Remove sparse tree.
authorIan Campbell <ian.campbell@xensource.com>
Mon, 4 Jun 2007 10:16:19 +0000 (11:16 +0100)
committerIan Campbell <ian.campbell@xensource.com>
Mon, 4 Jun 2007 10:16:19 +0000 (11:16 +0100)
Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
441 files changed:
COPYING
Makefile
README
buildconfigs/Rules.mk
buildconfigs/conf.linux-native/00_xen_to_native [deleted file]
buildconfigs/create_config.sh [deleted file]
buildconfigs/linux-defconfig_xen0_ia64 [deleted file]
buildconfigs/linux-defconfig_xen0_x86_32 [deleted file]
buildconfigs/linux-defconfig_xen0_x86_64 [deleted file]
buildconfigs/linux-defconfig_xenU_ia64 [deleted file]
buildconfigs/linux-defconfig_xenU_x86_32 [deleted file]
buildconfigs/linux-defconfig_xenU_x86_64 [deleted file]
buildconfigs/linux-defconfig_xen_ia64 [deleted file]
buildconfigs/linux-defconfig_xen_x86_32 [deleted file]
buildconfigs/linux-defconfig_xen_x86_64 [deleted file]
buildconfigs/src.sparse [deleted file]
linux-2.6-xen-sparse/arch/i386/Kconfig [deleted file]
linux-2.6-xen-sparse/arch/i386/Kconfig.cpu [deleted file]
linux-2.6-xen-sparse/arch/i386/Kconfig.debug [deleted file]
linux-2.6-xen-sparse/arch/i386/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/boot-xen/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/apic-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/asm-offsets.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/cpu/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/crash.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/early_printk-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/fixup.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/init_task-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/ioport-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/ldt-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/machine_kexec.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/mpparse-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/quirks-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/smp-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/sysenter.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/traps-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/vm86.c [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/vsyscall-note-xen.S [deleted file]
linux-2.6-xen-sparse/arch/i386/kernel/vsyscall.S [deleted file]
linux-2.6-xen-sparse/arch/i386/mach-xen/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/mach-xen/setup.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/fault-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/init-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/oprofile/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c [deleted file]
linux-2.6-xen-sparse/arch/i386/pci/Makefile [deleted file]
linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c [deleted file]
linux-2.6-xen-sparse/arch/i386/pci/pcifront.c [deleted file]
linux-2.6-xen-sparse/arch/i386/power/Makefile [deleted file]
linux-2.6-xen-sparse/arch/ia64/Kconfig [deleted file]
linux-2.6-xen-sparse/arch/ia64/Makefile [deleted file]
linux-2.6-xen-sparse/arch/ia64/hp/common/sba_iommu.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/Makefile [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/entry.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/fsys.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/gate.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/head.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/pal.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/patch.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/kernel/time.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/mm/ioremap.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile [deleted file]
linux-2.6-xen-sparse/arch/ia64/oprofile/init.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h [deleted file]
linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/pci/pci.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/Makefile [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/machvec.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/mem.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/swiotlb.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/util.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xen_dma.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xencomm.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xenhpski.c [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S [deleted file]
linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S [deleted file]
linux-2.6-xen-sparse/arch/um/kernel/physmem.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/Kconfig [deleted file]
linux-2.6-xen-sparse/arch/x86_64/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/ia32entry-xen.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32_syscall-xen.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-int80.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-sigreturn.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/acpi/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/apic-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/crash.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/early_printk-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/genapic-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/genapic_xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/ioport-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/ldt-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/machine_kexec.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/mpparse-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/pci-swiotlb-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/smp-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/vsyscall-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/kernel/xen_entry.S [deleted file]
linux-2.6-xen-sparse/arch/x86_64/mm/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/mm/pageattr-xen.c [deleted file]
linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile [deleted file]
linux-2.6-xen-sparse/arch/x86_64/pci/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/acpi/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/char/mem.c [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/tpm.h [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.c [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.h [deleted file]
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c [deleted file]
linux-2.6-xen-sparse/drivers/char/tty_io.c [deleted file]
linux-2.6-xen-sparse/drivers/firmware/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/pci/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/serial/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/video/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/video/console/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/xen/Kconfig [deleted file]
linux-2.6-xen-sparse/drivers/xen/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/balloon/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/balloon/common.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/balloon/sysfs.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/common.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkfront/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blktap/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blktap/common.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/char/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/char/mem.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/console/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/console/console.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/features.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/hypervisor_sysfs.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/reboot.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/xen_proc.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/core/xen_sysfs.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/evtchn/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/evtchn/evtchn.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/fbfront/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/gntdev/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/gntdev/gntdev.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/common.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/interface.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/netback.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/netfront/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_vpd.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_header.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/passthrough.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/pciback_ops.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/slot.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/vpci.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pcifront/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/pcifront/pci.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pcifront/pci_op.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/pcifront/pcifront.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/privcmd/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/tpmback/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/tpmback/common.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/util.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.h [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe_backend.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c [deleted file]
linux-2.6-xen-sparse/drivers/xen/xenoprof/xenoprofile.c [deleted file]
linux-2.6-xen-sparse/fs/Kconfig [deleted file]
linux-2.6-xen-sparse/include/asm-i386/apic.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/kexec.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-default/mach_traps.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/agp.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/desc.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/fixmap.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/floppy.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/highmem.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hw_irq.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/irqflags.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu_context.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/param.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgalloc.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/processor.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/ptrace.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/scatterlist.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/setup.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/smp.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/spinlock.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/synch_bitops.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/tlbflush.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/vga.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/xenoprof.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/irq_vectors.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/mach_traps.h [deleted file]
linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/agp.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/gcc_intrin.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/hypercall.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/intel_intrin.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/io.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/iosapic.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/irq.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/machvec.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/maddr.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/meminit.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/page.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/pal.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/pgalloc.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/privop.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/processor.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/sal.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/synch_bitops.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/system.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/uaccess.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/xen/xencomm.h [deleted file]
linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h [deleted file]
linux-2.6-xen-sparse/include/asm-um/page.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/apic.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/kexec.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/agp.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/arch_hooks.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/bootsetup.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/dma-mapping.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/e820.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/fixmap.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/floppy.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hw_irq.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypervisor.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irq.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irqflags.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu_context.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/msr.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/nmi.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgalloc.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/ptrace.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/smp.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/synch_bitops.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/timer.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/tlbflush.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/vga.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xenoprof.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xor.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/irq_vectors.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_time.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_timer.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h [deleted file]
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_pre.h [deleted file]
linux-2.6-xen-sparse/include/linux/gfp.h [deleted file]
linux-2.6-xen-sparse/include/linux/highmem.h [deleted file]
linux-2.6-xen-sparse/include/linux/interrupt.h [deleted file]
linux-2.6-xen-sparse/include/linux/kexec.h [deleted file]
linux-2.6-xen-sparse/include/linux/mm.h [deleted file]
linux-2.6-xen-sparse/include/linux/page-flags.h [deleted file]
linux-2.6-xen-sparse/include/linux/skbuff.h [deleted file]
linux-2.6-xen-sparse/include/xen/balloon.h [deleted file]
linux-2.6-xen-sparse/include/xen/blkif.h [deleted file]
linux-2.6-xen-sparse/include/xen/cpu_hotplug.h [deleted file]
linux-2.6-xen-sparse/include/xen/driver_util.h [deleted file]
linux-2.6-xen-sparse/include/xen/evtchn.h [deleted file]
linux-2.6-xen-sparse/include/xen/features.h [deleted file]
linux-2.6-xen-sparse/include/xen/gnttab.h [deleted file]
linux-2.6-xen-sparse/include/xen/hvm.h [deleted file]
linux-2.6-xen-sparse/include/xen/hypercall.h [deleted file]
linux-2.6-xen-sparse/include/xen/hypervisor_sysfs.h [deleted file]
linux-2.6-xen-sparse/include/xen/pcifront.h [deleted file]
linux-2.6-xen-sparse/include/xen/public/evtchn.h [deleted file]
linux-2.6-xen-sparse/include/xen/public/gntdev.h [deleted file]
linux-2.6-xen-sparse/include/xen/public/privcmd.h [deleted file]
linux-2.6-xen-sparse/include/xen/xen_proc.h [deleted file]
linux-2.6-xen-sparse/include/xen/xenbus.h [deleted file]
linux-2.6-xen-sparse/include/xen/xencons.h [deleted file]
linux-2.6-xen-sparse/include/xen/xenoprof.h [deleted file]
linux-2.6-xen-sparse/kernel/Kconfig.preempt [deleted file]
linux-2.6-xen-sparse/kernel/fork.c [deleted file]
linux-2.6-xen-sparse/kernel/irq/spurious.c [deleted file]
linux-2.6-xen-sparse/kernel/kexec.c [deleted file]
linux-2.6-xen-sparse/lib/Makefile [deleted file]
linux-2.6-xen-sparse/mkbuildtree [deleted file]
linux-2.6-xen-sparse/mm/Kconfig [deleted file]
linux-2.6-xen-sparse/mm/highmem.c [deleted file]
linux-2.6-xen-sparse/mm/memory.c [deleted file]
linux-2.6-xen-sparse/mm/mmap.c [deleted file]
linux-2.6-xen-sparse/mm/page_alloc.c [deleted file]
linux-2.6-xen-sparse/net/core/dev.c [deleted file]
linux-2.6-xen-sparse/net/core/skbuff.c [deleted file]
linux-2.6-xen-sparse/scripts/Makefile.xen [deleted file]
patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps-fix.patch [deleted file]
patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps.patch [deleted file]
patches/linux-2.6.18/blktap-aio-16_03_06.patch [deleted file]
patches/linux-2.6.18/fix-ide-cd-pio-mode.patch [deleted file]
patches/linux-2.6.18/fixaddr-top.patch [deleted file]
patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch [deleted file]
patches/linux-2.6.18/git-4bfaaef01a1badb9e8ffb0c0a37cd2379008d21f.patch [deleted file]
patches/linux-2.6.18/git-5ee7737379b1d7f0c977c0f1661fbaf01a8d4721.patch [deleted file]
patches/linux-2.6.18/git-c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4.patch [deleted file]
patches/linux-2.6.18/git-dbaab49f92ff6ae6255762a948375e4036cbdbd2.patch [deleted file]
patches/linux-2.6.18/i386-mach-io-check-nmi.patch [deleted file]
patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-i386.patch [deleted file]
patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch [deleted file]
patches/linux-2.6.18/net-csum.patch [deleted file]
patches/linux-2.6.18/net-gso-5-rcv-mss.patch [deleted file]
patches/linux-2.6.18/net-gso-6-linear-segmentation.patch [deleted file]
patches/linux-2.6.18/pmd-shared.patch [deleted file]
patches/linux-2.6.18/rename-TSS_sysenter_esp0-SYSENTER_stack_esp0.patch [deleted file]
patches/linux-2.6.18/series [deleted file]
patches/linux-2.6.18/softlockup-no-idle-hz.patch [deleted file]
patches/linux-2.6.18/x86-elfnote-as-preprocessor-macro.patch [deleted file]
patches/linux-2.6.18/x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch [deleted file]
patches/linux-2.6.18/x86_64-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch [deleted file]
patches/linux-2.6.18/xen-hotplug.patch [deleted file]
patches/linux-2.6.18/xenoprof-generic.patch [deleted file]

diff --git a/COPYING b/COPYING
index 32f39ab5f8d5746048d837e5ecc04fc34cf5527b..aba8ddf3aefd2afac561ff7183f27f30bcf1de6a 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -18,10 +18,11 @@ GPL when distributed separately or included in software packages
 outside this repository. Instead we specify a much more relaxed
 BSD-style license. Affected files include the Xen interface headers
 (xen/include/public/COPYING), and various drivers, support functions
-and header files within the Linux sparse source trees. In all such
-cases, license terms are stated at the top of the file or in a COPYING
-file in the same directory. Note that _any_ file that is modified and
-then distributed within a Linux kernel is still subject to the GNU GPL.
+and header files within the Linux source trees on
+http://xenbits.xensource.com/linux-2.6.X-xen.hg. In all such cases,
+license terms are stated at the top of the file or in a COPYING file
+in the same directory. Note that _any_ file that is modified and then
+distributed within a Linux kernel is still subject to the GNU GPL.
 
  -- Keir Fraser (on behalf of the Xen team)
 
index cac9547a3d066adaba993cffeddb174dfc524a1e..6559da4fde801c72495b65c1cfaf8852a4a0f160 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -92,11 +92,6 @@ kdelete:
 kclean:
        for i in $(XKERNELS) ; do $(MAKE) $$i-clean ; done
 
-# Make patches from kernel sparse trees
-.PHONY: mkpatches
-mkpatches:
-       for i in $(ALLSPARSETREES) ; do $(MAKE) $$i-xen.patch; done
-
 # build xen, the tools, and a domain 0 plus unprivileged linux-xen images,
 # and place them in the install directory. 'make install' should then
 # copy them to the normal system directories
@@ -121,7 +116,6 @@ distclean:
        $(MAKE) -C docs distclean
        rm -rf dist patches/tmp
        for i in $(ALLKERNELS) ; do $(MAKE) $$i-delete ; done
-       for i in $(ALLSPARSETREES) ; do $(MAKE) $$i-mrproper ; done
        rm -rf patches/*/.makedep
 
 # Linux name for GNU distclean
@@ -157,8 +151,6 @@ help:
        @echo ''
        @echo 'Miscellaneous targets:'
        @echo '  prep-kernels     - prepares kernel directories, does not build'
-       @echo '  mkpatches        - make patches against vanilla kernels from'
-       @echo '                     sparse trees'
        @echo '  uninstall        - attempt to remove installed Xen tools'
        @echo '                     (use with extreme care!)'
        @echo
diff --git a/README b/README
index d2069549054427eda20df93dbfad70e55e6a35f0..10ef237bc9b8a219bfc4bd315f0924c407097fcd 100644 (file)
--- a/README
+++ b/README
@@ -114,8 +114,6 @@ performed with root privileges.]
    version for unstable.
 
 2. cd to xen-unstable (or whatever you sensibly rename it to).
-   The Linux, netbsd and freebsd kernel source trees are in
-   the $os-$version-xen-sparse directories.
 
 On Linux:
 
index 49ef8fe21dcdc4946a4e325d83dd6402c45fc49b..ee61cf64eaeff0500ba2da8b2adf33f78d2a473d 100644 (file)
@@ -4,7 +4,6 @@ include Config.mk
 export DESTDIR
 
 ALLKERNELS = $(patsubst buildconfigs/mk.%,%,$(wildcard buildconfigs/mk.*))
-ALLSPARSETREES = $(patsubst %-xen-sparse,%,$(wildcard *-xen-sparse))
 
 %-install:
        $(MAKE) -f buildconfigs/mk.$* build
diff --git a/buildconfigs/conf.linux-native/00_xen_to_native b/buildconfigs/conf.linux-native/00_xen_to_native
deleted file mode 100644 (file)
index 024bc9b..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# Linux kernel version: 2.6.16.13-native
-# Mon May 15 10:59:54 2006
-#
-CONFIG_X86_PC=y
-# CONFIG_X86_XEN is not set
-# CONFIG_HPET_TIMER is not set
-# CONFIG_SCHED_SMT is not set
-# CONFIG_X86_MCE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_SWIOTLB is not set
-# CONFIG_EDD is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_SPARSEMEM_STATIC=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_HIGHPTE is not set
-# CONFIG_MATH_EMULATION is not set
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-# CONFIG_KEXEC is not set
-CONFIG_DOUBLEFAULT=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
-CONFIG_SUSPEND_SMP=y
-CONFIG_ACPI_SLEEP=y
-CONFIG_ACPI_SLEEP_PROC_FS=y
-# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set
-CONFIG_X86_PM_TIMER=y
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-CONFIG_PCI_BIOS=y
-# CONFIG_XEN_PCIDEV_FRONTEND is not set
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_ISA is not set
-# CONFIG_MCA is not set
-# CONFIG_HOTPLUG_PCI_COMPAQ is not set
-# CONFIG_HOTPLUG_PCI_IBM is not set
-# CONFIG_I2O_EXT_ADAPTEC_DMA64 is not set
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_TCG_XEN is not set
-# CONFIG_HUGETLBFS is not set
-# CONFIG_XEN is not set
-# CONFIG_XEN_INTERFACE_VERSION is not set
-
-#
-# XEN
-#
-# CONFIG_XEN_PRIVILEGED_GUEST is not set
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-# CONFIG_XEN_BACKEND is not set
-# CONFIG_XEN_PCIDEV_BACKEND is not set
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-# CONFIG_XEN_BLKDEV_BACKEND is not set
-# CONFIG_XEN_BLKDEV_TAP_BE is not set
-# CONFIG_XEN_NETDEV_BACKEND is not set
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-# CONFIG_XEN_NETDEV_LOOPBACK is not set
-# CONFIG_XEN_TPMDEV_BACKEND is not set
-# CONFIG_XEN_BLKDEV_FRONTEND is not set
-# CONFIG_XEN_NETDEV_FRONTEND is not set
-# CONFIG_XEN_BLKDEV_TAP is not set
-# CONFIG_XEN_SCRUB_PAGES is not set
-# CONFIG_XEN_DISABLE_SERIAL is not set
-# CONFIG_XEN_SYSFS is not set
-# CONFIG_XEN_COMPAT_030002_AND_LATER is not set
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-# CONFIG_XEN_COMPAT_030002 is not set
-# CONFIG_XEN_COMPAT_030004 is not set
-# CONFIG_HAVE_ARCH_ALLOC_SKB is not set
-# CONFIG_HAVE_ARCH_DEV_ALLOC_SKB is not set
-# CONFIG_NO_IDLE_HZ is not set
-CONFIG_X86_HT=y
-# CONFIG_X86_NO_TSS is not set
-# CONFIG_X86_NO_IDT is not set
diff --git a/buildconfigs/create_config.sh b/buildconfigs/create_config.sh
deleted file mode 100644 (file)
index 529b7fa..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/sh
-set -e
-
-
-# Parse arguments
-#
-if [ $# -lt 1 -o $# -gt 4 ]; then
-    echo "Usage: $0 config-file EXTRAVERSION XEN_TARGET_ARCH XEN_SYSTYPE"
-    exit 1
-fi
-
-config_file=$1
-extraversion=$2
-target_arch=$3
-systype=$4
-
-
-# Start with initial config skeleton file, if any.
-# Derive from linux-defconfig_xen_x86_32 otherwise.
-#
-skeleton=buildconfigs/linux-defconfig_${extraversion#-}_${target_arch}${systype}
-[ -r $skeleton ] || skeleton=buildconfigs/linux-defconfig_xen_x86_32
-[ -r $skeleton.local ] && skeleton=$skeleton.local
-cp $skeleton $config_file
-
-echo "Using $skeleton as base config"
-
-# Update
-#
-filter_template="s/^#\{0,1\} *\(CONFIG[^= ]*\).*/\/^#\\\{0,1\\\} *\1[= ].*\/d/p"
-config_dirs="buildconfigs/conf.linux buildconfigs/conf.linux-${target_arch} buildconfigs/conf.linux${extraversion} buildconfigs/conf.linux-${target_arch}${extraversion}"
-
-for config_dir in $config_dirs
-do
-    if [ -d $config_dir ]; then
-        echo "Processing $config_dir..." 1>&2
-        # processing is done in alphanumeric order
-        find $config_dir -type f | sort | while read update
-        do
-            echo "   ... $update" 1>&2
-            # create the filter rules in a temp file
-            filter_rules=`mktemp -t xenupdateconf.XXXXXXXXXX`
-            sed -n "${filter_template}" < $update > $filter_rules
-
-            # filter the config file in place, removing any options that
-            # will be updated.
-            sed -f $filter_rules -i $config_file
-            cat $update >> $config_file
-
-            # clean up
-            rm -f $filter_rules
-        done
-    fi
-done
diff --git a/buildconfigs/linux-defconfig_xen0_ia64 b/buildconfigs/linux-defconfig_xen0_ia64
deleted file mode 100644 (file)
index 9e7292d..0000000
+++ /dev/null
@@ -1,1684 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Sun May  6 20:45:43 2007
-#
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_EMBEDDED is not set
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_IA64=y
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_SWIOTLB=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_TIME_INTERPOLATION=y
-CONFIG_DMI=y
-CONFIG_EFI=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_XEN=y
-CONFIG_XEN_IA64_VDSO_PARAVIRT=y
-CONFIG_XEN_IA64_EXPOSE_P2M=y
-CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_DMA_IS_DMA32=y
-CONFIG_AUDIT_ARCH=y
-CONFIG_IA64_GENERIC=y
-# CONFIG_IA64_DIG is not set
-# CONFIG_IA64_HP_ZX1 is not set
-# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
-# CONFIG_IA64_SGI_SN2 is not set
-# CONFIG_IA64_HP_SIM is not set
-# CONFIG_IA64_XEN is not set
-# CONFIG_ITANIUM is not set
-CONFIG_MCKINLEY=y
-# CONFIG_IA64_PAGE_SIZE_4KB is not set
-# CONFIG_IA64_PAGE_SIZE_8KB is not set
-CONFIG_IA64_PAGE_SIZE_16KB=y
-# CONFIG_IA64_PAGE_SIZE_64KB is not set
-CONFIG_PGTABLE_3=y
-# CONFIG_PGTABLE_4 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-CONFIG_IA64_L1_CACHE_SHIFT=7
-CONFIG_IA64_CYCLONE=y
-CONFIG_IOSAPIC=y
-# CONFIG_IA64_SGI_SN_XP is not set
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_SMP=y
-CONFIG_NR_CPUS=16
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-# CONFIG_SCHED_SMT is not set
-# CONFIG_PERMIT_BSP_REMOVE is not set
-# CONFIG_PREEMPT is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_FLATMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM_MANUAL=y
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_NEED_MULTIPLE_NODES=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MIGRATION is not set
-CONFIG_RESOURCES_64BIT=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
-CONFIG_NUMA=y
-CONFIG_NODES_SHIFT=10
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
-CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_HAVE_ARCH_NODEDATA_EXTENSION=y
-# CONFIG_IA32_SUPPORT is not set
-# CONFIG_IA64_MCA_RECOVERY is not set
-CONFIG_PERFMON=y
-CONFIG_IA64_PALINFO=y
-CONFIG_SGI_SN=y
-
-#
-# SN Devices
-#
-# CONFIG_SGI_IOC3 is not set
-
-#
-# Firmware Drivers
-#
-CONFIG_EFI_VARS=y
-CONFIG_EFI_PCDP=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-
-#
-# Power management and ACPI
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_HOTPLUG_CPU=y
-CONFIG_ACPI_THERMAL=y
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_CONTAINER=y
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-CONFIG_HOTPLUG_PCI_ACPI=y
-# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-# CONFIG_HOTPLUG_PCI_SGI is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-CONFIG_ARPD=y
-CONFIG_SYN_COOKIES=y
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NF_CONNTRACK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_IP_NF_CONNTRACK is not set
-# CONFIG_IP_NF_QUEUE is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-CONFIG_BRIDGE=y
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_CPQ_DA is not set
-CONFIG_BLK_CPQ_CISS_DA=y
-# CONFIG_CISS_SCSI_TAPE is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_CRYPTOLOOP=y
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_IDE_MAX_HWIFS=4
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_IDEFLOPPY=y
-CONFIG_BLK_DEV_IDESCSI=y
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-CONFIG_BLK_DEV_CMD64X=y
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-CONFIG_CHR_DEV_OSST=y
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-CONFIG_SCSI_SAS_ATTRS=y
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# CONFIG_SCSI_IPR is not set
-CONFIG_SCSI_QLOGIC_1280=y
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-# CONFIG_FUSION_FC is not set
-CONFIG_FUSION_SAS=y
-CONFIG_FUSION_MAX_SGE=128
-# CONFIG_FUSION_CTL is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=y
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=y
-
-#
-# ARCnet devices
-#
-CONFIG_ARCNET=y
-# CONFIG_ARCNET_1201 is not set
-# CONFIG_ARCNET_1051 is not set
-# CONFIG_ARCNET_RAW is not set
-# CONFIG_ARCNET_CAP is not set
-# CONFIG_ARCNET_COM90xx is not set
-# CONFIG_ARCNET_COM90xxIO is not set
-# CONFIG_ARCNET_RIM_I is not set
-# CONFIG_ARCNET_COM20020 is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=y
-CONFIG_TULIP_MWI=y
-CONFIG_TULIP_MMIO=y
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-# CONFIG_DE4X5 is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_DM9102 is not set
-# CONFIG_ULI526X is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-CONFIG_EEPRO100=y
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-# CONFIG_BNX2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL=y
-# CONFIG_NETPOLL_RX is not set
-# CONFIG_NETPOLL_TRAP is not set
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-CONFIG_ISDN=m
-
-#
-# Old ISDN4Linux
-#
-# CONFIG_ISDN_I4L is not set
-
-#
-# CAPI subsystem
-#
-# CONFIG_ISDN_CAPI is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=y
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-CONFIG_GAMEPORT=y
-# CONFIG_GAMEPORT_NS558 is not set
-# CONFIG_GAMEPORT_L4 is not set
-# CONFIG_GAMEPORT_EMU10K1 is not set
-# CONFIG_GAMEPORT_FM801 is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-CONFIG_SERIAL_NONSTANDARD=y
-# CONFIG_COMPUTONE is not set
-# CONFIG_ROCKETPORT is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_MOXA_INTELLIO is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_ISI is not set
-# CONFIG_SYNCLINKMP is not set
-# CONFIG_SYNCLINK_GT is not set
-# CONFIG_N_HDLC is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_RIO is not set
-# CONFIG_STALDRV is not set
-# CONFIG_SGI_SNSC is not set
-# CONFIG_SGI_TIOCX is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_SGI_L1_CONSOLE is not set
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_EFI_RTC=y
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_VIA is not set
-CONFIG_AGP_I460=y
-# CONFIG_AGP_HP_ZX1 is not set
-# CONFIG_AGP_SGI_TIOCA is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-# CONFIG_MMTIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-CONFIG_I2C_ALGOPCF=y
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=y
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video Capture Adapters
-#
-
-#
-# Video Capture Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_CX88 is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_MATROX is not set
-CONFIG_FB_RADEON=y
-CONFIG_FB_RADEON_I2C=y
-CONFIG_FB_RADEON_DEBUG=y
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-CONFIG_LOGO_LINUX_CLUT224=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=y
-CONFIG_SND_RAWMIDI=y
-CONFIG_SND_SEQUENCER=y
-CONFIG_SND_SEQ_DUMMY=y
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_MPU401_UART=y
-CONFIG_SND_OPL3_LIB=y
-CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_AC97_BUS=y
-CONFIG_SND_DUMMY=y
-CONFIG_SND_VIRMIDI=y
-# CONFIG_SND_MTPAV is not set
-CONFIG_SND_SERIAL_U16550=y
-CONFIG_SND_MPU401=y
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALI5451 is not set
-CONFIG_SND_ATIIXP=y
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-CONFIG_SND_FM801=y
-# CONFIG_SND_FM801_TEA575X_BOOL is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-
-#
-# Open Sound System
-#
-CONFIG_SOUND_PRIME=y
-# CONFIG_OSS_OBSOLETE_DRIVER is not set
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_ES1371 is not set
-# CONFIG_SOUND_ICH is not set
-# CONFIG_SOUND_TRIDENT is not set
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
-# CONFIG_SOUND_VIA82CXXX is not set
-# CONFIG_SOUND_TVMIXER is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-CONFIG_USB_BANDWIDTH=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-CONFIG_USB_HIDDEV=y
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=y
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=y
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=y
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-CONFIG_SGI_PARTITION=y
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_737=y
-CONFIG_NLS_CODEPAGE_775=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_CODEPAGE_852=y
-CONFIG_NLS_CODEPAGE_855=y
-CONFIG_NLS_CODEPAGE_857=y
-CONFIG_NLS_CODEPAGE_860=y
-CONFIG_NLS_CODEPAGE_861=y
-CONFIG_NLS_CODEPAGE_862=y
-CONFIG_NLS_CODEPAGE_863=y
-CONFIG_NLS_CODEPAGE_864=y
-CONFIG_NLS_CODEPAGE_865=y
-CONFIG_NLS_CODEPAGE_866=y
-CONFIG_NLS_CODEPAGE_869=y
-CONFIG_NLS_CODEPAGE_936=y
-CONFIG_NLS_CODEPAGE_950=y
-CONFIG_NLS_CODEPAGE_932=y
-CONFIG_NLS_CODEPAGE_949=y
-CONFIG_NLS_CODEPAGE_874=y
-CONFIG_NLS_ISO8859_8=y
-# CONFIG_NLS_CODEPAGE_1250 is not set
-CONFIG_NLS_CODEPAGE_1251=y
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_2=y
-CONFIG_NLS_ISO8859_3=y
-CONFIG_NLS_ISO8859_4=y
-CONFIG_NLS_ISO8859_5=y
-CONFIG_NLS_ISO8859_6=y
-CONFIG_NLS_ISO8859_7=y
-CONFIG_NLS_ISO8859_9=y
-CONFIG_NLS_ISO8859_13=y
-CONFIG_NLS_ISO8859_14=y
-CONFIG_NLS_ISO8859_15=y
-CONFIG_NLS_KOI8_R=y
-CONFIG_NLS_KOI8_U=y
-CONFIG_NLS_UTF8=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_IRQ_PER_CPU=y
-
-#
-# HP Simulator drivers
-#
-# CONFIG_HP_SIMETH is not set
-# CONFIG_HP_SIMSERIAL is not set
-# CONFIG_HP_SIMSCSI is not set
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=20
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_IA64_GRANULE_16MB=y
-# CONFIG_IA64_GRANULE_64MB is not set
-CONFIG_IA64_PRINT_HAZARDS=y
-# CONFIG_DISABLE_VHPT is not set
-# CONFIG_IA64_DEBUG_CMPXCHG is not set
-# CONFIG_IA64_DEBUG_IRQ is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=y
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=y
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-# CONFIG_XEN_SMPBOOT is not set
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=y
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
-CONFIG_XEN_PCIDEV_BACKEND_SLOT=y
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_FRAMEBUFFER=y
-CONFIG_XEN_KEYBOARD=y
-# CONFIG_XEN_SCRUB_PAGES is not set
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT=0x030002
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
diff --git a/buildconfigs/linux-defconfig_xen0_x86_32 b/buildconfigs/linux-defconfig_xen0_x86_32
deleted file mode 100644 (file)
index 0ade353..0000000
+++ /dev/null
@@ -1,1443 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xen0
-# Wed Jan 17 18:35:52 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-# CONFIG_X86_PC is not set
-CONFIG_X86_XEN=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_M386 is not set
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-CONFIG_M686=y
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-# CONFIG_X86_GENERIC is not set
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_XADD=y
-CONFIG_X86_L1_CACHE_SHIFT=5
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_NR_CPUS=8
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-CONFIG_MICROCODE=y
-CONFIG_X86_CPUID=y
-CONFIG_SWIOTLB=y
-
-#
-# Firmware Drivers
-#
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-# CONFIG_NOHIGHMEM is not set
-CONFIG_HIGHMEM4G=y
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_HIGHMEM=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-# CONFIG_HIGHPTE is not set
-CONFIG_MTRR=y
-# CONFIG_REGPARM is not set
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-CONFIG_KEXEC=y
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x100000
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_VIDEO=m
-CONFIG_ACPI_HOTKEY=m
-CONFIG_ACPI_FAN=m
-CONFIG_ACPI_DOCK=m
-CONFIG_ACPI_PROCESSOR=m
-CONFIG_ACPI_THERMAL=m
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_IBM=m
-CONFIG_ACPI_TOSHIBA=m
-# CONFIG_ACPI_CUSTOM_DSDT is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-# CONFIG_PCI_GOXEN_FE is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-CONFIG_ISA_DMA_API=y
-# CONFIG_SCx200 is not set
-CONFIG_K8_NB=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-# CONFIG_INET_DIAG is not set
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-CONFIG_IP_NF_FTP=m
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_QUEUE is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-CONFIG_BRIDGE=y
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-# CONFIG_STANDALONE is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-CONFIG_PNP_DEBUG=y
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_CPQ_DA is not set
-CONFIG_BLK_CPQ_CISS_DA=y
-# CONFIG_CISS_SCSI_TAPE is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-CONFIG_BLK_DEV_SVWKS=y
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-CONFIG_BLK_DEV_3W_XXXX_RAID=y
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-CONFIG_SCSI_AACRAID=y
-CONFIG_SCSI_AIC7XXX=y
-CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
-CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-CONFIG_AIC7XXX_DEBUG_ENABLE=y
-CONFIG_AIC7XXX_DEBUG_MASK=0
-CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-CONFIG_SCSI_AIC79XX=y
-CONFIG_AIC79XX_CMDS_PER_DEVICE=32
-CONFIG_AIC79XX_RESET_DELAY_MS=15000
-# CONFIG_AIC79XX_ENABLE_RD_STRM is not set
-CONFIG_AIC79XX_DEBUG_ENABLE=y
-CONFIG_AIC79XX_DEBUG_MASK=0
-CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_DPT_I2O is not set
-CONFIG_SCSI_ADVANSYS=y
-CONFIG_MEGARAID_NEWGEN=y
-# CONFIG_MEGARAID_MM is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-CONFIG_SCSI_SATA=y
-CONFIG_SCSI_SATA_AHCI=y
-# CONFIG_SCSI_SATA_SVW is not set
-CONFIG_SCSI_ATA_PIIX=y
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_PDC_ADMA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-CONFIG_SCSI_SATA_PROMISE=y
-CONFIG_SCSI_SATA_SX4=y
-CONFIG_SCSI_SATA_SIL=y
-CONFIG_SCSI_SATA_SIL24=y
-# CONFIG_SCSI_SATA_SIS is not set
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-# CONFIG_MD_LINEAR is not set
-CONFIG_MD_RAID0=y
-CONFIG_MD_RAID1=y
-# CONFIG_MD_RAID10 is not set
-# CONFIG_MD_RAID456 is not set
-# CONFIG_MD_MULTIPATH is not set
-# CONFIG_MD_FAULTY is not set
-CONFIG_BLK_DEV_DM=y
-# CONFIG_DM_CRYPT is not set
-CONFIG_DM_SNAPSHOT=y
-CONFIG_DM_MIRROR=y
-# CONFIG_DM_ZERO is not set
-# CONFIG_DM_MULTIPATH is not set
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-CONFIG_FUSION_MAX_SGE=128
-# CONFIG_FUSION_CTL is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=y
-# CONFIG_NET_SB1000 is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=y
-# CONFIG_TYPHOON is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=y
-# CONFIG_TULIP_MWI is not set
-# CONFIG_TULIP_MMIO is not set
-# CONFIG_TULIP_NAPI is not set
-# CONFIG_DE4X5 is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_DM9102 is not set
-# CONFIG_ULI526X is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=y
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-CONFIG_NE2K_PCI=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-# CONFIG_8139TOO_8129 is not set
-# CONFIG_8139_OLD_RX_RESET is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_TLAN is not set
-CONFIG_VIA_RHINE=y
-# CONFIG_VIA_RHINE_MMIO is not set
-# CONFIG_VIA_RHINE_NAPI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=y
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-CONFIG_SK98LIN=y
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-CONFIG_BNX2=y
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-# CONFIG_SONYPI is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=m
-CONFIG_AGP_ALI=m
-CONFIG_AGP_ATI=m
-CONFIG_AGP_AMD=m
-CONFIG_AGP_AMD64=m
-CONFIG_AGP_INTEL=m
-CONFIG_AGP_NVIDIA=m
-CONFIG_AGP_SIS=m
-CONFIG_AGP_SWORKS=m
-CONFIG_AGP_VIA=m
-# CONFIG_AGP_EFFICEON is not set
-CONFIG_DRM=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_I810=m
-CONFIG_DRM_I830=m
-CONFIG_DRM_I915=m
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_NSC_GPIO is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_EHCI_HCD is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=m
-CONFIG_RTC_CLASS=m
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=m
-CONFIG_RTC_INTF_PROC=m
-CONFIG_RTC_INTF_DEV=m
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-CONFIG_RTC_DRV_M48T86=m
-CONFIG_RTC_DRV_TEST=m
-# CONFIG_RTC_DRV_V3020 is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-# CONFIG_NFSD_V4 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_HIGHMEM is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_EARLY_PRINTK=y
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_4KSTACKS is not set
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-# CONFIG_CRYPTO_DEV_PADLOCK is not set
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=y
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-CONFIG_XEN_PCIDEV_BACKEND_PASS=y
-# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-CONFIG_XEN_SMPBOOT=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_KTIME_SCALAR=y
diff --git a/buildconfigs/linux-defconfig_xen0_x86_64 b/buildconfigs/linux-defconfig_xen0_x86_64
deleted file mode 100644 (file)
index 5d37ba6..0000000
+++ /dev/null
@@ -1,1383 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xen0
-# Wed Jan 17 18:26:35 2007
-#
-CONFIG_X86_64=y
-CONFIG_64BIT=y
-CONFIG_X86=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_AUDIT_ARCH=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_X86_PC=y
-# CONFIG_X86_VSMP is not set
-# CONFIG_MK8 is not set
-# CONFIG_MPSC is not set
-CONFIG_GENERIC_CPU=y
-CONFIG_X86_64_XEN=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_X86_L1_CACHE_BYTES=128
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_X86_INTERNODE_CACHE_BYTES=128
-CONFIG_X86_GOOD_APIC=y
-CONFIG_MICROCODE=y
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_XEN_GENAPIC=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_MTRR=y
-# CONFIG_SMP is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-# CONFIG_CALGARY_IOMMU is not set
-CONFIG_SWIOTLB=y
-CONFIG_KEXEC=y
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x200000
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-# CONFIG_REORDER is not set
-CONFIG_K8_NB=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_ISA_DMA_API=y
-
-#
-# Power management options
-#
-CONFIG_PM=y
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_VIDEO=m
-# CONFIG_ACPI_HOTKEY is not set
-CONFIG_ACPI_FAN=m
-CONFIG_ACPI_DOCK=m
-CONFIG_ACPI_PROCESSOR=m
-CONFIG_ACPI_THERMAL=m
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_IBM=m
-CONFIG_ACPI_TOSHIBA=m
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI etc.)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DIRECT=y
-# CONFIG_PCI_MMCONFIG is not set
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Executable file formats / Emulations
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-CONFIG_IA32_EMULATION=y
-# CONFIG_IA32_AOUT is not set
-CONFIG_COMPAT=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-CONFIG_IP_NF_FTP=m
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_QUEUE is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-CONFIG_BRIDGE=y
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-CONFIG_PNP_DEBUG=y
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_CPQ_DA is not set
-CONFIG_BLK_CPQ_CISS_DA=y
-# CONFIG_CISS_SCSI_TAPE is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=16384
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-CONFIG_BLK_DEV_SVWKS=y
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
-CONFIG_SCSI_ISCSI_ATTRS=y
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-CONFIG_BLK_DEV_3W_XXXX_RAID=y
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-CONFIG_SCSI_AACRAID=y
-CONFIG_SCSI_AIC7XXX=y
-CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
-CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
-CONFIG_AIC7XXX_DEBUG_ENABLE=y
-CONFIG_AIC7XXX_DEBUG_MASK=0
-CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-CONFIG_SCSI_AIC79XX=y
-CONFIG_AIC79XX_CMDS_PER_DEVICE=32
-CONFIG_AIC79XX_RESET_DELAY_MS=15000
-# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
-# CONFIG_AIC79XX_ENABLE_RD_STRM is not set
-CONFIG_AIC79XX_DEBUG_ENABLE=y
-CONFIG_AIC79XX_DEBUG_MASK=0
-CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-CONFIG_MEGARAID_NEWGEN=y
-# CONFIG_MEGARAID_MM is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-CONFIG_SCSI_SATA=y
-CONFIG_SCSI_SATA_AHCI=y
-# CONFIG_SCSI_SATA_SVW is not set
-CONFIG_SCSI_ATA_PIIX=y
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_PDC_ADMA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-CONFIG_SCSI_SATA_PROMISE=y
-CONFIG_SCSI_SATA_SX4=y
-CONFIG_SCSI_SATA_SIL=y
-CONFIG_SCSI_SATA_SIL24=y
-# CONFIG_SCSI_SATA_SIS is not set
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-CONFIG_SCSI_BUSLOGIC=y
-# CONFIG_SCSI_OMIT_FLASHPOINT is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=y
-CONFIG_MD_RAID0=y
-CONFIG_MD_RAID1=y
-# CONFIG_MD_RAID10 is not set
-CONFIG_MD_RAID456=y
-# CONFIG_MD_RAID5_RESHAPE is not set
-CONFIG_MD_MULTIPATH=y
-# CONFIG_MD_FAULTY is not set
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=y
-CONFIG_DM_SNAPSHOT=y
-CONFIG_DM_MIRROR=y
-# CONFIG_DM_ZERO is not set
-CONFIG_DM_MULTIPATH=y
-CONFIG_DM_MULTIPATH_EMC=y
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-CONFIG_FUSION_MAX_SGE=128
-# CONFIG_FUSION_CTL is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=y
-# CONFIG_NET_SB1000 is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=y
-# CONFIG_TYPHOON is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=y
-# CONFIG_TULIP_MWI is not set
-# CONFIG_TULIP_MMIO is not set
-# CONFIG_TULIP_NAPI is not set
-# CONFIG_DE4X5 is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_DM9102 is not set
-# CONFIG_ULI526X is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=y
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-CONFIG_NE2K_PCI=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-# CONFIG_8139TOO_8129 is not set
-# CONFIG_8139_OLD_RX_RESET is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-CONFIG_VIA_RHINE=y
-# CONFIG_VIA_RHINE_MMIO is not set
-# CONFIG_VIA_RHINE_NAPI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=y
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-CONFIG_SK98LIN=y
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-CONFIG_BNX2=y
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_NVRAM is not set
-CONFIG_RTC=y
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_FTAPE is not set
-CONFIG_AGP=m
-CONFIG_AGP_AMD64=m
-# CONFIG_AGP_INTEL is not set
-CONFIG_AGP_SIS=m
-CONFIG_AGP_VIA=m
-CONFIG_DRM=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_EHCI_HCD is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-
-#
-# InfiniBand support
-#
-CONFIG_INFINIBAND=y
-# CONFIG_INFINIBAND_USER_MAD is not set
-# CONFIG_INFINIBAND_USER_ACCESS is not set
-CONFIG_INFINIBAND_ADDR_TRANS=y
-CONFIG_INFINIBAND_MTHCA=y
-CONFIG_INFINIBAND_MTHCA_DEBUG=y
-CONFIG_INFINIBAND_IPOIB=y
-CONFIG_INFINIBAND_IPOIB_DEBUG=y
-CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y
-CONFIG_INFINIBAND_SRP=y
-CONFIG_INFINIBAND_ISER=y
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=m
-CONFIG_RTC_CLASS=m
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=m
-CONFIG_RTC_INTF_PROC=m
-CONFIG_RTC_INTF_DEV=m
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-CONFIG_RTC_DRV_DS1553=m
-CONFIG_RTC_DRV_DS1742=m
-CONFIG_RTC_DRV_M48T86=m
-CONFIG_RTC_DRV_TEST=m
-CONFIG_RTC_DRV_V3020=m
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Firmware Drivers
-#
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-# CONFIG_NFSD_V4 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=15
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_X86_64 is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=y
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-CONFIG_XEN_PCIDEV_BACKEND_PASS=y
-# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_PLIST=y
diff --git a/buildconfigs/linux-defconfig_xenU_ia64 b/buildconfigs/linux-defconfig_xenU_ia64
deleted file mode 100644 (file)
index 0eceb09..0000000
+++ /dev/null
@@ -1,1495 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Sun May  6 22:07:34 2007
-#
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_EMBEDDED is not set
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-# CONFIG_MODULE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-# CONFIG_KMOD is not set
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_IA64=y
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_SWIOTLB=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_TIME_INTERPOLATION=y
-CONFIG_DMI=y
-CONFIG_EFI=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_XEN=y
-CONFIG_XEN_IA64_VDSO_PARAVIRT=y
-CONFIG_XEN_IA64_EXPOSE_P2M=y
-CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_DMA_IS_DMA32=y
-CONFIG_AUDIT_ARCH=y
-# CONFIG_IA64_GENERIC is not set
-# CONFIG_IA64_DIG is not set
-# CONFIG_IA64_HP_ZX1 is not set
-# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
-# CONFIG_IA64_SGI_SN2 is not set
-# CONFIG_IA64_HP_SIM is not set
-CONFIG_IA64_XEN=y
-# CONFIG_ITANIUM is not set
-CONFIG_MCKINLEY=y
-# CONFIG_IA64_PAGE_SIZE_4KB is not set
-# CONFIG_IA64_PAGE_SIZE_8KB is not set
-CONFIG_IA64_PAGE_SIZE_16KB=y
-# CONFIG_IA64_PAGE_SIZE_64KB is not set
-CONFIG_PGTABLE_3=y
-# CONFIG_PGTABLE_4 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-CONFIG_IA64_L1_CACHE_SHIFT=7
-# CONFIG_IA64_CYCLONE is not set
-CONFIG_IOSAPIC=y
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_SMP=y
-CONFIG_NR_CPUS=16
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-# CONFIG_SCHED_SMT is not set
-# CONFIG_PERMIT_BSP_REMOVE is not set
-# CONFIG_PREEMPT is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-CONFIG_RESOURCES_64BIT=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
-# CONFIG_IA32_SUPPORT is not set
-CONFIG_IA64_MCA_RECOVERY=y
-CONFIG_PERFMON=y
-CONFIG_IA64_PALINFO=y
-
-#
-# Firmware Drivers
-#
-CONFIG_EFI_VARS=y
-CONFIG_EFI_PCDP=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-
-#
-# Power management and ACPI
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_HOTPLUG_CPU=y
-CONFIG_ACPI_THERMAL=y
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_CONTAINER=y
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-CONFIG_HOTPLUG_PCI_ACPI=y
-# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NF_CONNTRACK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_IP_NF_CONNTRACK is not set
-# CONFIG_IP_NF_QUEUE is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-CONFIG_CHR_DEV_OSST=y
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-CONFIG_SCSI_SAS_ATTRS=y
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# CONFIG_SCSI_IPR is not set
-CONFIG_SCSI_QLOGIC_1280=y
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-# CONFIG_FUSION_FC is not set
-CONFIG_FUSION_SAS=y
-CONFIG_FUSION_MAX_SGE=128
-# CONFIG_FUSION_CTL is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=y
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=y
-CONFIG_TULIP_MWI=y
-CONFIG_TULIP_MMIO=y
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-# CONFIG_DE4X5 is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_DM9102 is not set
-# CONFIG_ULI526X is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-# CONFIG_EEPRO100 is not set
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-# CONFIG_BNX2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=y
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_NR_UARTS=8
-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-CONFIG_SERIAL_8250_EXTENDED=y
-CONFIG_SERIAL_8250_SHARE_IRQ=y
-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-# CONFIG_SERIAL_8250_RSA is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_EFI_RTC=y
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_VIA is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-CONFIG_DRM_RADEON=y
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-CONFIG_I2C_ALGOPCF=y
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=y
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video Capture Adapters
-#
-
-#
-# Video Capture Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_CX88 is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_MATROX is not set
-CONFIG_FB_RADEON=y
-CONFIG_FB_RADEON_I2C=y
-CONFIG_FB_RADEON_DEBUG=y
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-CONFIG_LOGO_LINUX_CLUT224=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=y
-CONFIG_SND_RAWMIDI=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_MPU401_UART=y
-CONFIG_SND_OPL3_LIB=y
-CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_AC97_BUS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_VIRMIDI is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-CONFIG_SND_FM801=y
-# CONFIG_SND_FM801_TEA575X_BOOL is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-CONFIG_USB_BANDWIDTH=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-CONFIG_USB_HIDDEV=y
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-# CONFIG_EXT2_FS_POSIX_ACL is not set
-# CONFIG_EXT2_FS_SECURITY is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFSD_TCP is not set
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_737=y
-CONFIG_NLS_CODEPAGE_775=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_CODEPAGE_852=y
-CONFIG_NLS_CODEPAGE_855=y
-CONFIG_NLS_CODEPAGE_857=y
-CONFIG_NLS_CODEPAGE_860=y
-CONFIG_NLS_CODEPAGE_861=y
-CONFIG_NLS_CODEPAGE_862=y
-CONFIG_NLS_CODEPAGE_863=y
-CONFIG_NLS_CODEPAGE_864=y
-CONFIG_NLS_CODEPAGE_865=y
-CONFIG_NLS_CODEPAGE_866=y
-CONFIG_NLS_CODEPAGE_869=y
-CONFIG_NLS_CODEPAGE_936=y
-CONFIG_NLS_CODEPAGE_950=y
-CONFIG_NLS_CODEPAGE_932=y
-CONFIG_NLS_CODEPAGE_949=y
-CONFIG_NLS_CODEPAGE_874=y
-CONFIG_NLS_ISO8859_8=y
-# CONFIG_NLS_CODEPAGE_1250 is not set
-CONFIG_NLS_CODEPAGE_1251=y
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_2=y
-CONFIG_NLS_ISO8859_3=y
-CONFIG_NLS_ISO8859_4=y
-CONFIG_NLS_ISO8859_5=y
-CONFIG_NLS_ISO8859_6=y
-CONFIG_NLS_ISO8859_7=y
-CONFIG_NLS_ISO8859_9=y
-CONFIG_NLS_ISO8859_13=y
-CONFIG_NLS_ISO8859_14=y
-CONFIG_NLS_ISO8859_15=y
-CONFIG_NLS_KOI8_R=y
-CONFIG_NLS_KOI8_U=y
-CONFIG_NLS_UTF8=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_IRQ_PER_CPU=y
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_IA64_GRANULE_16MB=y
-# CONFIG_IA64_GRANULE_64MB is not set
-CONFIG_IA64_PRINT_HAZARDS=y
-# CONFIG_DISABLE_VHPT is not set
-# CONFIG_IA64_DEBUG_CMPXCHG is not set
-# CONFIG_IA64_DEBUG_IRQ is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=y
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=y
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-# CONFIG_XEN_SMPBOOT is not set
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-# CONFIG_XEN_PRIVILEGED_GUEST is not set
-CONFIG_XEN_UNPRIVILEGED_GUEST=y
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-# CONFIG_XEN_BACKEND is not set
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_FRAMEBUFFER=y
-CONFIG_XEN_KEYBOARD=y
-# CONFIG_XEN_SCRUB_PAGES is not set
-# CONFIG_XEN_DISABLE_SERIAL is not set
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT=0x030002
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
diff --git a/buildconfigs/linux-defconfig_xenU_x86_32 b/buildconfigs/linux-defconfig_xenU_x86_32
deleted file mode 100644 (file)
index f2bbb86..0000000
+++ /dev/null
@@ -1,952 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xenU
-# Wed Jan 17 18:36:21 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-# CONFIG_X86_PC is not set
-CONFIG_X86_XEN=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_M386 is not set
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-CONFIG_M686=y
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-# CONFIG_X86_GENERIC is not set
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_XADD=y
-CONFIG_X86_L1_CACHE_SHIFT=5
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_NR_CPUS=8
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-CONFIG_X86_CPUID=y
-CONFIG_SWIOTLB=y
-
-#
-# Firmware Drivers
-#
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-# CONFIG_NOHIGHMEM is not set
-CONFIG_HIGHMEM4G=y
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_HIGHMEM=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-# CONFIG_HIGHPTE is not set
-# CONFIG_REGPARM is not set
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x100000
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-# CONFIG_PCI is not set
-CONFIG_ISA_DMA_API=y
-# CONFIG_SCx200 is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-# CONFIG_INET_DIAG is not set
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=m
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# PHY device support
-#
-
-#
-# Ethernet (10 or 100Mbit)
-#
-# CONFIG_NET_ETHERNET is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-CONFIG_HW_RANDOM=y
-CONFIG_HW_RANDOM_VIA=y
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_NSC_GPIO is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-# CONFIG_USB_ARCH_HAS_HCD is not set
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_HIGHMEM is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_EARLY_PRINTK=y
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_4KSTACKS is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=m
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-# CONFIG_CRYPTO_DEV_PADLOCK is not set
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-# CONFIG_XEN_PRIVILEGED_GUEST is not set
-CONFIG_XEN_UNPRIVILEGED_GUEST=y
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-# CONFIG_XEN_BACKEND is not set
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-CONFIG_XEN_SMPBOOT=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-# CONFIG_CRC32 is not set
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_KTIME_SCALAR=y
diff --git a/buildconfigs/linux-defconfig_xenU_x86_64 b/buildconfigs/linux-defconfig_xenU_x86_64
deleted file mode 100644 (file)
index 69fedf9..0000000
+++ /dev/null
@@ -1,1242 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xenU
-# Wed Jan 17 18:28:53 2007
-#
-CONFIG_X86_64=y
-CONFIG_64BIT=y
-CONFIG_X86=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_AUDIT_ARCH=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_TASKSTATS is not set
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_MODVERSIONS=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_X86_PC=y
-# CONFIG_X86_VSMP is not set
-# CONFIG_MK8 is not set
-CONFIG_MPSC=y
-# CONFIG_GENERIC_CPU is not set
-CONFIG_X86_64_XEN=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_X86_L1_CACHE_BYTES=128
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_X86_INTERNODE_CACHE_BYTES=128
-CONFIG_X86_GOOD_APIC=y
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-CONFIG_X86_CPUID=y
-CONFIG_X86_XEN_GENAPIC=y
-CONFIG_SMP=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-CONFIG_NR_CPUS=16
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-CONFIG_SWIOTLB=y
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x200000
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-# CONFIG_REORDER is not set
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_ISA_DMA_API=y
-CONFIG_GENERIC_PENDING_IRQ=y
-
-#
-# Bus options (PCI etc.)
-#
-# CONFIG_PCI is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-
-#
-# Executable file formats / Emulations
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-CONFIG_IA32_EMULATION=y
-# CONFIG_IA32_AOUT is not set
-CONFIG_COMPAT=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=y
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
-CONFIG_IP_ROUTE_VERBOSE=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-CONFIG_IP_PNP_RARP=y
-CONFIG_NET_IPIP=m
-CONFIG_NET_IPGRE=m
-CONFIG_NET_IPGRE_BROADCAST=y
-CONFIG_IP_MROUTE=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_XFRM_TUNNEL=m
-CONFIG_INET_TUNNEL=m
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-# CONFIG_INET_DIAG is not set
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-CONFIG_IP_VS=m
-# CONFIG_IP_VS_DEBUG is not set
-CONFIG_IP_VS_TAB_BITS=12
-
-#
-# IPVS transport protocol load balancing support
-#
-CONFIG_IP_VS_PROTO_TCP=y
-CONFIG_IP_VS_PROTO_UDP=y
-CONFIG_IP_VS_PROTO_ESP=y
-CONFIG_IP_VS_PROTO_AH=y
-
-#
-# IPVS scheduler
-#
-CONFIG_IP_VS_RR=m
-CONFIG_IP_VS_WRR=m
-CONFIG_IP_VS_LC=m
-CONFIG_IP_VS_WLC=m
-CONFIG_IP_VS_LBLC=m
-CONFIG_IP_VS_LBLCR=m
-CONFIG_IP_VS_DH=m
-CONFIG_IP_VS_SH=m
-CONFIG_IP_VS_SED=m
-CONFIG_IP_VS_NQ=m
-
-#
-# IPVS application helper
-#
-CONFIG_IP_VS_FTP=m
-CONFIG_IPV6=m
-CONFIG_IPV6_PRIVACY=y
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-# CONFIG_IP_NF_NETBIOS_NS is not set
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_SIP is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-CONFIG_BRIDGE_NF_EBTABLES=m
-CONFIG_BRIDGE_EBT_BROUTE=m
-CONFIG_BRIDGE_EBT_T_FILTER=m
-CONFIG_BRIDGE_EBT_T_NAT=m
-CONFIG_BRIDGE_EBT_802_3=m
-CONFIG_BRIDGE_EBT_AMONG=m
-CONFIG_BRIDGE_EBT_ARP=m
-CONFIG_BRIDGE_EBT_IP=m
-CONFIG_BRIDGE_EBT_LIMIT=m
-CONFIG_BRIDGE_EBT_MARK=m
-CONFIG_BRIDGE_EBT_PKTTYPE=m
-CONFIG_BRIDGE_EBT_STP=m
-CONFIG_BRIDGE_EBT_VLAN=m
-CONFIG_BRIDGE_EBT_ARPREPLY=m
-CONFIG_BRIDGE_EBT_DNAT=m
-CONFIG_BRIDGE_EBT_MARK_T=m
-CONFIG_BRIDGE_EBT_REDIRECT=m
-CONFIG_BRIDGE_EBT_SNAT=m
-CONFIG_BRIDGE_EBT_LOG=m
-# CONFIG_BRIDGE_EBT_ULOG is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_SCTP=m
-# CONFIG_SCTP_DBG_MSG is not set
-# CONFIG_SCTP_DBG_OBJCNT is not set
-# CONFIG_SCTP_HMAC_NONE is not set
-# CONFIG_SCTP_HMAC_SHA1 is not set
-CONFIG_SCTP_HMAC_MD5=y
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-CONFIG_ATM=m
-CONFIG_ATM_CLIP=m
-# CONFIG_ATM_CLIP_NO_ICMP is not set
-CONFIG_ATM_LANE=m
-# CONFIG_ATM_MPOA is not set
-CONFIG_ATM_BR2684=m
-# CONFIG_ATM_BR2684_IPFILTER is not set
-CONFIG_BRIDGE=m
-CONFIG_VLAN_8021Q=m
-# CONFIG_DECNET is not set
-CONFIG_LLC=m
-# CONFIG_LLC2 is not set
-CONFIG_IPX=m
-# CONFIG_IPX_INTERN is not set
-CONFIG_ATALK=m
-CONFIG_DEV_APPLETALK=m
-CONFIG_IPDDP=m
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-CONFIG_WAN_ROUTER=m
-
-#
-# QoS and/or fair queueing
-#
-CONFIG_NET_SCHED=y
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-
-#
-# Queueing/Scheduling
-#
-CONFIG_NET_SCH_CBQ=m
-CONFIG_NET_SCH_HTB=m
-CONFIG_NET_SCH_HFSC=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_NETEM=m
-CONFIG_NET_SCH_INGRESS=m
-
-#
-# Classification
-#
-CONFIG_NET_CLS=y
-# CONFIG_NET_CLS_BASIC is not set
-CONFIG_NET_CLS_TCINDEX=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_ROUTE=y
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_CLS_U32_PERF=y
-# CONFIG_CLS_U32_MARK is not set
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-# CONFIG_NET_EMATCH is not set
-# CONFIG_NET_CLS_ACT is not set
-CONFIG_NET_CLS_POLICE=y
-CONFIG_NET_CLS_IND=y
-CONFIG_NET_ESTIMATOR=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-CONFIG_IRDA=m
-
-#
-# IrDA protocols
-#
-CONFIG_IRLAN=m
-CONFIG_IRNET=m
-CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-
-#
-# IrDA options
-#
-CONFIG_IRDA_CACHE_LAST_LSAP=y
-CONFIG_IRDA_FAST_RR=y
-# CONFIG_IRDA_DEBUG is not set
-
-#
-# Infrared-port device drivers
-#
-
-#
-# SIR device drivers
-#
-CONFIG_IRTTY_SIR=m
-
-#
-# Dongle support
-#
-CONFIG_DONGLE=y
-CONFIG_ESI_DONGLE=m
-CONFIG_ACTISYS_DONGLE=m
-CONFIG_TEKRAM_DONGLE=m
-# CONFIG_TOIM3232_DONGLE is not set
-CONFIG_LITELINK_DONGLE=m
-CONFIG_MA600_DONGLE=m
-CONFIG_GIRBIL_DONGLE=m
-CONFIG_MCP2120_DONGLE=m
-CONFIG_OLD_BELKIN_DONGLE=m
-CONFIG_ACT200L_DONGLE=m
-
-#
-# Old SIR device drivers
-#
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-# CONFIG_NSC_FIR is not set
-# CONFIG_WINBOND_FIR is not set
-# CONFIG_SMC_IRCC_FIR is not set
-# CONFIG_ALI_FIR is not set
-# CONFIG_VIA_FIR is not set
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-CONFIG_BT_HIDP=m
-
-#
-# Bluetooth device drivers
-#
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIVHCI=m
-# CONFIG_IEEE80211 is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=m
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=m
-CONFIG_BLK_DEV_CRYPTOLOOP=m
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=16384
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-CONFIG_BLK_DEV_SR=m
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=m
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_FC_ATTRS=m
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-CONFIG_SCSI_SATA=m
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID10=m
-# CONFIG_MD_RAID456 is not set
-CONFIG_MD_MULTIPATH=m
-# CONFIG_MD_FAULTY is not set
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-# CONFIG_DM_MULTIPATH is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=m
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-# CONFIG_NET_WIRELESS_RTNETLINK is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_HOSTAP is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# ATM drivers
-#
-# CONFIG_ATM_DUMMY is not set
-CONFIG_ATM_TCP=m
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPPOE=m
-CONFIG_PPPOATM=m
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-CONFIG_NETCONSOLE=m
-CONFIG_NETPOLL=y
-# CONFIG_NETPOLL_RX is not set
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-CONFIG_HW_RANDOM=y
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-# CONFIG_USB_ARCH_HAS_HCD is not set
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Firmware Drivers
-#
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-CONFIG_REISERFS_PROC_INFO=y
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-# CONFIG_XFS_QUOTA is not set
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-# CONFIG_XFS_RT is not set
-# CONFIG_OCFS2_FS is not set
-CONFIG_MINIX_FS=m
-CONFIG_ROMFS_FS=m
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-CONFIG_QUOTA=y
-# CONFIG_QFMT_V1 is not set
-CONFIG_QFMT_V2=y
-CONFIG_QUOTACTL=y
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-CONFIG_AFFS_FS=m
-CONFIG_HFS_FS=m
-CONFIG_HFSPLUS_FS=m
-CONFIG_BEFS_FS=m
-# CONFIG_BEFS_DEBUG is not set
-CONFIG_BFS_FS=m
-CONFIG_EFS_FS=m
-CONFIG_CRAMFS=y
-CONFIG_VXFS_FS=m
-# CONFIG_HPFS_FS is not set
-CONFIG_QNX4FS_FS=m
-CONFIG_SYSV_FS=m
-CONFIG_UFS_FS=m
-# CONFIG_UFS_FS_WRITE is not set
-# CONFIG_UFS_DEBUG is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=m
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-CONFIG_RPCSEC_GSS_SPKM3=m
-CONFIG_SMB_FS=m
-# CONFIG_SMB_NLS_DEFAULT is not set
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-CONFIG_CIFS_XATTR=y
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-CONFIG_NCP_FS=m
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-CONFIG_NCPFS_SMALLDOS=y
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-CONFIG_OSF_PARTITION=y
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_MAC_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-CONFIG_MINIX_SUBPARTITION=y
-CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_UNIXWARE_DISKLABEL=y
-# CONFIG_LDM_PARTITION is not set
-CONFIG_SGI_PARTITION=y
-# CONFIG_ULTRIX_PARTITION is not set
-CONFIG_SUN_PARTITION=y
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="utf8"
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-CONFIG_NLS_CODEPAGE_1250=m
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_UTF8=m
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=15
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=y
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_X86_64 is not set
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-# CONFIG_CRYPTO_ANUBIS is not set
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-# CONFIG_XEN_PRIVILEGED_GUEST is not set
-CONFIG_XEN_UNPRIVILEGED_GUEST=y
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-# CONFIG_XEN_BACKEND is not set
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-CONFIG_XEN_SMPBOOT=y
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_PLIST=y
diff --git a/buildconfigs/linux-defconfig_xen_ia64 b/buildconfigs/linux-defconfig_xen_ia64
deleted file mode 100644 (file)
index 9e7292d..0000000
+++ /dev/null
@@ -1,1684 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Sun May  6 20:45:43 2007
-#
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_EMBEDDED is not set
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Processor type and features
-#
-CONFIG_IA64=y
-CONFIG_64BIT=y
-CONFIG_MMU=y
-CONFIG_SWIOTLB=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_TIME_INTERPOLATION=y
-CONFIG_DMI=y
-CONFIG_EFI=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_XEN=y
-CONFIG_XEN_IA64_VDSO_PARAVIRT=y
-CONFIG_XEN_IA64_EXPOSE_P2M=y
-CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_DMA_IS_DMA32=y
-CONFIG_AUDIT_ARCH=y
-CONFIG_IA64_GENERIC=y
-# CONFIG_IA64_DIG is not set
-# CONFIG_IA64_HP_ZX1 is not set
-# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
-# CONFIG_IA64_SGI_SN2 is not set
-# CONFIG_IA64_HP_SIM is not set
-# CONFIG_IA64_XEN is not set
-# CONFIG_ITANIUM is not set
-CONFIG_MCKINLEY=y
-# CONFIG_IA64_PAGE_SIZE_4KB is not set
-# CONFIG_IA64_PAGE_SIZE_8KB is not set
-CONFIG_IA64_PAGE_SIZE_16KB=y
-# CONFIG_IA64_PAGE_SIZE_64KB is not set
-CONFIG_PGTABLE_3=y
-# CONFIG_PGTABLE_4 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-CONFIG_IA64_L1_CACHE_SHIFT=7
-CONFIG_IA64_CYCLONE=y
-CONFIG_IOSAPIC=y
-# CONFIG_IA64_SGI_SN_XP is not set
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_SMP=y
-CONFIG_NR_CPUS=16
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-# CONFIG_SCHED_SMT is not set
-# CONFIG_PERMIT_BSP_REMOVE is not set
-# CONFIG_PREEMPT is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_FLATMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM_MANUAL=y
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_DISCONTIGMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_NEED_MULTIPLE_NODES=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MIGRATION is not set
-CONFIG_RESOURCES_64BIT=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
-CONFIG_NUMA=y
-CONFIG_NODES_SHIFT=10
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
-CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_HAVE_ARCH_NODEDATA_EXTENSION=y
-# CONFIG_IA32_SUPPORT is not set
-# CONFIG_IA64_MCA_RECOVERY is not set
-CONFIG_PERFMON=y
-CONFIG_IA64_PALINFO=y
-CONFIG_SGI_SN=y
-
-#
-# SN Devices
-#
-# CONFIG_SGI_IOC3 is not set
-
-#
-# Firmware Drivers
-#
-CONFIG_EFI_VARS=y
-CONFIG_EFI_PCDP=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-
-#
-# Power management and ACPI
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_HOTPLUG_CPU=y
-CONFIG_ACPI_THERMAL=y
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_CONTAINER=y
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-CONFIG_HOTPLUG_PCI_ACPI=y
-# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-# CONFIG_HOTPLUG_PCI_SGI is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-CONFIG_ARPD=y
-CONFIG_SYN_COOKIES=y
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_NETWORK_SECMARK is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NF_CONNTRACK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_IP_NF_CONNTRACK is not set
-# CONFIG_IP_NF_QUEUE is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-CONFIG_BRIDGE=y
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_CPQ_DA is not set
-CONFIG_BLK_CPQ_CISS_DA=y
-# CONFIG_CISS_SCSI_TAPE is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_CRYPTOLOOP=y
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_IDE_MAX_HWIFS=4
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_IDEFLOPPY=y
-CONFIG_BLK_DEV_IDESCSI=y
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-CONFIG_BLK_DEV_CMD64X=y
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=y
-CONFIG_CHR_DEV_OSST=y
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-CONFIG_SCSI_SAS_ATTRS=y
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# CONFIG_SCSI_IPR is not set
-CONFIG_SCSI_QLOGIC_1280=y
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=y
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-# CONFIG_FUSION_FC is not set
-CONFIG_FUSION_SAS=y
-CONFIG_FUSION_MAX_SGE=128
-# CONFIG_FUSION_CTL is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=y
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=y
-
-#
-# ARCnet devices
-#
-CONFIG_ARCNET=y
-# CONFIG_ARCNET_1201 is not set
-# CONFIG_ARCNET_1051 is not set
-# CONFIG_ARCNET_RAW is not set
-# CONFIG_ARCNET_CAP is not set
-# CONFIG_ARCNET_COM90xx is not set
-# CONFIG_ARCNET_COM90xxIO is not set
-# CONFIG_ARCNET_RIM_I is not set
-# CONFIG_ARCNET_COM20020 is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=y
-CONFIG_TULIP_MWI=y
-CONFIG_TULIP_MMIO=y
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-# CONFIG_DE4X5 is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_DM9102 is not set
-# CONFIG_ULI526X is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_DGRS is not set
-CONFIG_EEPRO100=y
-CONFIG_E100=y
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-CONFIG_E1000=y
-# CONFIG_E1000_NAPI is not set
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-CONFIG_TIGON3=y
-# CONFIG_BNX2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL=y
-# CONFIG_NETPOLL_RX is not set
-# CONFIG_NETPOLL_TRAP is not set
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-CONFIG_ISDN=m
-
-#
-# Old ISDN4Linux
-#
-# CONFIG_ISDN_I4L is not set
-
-#
-# CAPI subsystem
-#
-# CONFIG_ISDN_CAPI is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=y
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-CONFIG_GAMEPORT=y
-# CONFIG_GAMEPORT_NS558 is not set
-# CONFIG_GAMEPORT_L4 is not set
-# CONFIG_GAMEPORT_EMU10K1 is not set
-# CONFIG_GAMEPORT_FM801 is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-CONFIG_SERIAL_NONSTANDARD=y
-# CONFIG_COMPUTONE is not set
-# CONFIG_ROCKETPORT is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_MOXA_INTELLIO is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_ISI is not set
-# CONFIG_SYNCLINKMP is not set
-# CONFIG_SYNCLINK_GT is not set
-# CONFIG_N_HDLC is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_RIO is not set
-# CONFIG_STALDRV is not set
-# CONFIG_SGI_SNSC is not set
-# CONFIG_SGI_TIOCX is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_SGI_L1_CONSOLE is not set
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_EFI_RTC=y
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_VIA is not set
-CONFIG_AGP_I460=y
-# CONFIG_AGP_HP_ZX1 is not set
-# CONFIG_AGP_SGI_TIOCA is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-# CONFIG_MMTIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-CONFIG_I2C_ALGOPCF=y
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=y
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video Capture Adapters
-#
-
-#
-# Video Capture Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_CX88 is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_MATROX is not set
-CONFIG_FB_RADEON=y
-CONFIG_FB_RADEON_I2C=y
-CONFIG_FB_RADEON_DEBUG=y
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-CONFIG_LOGO_LINUX_CLUT224=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=y
-CONFIG_SND_RAWMIDI=y
-CONFIG_SND_SEQUENCER=y
-CONFIG_SND_SEQ_DUMMY=y
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_MPU401_UART=y
-CONFIG_SND_OPL3_LIB=y
-CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_AC97_BUS=y
-CONFIG_SND_DUMMY=y
-CONFIG_SND_VIRMIDI=y
-# CONFIG_SND_MTPAV is not set
-CONFIG_SND_SERIAL_U16550=y
-CONFIG_SND_MPU401=y
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALI5451 is not set
-CONFIG_SND_ATIIXP=y
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-CONFIG_SND_FM801=y
-# CONFIG_SND_FM801_TEA575X_BOOL is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-
-#
-# Open Sound System
-#
-CONFIG_SOUND_PRIME=y
-# CONFIG_OSS_OBSOLETE_DRIVER is not set
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_ES1371 is not set
-# CONFIG_SOUND_ICH is not set
-# CONFIG_SOUND_TRIDENT is not set
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
-# CONFIG_SOUND_VIA82CXXX is not set
-# CONFIG_SOUND_TVMIXER is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-CONFIG_USB_BANDWIDTH=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-CONFIG_USB_HIDDEV=y
-# CONFIG_USB_AIPTEK is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=y
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-CONFIG_SUNRPC_GSS=y
-CONFIG_RPCSEC_GSS_KRB5=y
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=y
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=y
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-CONFIG_SGI_PARTITION=y
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_737=y
-CONFIG_NLS_CODEPAGE_775=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_CODEPAGE_852=y
-CONFIG_NLS_CODEPAGE_855=y
-CONFIG_NLS_CODEPAGE_857=y
-CONFIG_NLS_CODEPAGE_860=y
-CONFIG_NLS_CODEPAGE_861=y
-CONFIG_NLS_CODEPAGE_862=y
-CONFIG_NLS_CODEPAGE_863=y
-CONFIG_NLS_CODEPAGE_864=y
-CONFIG_NLS_CODEPAGE_865=y
-CONFIG_NLS_CODEPAGE_866=y
-CONFIG_NLS_CODEPAGE_869=y
-CONFIG_NLS_CODEPAGE_936=y
-CONFIG_NLS_CODEPAGE_950=y
-CONFIG_NLS_CODEPAGE_932=y
-CONFIG_NLS_CODEPAGE_949=y
-CONFIG_NLS_CODEPAGE_874=y
-CONFIG_NLS_ISO8859_8=y
-# CONFIG_NLS_CODEPAGE_1250 is not set
-CONFIG_NLS_CODEPAGE_1251=y
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_2=y
-CONFIG_NLS_ISO8859_3=y
-CONFIG_NLS_ISO8859_4=y
-CONFIG_NLS_ISO8859_5=y
-CONFIG_NLS_ISO8859_6=y
-CONFIG_NLS_ISO8859_7=y
-CONFIG_NLS_ISO8859_9=y
-CONFIG_NLS_ISO8859_13=y
-CONFIG_NLS_ISO8859_14=y
-CONFIG_NLS_ISO8859_15=y
-CONFIG_NLS_KOI8_R=y
-CONFIG_NLS_KOI8_U=y
-CONFIG_NLS_UTF8=y
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_IRQ_PER_CPU=y
-
-#
-# HP Simulator drivers
-#
-# CONFIG_HP_SIMETH is not set
-# CONFIG_HP_SIMSERIAL is not set
-# CONFIG_HP_SIMSCSI is not set
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=20
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_IA64_GRANULE_16MB=y
-# CONFIG_IA64_GRANULE_64MB is not set
-CONFIG_IA64_PRINT_HAZARDS=y
-# CONFIG_DISABLE_VHPT is not set
-# CONFIG_IA64_DEBUG_CMPXCHG is not set
-# CONFIG_IA64_DEBUG_IRQ is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=y
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=y
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-# CONFIG_XEN_SMPBOOT is not set
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=y
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
-CONFIG_XEN_PCIDEV_BACKEND_SLOT=y
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_FRAMEBUFFER=y
-CONFIG_XEN_KEYBOARD=y
-# CONFIG_XEN_SCRUB_PAGES is not set
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT=0x030002
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
diff --git a/buildconfigs/linux-defconfig_xen_x86_32 b/buildconfigs/linux-defconfig_xen_x86_32
deleted file mode 100644 (file)
index 1c94915..0000000
+++ /dev/null
@@ -1,3311 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xen
-# Wed Jan 17 18:39:50 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_BSD_PROCESS_ACCT_V3=y
-CONFIG_TASKSTATS=y
-CONFIG_TASK_DELAY_ACCT=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_CPUSETS=y
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-CONFIG_DEFAULT_CFQ=y
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="cfq"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-# CONFIG_X86_PC is not set
-CONFIG_X86_XEN=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_M386 is not set
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-CONFIG_M686=y
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_XADD=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_INTEL_USERCOPY=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_NR_CPUS=32
-# CONFIG_PREEMPT_NONE is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-CONFIG_MICROCODE=y
-CONFIG_X86_CPUID=m
-CONFIG_SWIOTLB=y
-
-#
-# Firmware Drivers
-#
-CONFIG_DELL_RBU=m
-CONFIG_DCDBAS=m
-# CONFIG_NOHIGHMEM is not set
-CONFIG_HIGHMEM4G=y
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_HIGHMEM=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-# CONFIG_HIGHPTE is not set
-CONFIG_MTRR=y
-CONFIG_REGPARM=y
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-CONFIG_KEXEC=y
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x100000
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_VIDEO=m
-CONFIG_ACPI_HOTKEY=m
-CONFIG_ACPI_FAN=m
-CONFIG_ACPI_DOCK=m
-CONFIG_ACPI_PROCESSOR=m
-CONFIG_ACPI_HOTPLUG_CPU=y
-CONFIG_ACPI_THERMAL=m
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_IBM=m
-CONFIG_ACPI_TOSHIBA=m
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_CONTAINER=m
-CONFIG_ACPI_SBS=m
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-# CONFIG_PCI_GOXEN_FE is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-CONFIG_ISA_DMA_API=y
-CONFIG_SCx200=m
-CONFIG_SCx200HR_TIMER=m
-CONFIG_K8_NB=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-CONFIG_PCCARD=m
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=m
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_PCMCIA_IOCTL=y
-CONFIG_CARDBUS=y
-
-#
-# PC-card bridges
-#
-CONFIG_YENTA=m
-CONFIG_YENTA_O2=y
-CONFIG_YENTA_RICOH=y
-CONFIG_YENTA_TI=y
-CONFIG_YENTA_ENE_TUNE=y
-CONFIG_YENTA_TOSHIBA=y
-CONFIG_PD6729=m
-CONFIG_I82092=m
-CONFIG_PCCARD_NONSTATIC=m
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=m
-CONFIG_HOTPLUG_PCI_FAKE=m
-CONFIG_HOTPLUG_PCI_ACPI=m
-CONFIG_HOTPLUG_PCI_ACPI_IBM=m
-CONFIG_HOTPLUG_PCI_CPCI=y
-CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
-CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
-CONFIG_HOTPLUG_PCI_SHPC=m
-# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_AOUT=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=m
-CONFIG_NET_IPGRE=m
-CONFIG_NET_IPGRE_BROADCAST=y
-CONFIG_IP_MROUTE=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_XFRM_TUNNEL=m
-CONFIG_INET_TUNNEL=m
-CONFIG_INET_XFRM_MODE_TRANSPORT=m
-CONFIG_INET_XFRM_MODE_TUNNEL=m
-CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-CONFIG_TCP_CONG_ADVANCED=y
-
-#
-# TCP congestion control
-#
-CONFIG_TCP_CONG_BIC=m
-CONFIG_TCP_CONG_CUBIC=m
-CONFIG_TCP_CONG_WESTWOOD=m
-CONFIG_TCP_CONG_HTCP=m
-CONFIG_TCP_CONG_HSTCP=m
-CONFIG_TCP_CONG_HYBLA=m
-CONFIG_TCP_CONG_VEGAS=m
-CONFIG_TCP_CONG_SCALABLE=m
-CONFIG_TCP_CONG_LP=m
-CONFIG_TCP_CONG_VENO=m
-
-#
-# IP: Virtual Server Configuration
-#
-CONFIG_IP_VS=m
-# CONFIG_IP_VS_DEBUG is not set
-CONFIG_IP_VS_TAB_BITS=12
-
-#
-# IPVS transport protocol load balancing support
-#
-CONFIG_IP_VS_PROTO_TCP=y
-CONFIG_IP_VS_PROTO_UDP=y
-CONFIG_IP_VS_PROTO_ESP=y
-CONFIG_IP_VS_PROTO_AH=y
-
-#
-# IPVS scheduler
-#
-CONFIG_IP_VS_RR=m
-CONFIG_IP_VS_WRR=m
-CONFIG_IP_VS_LC=m
-CONFIG_IP_VS_WLC=m
-CONFIG_IP_VS_LBLC=m
-CONFIG_IP_VS_LBLCR=m
-CONFIG_IP_VS_DH=m
-CONFIG_IP_VS_SH=m
-CONFIG_IP_VS_SED=m
-CONFIG_IP_VS_NQ=m
-
-#
-# IPVS application helper
-#
-CONFIG_IP_VS_FTP=m
-CONFIG_IPV6=m
-CONFIG_IPV6_PRIVACY=y
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETWORK_SECMARK=y
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-CONFIG_NETFILTER_NETLINK=m
-CONFIG_NETFILTER_NETLINK_QUEUE=m
-CONFIG_NETFILTER_NETLINK_LOG=m
-CONFIG_NETFILTER_XTABLES=m
-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
-CONFIG_NETFILTER_XT_TARGET_MARK=m
-CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
-CONFIG_NETFILTER_XT_TARGET_SECMARK=m
-# CONFIG_NETFILTER_XT_TARGET_CONNSECMARK is not set
-CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
-CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
-CONFIG_NETFILTER_XT_MATCH_DCCP=m
-CONFIG_NETFILTER_XT_MATCH_ESP=m
-CONFIG_NETFILTER_XT_MATCH_HELPER=m
-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-CONFIG_NETFILTER_XT_MATCH_MAC=m
-CONFIG_NETFILTER_XT_MATCH_MARK=m
-CONFIG_NETFILTER_XT_MATCH_POLICY=m
-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
-CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-CONFIG_NETFILTER_XT_MATCH_REALM=m
-CONFIG_NETFILTER_XT_MATCH_SCTP=m
-CONFIG_NETFILTER_XT_MATCH_STATE=m
-CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-CONFIG_NETFILTER_XT_MATCH_STRING=m
-CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK_SECMARK=y
-CONFIG_IP_NF_CONNTRACK_EVENTS=y
-CONFIG_IP_NF_CONNTRACK_NETLINK=m
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-CONFIG_IP_NF_NETBIOS_NS=m
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-CONFIG_IP_NF_PPTP=m
-CONFIG_IP_NF_H323=m
-CONFIG_IP_NF_SIP=m
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_NAT_PPTP=m
-CONFIG_IP_NF_NAT_H323=m
-CONFIG_IP_NF_NAT_SIP=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_TARGET_CLUSTERIP=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-CONFIG_IP6_NF_QUEUE=m
-CONFIG_IP6_NF_IPTABLES=m
-CONFIG_IP6_NF_MATCH_RT=m
-CONFIG_IP6_NF_MATCH_OPTS=m
-CONFIG_IP6_NF_MATCH_FRAG=m
-CONFIG_IP6_NF_MATCH_HL=m
-CONFIG_IP6_NF_MATCH_OWNER=m
-CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-CONFIG_IP6_NF_MATCH_AH=m
-CONFIG_IP6_NF_MATCH_EUI64=m
-CONFIG_IP6_NF_FILTER=m
-CONFIG_IP6_NF_TARGET_LOG=m
-CONFIG_IP6_NF_TARGET_REJECT=m
-CONFIG_IP6_NF_MANGLE=m
-CONFIG_IP6_NF_TARGET_HL=m
-CONFIG_IP6_NF_RAW=m
-
-#
-# DECnet: Netfilter Configuration
-#
-CONFIG_DECNET_NF_GRABULATOR=m
-
-#
-# Bridge: Netfilter Configuration
-#
-CONFIG_BRIDGE_NF_EBTABLES=m
-CONFIG_BRIDGE_EBT_BROUTE=m
-CONFIG_BRIDGE_EBT_T_FILTER=m
-CONFIG_BRIDGE_EBT_T_NAT=m
-CONFIG_BRIDGE_EBT_802_3=m
-CONFIG_BRIDGE_EBT_AMONG=m
-CONFIG_BRIDGE_EBT_ARP=m
-CONFIG_BRIDGE_EBT_IP=m
-CONFIG_BRIDGE_EBT_LIMIT=m
-CONFIG_BRIDGE_EBT_MARK=m
-CONFIG_BRIDGE_EBT_PKTTYPE=m
-CONFIG_BRIDGE_EBT_STP=m
-CONFIG_BRIDGE_EBT_VLAN=m
-CONFIG_BRIDGE_EBT_ARPREPLY=m
-CONFIG_BRIDGE_EBT_DNAT=m
-CONFIG_BRIDGE_EBT_MARK_T=m
-CONFIG_BRIDGE_EBT_REDIRECT=m
-CONFIG_BRIDGE_EBT_SNAT=m
-CONFIG_BRIDGE_EBT_LOG=m
-CONFIG_BRIDGE_EBT_ULOG=m
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_DCCP=m
-CONFIG_INET_DCCP_DIAG=m
-CONFIG_IP_DCCP_ACKVEC=y
-
-#
-# DCCP CCIDs Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_DCCP_CCID2=m
-CONFIG_IP_DCCP_CCID3=m
-CONFIG_IP_DCCP_TFRC_LIB=m
-
-#
-# DCCP Kernel Hacking
-#
-# CONFIG_IP_DCCP_DEBUG is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_SCTP=m
-# CONFIG_SCTP_DBG_MSG is not set
-# CONFIG_SCTP_DBG_OBJCNT is not set
-# CONFIG_SCTP_HMAC_NONE is not set
-# CONFIG_SCTP_HMAC_SHA1 is not set
-CONFIG_SCTP_HMAC_MD5=y
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-CONFIG_ATM=m
-CONFIG_ATM_CLIP=m
-CONFIG_ATM_CLIP_NO_ICMP=y
-CONFIG_ATM_LANE=m
-CONFIG_ATM_MPOA=m
-CONFIG_ATM_BR2684=m
-# CONFIG_ATM_BR2684_IPFILTER is not set
-CONFIG_BRIDGE=m
-CONFIG_VLAN_8021Q=m
-CONFIG_DECNET=m
-CONFIG_DECNET_ROUTER=y
-CONFIG_DECNET_ROUTE_FWMARK=y
-CONFIG_LLC=y
-CONFIG_LLC2=m
-CONFIG_IPX=m
-# CONFIG_IPX_INTERN is not set
-CONFIG_ATALK=m
-CONFIG_DEV_APPLETALK=m
-CONFIG_IPDDP=m
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
-CONFIG_X25=m
-CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
-CONFIG_WAN_ROUTER=m
-
-#
-# QoS and/or fair queueing
-#
-CONFIG_NET_SCHED=y
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-
-#
-# Queueing/Scheduling
-#
-CONFIG_NET_SCH_CBQ=m
-CONFIG_NET_SCH_HTB=m
-CONFIG_NET_SCH_HFSC=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_NETEM=m
-CONFIG_NET_SCH_INGRESS=m
-
-#
-# Classification
-#
-CONFIG_NET_CLS=y
-CONFIG_NET_CLS_BASIC=m
-CONFIG_NET_CLS_TCINDEX=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_ROUTE=y
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_CLS_U32_PERF=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_EMATCH=y
-CONFIG_NET_EMATCH_STACK=32
-CONFIG_NET_EMATCH_CMP=m
-CONFIG_NET_EMATCH_NBYTE=m
-CONFIG_NET_EMATCH_U32=m
-CONFIG_NET_EMATCH_META=m
-CONFIG_NET_EMATCH_TEXT=m
-# CONFIG_NET_CLS_ACT is not set
-CONFIG_NET_CLS_POLICE=y
-# CONFIG_NET_CLS_IND is not set
-CONFIG_NET_ESTIMATOR=y
-
-#
-# Network testing
-#
-CONFIG_NET_PKTGEN=m
-CONFIG_HAMRADIO=y
-
-#
-# Packet Radio protocols
-#
-CONFIG_AX25=m
-# CONFIG_AX25_DAMA_SLAVE is not set
-CONFIG_NETROM=m
-CONFIG_ROSE=m
-
-#
-# AX.25 network device drivers
-#
-CONFIG_MKISS=m
-CONFIG_6PACK=m
-CONFIG_BPQETHER=m
-CONFIG_BAYCOM_SER_FDX=m
-CONFIG_BAYCOM_SER_HDX=m
-CONFIG_BAYCOM_PAR=m
-CONFIG_BAYCOM_EPP=m
-CONFIG_YAM=m
-CONFIG_IRDA=m
-
-#
-# IrDA protocols
-#
-CONFIG_IRLAN=m
-CONFIG_IRNET=m
-CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-
-#
-# IrDA options
-#
-CONFIG_IRDA_CACHE_LAST_LSAP=y
-CONFIG_IRDA_FAST_RR=y
-CONFIG_IRDA_DEBUG=y
-
-#
-# Infrared-port device drivers
-#
-
-#
-# SIR device drivers
-#
-CONFIG_IRTTY_SIR=m
-
-#
-# Dongle support
-#
-CONFIG_DONGLE=y
-CONFIG_ESI_DONGLE=m
-CONFIG_ACTISYS_DONGLE=m
-CONFIG_TEKRAM_DONGLE=m
-CONFIG_TOIM3232_DONGLE=m
-CONFIG_LITELINK_DONGLE=m
-CONFIG_MA600_DONGLE=m
-CONFIG_GIRBIL_DONGLE=m
-CONFIG_MCP2120_DONGLE=m
-CONFIG_OLD_BELKIN_DONGLE=m
-CONFIG_ACT200L_DONGLE=m
-
-#
-# Old SIR device drivers
-#
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-CONFIG_SIGMATEL_FIR=m
-CONFIG_NSC_FIR=m
-CONFIG_WINBOND_FIR=m
-CONFIG_TOSHIBA_FIR=m
-CONFIG_SMC_IRCC_FIR=m
-CONFIG_ALI_FIR=m
-CONFIG_VLSI_FIR=m
-CONFIG_VIA_FIR=m
-CONFIG_MCS_FIR=m
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-CONFIG_BT_CMTP=m
-CONFIG_BT_HIDP=m
-
-#
-# Bluetooth device drivers
-#
-CONFIG_BT_HCIUSB=m
-CONFIG_BT_HCIUSB_SCO=y
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBPA10X=m
-CONFIG_BT_HCIBFUSB=m
-CONFIG_BT_HCIDTL1=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=m
-CONFIG_BT_HCIVHCI=m
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-CONFIG_IEEE80211_SOFTMAC=m
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=m
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-CONFIG_CONNECTOR=m
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=m
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=m
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_REDBOOT_PARTS=m
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# CONFIG_MTD_CMDLINE_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=m
-CONFIG_MTD_BLOCK=m
-CONFIG_MTD_BLOCK_RO=m
-CONFIG_FTL=m
-CONFIG_NFTL=m
-CONFIG_NFTL_RW=y
-CONFIG_INFTL=m
-CONFIG_RFD_FTL=m
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=m
-CONFIG_MTD_JEDECPROBE=m
-CONFIG_MTD_GEN_PROBE=m
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_CFI_INTELEXT=m
-CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
-CONFIG_MTD_RAM=m
-CONFIG_MTD_ROM=m
-CONFIG_MTD_ABSENT=m
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_PHYSMAP=m
-CONFIG_MTD_PHYSMAP_START=0x8000000
-CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-CONFIG_MTD_PNC2000=m
-CONFIG_MTD_SC520CDP=m
-CONFIG_MTD_NETSC520=m
-CONFIG_MTD_TS5500=m
-CONFIG_MTD_SBC_GXX=m
-CONFIG_MTD_SCx200_DOCFLASH=m
-CONFIG_MTD_AMD76XROM=m
-CONFIG_MTD_ICHXROM=m
-CONFIG_MTD_SCB2_FLASH=m
-CONFIG_MTD_NETtel=m
-CONFIG_MTD_DILNETPC=m
-CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000
-CONFIG_MTD_L440GX=m
-CONFIG_MTD_PCI=m
-CONFIG_MTD_PLATRAM=m
-
-#
-# Self-contained MTD device drivers
-#
-CONFIG_MTD_PMC551=m
-# CONFIG_MTD_PMC551_BUGFIX is not set
-# CONFIG_MTD_PMC551_DEBUG is not set
-CONFIG_MTD_DATAFLASH=m
-CONFIG_MTD_M25P80=m
-CONFIG_MTD_SLRAM=m
-CONFIG_MTD_PHRAM=m
-CONFIG_MTD_MTDRAM=m
-CONFIG_MTDRAM_TOTAL_SIZE=4096
-CONFIG_MTDRAM_ERASE_SIZE=128
-CONFIG_MTD_BLOCK2MTD=m
-
-#
-# Disk-On-Chip Device Drivers
-#
-CONFIG_MTD_DOC2000=m
-CONFIG_MTD_DOC2001=m
-CONFIG_MTD_DOC2001PLUS=m
-CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
-# CONFIG_MTD_DOCPROBE_ADVANCED is not set
-CONFIG_MTD_DOCPROBE_ADDRESS=0
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=m
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-CONFIG_MTD_NAND_IDS=m
-CONFIG_MTD_NAND_DISKONCHIP=m
-# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
-CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
-CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y
-CONFIG_MTD_NAND_NANDSIM=m
-
-#
-# OneNAND Flash Device Drivers
-#
-CONFIG_MTD_ONENAND=m
-# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND_OTP is not set
-
-#
-# Parallel port support
-#
-CONFIG_PARPORT=m
-CONFIG_PARPORT_PC=m
-CONFIG_PARPORT_SERIAL=m
-CONFIG_PARPORT_PC_FIFO=y
-CONFIG_PARPORT_PC_SUPERIO=y
-CONFIG_PARPORT_PC_PCMCIA=m
-CONFIG_PARPORT_NOT_PC=y
-# CONFIG_PARPORT_GSC is not set
-CONFIG_PARPORT_AX88796=m
-CONFIG_PARPORT_1284=y
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-CONFIG_PARIDE=m
-CONFIG_PARIDE_PARPORT=m
-
-#
-# Parallel IDE high-level drivers
-#
-CONFIG_PARIDE_PD=m
-CONFIG_PARIDE_PCD=m
-CONFIG_PARIDE_PF=m
-CONFIG_PARIDE_PT=m
-CONFIG_PARIDE_PG=m
-
-#
-# Parallel IDE protocol modules
-#
-CONFIG_PARIDE_ATEN=m
-CONFIG_PARIDE_BPCK=m
-CONFIG_PARIDE_BPCK6=m
-CONFIG_PARIDE_COMM=m
-CONFIG_PARIDE_DSTR=m
-CONFIG_PARIDE_FIT2=m
-CONFIG_PARIDE_FIT3=m
-CONFIG_PARIDE_EPAT=m
-CONFIG_PARIDE_EPATC8=y
-CONFIG_PARIDE_EPIA=m
-CONFIG_PARIDE_FRIQ=m
-CONFIG_PARIDE_FRPW=m
-CONFIG_PARIDE_KBIC=m
-CONFIG_PARIDE_KTTI=m
-CONFIG_PARIDE_ON20=m
-CONFIG_PARIDE_ON26=m
-CONFIG_BLK_CPQ_DA=m
-CONFIG_BLK_CPQ_CISS_DA=m
-CONFIG_CISS_SCSI_TAPE=y
-CONFIG_BLK_DEV_DAC960=m
-CONFIG_BLK_DEV_UMEM=m
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_CRYPTOLOOP=m
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_SX8=m
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=16384
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_CDROM_PKTCDVD_BUFFERS=8
-CONFIG_CDROM_PKTCDVD_WCACHE=y
-CONFIG_ATA_OVER_ETH=m
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=m
-CONFIG_IDEDISK_MULTI_MODE=y
-CONFIG_BLK_DEV_IDECS=m
-CONFIG_BLK_DEV_IDECD=m
-CONFIG_BLK_DEV_IDETAPE=m
-CONFIG_BLK_DEV_IDEFLOPPY=m
-CONFIG_BLK_DEV_IDESCSI=m
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=m
-CONFIG_BLK_DEV_CMD640=y
-CONFIG_BLK_DEV_CMD640_ENHANCED=y
-CONFIG_BLK_DEV_IDEPNP=y
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-CONFIG_BLK_DEV_OFFBOARD=y
-CONFIG_BLK_DEV_GENERIC=y
-CONFIG_BLK_DEV_OPTI621=m
-CONFIG_BLK_DEV_RZ1000=m
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-CONFIG_BLK_DEV_AEC62XX=m
-CONFIG_BLK_DEV_ALI15X3=m
-# CONFIG_WDC_ALI15X3 is not set
-CONFIG_BLK_DEV_AMD74XX=m
-CONFIG_BLK_DEV_ATIIXP=m
-CONFIG_BLK_DEV_CMD64X=m
-CONFIG_BLK_DEV_TRIFLEX=m
-CONFIG_BLK_DEV_CY82C693=m
-CONFIG_BLK_DEV_CS5520=m
-CONFIG_BLK_DEV_CS5530=m
-CONFIG_BLK_DEV_CS5535=m
-CONFIG_BLK_DEV_HPT34X=m
-CONFIG_HPT34X_AUTODMA=y
-CONFIG_BLK_DEV_HPT366=m
-CONFIG_BLK_DEV_SC1200=m
-CONFIG_BLK_DEV_PIIX=m
-CONFIG_BLK_DEV_IT821X=m
-CONFIG_BLK_DEV_NS87415=m
-CONFIG_BLK_DEV_PDC202XX_OLD=m
-CONFIG_PDC202XX_BURST=y
-CONFIG_BLK_DEV_PDC202XX_NEW=m
-CONFIG_BLK_DEV_SVWKS=m
-CONFIG_BLK_DEV_SIIMAGE=m
-CONFIG_BLK_DEV_SIS5513=m
-CONFIG_BLK_DEV_SLC90E66=m
-CONFIG_BLK_DEV_TRM290=m
-CONFIG_BLK_DEV_VIA82CXXX=m
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-CONFIG_RAID_ATTRS=m
-CONFIG_SCSI=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-CONFIG_BLK_DEV_SR=m
-# CONFIG_BLK_DEV_SR_VENDOR is not set
-CONFIG_CHR_DEV_SG=m
-CONFIG_CHR_DEV_SCH=m
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_FC_ATTRS=m
-CONFIG_SCSI_ISCSI_ATTRS=m
-CONFIG_SCSI_SAS_ATTRS=m
-
-#
-# SCSI low-level drivers
-#
-CONFIG_ISCSI_TCP=m
-CONFIG_BLK_DEV_3W_XXXX_RAID=m
-CONFIG_SCSI_3W_9XXX=m
-CONFIG_SCSI_ACARD=m
-CONFIG_SCSI_AACRAID=m
-CONFIG_SCSI_AIC7XXX=m
-CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
-CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-CONFIG_AIC7XXX_DEBUG_ENABLE=y
-CONFIG_AIC7XXX_DEBUG_MASK=0
-CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_AIC7XXX_OLD=m
-CONFIG_SCSI_AIC79XX=m
-CONFIG_AIC79XX_CMDS_PER_DEVICE=32
-CONFIG_AIC79XX_RESET_DELAY_MS=15000
-CONFIG_AIC79XX_ENABLE_RD_STRM=y
-CONFIG_AIC79XX_DEBUG_ENABLE=y
-CONFIG_AIC79XX_DEBUG_MASK=0
-CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_DPT_I2O=m
-CONFIG_SCSI_ADVANSYS=m
-CONFIG_MEGARAID_NEWGEN=y
-CONFIG_MEGARAID_MM=m
-CONFIG_MEGARAID_MAILBOX=m
-CONFIG_MEGARAID_LEGACY=m
-CONFIG_MEGARAID_SAS=m
-CONFIG_SCSI_SATA=m
-CONFIG_SCSI_SATA_AHCI=m
-CONFIG_SCSI_SATA_SVW=m
-CONFIG_SCSI_ATA_PIIX=m
-CONFIG_SCSI_SATA_MV=m
-CONFIG_SCSI_SATA_NV=m
-CONFIG_SCSI_PDC_ADMA=m
-CONFIG_SCSI_HPTIOP=m
-CONFIG_SCSI_SATA_QSTOR=m
-CONFIG_SCSI_SATA_PROMISE=m
-CONFIG_SCSI_SATA_SX4=m
-CONFIG_SCSI_SATA_SIL=m
-CONFIG_SCSI_SATA_SIL24=m
-CONFIG_SCSI_SATA_SIS=m
-CONFIG_SCSI_SATA_ULI=m
-CONFIG_SCSI_SATA_VIA=m
-CONFIG_SCSI_SATA_VITESSE=m
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-CONFIG_SCSI_BUSLOGIC=m
-# CONFIG_SCSI_OMIT_FLASHPOINT is not set
-CONFIG_SCSI_DMX3191D=m
-CONFIG_SCSI_EATA=m
-CONFIG_SCSI_EATA_TAGGED_QUEUE=y
-CONFIG_SCSI_EATA_LINKED_COMMANDS=y
-CONFIG_SCSI_EATA_MAX_TAGS=16
-CONFIG_SCSI_FUTURE_DOMAIN=m
-CONFIG_SCSI_GDTH=m
-CONFIG_SCSI_IPS=m
-CONFIG_SCSI_INITIO=m
-CONFIG_SCSI_INIA100=m
-CONFIG_SCSI_PPA=m
-CONFIG_SCSI_IMM=m
-# CONFIG_SCSI_IZIP_EPP16 is not set
-# CONFIG_SCSI_IZIP_SLOW_CTR is not set
-CONFIG_SCSI_SYM53C8XX_2=m
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-CONFIG_SCSI_IPR=m
-CONFIG_SCSI_IPR_TRACE=y
-CONFIG_SCSI_IPR_DUMP=y
-CONFIG_SCSI_QLOGIC_1280=m
-CONFIG_SCSI_QLA_FC=m
-CONFIG_SCSI_LPFC=m
-CONFIG_SCSI_DC395x=m
-CONFIG_SCSI_DC390T=m
-CONFIG_SCSI_NSP32=m
-CONFIG_SCSI_DEBUG=m
-
-#
-# PCMCIA SCSI adapter support
-#
-CONFIG_PCMCIA_AHA152X=m
-CONFIG_PCMCIA_FDOMAIN=m
-CONFIG_PCMCIA_NINJA_SCSI=m
-CONFIG_PCMCIA_QLOGIC=m
-CONFIG_PCMCIA_SYM53C500=m
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID10=m
-CONFIG_MD_RAID456=m
-CONFIG_MD_RAID5_RESHAPE=y
-CONFIG_MD_MULTIPATH=m
-CONFIG_MD_FAULTY=m
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=m
-CONFIG_FUSION_FC=m
-CONFIG_FUSION_SAS=m
-CONFIG_FUSION_MAX_SGE=128
-CONFIG_FUSION_CTL=m
-CONFIG_FUSION_LAN=m
-
-#
-# IEEE 1394 (FireWire) support
-#
-CONFIG_IEEE1394=m
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
-CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y
-CONFIG_IEEE1394_CONFIG_ROM_IP1394=y
-CONFIG_IEEE1394_EXPORT_FULL_API=y
-
-#
-# Device Drivers
-#
-CONFIG_IEEE1394_PCILYNX=m
-CONFIG_IEEE1394_OHCI1394=m
-
-#
-# Protocol Drivers
-#
-CONFIG_IEEE1394_VIDEO1394=m
-CONFIG_IEEE1394_SBP2=m
-# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
-CONFIG_IEEE1394_ETH1394=m
-CONFIG_IEEE1394_DV1394=m
-CONFIG_IEEE1394_RAWIO=m
-
-#
-# I2O device support
-#
-CONFIG_I2O=m
-CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
-CONFIG_I2O_EXT_ADAPTEC=y
-CONFIG_I2O_EXT_ADAPTEC_DMA64=y
-CONFIG_I2O_CONFIG=m
-CONFIG_I2O_CONFIG_OLD_IOCTL=y
-CONFIG_I2O_BUS=m
-CONFIG_I2O_BLOCK=m
-CONFIG_I2O_SCSI=m
-CONFIG_I2O_PROC=m
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=m
-CONFIG_NET_SB1000=m
-
-#
-# ARCnet devices
-#
-CONFIG_ARCNET=m
-CONFIG_ARCNET_1201=m
-CONFIG_ARCNET_1051=m
-CONFIG_ARCNET_RAW=m
-CONFIG_ARCNET_CAP=m
-CONFIG_ARCNET_COM90xx=m
-CONFIG_ARCNET_COM90xxIO=m
-CONFIG_ARCNET_RIM_I=m
-# CONFIG_ARCNET_COM20020 is not set
-
-#
-# PHY device support
-#
-CONFIG_PHYLIB=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_FIXED_PHY=m
-# CONFIG_FIXED_MII_10_FDX is not set
-# CONFIG_FIXED_MII_100_FDX is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-CONFIG_HAPPYMEAL=m
-CONFIG_SUNGEM=m
-CONFIG_CASSINI=m
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-CONFIG_DE2104X=m
-CONFIG_TULIP=m
-# CONFIG_TULIP_MWI is not set
-# CONFIG_TULIP_MMIO is not set
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-CONFIG_DE4X5=m
-CONFIG_WINBOND_840=m
-CONFIG_DM9102=m
-CONFIG_ULI526X=m
-CONFIG_PCMCIA_XIRCOM=m
-CONFIG_HP100=m
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=m
-CONFIG_AMD8111_ETH=m
-# CONFIG_AMD8111E_NAPI is not set
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_ADAPTEC_STARFIRE_NAPI=y
-CONFIG_B44=m
-CONFIG_FORCEDETH=m
-CONFIG_DGRS=m
-CONFIG_EEPRO100=m
-CONFIG_E100=m
-CONFIG_FEALNX=m
-CONFIG_NATSEMI=m
-CONFIG_NE2K_PCI=m
-CONFIG_8139CP=m
-CONFIG_8139TOO=m
-# CONFIG_8139TOO_PIO is not set
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-CONFIG_8139TOO_8129=y
-# CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_SIS900=m
-CONFIG_EPIC100=m
-CONFIG_SUNDANCE=m
-# CONFIG_SUNDANCE_MMIO is not set
-CONFIG_TLAN=m
-CONFIG_VIA_RHINE=m
-# CONFIG_VIA_RHINE_MMIO is not set
-# CONFIG_VIA_RHINE_NAPI is not set
-CONFIG_NET_POCKET=y
-CONFIG_ATP=m
-CONFIG_DE600=m
-CONFIG_DE620=m
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=m
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-CONFIG_DL2K=m
-CONFIG_E1000=m
-CONFIG_E1000_NAPI=y
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-CONFIG_NS83820=m
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_R8169=m
-# CONFIG_R8169_NAPI is not set
-CONFIG_R8169_VLAN=y
-CONFIG_SIS190=m
-CONFIG_SKGE=m
-CONFIG_SKY2=m
-CONFIG_SK98LIN=m
-CONFIG_VIA_VELOCITY=m
-CONFIG_TIGON3=m
-CONFIG_BNX2=m
-
-#
-# Ethernet (10000 Mbit)
-#
-CONFIG_CHELSIO_T1=m
-CONFIG_IXGB=m
-CONFIG_IXGB_NAPI=y
-CONFIG_S2IO=m
-CONFIG_S2IO_NAPI=y
-CONFIG_MYRI10GE=m
-
-#
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=m
-CONFIG_IBMLS=m
-CONFIG_3C359=m
-CONFIG_TMS380TR=m
-CONFIG_TMSPCI=m
-CONFIG_ABYSS=m
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-CONFIG_NET_WIRELESS_RTNETLINK=y
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-CONFIG_STRIP=m
-CONFIG_PCMCIA_WAVELAN=m
-CONFIG_PCMCIA_NETWAVE=m
-
-#
-# Wireless 802.11 Frequency Hopping cards support
-#
-CONFIG_PCMCIA_RAYCS=m
-
-#
-# Wireless 802.11b ISA/PCI cards support
-#
-CONFIG_IPW2100=m
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2200=m
-CONFIG_IPW2200_MONITOR=y
-CONFIG_IPW2200_RADIOTAP=y
-CONFIG_IPW2200_PROMISCUOUS=y
-CONFIG_IPW2200_QOS=y
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_AIRO=m
-CONFIG_HERMES=m
-CONFIG_PLX_HERMES=m
-CONFIG_TMD_HERMES=m
-CONFIG_NORTEL_HERMES=m
-CONFIG_PCI_HERMES=m
-CONFIG_ATMEL=m
-CONFIG_PCI_ATMEL=m
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-CONFIG_AIRO_CS=m
-CONFIG_PCMCIA_ATMEL=m
-CONFIG_PCMCIA_WL3501=m
-
-#
-# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
-#
-CONFIG_PRISM54=m
-CONFIG_USB_ZD1201=m
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-CONFIG_HOSTAP_FIRMWARE_NVRAM=y
-CONFIG_HOSTAP_PLX=m
-CONFIG_HOSTAP_PCI=m
-CONFIG_HOSTAP_CS=m
-CONFIG_BCM43XX=m
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA=y
-CONFIG_BCM43XX_PIO=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_ZD1211RW=m
-# CONFIG_ZD1211RW_DEBUG is not set
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-CONFIG_PCMCIA_3C589=m
-CONFIG_PCMCIA_3C574=m
-CONFIG_PCMCIA_FMVJ18X=m
-CONFIG_PCMCIA_PCNET=m
-CONFIG_PCMCIA_NMCLAN=m
-CONFIG_PCMCIA_SMC91C92=m
-CONFIG_PCMCIA_XIRC2PS=m
-CONFIG_PCMCIA_AXNET=m
-CONFIG_PCMCIA_IBMTR=m
-
-#
-# Wan interfaces
-#
-CONFIG_WAN=y
-CONFIG_DSCC4=m
-CONFIG_DSCC4_PCISYNC=y
-CONFIG_DSCC4_PCI_RST=y
-CONFIG_LANMEDIA=m
-CONFIG_HDLC=m
-CONFIG_HDLC_RAW=y
-CONFIG_HDLC_RAW_ETH=y
-CONFIG_HDLC_CISCO=y
-CONFIG_HDLC_FR=y
-CONFIG_HDLC_PPP=y
-CONFIG_HDLC_X25=y
-CONFIG_PCI200SYN=m
-CONFIG_WANXL=m
-CONFIG_PC300=m
-CONFIG_PC300_MLPPP=y
-CONFIG_FARSYNC=m
-CONFIG_DLCI=m
-CONFIG_DLCI_COUNT=24
-CONFIG_DLCI_MAX=8
-CONFIG_WAN_ROUTER_DRIVERS=y
-CONFIG_CYCLADES_SYNC=m
-CONFIG_CYCLOMX_X25=y
-CONFIG_LAPBETHER=m
-CONFIG_X25_ASY=m
-CONFIG_SBNI=m
-# CONFIG_SBNI_MULTILINE is not set
-
-#
-# ATM drivers
-#
-CONFIG_ATM_DUMMY=m
-CONFIG_ATM_TCP=m
-CONFIG_ATM_LANAI=m
-CONFIG_ATM_ENI=m
-# CONFIG_ATM_ENI_DEBUG is not set
-# CONFIG_ATM_ENI_TUNE_BURST is not set
-CONFIG_ATM_FIRESTREAM=m
-CONFIG_ATM_ZATM=m
-# CONFIG_ATM_ZATM_DEBUG is not set
-CONFIG_ATM_NICSTAR=m
-CONFIG_ATM_NICSTAR_USE_SUNI=y
-CONFIG_ATM_NICSTAR_USE_IDT77105=y
-CONFIG_ATM_IDT77252=m
-# CONFIG_ATM_IDT77252_DEBUG is not set
-CONFIG_ATM_IDT77252_RCV_ALL=y
-CONFIG_ATM_IDT77252_USE_SUNI=y
-CONFIG_ATM_AMBASSADOR=m
-# CONFIG_ATM_AMBASSADOR_DEBUG is not set
-CONFIG_ATM_HORIZON=m
-# CONFIG_ATM_HORIZON_DEBUG is not set
-CONFIG_ATM_IA=m
-# CONFIG_ATM_IA_DEBUG is not set
-CONFIG_ATM_FORE200E_MAYBE=m
-CONFIG_ATM_FORE200E_PCA=y
-CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y
-CONFIG_ATM_FORE200E_USE_TASKLET=y
-CONFIG_ATM_FORE200E_TX_RETRY=16
-CONFIG_ATM_FORE200E_DEBUG=0
-CONFIG_ATM_FORE200E=m
-CONFIG_ATM_HE=m
-CONFIG_ATM_HE_USE_SUNI=y
-CONFIG_FDDI=y
-# CONFIG_DEFXX is not set
-CONFIG_SKFP=m
-CONFIG_HIPPI=y
-CONFIG_ROADRUNNER=m
-CONFIG_ROADRUNNER_LARGE_RINGS=y
-CONFIG_PLIP=m
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPP_MPPE=m
-CONFIG_PPPOE=m
-CONFIG_PPPOATM=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-CONFIG_SLIP_MODE_SLIP6=y
-CONFIG_NET_FC=y
-CONFIG_SHAPER=m
-CONFIG_NETCONSOLE=m
-CONFIG_NETPOLL=y
-CONFIG_NETPOLL_RX=y
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-CONFIG_ISDN=m
-
-#
-# Old ISDN4Linux
-#
-CONFIG_ISDN_I4L=m
-CONFIG_ISDN_PPP=y
-CONFIG_ISDN_PPP_VJ=y
-CONFIG_ISDN_MPP=y
-CONFIG_IPPP_FILTER=y
-CONFIG_ISDN_PPP_BSDCOMP=m
-CONFIG_ISDN_AUDIO=y
-CONFIG_ISDN_TTY_FAX=y
-CONFIG_ISDN_X25=y
-
-#
-# ISDN feature submodules
-#
-CONFIG_ISDN_DIVERSION=m
-
-#
-# ISDN4Linux hardware drivers
-#
-
-#
-# Passive cards
-#
-CONFIG_ISDN_DRV_HISAX=m
-
-#
-# D-channel protocol features
-#
-CONFIG_HISAX_EURO=y
-CONFIG_DE_AOC=y
-# CONFIG_HISAX_NO_SENDCOMPLETE is not set
-# CONFIG_HISAX_NO_LLC is not set
-# CONFIG_HISAX_NO_KEYPAD is not set
-CONFIG_HISAX_1TR6=y
-CONFIG_HISAX_NI1=y
-CONFIG_HISAX_MAX_CARDS=8
-
-#
-# HiSax supported cards
-#
-CONFIG_HISAX_16_3=y
-CONFIG_HISAX_TELESPCI=y
-CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_FRITZPCI=y
-CONFIG_HISAX_AVM_A1_PCMCIA=y
-CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_NETJET=y
-CONFIG_HISAX_NETJET_U=y
-CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_BKM_A4T=y
-CONFIG_HISAX_SCT_QUADRO=y
-CONFIG_HISAX_GAZEL=y
-CONFIG_HISAX_HFC_PCI=y
-CONFIG_HISAX_W6692=y
-CONFIG_HISAX_HFC_SX=y
-CONFIG_HISAX_ENTERNOW_PCI=y
-# CONFIG_HISAX_DEBUG is not set
-
-#
-# HiSax PCMCIA card service modules
-#
-CONFIG_HISAX_SEDLBAUER_CS=m
-CONFIG_HISAX_ELSA_CS=m
-CONFIG_HISAX_AVM_A1_CS=m
-CONFIG_HISAX_TELES_CS=m
-
-#
-# HiSax sub driver modules
-#
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_HFC4S8S=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-CONFIG_HISAX_HDLC=y
-
-#
-# Active cards
-#
-
-#
-# Siemens Gigaset
-#
-CONFIG_ISDN_DRV_GIGASET=m
-CONFIG_GIGASET_BASE=m
-CONFIG_GIGASET_M105=m
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GIGASET_UNDOCREQ is not set
-
-#
-# CAPI subsystem
-#
-CONFIG_ISDN_CAPI=m
-CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y
-CONFIG_ISDN_CAPI_MIDDLEWARE=y
-CONFIG_ISDN_CAPI_CAPI20=m
-CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
-CONFIG_ISDN_CAPI_CAPIFS=m
-CONFIG_ISDN_CAPI_CAPIDRV=m
-
-#
-# CAPI hardware drivers
-#
-
-#
-# Active AVM cards
-#
-CONFIG_CAPI_AVM=y
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-
-#
-# Active Eicon DIVA Server cards
-#
-CONFIG_CAPI_EICON=y
-CONFIG_ISDN_DIVAS=m
-CONFIG_ISDN_DIVAS_BRIPCI=y
-CONFIG_ISDN_DIVAS_PRIPCI=y
-CONFIG_ISDN_DIVAS_DIVACAPI=m
-CONFIG_ISDN_DIVAS_USERIDI=m
-CONFIG_ISDN_DIVAS_MAINT=m
-
-#
-# Telephony Support
-#
-CONFIG_PHONE=m
-CONFIG_PHONE_IXJ=m
-CONFIG_PHONE_IXJ_PCMCIA=m
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=m
-CONFIG_INPUT_TSDEV=m
-CONFIG_INPUT_TSDEV_SCREEN_X=240
-CONFIG_INPUT_TSDEV_SCREEN_Y=320
-CONFIG_INPUT_EVDEV=m
-CONFIG_INPUT_EVBUG=m
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-CONFIG_KEYBOARD_SUNKBD=m
-CONFIG_KEYBOARD_LKKBD=m
-CONFIG_KEYBOARD_XTKBD=m
-CONFIG_KEYBOARD_NEWTON=m
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_VSXXXAA=m
-CONFIG_INPUT_JOYSTICK=y
-CONFIG_JOYSTICK_ANALOG=m
-CONFIG_JOYSTICK_A3D=m
-CONFIG_JOYSTICK_ADI=m
-CONFIG_JOYSTICK_COBRA=m
-CONFIG_JOYSTICK_GF2K=m
-CONFIG_JOYSTICK_GRIP=m
-CONFIG_JOYSTICK_GRIP_MP=m
-CONFIG_JOYSTICK_GUILLEMOT=m
-CONFIG_JOYSTICK_INTERACT=m
-CONFIG_JOYSTICK_SIDEWINDER=m
-CONFIG_JOYSTICK_TMDC=m
-CONFIG_JOYSTICK_IFORCE=m
-CONFIG_JOYSTICK_IFORCE_USB=y
-CONFIG_JOYSTICK_IFORCE_232=y
-CONFIG_JOYSTICK_WARRIOR=m
-CONFIG_JOYSTICK_MAGELLAN=m
-CONFIG_JOYSTICK_SPACEORB=m
-CONFIG_JOYSTICK_SPACEBALL=m
-CONFIG_JOYSTICK_STINGER=m
-CONFIG_JOYSTICK_TWIDJOY=m
-CONFIG_JOYSTICK_DB9=m
-CONFIG_JOYSTICK_GAMECON=m
-CONFIG_JOYSTICK_TURBOGRAFX=m
-CONFIG_JOYSTICK_JOYDUMP=m
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_ADS7846=m
-CONFIG_TOUCHSCREEN_GUNZE=m
-CONFIG_TOUCHSCREEN_ELO=m
-CONFIG_TOUCHSCREEN_MTOUCH=m
-CONFIG_TOUCHSCREEN_MK712=m
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_PCSPKR=m
-CONFIG_INPUT_WISTRON_BTNS=m
-CONFIG_INPUT_UINPUT=m
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=m
-CONFIG_SERIO_CT82C710=m
-CONFIG_SERIO_PARKBD=m
-CONFIG_SERIO_PCIPS2=m
-CONFIG_SERIO_LIBPS2=y
-CONFIG_SERIO_RAW=m
-CONFIG_GAMEPORT=m
-CONFIG_GAMEPORT_NS558=m
-CONFIG_GAMEPORT_L4=m
-CONFIG_GAMEPORT_EMU10K1=m
-CONFIG_GAMEPORT_FM801=m
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=m
-CONFIG_SERIAL_8250_PCI=m
-CONFIG_SERIAL_8250_PNP=m
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=4
-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=m
-CONFIG_SERIAL_JSM=m
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-CONFIG_PRINTER=m
-# CONFIG_LP_CONSOLE is not set
-CONFIG_PPDEV=m
-CONFIG_TIPAR=m
-
-#
-# IPMI
-#
-CONFIG_IPMI_HANDLER=m
-# CONFIG_IPMI_PANIC_EVENT is not set
-CONFIG_IPMI_DEVICE_INTERFACE=m
-CONFIG_IPMI_SI=m
-CONFIG_IPMI_WATCHDOG=m
-CONFIG_IPMI_POWEROFF=m
-
-#
-# Watchdog Cards
-#
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-
-#
-# Watchdog Device Drivers
-#
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_ACQUIRE_WDT=m
-CONFIG_ADVANTECH_WDT=m
-CONFIG_ALIM1535_WDT=m
-CONFIG_ALIM7101_WDT=m
-CONFIG_SC520_WDT=m
-CONFIG_EUROTECH_WDT=m
-CONFIG_IB700_WDT=m
-CONFIG_IBMASR=m
-CONFIG_WAFER_WDT=m
-CONFIG_I6300ESB_WDT=m
-CONFIG_I8XX_TCO=m
-CONFIG_SC1200_WDT=m
-CONFIG_SCx200_WDT=m
-CONFIG_60XX_WDT=m
-CONFIG_SBC8360_WDT=m
-CONFIG_CPU5_WDT=m
-CONFIG_W83627HF_WDT=m
-CONFIG_W83877F_WDT=m
-CONFIG_W83977F_WDT=m
-CONFIG_MACHZ_WDT=m
-CONFIG_SBC_EPX_C3_WATCHDOG=m
-
-#
-# PCI-based Watchdog Cards
-#
-CONFIG_PCIPCWATCHDOG=m
-CONFIG_WDTPCI=m
-CONFIG_WDT_501_PCI=y
-
-#
-# USB-based Watchdog Cards
-#
-CONFIG_USBPCWATCHDOG=m
-CONFIG_HW_RANDOM=y
-CONFIG_HW_RANDOM_INTEL=m
-CONFIG_HW_RANDOM_AMD=m
-CONFIG_HW_RANDOM_GEODE=m
-CONFIG_HW_RANDOM_VIA=m
-CONFIG_NVRAM=m
-CONFIG_RTC=m
-CONFIG_GEN_RTC=m
-CONFIG_GEN_RTC_X=y
-CONFIG_DTLK=m
-CONFIG_R3964=m
-CONFIG_APPLICOM=m
-CONFIG_SONYPI=m
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=m
-CONFIG_AGP_ALI=m
-CONFIG_AGP_ATI=m
-CONFIG_AGP_AMD=m
-CONFIG_AGP_AMD64=m
-CONFIG_AGP_INTEL=m
-CONFIG_AGP_NVIDIA=m
-CONFIG_AGP_SIS=m
-CONFIG_AGP_SWORKS=m
-CONFIG_AGP_VIA=m
-CONFIG_AGP_EFFICEON=m
-CONFIG_DRM=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_I810=m
-CONFIG_DRM_I830=m
-CONFIG_DRM_I915=m
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-CONFIG_DRM_VIA=m
-CONFIG_DRM_SAVAGE=m
-
-#
-# PCMCIA character devices
-#
-CONFIG_SYNCLINK_CS=m
-CONFIG_CARDMAN_4000=m
-CONFIG_CARDMAN_4040=m
-CONFIG_MWAVE=m
-CONFIG_SCx200_GPIO=m
-CONFIG_PC8736x_GPIO=m
-CONFIG_NSC_GPIO=m
-CONFIG_CS5535_GPIO=m
-CONFIG_RAW_DRIVER=m
-CONFIG_MAX_RAW_DEVS=256
-# CONFIG_HPET is not set
-CONFIG_HANGCHECK_TIMER=m
-
-#
-# TPM devices
-#
-CONFIG_TCG_TPM=m
-CONFIG_TCG_TIS=m
-CONFIG_TCG_NSC=m
-CONFIG_TCG_ATMEL=m
-CONFIG_TCG_INFINEON=m
-CONFIG_TCG_XEN=m
-CONFIG_TELCLOCK=m
-
-#
-# I2C support
-#
-CONFIG_I2C=m
-CONFIG_I2C_CHARDEV=m
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=m
-CONFIG_I2C_ALGOPCF=m
-CONFIG_I2C_ALGOPCA=m
-
-#
-# I2C Hardware Bus support
-#
-CONFIG_I2C_ALI1535=m
-CONFIG_I2C_ALI1563=m
-CONFIG_I2C_ALI15X3=m
-CONFIG_I2C_AMD756=m
-CONFIG_I2C_AMD756_S4882=m
-CONFIG_I2C_AMD8111=m
-CONFIG_I2C_I801=m
-CONFIG_I2C_I810=m
-CONFIG_I2C_PIIX4=m
-CONFIG_I2C_ISA=m
-CONFIG_I2C_NFORCE2=m
-CONFIG_I2C_OCORES=m
-CONFIG_I2C_PARPORT=m
-CONFIG_I2C_PARPORT_LIGHT=m
-CONFIG_I2C_PROSAVAGE=m
-CONFIG_I2C_SAVAGE4=m
-CONFIG_SCx200_I2C=m
-CONFIG_SCx200_I2C_SCL=12
-CONFIG_SCx200_I2C_SDA=13
-CONFIG_SCx200_ACB=m
-CONFIG_I2C_SIS5595=m
-CONFIG_I2C_SIS630=m
-CONFIG_I2C_SIS96X=m
-CONFIG_I2C_STUB=m
-CONFIG_I2C_VIA=m
-CONFIG_I2C_VIAPRO=m
-CONFIG_I2C_VOODOO3=m
-CONFIG_I2C_PCA_ISA=m
-
-#
-# Miscellaneous I2C Chip support
-#
-CONFIG_SENSORS_DS1337=m
-CONFIG_SENSORS_DS1374=m
-CONFIG_SENSORS_EEPROM=m
-CONFIG_SENSORS_PCF8574=m
-CONFIG_SENSORS_PCA9539=m
-CONFIG_SENSORS_PCF8591=m
-CONFIG_SENSORS_MAX6875=m
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-CONFIG_SPI_BITBANG=m
-CONFIG_SPI_BUTTERFLY=m
-
-#
-# SPI Protocol Masters
-#
-
-#
-# Dallas's 1-wire bus
-#
-CONFIG_W1=m
-CONFIG_W1_CON=y
-
-#
-# 1-wire Bus Masters
-#
-CONFIG_W1_MASTER_MATROX=m
-CONFIG_W1_MASTER_DS2490=m
-CONFIG_W1_MASTER_DS2482=m
-
-#
-# 1-wire Slaves
-#
-CONFIG_W1_SLAVE_THERM=m
-CONFIG_W1_SLAVE_SMEM=m
-CONFIG_W1_SLAVE_DS2433=m
-# CONFIG_W1_SLAVE_DS2433_CRC is not set
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=m
-CONFIG_HWMON_VID=m
-CONFIG_SENSORS_ABITUGURU=m
-CONFIG_SENSORS_ADM1021=m
-CONFIG_SENSORS_ADM1025=m
-CONFIG_SENSORS_ADM1026=m
-CONFIG_SENSORS_ADM1031=m
-CONFIG_SENSORS_ADM9240=m
-CONFIG_SENSORS_ASB100=m
-CONFIG_SENSORS_ATXP1=m
-CONFIG_SENSORS_DS1621=m
-CONFIG_SENSORS_F71805F=m
-CONFIG_SENSORS_FSCHER=m
-CONFIG_SENSORS_FSCPOS=m
-CONFIG_SENSORS_GL518SM=m
-CONFIG_SENSORS_GL520SM=m
-CONFIG_SENSORS_IT87=m
-CONFIG_SENSORS_LM63=m
-CONFIG_SENSORS_LM70=m
-CONFIG_SENSORS_LM75=m
-CONFIG_SENSORS_LM77=m
-CONFIG_SENSORS_LM78=m
-CONFIG_SENSORS_LM80=m
-CONFIG_SENSORS_LM83=m
-CONFIG_SENSORS_LM85=m
-CONFIG_SENSORS_LM87=m
-CONFIG_SENSORS_LM90=m
-CONFIG_SENSORS_LM92=m
-CONFIG_SENSORS_MAX1619=m
-CONFIG_SENSORS_PC87360=m
-CONFIG_SENSORS_SIS5595=m
-CONFIG_SENSORS_SMSC47M1=m
-CONFIG_SENSORS_SMSC47M192=m
-CONFIG_SENSORS_SMSC47B397=m
-CONFIG_SENSORS_VIA686A=m
-CONFIG_SENSORS_VT8231=m
-CONFIG_SENSORS_W83781D=m
-CONFIG_SENSORS_W83791D=m
-CONFIG_SENSORS_W83792D=m
-CONFIG_SENSORS_W83L785TS=m
-CONFIG_SENSORS_W83627HF=m
-CONFIG_SENSORS_W83627EHF=m
-CONFIG_SENSORS_HDAPS=m
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-CONFIG_IBM_ASM=m
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video Capture Adapters
-#
-
-#
-# Video Capture Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-CONFIG_VIDEO_VIVI=m
-CONFIG_VIDEO_BT848=m
-CONFIG_VIDEO_BT848_DVB=y
-CONFIG_VIDEO_SAA6588=m
-CONFIG_VIDEO_BWQCAM=m
-CONFIG_VIDEO_CQCAM=m
-CONFIG_VIDEO_W9966=m
-CONFIG_VIDEO_CPIA=m
-CONFIG_VIDEO_CPIA_PP=m
-CONFIG_VIDEO_CPIA_USB=m
-CONFIG_VIDEO_CPIA2=m
-CONFIG_VIDEO_SAA5246A=m
-CONFIG_VIDEO_SAA5249=m
-CONFIG_TUNER_3036=m
-CONFIG_VIDEO_STRADIS=m
-CONFIG_VIDEO_ZORAN=m
-CONFIG_VIDEO_ZORAN_BUZ=m
-CONFIG_VIDEO_ZORAN_DC10=m
-CONFIG_VIDEO_ZORAN_DC30=m
-CONFIG_VIDEO_ZORAN_LML33=m
-CONFIG_VIDEO_ZORAN_LML33R10=m
-CONFIG_VIDEO_ZORAN_AVS6EYES=m
-CONFIG_VIDEO_MEYE=m
-CONFIG_VIDEO_SAA7134=m
-CONFIG_VIDEO_SAA7134_ALSA=m
-# CONFIG_VIDEO_SAA7134_OSS is not set
-CONFIG_VIDEO_SAA7134_DVB=m
-CONFIG_VIDEO_SAA7134_DVB_ALL_FRONTENDS=y
-CONFIG_VIDEO_MXB=m
-CONFIG_VIDEO_DPC=m
-CONFIG_VIDEO_HEXIUM_ORION=m
-CONFIG_VIDEO_HEXIUM_GEMINI=m
-CONFIG_VIDEO_CX88_VP3054=m
-CONFIG_VIDEO_CX88=m
-CONFIG_VIDEO_CX88_ALSA=m
-CONFIG_VIDEO_CX88_BLACKBIRD=m
-CONFIG_VIDEO_CX88_DVB=m
-CONFIG_VIDEO_CX88_DVB_ALL_FRONTENDS=y
-
-#
-# Encoders and Decoders
-#
-CONFIG_VIDEO_MSP3400=m
-CONFIG_VIDEO_CS53L32A=m
-CONFIG_VIDEO_TLV320AIC23B=m
-CONFIG_VIDEO_WM8775=m
-CONFIG_VIDEO_WM8739=m
-CONFIG_VIDEO_CX2341X=m
-CONFIG_VIDEO_CX25840=m
-CONFIG_VIDEO_SAA711X=m
-CONFIG_VIDEO_SAA7127=m
-CONFIG_VIDEO_UPD64031A=m
-CONFIG_VIDEO_UPD64083=m
-
-#
-# V4L USB devices
-#
-CONFIG_VIDEO_PVRUSB2=m
-CONFIG_VIDEO_PVRUSB2_24XXX=y
-CONFIG_VIDEO_PVRUSB2_SYSFS=y
-# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
-CONFIG_VIDEO_EM28XX=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-CONFIG_USB_QUICKCAM_MESSENGER=m
-CONFIG_USB_ET61X251=m
-CONFIG_VIDEO_OVCAMCHIP=m
-CONFIG_USB_W9968CF=m
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-CONFIG_USB_ZC0301=m
-CONFIG_USB_PWC=m
-# CONFIG_USB_PWC_DEBUG is not set
-
-#
-# Radio Adapters
-#
-CONFIG_RADIO_GEMTEK_PCI=m
-CONFIG_RADIO_MAXIRADIO=m
-CONFIG_RADIO_MAESTRO=m
-CONFIG_USB_DSBR=m
-
-#
-# Digital Video Broadcasting Devices
-#
-CONFIG_DVB=y
-CONFIG_DVB_CORE=m
-
-#
-# Supported SAA7146 based PCI Adapters
-#
-CONFIG_DVB_AV7110=m
-CONFIG_DVB_AV7110_OSD=y
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
-CONFIG_DVB_BUDGET_PATCH=m
-
-#
-# Supported USB Adapters
-#
-CONFIG_DVB_USB=m
-# CONFIG_DVB_USB_DEBUG is not set
-CONFIG_DVB_USB_A800=m
-CONFIG_DVB_USB_DIBUSB_MB=m
-# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
-CONFIG_DVB_USB_DIBUSB_MC=m
-CONFIG_DVB_USB_UMT_010=m
-CONFIG_DVB_USB_CXUSB=m
-CONFIG_DVB_USB_DIGITV=m
-CONFIG_DVB_USB_VP7045=m
-CONFIG_DVB_USB_VP702X=m
-CONFIG_DVB_USB_GP8PSK=m
-CONFIG_DVB_USB_NOVA_T_USB2=m
-CONFIG_DVB_USB_DTT200U=m
-CONFIG_DVB_TTUSB_BUDGET=m
-CONFIG_DVB_TTUSB_DEC=m
-CONFIG_DVB_CINERGYT2=m
-# CONFIG_DVB_CINERGYT2_TUNING is not set
-
-#
-# Supported FlexCopII (B2C2) Adapters
-#
-CONFIG_DVB_B2C2_FLEXCOP=m
-CONFIG_DVB_B2C2_FLEXCOP_PCI=m
-CONFIG_DVB_B2C2_FLEXCOP_USB=m
-# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
-
-#
-# Supported BT878 Adapters
-#
-CONFIG_DVB_BT8XX=m
-
-#
-# Supported Pluto2 Adapters
-#
-CONFIG_DVB_PLUTO2=m
-
-#
-# Supported DVB Frontends
-#
-
-#
-# Customise DVB Frontends
-#
-
-#
-# DVB-S (satellite) frontends
-#
-CONFIG_DVB_STV0299=m
-CONFIG_DVB_CX24110=m
-CONFIG_DVB_CX24123=m
-CONFIG_DVB_TDA8083=m
-CONFIG_DVB_MT312=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_S5H1420=m
-
-#
-# DVB-T (terrestrial) frontends
-#
-CONFIG_DVB_SP8870=m
-CONFIG_DVB_SP887X=m
-CONFIG_DVB_CX22700=m
-CONFIG_DVB_CX22702=m
-CONFIG_DVB_L64781=m
-CONFIG_DVB_TDA1004X=m
-CONFIG_DVB_NXT6000=m
-CONFIG_DVB_MT352=m
-CONFIG_DVB_ZL10353=m
-CONFIG_DVB_DIB3000MB=m
-CONFIG_DVB_DIB3000MC=m
-
-#
-# DVB-C (cable) frontends
-#
-CONFIG_DVB_VES1820=m
-CONFIG_DVB_TDA10021=m
-CONFIG_DVB_STV0297=m
-
-#
-# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
-#
-CONFIG_DVB_NXT200X=m
-CONFIG_DVB_OR51211=m
-CONFIG_DVB_OR51132=m
-CONFIG_DVB_BCM3510=m
-CONFIG_DVB_LGDT330X=m
-
-#
-# Miscellaneous devices
-#
-CONFIG_DVB_PLL=m
-CONFIG_DVB_LNBP21=m
-CONFIG_DVB_ISL6421=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_VIDEO_VIDEOBUF=m
-CONFIG_VIDEO_TUNER=m
-CONFIG_VIDEO_BUF=m
-CONFIG_VIDEO_BUF_DVB=m
-CONFIG_VIDEO_BTCX=m
-CONFIG_VIDEO_IR=m
-CONFIG_VIDEO_TVEEPROM=m
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
-CONFIG_FB_TILEBLITTING=y
-CONFIG_FB_CIRRUS=m
-CONFIG_FB_PM2=m
-CONFIG_FB_PM2_FIFO_DISCONNECT=y
-CONFIG_FB_CYBER2000=m
-CONFIG_FB_ARC=m
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=m
-CONFIG_FB_VESA=y
-CONFIG_FB_HGA=m
-# CONFIG_FB_HGA_ACCEL is not set
-CONFIG_FB_S1D13XXX=m
-CONFIG_FB_NVIDIA=m
-CONFIG_FB_NVIDIA_I2C=y
-CONFIG_FB_RIVA=m
-CONFIG_FB_RIVA_I2C=y
-CONFIG_FB_RIVA_DEBUG=y
-CONFIG_FB_I810=m
-# CONFIG_FB_I810_GTF is not set
-CONFIG_FB_INTEL=m
-# CONFIG_FB_INTEL_DEBUG is not set
-CONFIG_FB_MATROX=m
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G=y
-# CONFIG_FB_MATROX_I2C is not set
-CONFIG_FB_MATROX_MULTIHEAD=y
-CONFIG_FB_RADEON=m
-CONFIG_FB_RADEON_I2C=y
-# CONFIG_FB_RADEON_DEBUG is not set
-CONFIG_FB_ATY128=m
-CONFIG_FB_ATY=m
-CONFIG_FB_ATY_CT=y
-CONFIG_FB_ATY_GENERIC_LCD=y
-CONFIG_FB_ATY_GX=y
-CONFIG_FB_SAVAGE=m
-CONFIG_FB_SAVAGE_I2C=y
-CONFIG_FB_SAVAGE_ACCEL=y
-CONFIG_FB_SIS=m
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-CONFIG_FB_NEOMAGIC=m
-CONFIG_FB_KYRO=m
-CONFIG_FB_3DFX=m
-# CONFIG_FB_3DFX_ACCEL is not set
-CONFIG_FB_VOODOO1=m
-CONFIG_FB_CYBLA=m
-CONFIG_FB_TRIDENT=m
-# CONFIG_FB_TRIDENT_ACCEL is not set
-CONFIG_FB_GEODE=y
-CONFIG_FB_GEODE_GX=m
-CONFIG_FB_GEODE_GX1=m
-CONFIG_FB_VIRTUAL=m
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_VIDEO_SELECT=y
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=m
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-# CONFIG_LOGO is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=m
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-CONFIG_SND_RTCTIMER=m
-CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_MPU401_UART=m
-CONFIG_SND_OPL3_LIB=m
-CONFIG_SND_VX_LIB=m
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=m
-CONFIG_SND_DUMMY=m
-CONFIG_SND_VIRMIDI=m
-CONFIG_SND_MTPAV=m
-CONFIG_SND_SERIAL_U16550=m
-CONFIG_SND_MPU401=m
-
-#
-# PCI devices
-#
-CONFIG_SND_AD1889=m
-CONFIG_SND_ALS300=m
-CONFIG_SND_ALS4000=m
-CONFIG_SND_ALI5451=m
-CONFIG_SND_ATIIXP=m
-CONFIG_SND_ATIIXP_MODEM=m
-CONFIG_SND_AU8810=m
-CONFIG_SND_AU8820=m
-CONFIG_SND_AU8830=m
-CONFIG_SND_AZT3328=m
-CONFIG_SND_BT87X=m
-# CONFIG_SND_BT87X_OVERCLOCK is not set
-CONFIG_SND_CA0106=m
-CONFIG_SND_CMIPCI=m
-CONFIG_SND_CS4281=m
-CONFIG_SND_CS46XX=m
-CONFIG_SND_CS46XX_NEW_DSP=y
-CONFIG_SND_CS5535AUDIO=m
-CONFIG_SND_DARLA20=m
-CONFIG_SND_GINA20=m
-CONFIG_SND_LAYLA20=m
-CONFIG_SND_DARLA24=m
-CONFIG_SND_GINA24=m
-CONFIG_SND_LAYLA24=m
-CONFIG_SND_MONA=m
-CONFIG_SND_MIA=m
-CONFIG_SND_ECHO3G=m
-CONFIG_SND_INDIGO=m
-CONFIG_SND_INDIGOIO=m
-CONFIG_SND_INDIGODJ=m
-CONFIG_SND_EMU10K1=m
-CONFIG_SND_EMU10K1X=m
-CONFIG_SND_ENS1370=m
-CONFIG_SND_ENS1371=m
-CONFIG_SND_ES1938=m
-CONFIG_SND_ES1968=m
-CONFIG_SND_FM801=m
-# CONFIG_SND_FM801_TEA575X_BOOL is not set
-CONFIG_SND_HDA_INTEL=m
-CONFIG_SND_HDSP=m
-CONFIG_SND_HDSPM=m
-CONFIG_SND_ICE1712=m
-CONFIG_SND_ICE1724=m
-CONFIG_SND_INTEL8X0=m
-CONFIG_SND_INTEL8X0M=m
-CONFIG_SND_KORG1212=m
-CONFIG_SND_MAESTRO3=m
-CONFIG_SND_MIXART=m
-CONFIG_SND_NM256=m
-CONFIG_SND_PCXHR=m
-CONFIG_SND_RIPTIDE=m
-CONFIG_SND_RME32=m
-CONFIG_SND_RME96=m
-CONFIG_SND_RME9652=m
-CONFIG_SND_SONICVIBES=m
-CONFIG_SND_TRIDENT=m
-CONFIG_SND_VIA82XX=m
-# CONFIG_SND_VIA82XX_MODEM is not set
-CONFIG_SND_VX222=m
-CONFIG_SND_YMFPCI=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-CONFIG_SND_USB_USX2Y=m
-
-#
-# PCMCIA devices
-#
-CONFIG_SND_VXPOCKET=m
-CONFIG_SND_PDAUDIOCF=m
-
-#
-# Open Sound System
-#
-CONFIG_SOUND_PRIME=m
-# CONFIG_OSS_OBSOLETE_DRIVER is not set
-CONFIG_SOUND_BT878=m
-CONFIG_SOUND_ES1371=m
-CONFIG_SOUND_ICH=m
-CONFIG_SOUND_TRIDENT=m
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
-CONFIG_SOUND_VIA82CXXX=m
-# CONFIG_MIDI_VIA82CXXX is not set
-# CONFIG_SOUND_OSS is not set
-CONFIG_SOUND_TVMIXER=m
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-CONFIG_USB_BANDWIDTH=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=m
-CONFIG_USB_EHCI_SPLIT_ISO=y
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_EHCI_TT_NEWSCHED=y
-CONFIG_USB_ISP116X_HCD=m
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=m
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-CONFIG_USB_STORAGE_FREECOM=y
-CONFIG_USB_STORAGE_ISD200=y
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_USBAT=y
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_ALAUDA=y
-CONFIG_USB_LIBUSUAL=y
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_HID_FF=y
-CONFIG_HID_PID=y
-CONFIG_LOGITECH_FF=y
-CONFIG_THRUSTMASTER_FF=y
-CONFIG_USB_HIDDEV=y
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-CONFIG_USB_ACECAD=m
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_TOUCHSCREEN=m
-CONFIG_USB_TOUCHSCREEN_EGALAX=y
-CONFIG_USB_TOUCHSCREEN_PANJIT=y
-CONFIG_USB_TOUCHSCREEN_3M=y
-CONFIG_USB_TOUCHSCREEN_ITM=y
-CONFIG_USB_YEALINK=m
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-CONFIG_USB_ATI_REMOTE2=m
-CONFIG_USB_KEYSPAN_REMOTE=m
-CONFIG_USB_APPLETOUCH=m
-
-#
-# USB Imaging devices
-#
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-CONFIG_USB_NET_RNDIS_HOST=m
-CONFIG_USB_NET_CDC_SUBSET=m
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-CONFIG_USB_NET_ZAURUS=m
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-CONFIG_USB_USS720=m
-
-#
-# USB Serial Converter support
-#
-CONFIG_USB_SERIAL=m
-CONFIG_USB_SERIAL_GENERIC=y
-CONFIG_USB_SERIAL_AIRPRIME=m
-CONFIG_USB_SERIAL_ARK3116=m
-CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-CONFIG_USB_SERIAL_CP2101=m
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-CONFIG_USB_SERIAL_FUNSOFT=m
-CONFIG_USB_SERIAL_VISOR=m
-CONFIG_USB_SERIAL_IPAQ=m
-CONFIG_USB_SERIAL_IR=m
-CONFIG_USB_SERIAL_EDGEPORT=m
-CONFIG_USB_SERIAL_EDGEPORT_TI=m
-CONFIG_USB_SERIAL_GARMIN=m
-CONFIG_USB_SERIAL_IPW=m
-CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-CONFIG_USB_SERIAL_KEYSPAN=m
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-CONFIG_USB_SERIAL_NAVMAN=m
-CONFIG_USB_SERIAL_PL2303=m
-CONFIG_USB_SERIAL_HP4X=m
-CONFIG_USB_SERIAL_SAFE=m
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OPTION=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYPRESS_CY7C63=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-CONFIG_USB_APPLEDISPLAY=m
-CONFIG_USB_SISUSBVGA=m
-CONFIG_USB_SISUSBVGA_CON=y
-CONFIG_USB_LD=m
-CONFIG_USB_TEST=m
-
-#
-# USB DSL modem support
-#
-CONFIG_USB_ATM=m
-CONFIG_USB_SPEEDTOUCH=m
-CONFIG_USB_CXACRU=m
-CONFIG_USB_UEAGLEATM=m
-CONFIG_USB_XUSBATM=m
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=m
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-CONFIG_USB_GADGET_NET2280=y
-CONFIG_USB_NET2280=m
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-CONFIG_USB_GADGET_DUALSPEED=y
-CONFIG_USB_ZERO=m
-CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
-CONFIG_USB_G_SERIAL=m
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=m
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=m
-CONFIG_MMC_SDHCI=m
-CONFIG_MMC_WBSD=m
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-CONFIG_LEDS_NET48XX=m
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-
-#
-# InfiniBand support
-#
-CONFIG_INFINIBAND=m
-CONFIG_INFINIBAND_USER_MAD=m
-CONFIG_INFINIBAND_USER_ACCESS=m
-CONFIG_INFINIBAND_ADDR_TRANS=y
-CONFIG_INFINIBAND_MTHCA=m
-CONFIG_INFINIBAND_MTHCA_DEBUG=y
-CONFIG_INFINIBAND_IPOIB=m
-CONFIG_INFINIBAND_IPOIB_DEBUG=y
-# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
-CONFIG_INFINIBAND_SRP=m
-CONFIG_INFINIBAND_ISER=m
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-CONFIG_EDAC=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_EDAC_DEBUG is not set
-CONFIG_EDAC_MM_EDAC=m
-CONFIG_EDAC_AMD76X=m
-CONFIG_EDAC_E7XXX=m
-CONFIG_EDAC_E752X=m
-CONFIG_EDAC_I82875P=m
-CONFIG_EDAC_I82860=m
-CONFIG_EDAC_R82600=m
-CONFIG_EDAC_POLL=y
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=m
-CONFIG_RTC_CLASS=m
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=m
-CONFIG_RTC_INTF_PROC=m
-CONFIG_RTC_INTF_DEV=m
-CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-
-#
-# RTC drivers
-#
-CONFIG_RTC_DRV_X1205=m
-CONFIG_RTC_DRV_DS1307=m
-CONFIG_RTC_DRV_DS1553=m
-CONFIG_RTC_DRV_ISL1208=m
-CONFIG_RTC_DRV_DS1672=m
-CONFIG_RTC_DRV_DS1742=m
-CONFIG_RTC_DRV_PCF8563=m
-CONFIG_RTC_DRV_PCF8583=m
-CONFIG_RTC_DRV_RS5C348=m
-CONFIG_RTC_DRV_RS5C372=m
-CONFIG_RTC_DRV_M48T86=m
-CONFIG_RTC_DRV_TEST=m
-CONFIG_RTC_DRV_MAX6902=m
-CONFIG_RTC_DRV_V3020=m
-
-#
-# DMA Engine support
-#
-CONFIG_DMA_ENGINE=y
-
-#
-# DMA Clients
-#
-CONFIG_NET_DMA=y
-
-#
-# DMA Devices
-#
-CONFIG_INTEL_IOATDMA=m
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=m
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=m
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=m
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_DEBUG is not set
-CONFIG_JFS_STATISTICS=y
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_QUOTA=y
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_RT=y
-CONFIG_OCFS2_FS=m
-CONFIG_OCFS2_DEBUG_MASKLOG=y
-CONFIG_MINIX_FS=m
-CONFIG_ROMFS_FS=m
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-CONFIG_QUOTA=y
-CONFIG_QFMT_V1=m
-CONFIG_QFMT_V2=m
-CONFIG_QUOTACTL=y
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=m
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-CONFIG_NTFS_FS=m
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_RW is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-CONFIG_CONFIGFS_FS=m
-
-#
-# Miscellaneous filesystems
-#
-CONFIG_ADFS_FS=m
-# CONFIG_ADFS_FS_RW is not set
-CONFIG_AFFS_FS=m
-CONFIG_HFS_FS=m
-CONFIG_HFSPLUS_FS=m
-CONFIG_BEFS_FS=m
-# CONFIG_BEFS_DEBUG is not set
-CONFIG_BFS_FS=m
-CONFIG_EFS_FS=m
-CONFIG_JFFS_FS=m
-CONFIG_JFFS_FS_VERBOSE=0
-CONFIG_JFFS_PROC_FS=y
-CONFIG_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_SUMMARY is not set
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=m
-CONFIG_VXFS_FS=m
-CONFIG_HPFS_FS=m
-CONFIG_QNX4FS_FS=m
-CONFIG_SYSV_FS=m
-CONFIG_UFS_FS=m
-# CONFIG_UFS_FS_WRITE is not set
-# CONFIG_UFS_DEBUG is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=m
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=m
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_ACL_SUPPORT=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-CONFIG_RPCSEC_GSS_SPKM3=m
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp850"
-CONFIG_CIFS=m
-CONFIG_CIFS_STATS=y
-CONFIG_CIFS_STATS2=y
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-CONFIG_CIFS_XATTR=y
-# CONFIG_CIFS_POSIX is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-CONFIG_NCP_FS=m
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-# CONFIG_NCPFS_SMALLDOS is not set
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
-CONFIG_CODA_FS=m
-# CONFIG_CODA_FS_OLD_API is not set
-CONFIG_AFS_FS=m
-CONFIG_RXRPC=m
-CONFIG_9P_FS=m
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-CONFIG_OSF_PARTITION=y
-# CONFIG_AMIGA_PARTITION is not set
-CONFIG_ATARI_PARTITION=y
-CONFIG_MAC_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-# CONFIG_MINIX_SUBPARTITION is not set
-CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_UNIXWARE_DISKLABEL=y
-CONFIG_LDM_PARTITION=y
-# CONFIG_LDM_DEBUG is not set
-CONFIG_SGI_PARTITION=y
-CONFIG_ULTRIX_PARTITION=y
-CONFIG_SUN_PARTITION=y
-CONFIG_KARMA_PARTITION=y
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="utf8"
-CONFIG_NLS_CODEPAGE_437=m
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-CONFIG_NLS_CODEPAGE_1250=m
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ASCII=m
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_UTF8=m
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_HIGHMEM is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_FRAME_POINTER is not set
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_DEBUG_STACKOVERFLOW=y
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_4KSTACKS is not set
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
-CONFIG_SECURITY=y
-CONFIG_SECURITY_NETWORK=y
-# CONFIG_SECURITY_NETWORK_XFRM is not set
-CONFIG_SECURITY_CAPABILITIES=y
-CONFIG_SECURITY_ROOTPLUG=m
-CONFIG_SECURITY_SECLVL=m
-# CONFIG_SECURITY_SELINUX is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_AES_586=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-# CONFIG_CRYPTO_DEV_PADLOCK is not set
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=m
-CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
-# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
-# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_FRAMEBUFFER=y
-CONFIG_XEN_KEYBOARD=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-CONFIG_XEN_SMPBOOT=y
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-CONFIG_CRC16=m
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_AUDIT_GENERIC=y
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_REED_SOLOMON=m
-CONFIG_REED_SOLOMON_DEC16=y
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
-CONFIG_PLIST=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_KTIME_SCALAR=y
diff --git a/buildconfigs/linux-defconfig_xen_x86_64 b/buildconfigs/linux-defconfig_xen_x86_64
deleted file mode 100644 (file)
index 8ac6836..0000000
+++ /dev/null
@@ -1,3131 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-xen
-# Wed Jan 17 18:33:45 2007
-#
-CONFIG_X86_64=y
-CONFIG_64BIT=y
-CONFIG_X86=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_AUDIT_ARCH=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_BSD_PROCESS_ACCT_V3=y
-CONFIG_TASKSTATS=y
-CONFIG_TASK_DELAY_ACCT=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_CPUSETS=y
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_EMBEDDED is not set
-CONFIG_UID16=y
-CONFIG_SYSCTL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_LSF=y
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-CONFIG_DEFAULT_CFQ=y
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="cfq"
-
-#
-# Processor type and features
-#
-CONFIG_X86_PC=y
-# CONFIG_X86_VSMP is not set
-# CONFIG_MK8 is not set
-# CONFIG_MPSC is not set
-CONFIG_GENERIC_CPU=y
-CONFIG_X86_64_XEN=y
-CONFIG_X86_NO_TSS=y
-CONFIG_X86_NO_IDT=y
-CONFIG_X86_L1_CACHE_BYTES=128
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_X86_INTERNODE_CACHE_BYTES=128
-CONFIG_X86_GOOD_APIC=y
-CONFIG_MICROCODE=y
-CONFIG_X86_MSR=m
-CONFIG_X86_CPUID=m
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_XEN_GENAPIC=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_MTRR=y
-CONFIG_SMP=y
-# CONFIG_PREEMPT_NONE is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_RESOURCES_64BIT=y
-CONFIG_NR_CPUS=32
-CONFIG_HOTPLUG_CPU=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-# CONFIG_CALGARY_IOMMU is not set
-CONFIG_SWIOTLB=y
-CONFIG_KEXEC=y
-# CONFIG_CRASH_DUMP is not set
-CONFIG_PHYSICAL_START=0x200000
-CONFIG_SECCOMP=y
-CONFIG_HZ_100=y
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=100
-# CONFIG_REORDER is not set
-CONFIG_K8_NB=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_ISA_DMA_API=y
-CONFIG_GENERIC_PENDING_IRQ=y
-
-#
-# Power management options
-#
-CONFIG_PM=y
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_VIDEO=m
-CONFIG_ACPI_HOTKEY=m
-CONFIG_ACPI_FAN=m
-CONFIG_ACPI_DOCK=m
-CONFIG_ACPI_PROCESSOR=m
-CONFIG_ACPI_HOTPLUG_CPU=y
-CONFIG_ACPI_THERMAL=m
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_IBM=m
-CONFIG_ACPI_TOSHIBA=m
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_CONTAINER=m
-CONFIG_ACPI_SBS=m
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI etc.)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DIRECT=y
-# CONFIG_PCI_MMCONFIG is not set
-CONFIG_XEN_PCIDEV_FRONTEND=y
-# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-CONFIG_PCCARD=m
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=m
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_PCMCIA_IOCTL=y
-CONFIG_CARDBUS=y
-
-#
-# PC-card bridges
-#
-CONFIG_YENTA=m
-CONFIG_YENTA_O2=y
-CONFIG_YENTA_RICOH=y
-CONFIG_YENTA_TI=y
-CONFIG_YENTA_ENE_TUNE=y
-CONFIG_YENTA_TOSHIBA=y
-CONFIG_PD6729=m
-CONFIG_I82092=m
-CONFIG_PCCARD_NONSTATIC=m
-
-#
-# PCI Hotplug Support
-#
-CONFIG_HOTPLUG_PCI=m
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-# CONFIG_HOTPLUG_PCI_ACPI is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-
-#
-# Executable file formats / Emulations
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=m
-CONFIG_IA32_EMULATION=y
-CONFIG_IA32_AOUT=y
-CONFIG_COMPAT=y
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=m
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
-CONFIG_IP_ROUTE_VERBOSE=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-CONFIG_IP_PNP_RARP=y
-CONFIG_NET_IPIP=m
-CONFIG_NET_IPGRE=m
-CONFIG_NET_IPGRE_BROADCAST=y
-CONFIG_IP_MROUTE=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_XFRM_TUNNEL=m
-CONFIG_INET_TUNNEL=m
-CONFIG_INET_XFRM_MODE_TRANSPORT=m
-CONFIG_INET_XFRM_MODE_TUNNEL=m
-CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-CONFIG_TCP_CONG_ADVANCED=y
-
-#
-# TCP congestion control
-#
-CONFIG_TCP_CONG_BIC=m
-CONFIG_TCP_CONG_CUBIC=m
-CONFIG_TCP_CONG_WESTWOOD=m
-CONFIG_TCP_CONG_HTCP=m
-CONFIG_TCP_CONG_HSTCP=m
-CONFIG_TCP_CONG_HYBLA=m
-CONFIG_TCP_CONG_VEGAS=m
-CONFIG_TCP_CONG_SCALABLE=m
-CONFIG_TCP_CONG_LP=m
-CONFIG_TCP_CONG_VENO=m
-
-#
-# IP: Virtual Server Configuration
-#
-CONFIG_IP_VS=m
-# CONFIG_IP_VS_DEBUG is not set
-CONFIG_IP_VS_TAB_BITS=12
-
-#
-# IPVS transport protocol load balancing support
-#
-CONFIG_IP_VS_PROTO_TCP=y
-CONFIG_IP_VS_PROTO_UDP=y
-CONFIG_IP_VS_PROTO_ESP=y
-CONFIG_IP_VS_PROTO_AH=y
-
-#
-# IPVS scheduler
-#
-CONFIG_IP_VS_RR=m
-CONFIG_IP_VS_WRR=m
-CONFIG_IP_VS_LC=m
-CONFIG_IP_VS_WLC=m
-CONFIG_IP_VS_LBLC=m
-CONFIG_IP_VS_LBLCR=m
-CONFIG_IP_VS_DH=m
-CONFIG_IP_VS_SH=m
-CONFIG_IP_VS_SED=m
-CONFIG_IP_VS_NQ=m
-
-#
-# IPVS application helper
-#
-CONFIG_IP_VS_FTP=m
-CONFIG_IPV6=m
-CONFIG_IPV6_PRIVACY=y
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETWORK_SECMARK=y
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_BRIDGE_NETFILTER=y
-
-#
-# Core Netfilter Configuration
-#
-CONFIG_NETFILTER_NETLINK=m
-CONFIG_NETFILTER_NETLINK_QUEUE=m
-CONFIG_NETFILTER_NETLINK_LOG=m
-CONFIG_NETFILTER_XTABLES=m
-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
-CONFIG_NETFILTER_XT_TARGET_MARK=m
-CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
-CONFIG_NETFILTER_XT_TARGET_SECMARK=m
-CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
-CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
-CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
-CONFIG_NETFILTER_XT_MATCH_DCCP=m
-CONFIG_NETFILTER_XT_MATCH_ESP=m
-CONFIG_NETFILTER_XT_MATCH_HELPER=m
-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-CONFIG_NETFILTER_XT_MATCH_MAC=m
-CONFIG_NETFILTER_XT_MATCH_MARK=m
-CONFIG_NETFILTER_XT_MATCH_POLICY=m
-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
-CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-CONFIG_NETFILTER_XT_MATCH_REALM=m
-CONFIG_NETFILTER_XT_MATCH_SCTP=m
-CONFIG_NETFILTER_XT_MATCH_STATE=m
-CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-CONFIG_NETFILTER_XT_MATCH_STRING=m
-CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK_SECMARK=y
-CONFIG_IP_NF_CONNTRACK_EVENTS=y
-CONFIG_IP_NF_CONNTRACK_NETLINK=m
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-CONFIG_IP_NF_NETBIOS_NS=m
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-CONFIG_IP_NF_PPTP=m
-CONFIG_IP_NF_H323=m
-CONFIG_IP_NF_SIP=m
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_IPRANGE=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_RECENT=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_DSCP=m
-CONFIG_IP_NF_MATCH_AH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
-CONFIG_IP_NF_MATCH_HASHLIMIT=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_TARGET_NETMAP=m
-CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_NAT_PPTP=m
-CONFIG_IP_NF_NAT_H323=m
-CONFIG_IP_NF_NAT_SIP=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_TTL=m
-CONFIG_IP_NF_TARGET_CLUSTERIP=m
-CONFIG_IP_NF_RAW=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-CONFIG_IP6_NF_QUEUE=m
-CONFIG_IP6_NF_IPTABLES=m
-CONFIG_IP6_NF_MATCH_RT=m
-CONFIG_IP6_NF_MATCH_OPTS=m
-CONFIG_IP6_NF_MATCH_FRAG=m
-CONFIG_IP6_NF_MATCH_HL=m
-CONFIG_IP6_NF_MATCH_OWNER=m
-CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-CONFIG_IP6_NF_MATCH_AH=m
-CONFIG_IP6_NF_MATCH_EUI64=m
-CONFIG_IP6_NF_FILTER=m
-CONFIG_IP6_NF_TARGET_LOG=m
-CONFIG_IP6_NF_TARGET_REJECT=m
-CONFIG_IP6_NF_MANGLE=m
-CONFIG_IP6_NF_TARGET_HL=m
-CONFIG_IP6_NF_RAW=m
-
-#
-# DECnet: Netfilter Configuration
-#
-# CONFIG_DECNET_NF_GRABULATOR is not set
-
-#
-# Bridge: Netfilter Configuration
-#
-CONFIG_BRIDGE_NF_EBTABLES=m
-CONFIG_BRIDGE_EBT_BROUTE=m
-CONFIG_BRIDGE_EBT_T_FILTER=m
-CONFIG_BRIDGE_EBT_T_NAT=m
-CONFIG_BRIDGE_EBT_802_3=m
-CONFIG_BRIDGE_EBT_AMONG=m
-CONFIG_BRIDGE_EBT_ARP=m
-CONFIG_BRIDGE_EBT_IP=m
-CONFIG_BRIDGE_EBT_LIMIT=m
-CONFIG_BRIDGE_EBT_MARK=m
-CONFIG_BRIDGE_EBT_PKTTYPE=m
-CONFIG_BRIDGE_EBT_STP=m
-CONFIG_BRIDGE_EBT_VLAN=m
-CONFIG_BRIDGE_EBT_ARPREPLY=m
-CONFIG_BRIDGE_EBT_DNAT=m
-CONFIG_BRIDGE_EBT_MARK_T=m
-CONFIG_BRIDGE_EBT_REDIRECT=m
-CONFIG_BRIDGE_EBT_SNAT=m
-CONFIG_BRIDGE_EBT_LOG=m
-CONFIG_BRIDGE_EBT_ULOG=m
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_DCCP=m
-CONFIG_INET_DCCP_DIAG=m
-CONFIG_IP_DCCP_ACKVEC=y
-
-#
-# DCCP CCIDs Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_DCCP_CCID2=m
-CONFIG_IP_DCCP_CCID3=m
-CONFIG_IP_DCCP_TFRC_LIB=m
-
-#
-# DCCP Kernel Hacking
-#
-# CONFIG_IP_DCCP_DEBUG is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IP_SCTP=m
-# CONFIG_SCTP_DBG_MSG is not set
-# CONFIG_SCTP_DBG_OBJCNT is not set
-# CONFIG_SCTP_HMAC_NONE is not set
-# CONFIG_SCTP_HMAC_SHA1 is not set
-CONFIG_SCTP_HMAC_MD5=y
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-CONFIG_TIPC=m
-# CONFIG_TIPC_ADVANCED is not set
-# CONFIG_TIPC_DEBUG is not set
-CONFIG_ATM=m
-CONFIG_ATM_CLIP=m
-# CONFIG_ATM_CLIP_NO_ICMP is not set
-CONFIG_ATM_LANE=m
-# CONFIG_ATM_MPOA is not set
-CONFIG_ATM_BR2684=m
-# CONFIG_ATM_BR2684_IPFILTER is not set
-CONFIG_BRIDGE=m
-CONFIG_VLAN_8021Q=m
-CONFIG_DECNET=m
-# CONFIG_DECNET_ROUTER is not set
-CONFIG_LLC=y
-CONFIG_LLC2=m
-CONFIG_IPX=m
-CONFIG_IPX_INTERN=y
-CONFIG_ATALK=m
-CONFIG_DEV_APPLETALK=m
-CONFIG_IPDDP=m
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
-CONFIG_X25=m
-CONFIG_LAPB=m
-CONFIG_ECONET=m
-# CONFIG_ECONET_AUNUDP is not set
-# CONFIG_ECONET_NATIVE is not set
-CONFIG_WAN_ROUTER=m
-
-#
-# QoS and/or fair queueing
-#
-CONFIG_NET_SCHED=y
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-
-#
-# Queueing/Scheduling
-#
-CONFIG_NET_SCH_CBQ=m
-CONFIG_NET_SCH_HTB=m
-CONFIG_NET_SCH_HFSC=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_NETEM=m
-CONFIG_NET_SCH_INGRESS=m
-
-#
-# Classification
-#
-CONFIG_NET_CLS=y
-CONFIG_NET_CLS_BASIC=m
-CONFIG_NET_CLS_TCINDEX=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_ROUTE=y
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_CLS_U32_PERF=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_EMATCH=y
-CONFIG_NET_EMATCH_STACK=32
-CONFIG_NET_EMATCH_CMP=m
-CONFIG_NET_EMATCH_NBYTE=m
-CONFIG_NET_EMATCH_U32=m
-CONFIG_NET_EMATCH_META=m
-CONFIG_NET_EMATCH_TEXT=m
-# CONFIG_NET_CLS_ACT is not set
-CONFIG_NET_CLS_POLICE=y
-CONFIG_NET_CLS_IND=y
-CONFIG_NET_ESTIMATOR=y
-
-#
-# Network testing
-#
-CONFIG_NET_PKTGEN=m
-CONFIG_HAMRADIO=y
-
-#
-# Packet Radio protocols
-#
-CONFIG_AX25=m
-CONFIG_AX25_DAMA_SLAVE=y
-CONFIG_NETROM=m
-CONFIG_ROSE=m
-
-#
-# AX.25 network device drivers
-#
-CONFIG_MKISS=m
-CONFIG_6PACK=m
-CONFIG_BPQETHER=m
-CONFIG_BAYCOM_SER_FDX=m
-CONFIG_BAYCOM_SER_HDX=m
-CONFIG_BAYCOM_PAR=m
-CONFIG_YAM=m
-CONFIG_IRDA=m
-
-#
-# IrDA protocols
-#
-CONFIG_IRLAN=m
-CONFIG_IRNET=m
-CONFIG_IRCOMM=m
-CONFIG_IRDA_ULTRA=y
-
-#
-# IrDA options
-#
-CONFIG_IRDA_CACHE_LAST_LSAP=y
-CONFIG_IRDA_FAST_RR=y
-# CONFIG_IRDA_DEBUG is not set
-
-#
-# Infrared-port device drivers
-#
-
-#
-# SIR device drivers
-#
-CONFIG_IRTTY_SIR=m
-
-#
-# Dongle support
-#
-CONFIG_DONGLE=y
-CONFIG_ESI_DONGLE=m
-CONFIG_ACTISYS_DONGLE=m
-CONFIG_TEKRAM_DONGLE=m
-CONFIG_TOIM3232_DONGLE=m
-CONFIG_LITELINK_DONGLE=m
-CONFIG_MA600_DONGLE=m
-CONFIG_GIRBIL_DONGLE=m
-CONFIG_MCP2120_DONGLE=m
-CONFIG_OLD_BELKIN_DONGLE=m
-CONFIG_ACT200L_DONGLE=m
-
-#
-# Old SIR device drivers
-#
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-CONFIG_SIGMATEL_FIR=m
-CONFIG_NSC_FIR=m
-CONFIG_WINBOND_FIR=m
-CONFIG_SMC_IRCC_FIR=m
-CONFIG_ALI_FIR=m
-CONFIG_VLSI_FIR=m
-CONFIG_VIA_FIR=m
-CONFIG_MCS_FIR=m
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-CONFIG_BT_CMTP=m
-CONFIG_BT_HIDP=m
-
-#
-# Bluetooth device drivers
-#
-CONFIG_BT_HCIUSB=m
-CONFIG_BT_HCIUSB_SCO=y
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBPA10X=m
-CONFIG_BT_HCIBFUSB=m
-# CONFIG_BT_HCIDTL1 is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBTUART is not set
-CONFIG_BT_HCIVHCI=m
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-CONFIG_IEEE80211_SOFTMAC=m
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=m
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-CONFIG_CONNECTOR=y
-CONFIG_PROC_EVENTS=y
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=m
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=m
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_REDBOOT_PARTS=m
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=m
-CONFIG_MTD_BLOCK=m
-CONFIG_MTD_BLOCK_RO=m
-CONFIG_FTL=m
-CONFIG_NFTL=m
-CONFIG_NFTL_RW=y
-CONFIG_INFTL=m
-CONFIG_RFD_FTL=m
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=m
-CONFIG_MTD_JEDECPROBE=m
-CONFIG_MTD_GEN_PROBE=m
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_CFI_INTELEXT=m
-CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
-CONFIG_MTD_RAM=m
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ABSENT=m
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_PHYSMAP=m
-CONFIG_MTD_PHYSMAP_START=0x8000000
-CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-# CONFIG_MTD_PNC2000 is not set
-CONFIG_MTD_SC520CDP=m
-CONFIG_MTD_NETSC520=m
-CONFIG_MTD_TS5500=m
-CONFIG_MTD_SBC_GXX=m
-# CONFIG_MTD_AMD76XROM is not set
-# CONFIG_MTD_ICHXROM is not set
-CONFIG_MTD_SCB2_FLASH=m
-# CONFIG_MTD_NETtel is not set
-# CONFIG_MTD_DILNETPC is not set
-# CONFIG_MTD_L440GX is not set
-CONFIG_MTD_PCI=m
-CONFIG_MTD_PLATRAM=m
-
-#
-# Self-contained MTD device drivers
-#
-CONFIG_MTD_PMC551=m
-# CONFIG_MTD_PMC551_BUGFIX is not set
-# CONFIG_MTD_PMC551_DEBUG is not set
-CONFIG_MTD_DATAFLASH=m
-CONFIG_MTD_M25P80=m
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_PHRAM is not set
-CONFIG_MTD_MTDRAM=m
-CONFIG_MTDRAM_TOTAL_SIZE=4096
-CONFIG_MTDRAM_ERASE_SIZE=128
-CONFIG_MTD_BLOCK2MTD=m
-
-#
-# Disk-On-Chip Device Drivers
-#
-CONFIG_MTD_DOC2000=m
-CONFIG_MTD_DOC2001=m
-CONFIG_MTD_DOC2001PLUS=m
-CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
-CONFIG_MTD_DOCPROBE_ADVANCED=y
-CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
-CONFIG_MTD_DOCPROBE_HIGH=y
-CONFIG_MTD_DOCPROBE_55AA=y
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=m
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-CONFIG_MTD_NAND_IDS=m
-CONFIG_MTD_NAND_DISKONCHIP=m
-# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
-CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
-CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y
-CONFIG_MTD_NAND_NANDSIM=m
-
-#
-# OneNAND Flash Device Drivers
-#
-CONFIG_MTD_ONENAND=m
-# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND_OTP is not set
-
-#
-# Parallel port support
-#
-CONFIG_PARPORT=m
-CONFIG_PARPORT_PC=m
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_PC_PCMCIA is not set
-CONFIG_PARPORT_NOT_PC=y
-# CONFIG_PARPORT_GSC is not set
-CONFIG_PARPORT_AX88796=m
-CONFIG_PARPORT_1284=y
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-CONFIG_PNP_DEBUG=y
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=m
-CONFIG_PARIDE=m
-CONFIG_PARIDE_PARPORT=m
-
-#
-# Parallel IDE high-level drivers
-#
-CONFIG_PARIDE_PD=m
-CONFIG_PARIDE_PCD=m
-CONFIG_PARIDE_PF=m
-CONFIG_PARIDE_PT=m
-CONFIG_PARIDE_PG=m
-
-#
-# Parallel IDE protocol modules
-#
-CONFIG_PARIDE_ATEN=m
-CONFIG_PARIDE_BPCK=m
-CONFIG_PARIDE_COMM=m
-CONFIG_PARIDE_DSTR=m
-CONFIG_PARIDE_FIT2=m
-CONFIG_PARIDE_FIT3=m
-CONFIG_PARIDE_EPAT=m
-CONFIG_PARIDE_EPATC8=y
-CONFIG_PARIDE_EPIA=m
-CONFIG_PARIDE_FRIQ=m
-CONFIG_PARIDE_FRPW=m
-CONFIG_PARIDE_KBIC=m
-CONFIG_PARIDE_KTTI=m
-CONFIG_PARIDE_ON20=m
-CONFIG_PARIDE_ON26=m
-CONFIG_BLK_CPQ_DA=m
-CONFIG_BLK_CPQ_CISS_DA=m
-CONFIG_CISS_SCSI_TAPE=y
-CONFIG_BLK_DEV_DAC960=m
-CONFIG_BLK_DEV_UMEM=m
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_CRYPTOLOOP=m
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_SX8=m
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=16384
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_CDROM_PKTCDVD_BUFFERS=8
-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-CONFIG_ATA_OVER_ETH=m
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=m
-CONFIG_IDEDISK_MULTI_MODE=y
-# CONFIG_BLK_DEV_IDECS is not set
-CONFIG_BLK_DEV_IDECD=m
-CONFIG_BLK_DEV_IDETAPE=m
-CONFIG_BLK_DEV_IDEFLOPPY=m
-CONFIG_BLK_DEV_IDESCSI=m
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=m
-CONFIG_BLK_DEV_CMD640=y
-CONFIG_BLK_DEV_CMD640_ENHANCED=y
-CONFIG_BLK_DEV_IDEPNP=y
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-CONFIG_BLK_DEV_OFFBOARD=y
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_RZ1000=m
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-# CONFIG_IDEDMA_ONLYDISK is not set
-CONFIG_BLK_DEV_AEC62XX=m
-CONFIG_BLK_DEV_ALI15X3=m
-# CONFIG_WDC_ALI15X3 is not set
-CONFIG_BLK_DEV_AMD74XX=m
-CONFIG_BLK_DEV_ATIIXP=m
-CONFIG_BLK_DEV_CMD64X=m
-CONFIG_BLK_DEV_TRIFLEX=m
-CONFIG_BLK_DEV_CY82C693=m
-CONFIG_BLK_DEV_CS5520=m
-CONFIG_BLK_DEV_CS5530=m
-CONFIG_BLK_DEV_HPT34X=m
-CONFIG_HPT34X_AUTODMA=y
-CONFIG_BLK_DEV_HPT366=m
-CONFIG_BLK_DEV_SC1200=m
-CONFIG_BLK_DEV_PIIX=m
-CONFIG_BLK_DEV_IT821X=m
-CONFIG_BLK_DEV_NS87415=m
-CONFIG_BLK_DEV_PDC202XX_OLD=m
-CONFIG_PDC202XX_BURST=y
-CONFIG_BLK_DEV_PDC202XX_NEW=m
-CONFIG_BLK_DEV_SVWKS=m
-CONFIG_BLK_DEV_SIIMAGE=m
-CONFIG_BLK_DEV_SIS5513=m
-CONFIG_BLK_DEV_SLC90E66=m
-# CONFIG_BLK_DEV_TRM290 is not set
-CONFIG_BLK_DEV_VIA82CXXX=m
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-CONFIG_RAID_ATTRS=m
-CONFIG_SCSI=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-CONFIG_BLK_DEV_SR=m
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=m
-CONFIG_CHR_DEV_SCH=m
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_FC_ATTRS=m
-CONFIG_SCSI_ISCSI_ATTRS=m
-CONFIG_SCSI_SAS_ATTRS=m
-
-#
-# SCSI low-level drivers
-#
-CONFIG_ISCSI_TCP=m
-CONFIG_BLK_DEV_3W_XXXX_RAID=m
-CONFIG_SCSI_3W_9XXX=m
-CONFIG_SCSI_ACARD=m
-CONFIG_SCSI_AACRAID=m
-CONFIG_SCSI_AIC7XXX=m
-CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
-CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
-CONFIG_AIC7XXX_DEBUG_MASK=0
-# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
-CONFIG_SCSI_AIC7XXX_OLD=m
-CONFIG_SCSI_AIC79XX=m
-CONFIG_AIC79XX_CMDS_PER_DEVICE=4
-CONFIG_AIC79XX_RESET_DELAY_MS=15000
-# CONFIG_AIC79XX_ENABLE_RD_STRM is not set
-# CONFIG_AIC79XX_DEBUG_ENABLE is not set
-CONFIG_AIC79XX_DEBUG_MASK=0
-# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
-CONFIG_MEGARAID_NEWGEN=y
-CONFIG_MEGARAID_MM=m
-CONFIG_MEGARAID_MAILBOX=m
-CONFIG_MEGARAID_LEGACY=m
-CONFIG_MEGARAID_SAS=m
-CONFIG_SCSI_SATA=m
-CONFIG_SCSI_SATA_AHCI=m
-CONFIG_SCSI_SATA_SVW=m
-CONFIG_SCSI_ATA_PIIX=m
-CONFIG_SCSI_SATA_MV=m
-CONFIG_SCSI_SATA_NV=m
-CONFIG_SCSI_PDC_ADMA=m
-CONFIG_SCSI_HPTIOP=m
-CONFIG_SCSI_SATA_QSTOR=m
-CONFIG_SCSI_SATA_PROMISE=m
-CONFIG_SCSI_SATA_SX4=m
-CONFIG_SCSI_SATA_SIL=m
-CONFIG_SCSI_SATA_SIL24=m
-CONFIG_SCSI_SATA_SIS=m
-CONFIG_SCSI_SATA_ULI=m
-CONFIG_SCSI_SATA_VIA=m
-CONFIG_SCSI_SATA_VITESSE=m
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-CONFIG_SCSI_BUSLOGIC=m
-# CONFIG_SCSI_OMIT_FLASHPOINT is not set
-CONFIG_SCSI_DMX3191D=m
-CONFIG_SCSI_EATA=m
-CONFIG_SCSI_EATA_TAGGED_QUEUE=y
-CONFIG_SCSI_EATA_LINKED_COMMANDS=y
-CONFIG_SCSI_EATA_MAX_TAGS=16
-CONFIG_SCSI_FUTURE_DOMAIN=m
-CONFIG_SCSI_GDTH=m
-CONFIG_SCSI_IPS=m
-CONFIG_SCSI_INITIO=m
-CONFIG_SCSI_INIA100=m
-CONFIG_SCSI_PPA=m
-CONFIG_SCSI_IMM=m
-# CONFIG_SCSI_IZIP_EPP16 is not set
-# CONFIG_SCSI_IZIP_SLOW_CTR is not set
-CONFIG_SCSI_SYM53C8XX_2=m
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# CONFIG_SCSI_IPR is not set
-CONFIG_SCSI_QLOGIC_1280=m
-CONFIG_SCSI_QLA_FC=m
-CONFIG_SCSI_LPFC=m
-CONFIG_SCSI_DC395x=m
-CONFIG_SCSI_DC390T=m
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# PCMCIA SCSI adapter support
-#
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID10=m
-CONFIG_MD_RAID456=m
-CONFIG_MD_RAID5_RESHAPE=y
-CONFIG_MD_MULTIPATH=m
-CONFIG_MD_FAULTY=m
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=m
-CONFIG_FUSION_FC=m
-CONFIG_FUSION_SAS=m
-CONFIG_FUSION_MAX_SGE=128
-CONFIG_FUSION_CTL=m
-CONFIG_FUSION_LAN=m
-
-#
-# IEEE 1394 (FireWire) support
-#
-CONFIG_IEEE1394=m
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-CONFIG_IEEE1394_OUI_DB=y
-CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y
-CONFIG_IEEE1394_CONFIG_ROM_IP1394=y
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
-
-#
-# Device Drivers
-#
-CONFIG_IEEE1394_PCILYNX=m
-CONFIG_IEEE1394_OHCI1394=m
-
-#
-# Protocol Drivers
-#
-CONFIG_IEEE1394_VIDEO1394=m
-CONFIG_IEEE1394_SBP2=m
-CONFIG_IEEE1394_ETH1394=m
-CONFIG_IEEE1394_DV1394=m
-CONFIG_IEEE1394_RAWIO=m
-
-#
-# I2O device support
-#
-CONFIG_I2O=m
-CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
-CONFIG_I2O_EXT_ADAPTEC=y
-CONFIG_I2O_EXT_ADAPTEC_DMA64=y
-CONFIG_I2O_CONFIG=m
-CONFIG_I2O_CONFIG_OLD_IOCTL=y
-CONFIG_I2O_BUS=m
-CONFIG_I2O_BLOCK=m
-CONFIG_I2O_SCSI=m
-CONFIG_I2O_PROC=m
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=m
-CONFIG_NET_SB1000=m
-
-#
-# ARCnet devices
-#
-CONFIG_ARCNET=m
-CONFIG_ARCNET_1201=m
-CONFIG_ARCNET_1051=m
-CONFIG_ARCNET_RAW=m
-CONFIG_ARCNET_CAP=m
-CONFIG_ARCNET_COM90xx=m
-CONFIG_ARCNET_COM90xxIO=m
-CONFIG_ARCNET_RIM_I=m
-# CONFIG_ARCNET_COM20020 is not set
-
-#
-# PHY device support
-#
-CONFIG_PHYLIB=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_FIXED_PHY=m
-# CONFIG_FIXED_MII_10_FDX is not set
-# CONFIG_FIXED_MII_100_FDX is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-CONFIG_HAPPYMEAL=m
-CONFIG_SUNGEM=m
-CONFIG_CASSINI=m
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-CONFIG_DE2104X=m
-CONFIG_TULIP=m
-# CONFIG_TULIP_MWI is not set
-# CONFIG_TULIP_MMIO is not set
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-CONFIG_DE4X5=m
-CONFIG_WINBOND_840=m
-CONFIG_DM9102=m
-CONFIG_ULI526X=m
-CONFIG_PCMCIA_XIRCOM=m
-CONFIG_HP100=m
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=m
-CONFIG_AMD8111_ETH=m
-CONFIG_AMD8111E_NAPI=y
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_ADAPTEC_STARFIRE_NAPI=y
-CONFIG_B44=m
-CONFIG_FORCEDETH=m
-CONFIG_DGRS=m
-CONFIG_EEPRO100=m
-CONFIG_E100=m
-CONFIG_FEALNX=m
-CONFIG_NATSEMI=m
-CONFIG_NE2K_PCI=m
-CONFIG_8139CP=m
-CONFIG_8139TOO=m
-# CONFIG_8139TOO_PIO is not set
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-CONFIG_8139TOO_8129=y
-# CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_SIS900=m
-CONFIG_EPIC100=m
-CONFIG_SUNDANCE=m
-# CONFIG_SUNDANCE_MMIO is not set
-CONFIG_VIA_RHINE=m
-# CONFIG_VIA_RHINE_MMIO is not set
-# CONFIG_VIA_RHINE_NAPI is not set
-# CONFIG_NET_POCKET is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=m
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-CONFIG_DL2K=m
-CONFIG_E1000=m
-CONFIG_E1000_NAPI=y
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-CONFIG_NS83820=m
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_R8169=m
-CONFIG_R8169_NAPI=y
-CONFIG_R8169_VLAN=y
-CONFIG_SIS190=m
-CONFIG_SKGE=m
-CONFIG_SKY2=m
-CONFIG_SK98LIN=m
-CONFIG_VIA_VELOCITY=m
-CONFIG_TIGON3=m
-CONFIG_BNX2=m
-
-#
-# Ethernet (10000 Mbit)
-#
-CONFIG_CHELSIO_T1=m
-CONFIG_IXGB=m
-CONFIG_IXGB_NAPI=y
-CONFIG_S2IO=m
-CONFIG_S2IO_NAPI=y
-CONFIG_MYRI10GE=m
-
-#
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=m
-CONFIG_3C359=m
-CONFIG_TMS380TR=m
-CONFIG_TMSPCI=m
-CONFIG_ABYSS=m
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-CONFIG_NET_WIRELESS_RTNETLINK=y
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-CONFIG_STRIP=m
-CONFIG_PCMCIA_WAVELAN=m
-CONFIG_PCMCIA_NETWAVE=m
-
-#
-# Wireless 802.11 Frequency Hopping cards support
-#
-CONFIG_PCMCIA_RAYCS=m
-
-#
-# Wireless 802.11b ISA/PCI cards support
-#
-CONFIG_IPW2100=m
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2200=m
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPW2200_PROMISCUOUS is not set
-CONFIG_IPW2200_QOS=y
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_AIRO=m
-CONFIG_HERMES=m
-CONFIG_PLX_HERMES=m
-CONFIG_TMD_HERMES=m
-CONFIG_NORTEL_HERMES=m
-CONFIG_PCI_HERMES=m
-CONFIG_ATMEL=m
-CONFIG_PCI_ATMEL=m
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_WL3501 is not set
-
-#
-# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
-#
-CONFIG_PRISM54=m
-CONFIG_USB_ZD1201=m
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-CONFIG_HOSTAP_FIRMWARE_NVRAM=y
-CONFIG_HOSTAP_PLX=m
-CONFIG_HOSTAP_PCI=m
-# CONFIG_HOSTAP_CS is not set
-CONFIG_BCM43XX=m
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA=y
-CONFIG_BCM43XX_PIO=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_ZD1211RW=m
-# CONFIG_ZD1211RW_DEBUG is not set
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-# CONFIG_NET_PCMCIA is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# ATM drivers
-#
-CONFIG_ATM_DUMMY=m
-CONFIG_ATM_TCP=m
-CONFIG_ATM_LANAI=m
-CONFIG_ATM_ENI=m
-# CONFIG_ATM_ENI_DEBUG is not set
-# CONFIG_ATM_ENI_TUNE_BURST is not set
-CONFIG_ATM_FIRESTREAM=m
-# CONFIG_ATM_ZATM is not set
-CONFIG_ATM_IDT77252=m
-# CONFIG_ATM_IDT77252_DEBUG is not set
-# CONFIG_ATM_IDT77252_RCV_ALL is not set
-CONFIG_ATM_IDT77252_USE_SUNI=y
-CONFIG_ATM_AMBASSADOR=m
-# CONFIG_ATM_AMBASSADOR_DEBUG is not set
-CONFIG_ATM_HORIZON=m
-# CONFIG_ATM_HORIZON_DEBUG is not set
-CONFIG_ATM_FORE200E_MAYBE=m
-# CONFIG_ATM_FORE200E_PCA is not set
-CONFIG_ATM_HE=m
-# CONFIG_ATM_HE_USE_SUNI is not set
-CONFIG_FDDI=y
-# CONFIG_DEFXX is not set
-CONFIG_SKFP=m
-CONFIG_HIPPI=y
-CONFIG_ROADRUNNER=m
-CONFIG_ROADRUNNER_LARGE_RINGS=y
-CONFIG_PLIP=m
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPP_MPPE=m
-CONFIG_PPPOE=m
-CONFIG_PPPOATM=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-CONFIG_SLIP_MODE_SLIP6=y
-CONFIG_NET_FC=y
-CONFIG_SHAPER=m
-CONFIG_NETCONSOLE=m
-CONFIG_NETPOLL=y
-CONFIG_NETPOLL_RX=y
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-
-#
-# ISDN subsystem
-#
-CONFIG_ISDN=m
-
-#
-# Old ISDN4Linux
-#
-CONFIG_ISDN_I4L=m
-CONFIG_ISDN_PPP=y
-CONFIG_ISDN_PPP_VJ=y
-CONFIG_ISDN_MPP=y
-CONFIG_IPPP_FILTER=y
-CONFIG_ISDN_PPP_BSDCOMP=m
-CONFIG_ISDN_AUDIO=y
-CONFIG_ISDN_TTY_FAX=y
-CONFIG_ISDN_X25=y
-
-#
-# ISDN feature submodules
-#
-CONFIG_ISDN_DIVERSION=m
-
-#
-# ISDN4Linux hardware drivers
-#
-
-#
-# Passive cards
-#
-CONFIG_ISDN_DRV_HISAX=m
-
-#
-# D-channel protocol features
-#
-CONFIG_HISAX_EURO=y
-CONFIG_DE_AOC=y
-CONFIG_HISAX_NO_SENDCOMPLETE=y
-CONFIG_HISAX_NO_LLC=y
-CONFIG_HISAX_NO_KEYPAD=y
-CONFIG_HISAX_1TR6=y
-CONFIG_HISAX_NI1=y
-CONFIG_HISAX_MAX_CARDS=8
-
-#
-# HiSax supported cards
-#
-CONFIG_HISAX_16_3=y
-CONFIG_HISAX_TELESPCI=y
-CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_FRITZPCI=y
-CONFIG_HISAX_AVM_A1_PCMCIA=y
-CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_NETJET=y
-CONFIG_HISAX_NETJET_U=y
-CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_BKM_A4T=y
-CONFIG_HISAX_SCT_QUADRO=y
-CONFIG_HISAX_GAZEL=y
-CONFIG_HISAX_HFC_PCI=y
-CONFIG_HISAX_W6692=y
-CONFIG_HISAX_HFC_SX=y
-CONFIG_HISAX_ENTERNOW_PCI=y
-# CONFIG_HISAX_DEBUG is not set
-
-#
-# HiSax PCMCIA card service modules
-#
-# CONFIG_HISAX_SEDLBAUER_CS is not set
-# CONFIG_HISAX_ELSA_CS is not set
-# CONFIG_HISAX_AVM_A1_CS is not set
-# CONFIG_HISAX_TELES_CS is not set
-
-#
-# HiSax sub driver modules
-#
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_HFC4S8S=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-CONFIG_HISAX_HDLC=y
-
-#
-# Active cards
-#
-
-#
-# Siemens Gigaset
-#
-CONFIG_ISDN_DRV_GIGASET=m
-CONFIG_GIGASET_BASE=m
-CONFIG_GIGASET_M105=m
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GIGASET_UNDOCREQ is not set
-
-#
-# CAPI subsystem
-#
-CONFIG_ISDN_CAPI=m
-CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y
-CONFIG_ISDN_CAPI_MIDDLEWARE=y
-CONFIG_ISDN_CAPI_CAPI20=m
-CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
-CONFIG_ISDN_CAPI_CAPIFS=m
-CONFIG_ISDN_CAPI_CAPIDRV=m
-
-#
-# CAPI hardware drivers
-#
-
-#
-# Active AVM cards
-#
-CONFIG_CAPI_AVM=y
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-# CONFIG_ISDN_DRV_AVMB1_AVM_CS is not set
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-
-#
-# Active Eicon DIVA Server cards
-#
-# CONFIG_CAPI_EICON is not set
-
-#
-# Telephony Support
-#
-CONFIG_PHONE=m
-CONFIG_PHONE_IXJ=m
-CONFIG_PHONE_IXJ_PCMCIA=m
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=m
-CONFIG_INPUT_TSDEV=m
-CONFIG_INPUT_TSDEV_SCREEN_X=240
-CONFIG_INPUT_TSDEV_SCREEN_Y=320
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-CONFIG_KEYBOARD_SUNKBD=m
-# CONFIG_KEYBOARD_LKKBD is not set
-CONFIG_KEYBOARD_XTKBD=m
-CONFIG_KEYBOARD_NEWTON=m
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-CONFIG_MOUSE_SERIAL=m
-# CONFIG_MOUSE_VSXXXAA is not set
-CONFIG_INPUT_JOYSTICK=y
-CONFIG_JOYSTICK_ANALOG=m
-CONFIG_JOYSTICK_A3D=m
-CONFIG_JOYSTICK_ADI=m
-CONFIG_JOYSTICK_COBRA=m
-CONFIG_JOYSTICK_GF2K=m
-CONFIG_JOYSTICK_GRIP=m
-CONFIG_JOYSTICK_GRIP_MP=m
-CONFIG_JOYSTICK_GUILLEMOT=m
-CONFIG_JOYSTICK_INTERACT=m
-CONFIG_JOYSTICK_SIDEWINDER=m
-CONFIG_JOYSTICK_TMDC=m
-CONFIG_JOYSTICK_IFORCE=m
-CONFIG_JOYSTICK_IFORCE_USB=y
-CONFIG_JOYSTICK_IFORCE_232=y
-CONFIG_JOYSTICK_WARRIOR=m
-CONFIG_JOYSTICK_MAGELLAN=m
-CONFIG_JOYSTICK_SPACEORB=m
-CONFIG_JOYSTICK_SPACEBALL=m
-CONFIG_JOYSTICK_STINGER=m
-CONFIG_JOYSTICK_TWIDJOY=m
-CONFIG_JOYSTICK_DB9=m
-CONFIG_JOYSTICK_GAMECON=m
-CONFIG_JOYSTICK_TURBOGRAFX=m
-CONFIG_JOYSTICK_JOYDUMP=m
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_ADS7846=m
-CONFIG_TOUCHSCREEN_GUNZE=m
-CONFIG_TOUCHSCREEN_ELO=m
-CONFIG_TOUCHSCREEN_MTOUCH=m
-CONFIG_TOUCHSCREEN_MK712=m
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_PCSPKR=m
-CONFIG_INPUT_UINPUT=m
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=m
-CONFIG_SERIO_CT82C710=m
-CONFIG_SERIO_PARKBD=m
-CONFIG_SERIO_PCIPS2=m
-CONFIG_SERIO_LIBPS2=y
-CONFIG_SERIO_RAW=m
-CONFIG_GAMEPORT=m
-CONFIG_GAMEPORT_NS558=m
-CONFIG_GAMEPORT_L4=m
-CONFIG_GAMEPORT_EMU10K1=m
-CONFIG_GAMEPORT_FM801=m
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-
-#
-# Non-8250 serial port support
-#
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=64
-CONFIG_PRINTER=m
-CONFIG_LP_CONSOLE=y
-CONFIG_PPDEV=m
-CONFIG_TIPAR=m
-
-#
-# IPMI
-#
-CONFIG_IPMI_HANDLER=m
-CONFIG_IPMI_PANIC_EVENT=y
-# CONFIG_IPMI_PANIC_STRING is not set
-CONFIG_IPMI_DEVICE_INTERFACE=m
-CONFIG_IPMI_SI=m
-CONFIG_IPMI_WATCHDOG=m
-CONFIG_IPMI_POWEROFF=m
-
-#
-# Watchdog Cards
-#
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-
-#
-# Watchdog Device Drivers
-#
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_ACQUIRE_WDT=m
-CONFIG_ADVANTECH_WDT=m
-CONFIG_ALIM1535_WDT=m
-CONFIG_ALIM7101_WDT=m
-CONFIG_SC520_WDT=m
-CONFIG_EUROTECH_WDT=m
-CONFIG_IB700_WDT=m
-CONFIG_IBMASR=m
-CONFIG_WAFER_WDT=m
-CONFIG_I6300ESB_WDT=m
-CONFIG_I8XX_TCO=m
-CONFIG_SC1200_WDT=m
-CONFIG_60XX_WDT=m
-CONFIG_SBC8360_WDT=m
-CONFIG_CPU5_WDT=m
-CONFIG_W83627HF_WDT=m
-CONFIG_W83877F_WDT=m
-CONFIG_W83977F_WDT=m
-CONFIG_MACHZ_WDT=m
-CONFIG_SBC_EPX_C3_WATCHDOG=m
-
-#
-# PCI-based Watchdog Cards
-#
-CONFIG_PCIPCWATCHDOG=m
-CONFIG_WDTPCI=m
-CONFIG_WDT_501_PCI=y
-
-#
-# USB-based Watchdog Cards
-#
-CONFIG_USBPCWATCHDOG=m
-CONFIG_HW_RANDOM=y
-CONFIG_HW_RANDOM_INTEL=m
-CONFIG_HW_RANDOM_AMD=m
-CONFIG_HW_RANDOM_GEODE=m
-CONFIG_NVRAM=y
-CONFIG_RTC=y
-CONFIG_DTLK=m
-CONFIG_R3964=m
-CONFIG_APPLICOM=m
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=m
-CONFIG_AGP_AMD64=m
-CONFIG_AGP_INTEL=m
-CONFIG_AGP_SIS=m
-CONFIG_AGP_VIA=m
-CONFIG_DRM=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_I810=m
-# CONFIG_DRM_I830 is not set
-CONFIG_DRM_I915=m
-CONFIG_DRM_MGA=m
-# CONFIG_DRM_SIS is not set
-CONFIG_DRM_VIA=m
-CONFIG_DRM_SAVAGE=m
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_MWAVE is not set
-CONFIG_PC8736x_GPIO=m
-CONFIG_NSC_GPIO=m
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-CONFIG_HANGCHECK_TIMER=m
-
-#
-# TPM devices
-#
-CONFIG_TCG_TPM=m
-CONFIG_TCG_TIS=m
-CONFIG_TCG_NSC=m
-CONFIG_TCG_ATMEL=m
-CONFIG_TCG_INFINEON=m
-CONFIG_TCG_XEN=m
-CONFIG_TELCLOCK=m
-
-#
-# I2C support
-#
-CONFIG_I2C=m
-CONFIG_I2C_CHARDEV=m
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=m
-CONFIG_I2C_ALGOPCF=m
-CONFIG_I2C_ALGOPCA=m
-
-#
-# I2C Hardware Bus support
-#
-CONFIG_I2C_ALI1535=m
-CONFIG_I2C_ALI1563=m
-CONFIG_I2C_ALI15X3=m
-CONFIG_I2C_AMD756=m
-CONFIG_I2C_AMD756_S4882=m
-CONFIG_I2C_AMD8111=m
-CONFIG_I2C_I801=m
-CONFIG_I2C_I810=m
-CONFIG_I2C_PIIX4=m
-CONFIG_I2C_ISA=m
-CONFIG_I2C_NFORCE2=m
-CONFIG_I2C_OCORES=m
-CONFIG_I2C_PARPORT=m
-CONFIG_I2C_PARPORT_LIGHT=m
-CONFIG_I2C_PROSAVAGE=m
-CONFIG_I2C_SAVAGE4=m
-CONFIG_I2C_SIS5595=m
-CONFIG_I2C_SIS630=m
-CONFIG_I2C_SIS96X=m
-CONFIG_I2C_STUB=m
-CONFIG_I2C_VIA=m
-CONFIG_I2C_VIAPRO=m
-CONFIG_I2C_VOODOO3=m
-CONFIG_I2C_PCA_ISA=m
-
-#
-# Miscellaneous I2C Chip support
-#
-CONFIG_SENSORS_DS1337=m
-CONFIG_SENSORS_DS1374=m
-CONFIG_SENSORS_EEPROM=m
-CONFIG_SENSORS_PCF8574=m
-CONFIG_SENSORS_PCA9539=m
-CONFIG_SENSORS_PCF8591=m
-CONFIG_SENSORS_MAX6875=m
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-CONFIG_SPI_BITBANG=m
-CONFIG_SPI_BUTTERFLY=m
-
-#
-# SPI Protocol Masters
-#
-
-#
-# Dallas's 1-wire bus
-#
-CONFIG_W1=m
-CONFIG_W1_CON=y
-
-#
-# 1-wire Bus Masters
-#
-CONFIG_W1_MASTER_MATROX=m
-CONFIG_W1_MASTER_DS2490=m
-CONFIG_W1_MASTER_DS2482=m
-
-#
-# 1-wire Slaves
-#
-CONFIG_W1_SLAVE_THERM=m
-CONFIG_W1_SLAVE_SMEM=m
-CONFIG_W1_SLAVE_DS2433=m
-# CONFIG_W1_SLAVE_DS2433_CRC is not set
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=m
-CONFIG_HWMON_VID=m
-CONFIG_SENSORS_ABITUGURU=m
-CONFIG_SENSORS_ADM1021=m
-CONFIG_SENSORS_ADM1025=m
-CONFIG_SENSORS_ADM1026=m
-CONFIG_SENSORS_ADM1031=m
-CONFIG_SENSORS_ADM9240=m
-CONFIG_SENSORS_ASB100=m
-CONFIG_SENSORS_ATXP1=m
-CONFIG_SENSORS_DS1621=m
-CONFIG_SENSORS_F71805F=m
-CONFIG_SENSORS_FSCHER=m
-CONFIG_SENSORS_FSCPOS=m
-CONFIG_SENSORS_GL518SM=m
-CONFIG_SENSORS_GL520SM=m
-CONFIG_SENSORS_IT87=m
-CONFIG_SENSORS_LM63=m
-CONFIG_SENSORS_LM70=m
-CONFIG_SENSORS_LM75=m
-CONFIG_SENSORS_LM77=m
-CONFIG_SENSORS_LM78=m
-CONFIG_SENSORS_LM80=m
-CONFIG_SENSORS_LM83=m
-CONFIG_SENSORS_LM85=m
-CONFIG_SENSORS_LM87=m
-CONFIG_SENSORS_LM90=m
-CONFIG_SENSORS_LM92=m
-CONFIG_SENSORS_MAX1619=m
-CONFIG_SENSORS_PC87360=m
-CONFIG_SENSORS_SIS5595=m
-CONFIG_SENSORS_SMSC47M1=m
-CONFIG_SENSORS_SMSC47M192=m
-CONFIG_SENSORS_SMSC47B397=m
-CONFIG_SENSORS_VIA686A=m
-CONFIG_SENSORS_VT8231=m
-CONFIG_SENSORS_W83781D=m
-CONFIG_SENSORS_W83791D=m
-CONFIG_SENSORS_W83792D=m
-CONFIG_SENSORS_W83L785TS=m
-CONFIG_SENSORS_W83627HF=m
-CONFIG_SENSORS_W83627EHF=m
-CONFIG_SENSORS_HDAPS=m
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-CONFIG_IBM_ASM=m
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video Capture Adapters
-#
-
-#
-# Video Capture Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-CONFIG_VIDEO_VIVI=m
-CONFIG_VIDEO_BT848=m
-CONFIG_VIDEO_BT848_DVB=y
-CONFIG_VIDEO_SAA6588=m
-CONFIG_VIDEO_BWQCAM=m
-CONFIG_VIDEO_CQCAM=m
-CONFIG_VIDEO_W9966=m
-CONFIG_VIDEO_CPIA=m
-CONFIG_VIDEO_CPIA_PP=m
-CONFIG_VIDEO_CPIA_USB=m
-CONFIG_VIDEO_CPIA2=m
-CONFIG_VIDEO_SAA5246A=m
-CONFIG_VIDEO_SAA5249=m
-CONFIG_TUNER_3036=m
-CONFIG_VIDEO_STRADIS=m
-CONFIG_VIDEO_ZORAN=m
-CONFIG_VIDEO_ZORAN_BUZ=m
-CONFIG_VIDEO_ZORAN_DC10=m
-CONFIG_VIDEO_ZORAN_DC30=m
-CONFIG_VIDEO_ZORAN_LML33=m
-CONFIG_VIDEO_ZORAN_LML33R10=m
-CONFIG_VIDEO_ZORAN_AVS6EYES=m
-CONFIG_VIDEO_SAA7134=m
-CONFIG_VIDEO_SAA7134_ALSA=m
-CONFIG_VIDEO_SAA7134_DVB=m
-CONFIG_VIDEO_SAA7134_DVB_ALL_FRONTENDS=y
-CONFIG_VIDEO_MXB=m
-CONFIG_VIDEO_DPC=m
-CONFIG_VIDEO_HEXIUM_ORION=m
-CONFIG_VIDEO_HEXIUM_GEMINI=m
-CONFIG_VIDEO_CX88_VP3054=m
-CONFIG_VIDEO_CX88=m
-CONFIG_VIDEO_CX88_ALSA=m
-CONFIG_VIDEO_CX88_BLACKBIRD=m
-CONFIG_VIDEO_CX88_DVB=m
-CONFIG_VIDEO_CX88_DVB_ALL_FRONTENDS=y
-
-#
-# Encoders and Decoders
-#
-CONFIG_VIDEO_MSP3400=m
-CONFIG_VIDEO_CS53L32A=m
-CONFIG_VIDEO_TLV320AIC23B=m
-CONFIG_VIDEO_WM8775=m
-CONFIG_VIDEO_WM8739=m
-CONFIG_VIDEO_CX2341X=m
-CONFIG_VIDEO_CX25840=m
-CONFIG_VIDEO_SAA711X=m
-CONFIG_VIDEO_SAA7127=m
-CONFIG_VIDEO_UPD64031A=m
-CONFIG_VIDEO_UPD64083=m
-
-#
-# V4L USB devices
-#
-CONFIG_VIDEO_PVRUSB2=m
-CONFIG_VIDEO_PVRUSB2_24XXX=y
-CONFIG_VIDEO_PVRUSB2_SYSFS=y
-# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
-CONFIG_VIDEO_EM28XX=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-CONFIG_USB_QUICKCAM_MESSENGER=m
-CONFIG_USB_ET61X251=m
-CONFIG_VIDEO_OVCAMCHIP=m
-CONFIG_USB_W9968CF=m
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-CONFIG_USB_ZC0301=m
-CONFIG_USB_PWC=m
-# CONFIG_USB_PWC_DEBUG is not set
-
-#
-# Radio Adapters
-#
-CONFIG_RADIO_GEMTEK_PCI=m
-CONFIG_RADIO_MAXIRADIO=m
-CONFIG_RADIO_MAESTRO=m
-CONFIG_USB_DSBR=m
-
-#
-# Digital Video Broadcasting Devices
-#
-CONFIG_DVB=y
-CONFIG_DVB_CORE=m
-
-#
-# Supported SAA7146 based PCI Adapters
-#
-CONFIG_DVB_AV7110=m
-CONFIG_DVB_AV7110_OSD=y
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
-CONFIG_DVB_BUDGET_PATCH=m
-
-#
-# Supported USB Adapters
-#
-CONFIG_DVB_USB=m
-# CONFIG_DVB_USB_DEBUG is not set
-CONFIG_DVB_USB_A800=m
-CONFIG_DVB_USB_DIBUSB_MB=m
-# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
-CONFIG_DVB_USB_DIBUSB_MC=m
-CONFIG_DVB_USB_UMT_010=m
-CONFIG_DVB_USB_CXUSB=m
-CONFIG_DVB_USB_DIGITV=m
-CONFIG_DVB_USB_VP7045=m
-CONFIG_DVB_USB_VP702X=m
-CONFIG_DVB_USB_GP8PSK=m
-CONFIG_DVB_USB_NOVA_T_USB2=m
-CONFIG_DVB_USB_DTT200U=m
-CONFIG_DVB_TTUSB_BUDGET=m
-CONFIG_DVB_TTUSB_DEC=m
-CONFIG_DVB_CINERGYT2=m
-CONFIG_DVB_CINERGYT2_TUNING=y
-CONFIG_DVB_CINERGYT2_STREAM_URB_COUNT=32
-CONFIG_DVB_CINERGYT2_STREAM_BUF_SIZE=512
-CONFIG_DVB_CINERGYT2_QUERY_INTERVAL=250
-CONFIG_DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE=y
-CONFIG_DVB_CINERGYT2_RC_QUERY_INTERVAL=100
-
-#
-# Supported FlexCopII (B2C2) Adapters
-#
-CONFIG_DVB_B2C2_FLEXCOP=m
-CONFIG_DVB_B2C2_FLEXCOP_PCI=m
-CONFIG_DVB_B2C2_FLEXCOP_USB=m
-# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
-
-#
-# Supported BT878 Adapters
-#
-CONFIG_DVB_BT8XX=m
-
-#
-# Supported Pluto2 Adapters
-#
-CONFIG_DVB_PLUTO2=m
-
-#
-# Supported DVB Frontends
-#
-
-#
-# Customise DVB Frontends
-#
-
-#
-# DVB-S (satellite) frontends
-#
-CONFIG_DVB_STV0299=m
-CONFIG_DVB_CX24110=m
-CONFIG_DVB_CX24123=m
-CONFIG_DVB_TDA8083=m
-CONFIG_DVB_MT312=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_S5H1420=m
-
-#
-# DVB-T (terrestrial) frontends
-#
-CONFIG_DVB_SP8870=m
-CONFIG_DVB_SP887X=m
-CONFIG_DVB_CX22700=m
-CONFIG_DVB_CX22702=m
-CONFIG_DVB_L64781=m
-CONFIG_DVB_TDA1004X=m
-CONFIG_DVB_NXT6000=m
-CONFIG_DVB_MT352=m
-CONFIG_DVB_ZL10353=m
-CONFIG_DVB_DIB3000MB=m
-CONFIG_DVB_DIB3000MC=m
-
-#
-# DVB-C (cable) frontends
-#
-CONFIG_DVB_VES1820=m
-CONFIG_DVB_TDA10021=m
-CONFIG_DVB_STV0297=m
-
-#
-# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
-#
-CONFIG_DVB_NXT200X=m
-CONFIG_DVB_OR51211=m
-CONFIG_DVB_OR51132=m
-CONFIG_DVB_BCM3510=m
-CONFIG_DVB_LGDT330X=m
-
-#
-# Miscellaneous devices
-#
-CONFIG_DVB_PLL=m
-CONFIG_DVB_LNBP21=m
-CONFIG_DVB_ISL6421=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_VIDEO_VIDEOBUF=m
-CONFIG_VIDEO_TUNER=m
-CONFIG_VIDEO_BUF=m
-CONFIG_VIDEO_BUF_DVB=m
-CONFIG_VIDEO_BTCX=m
-CONFIG_VIDEO_IR=m
-CONFIG_VIDEO_TVEEPROM=m
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
-CONFIG_FB_TILEBLITTING=y
-CONFIG_FB_CIRRUS=m
-# CONFIG_FB_PM2 is not set
-CONFIG_FB_CYBER2000=m
-CONFIG_FB_ARC=m
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=m
-CONFIG_FB_VESA=y
-CONFIG_FB_HGA=m
-CONFIG_FB_HGA_ACCEL=y
-CONFIG_FB_S1D13XXX=m
-CONFIG_FB_NVIDIA=m
-CONFIG_FB_NVIDIA_I2C=y
-CONFIG_FB_RIVA=m
-CONFIG_FB_RIVA_I2C=y
-# CONFIG_FB_RIVA_DEBUG is not set
-CONFIG_FB_INTEL=m
-# CONFIG_FB_INTEL_DEBUG is not set
-CONFIG_FB_MATROX=m
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G=y
-CONFIG_FB_MATROX_I2C=m
-CONFIG_FB_MATROX_MAVEN=m
-CONFIG_FB_MATROX_MULTIHEAD=y
-CONFIG_FB_RADEON=m
-CONFIG_FB_RADEON_I2C=y
-# CONFIG_FB_RADEON_DEBUG is not set
-CONFIG_FB_ATY128=m
-CONFIG_FB_ATY=m
-CONFIG_FB_ATY_CT=y
-CONFIG_FB_ATY_GENERIC_LCD=y
-CONFIG_FB_ATY_GX=y
-CONFIG_FB_SAVAGE=m
-CONFIG_FB_SAVAGE_I2C=y
-CONFIG_FB_SAVAGE_ACCEL=y
-CONFIG_FB_SIS=m
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-CONFIG_FB_NEOMAGIC=m
-CONFIG_FB_KYRO=m
-CONFIG_FB_3DFX=m
-CONFIG_FB_3DFX_ACCEL=y
-CONFIG_FB_VOODOO1=m
-CONFIG_FB_TRIDENT=m
-CONFIG_FB_TRIDENT_ACCEL=y
-CONFIG_FB_GEODE=y
-CONFIG_FB_GEODE_GX=m
-CONFIG_FB_GEODE_GX1=m
-CONFIG_FB_VIRTUAL=m
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-CONFIG_LOGO_LINUX_CLUT224=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=m
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-CONFIG_SND_RTCTIMER=m
-CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
-CONFIG_SND_DYNAMIC_MINORS=y
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_MPU401_UART=m
-CONFIG_SND_OPL3_LIB=m
-CONFIG_SND_VX_LIB=m
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=m
-CONFIG_SND_DUMMY=m
-CONFIG_SND_VIRMIDI=m
-CONFIG_SND_MTPAV=m
-CONFIG_SND_SERIAL_U16550=m
-CONFIG_SND_MPU401=m
-
-#
-# PCI devices
-#
-CONFIG_SND_AD1889=m
-CONFIG_SND_ALS300=m
-CONFIG_SND_ALS4000=m
-CONFIG_SND_ALI5451=m
-CONFIG_SND_ATIIXP=m
-CONFIG_SND_ATIIXP_MODEM=m
-CONFIG_SND_AU8810=m
-CONFIG_SND_AU8820=m
-CONFIG_SND_AU8830=m
-CONFIG_SND_AZT3328=m
-CONFIG_SND_BT87X=m
-# CONFIG_SND_BT87X_OVERCLOCK is not set
-CONFIG_SND_CA0106=m
-CONFIG_SND_CMIPCI=m
-CONFIG_SND_CS4281=m
-CONFIG_SND_CS46XX=m
-CONFIG_SND_CS46XX_NEW_DSP=y
-CONFIG_SND_DARLA20=m
-CONFIG_SND_GINA20=m
-CONFIG_SND_LAYLA20=m
-CONFIG_SND_DARLA24=m
-CONFIG_SND_GINA24=m
-CONFIG_SND_LAYLA24=m
-CONFIG_SND_MONA=m
-CONFIG_SND_MIA=m
-CONFIG_SND_ECHO3G=m
-CONFIG_SND_INDIGO=m
-CONFIG_SND_INDIGOIO=m
-CONFIG_SND_INDIGODJ=m
-CONFIG_SND_EMU10K1=m
-CONFIG_SND_EMU10K1X=m
-CONFIG_SND_ENS1370=m
-CONFIG_SND_ENS1371=m
-CONFIG_SND_ES1938=m
-CONFIG_SND_ES1968=m
-CONFIG_SND_FM801=m
-CONFIG_SND_FM801_TEA575X_BOOL=y
-CONFIG_SND_FM801_TEA575X=m
-CONFIG_SND_HDA_INTEL=m
-CONFIG_SND_HDSP=m
-CONFIG_SND_HDSPM=m
-CONFIG_SND_ICE1712=m
-CONFIG_SND_ICE1724=m
-CONFIG_SND_INTEL8X0=m
-CONFIG_SND_INTEL8X0M=m
-CONFIG_SND_KORG1212=m
-CONFIG_SND_MAESTRO3=m
-CONFIG_SND_MIXART=m
-CONFIG_SND_NM256=m
-CONFIG_SND_PCXHR=m
-CONFIG_SND_RIPTIDE=m
-CONFIG_SND_RME32=m
-CONFIG_SND_RME96=m
-CONFIG_SND_RME9652=m
-CONFIG_SND_SONICVIBES=m
-CONFIG_SND_TRIDENT=m
-CONFIG_SND_VIA82XX=m
-CONFIG_SND_VIA82XX_MODEM=m
-CONFIG_SND_VX222=m
-CONFIG_SND_YMFPCI=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-CONFIG_SND_USB_USX2Y=m
-
-#
-# PCMCIA devices
-#
-CONFIG_SND_VXPOCKET=m
-CONFIG_SND_PDAUDIOCF=m
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=m
-CONFIG_USB_EHCI_SPLIT_ISO=y
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_EHCI_TT_NEWSCHED=y
-CONFIG_USB_ISP116X_HCD=m
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_UHCI_HCD=m
-CONFIG_USB_SL811_HCD=m
-# CONFIG_USB_SL811_CS is not set
-
-#
-# USB Device Class drivers
-#
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-CONFIG_USB_STORAGE_FREECOM=y
-CONFIG_USB_STORAGE_ISD200=y
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_USBAT=y
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_JUMPSHOT=y
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_HID_FF=y
-CONFIG_HID_PID=y
-CONFIG_LOGITECH_FF=y
-CONFIG_THRUSTMASTER_FF=y
-CONFIG_USB_HIDDEV=y
-
-#
-# USB HID Boot Protocol drivers
-#
-CONFIG_USB_KBD=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-CONFIG_USB_ACECAD=m
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_TOUCHSCREEN=m
-CONFIG_USB_TOUCHSCREEN_EGALAX=y
-CONFIG_USB_TOUCHSCREEN_PANJIT=y
-CONFIG_USB_TOUCHSCREEN_3M=y
-CONFIG_USB_TOUCHSCREEN_ITM=y
-CONFIG_USB_YEALINK=m
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-CONFIG_USB_ATI_REMOTE2=m
-CONFIG_USB_KEYSPAN_REMOTE=m
-CONFIG_USB_APPLETOUCH=m
-
-#
-# USB Imaging devices
-#
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-CONFIG_USB_NET_RNDIS_HOST=m
-CONFIG_USB_NET_CDC_SUBSET=m
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-CONFIG_USB_EPSON2888=y
-CONFIG_USB_NET_ZAURUS=m
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-CONFIG_USB_USS720=m
-
-#
-# USB Serial Converter support
-#
-CONFIG_USB_SERIAL=m
-CONFIG_USB_SERIAL_GENERIC=y
-CONFIG_USB_SERIAL_AIRPRIME=m
-CONFIG_USB_SERIAL_ARK3116=m
-CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-CONFIG_USB_SERIAL_CP2101=m
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-CONFIG_USB_SERIAL_FUNSOFT=m
-CONFIG_USB_SERIAL_VISOR=m
-CONFIG_USB_SERIAL_IPAQ=m
-CONFIG_USB_SERIAL_IR=m
-CONFIG_USB_SERIAL_EDGEPORT=m
-CONFIG_USB_SERIAL_EDGEPORT_TI=m
-CONFIG_USB_SERIAL_GARMIN=m
-CONFIG_USB_SERIAL_IPW=m
-CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-CONFIG_USB_SERIAL_KEYSPAN=m
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-CONFIG_USB_SERIAL_NAVMAN=m
-CONFIG_USB_SERIAL_PL2303=m
-CONFIG_USB_SERIAL_HP4X=m
-CONFIG_USB_SERIAL_SAFE=m
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYPRESS_CY7C63=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-CONFIG_USB_APPLEDISPLAY=m
-CONFIG_USB_SISUSBVGA=m
-CONFIG_USB_SISUSBVGA_CON=y
-CONFIG_USB_LD=m
-CONFIG_USB_TEST=m
-
-#
-# USB DSL modem support
-#
-CONFIG_USB_ATM=m
-CONFIG_USB_SPEEDTOUCH=m
-CONFIG_USB_CXACRU=m
-CONFIG_USB_UEAGLEATM=m
-CONFIG_USB_XUSBATM=m
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=m
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=m
-CONFIG_MMC_SDHCI=m
-CONFIG_MMC_WBSD=m
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-
-#
-# InfiniBand support
-#
-CONFIG_INFINIBAND=m
-CONFIG_INFINIBAND_USER_MAD=m
-CONFIG_INFINIBAND_USER_ACCESS=m
-CONFIG_INFINIBAND_ADDR_TRANS=y
-CONFIG_INFINIBAND_MTHCA=m
-CONFIG_INFINIBAND_MTHCA_DEBUG=y
-CONFIG_INFINIBAND_IPOIB=m
-CONFIG_INFINIBAND_IPOIB_DEBUG=y
-# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
-CONFIG_INFINIBAND_SRP=m
-CONFIG_INFINIBAND_ISER=m
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-CONFIG_EDAC=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_EDAC_DEBUG is not set
-CONFIG_EDAC_MM_EDAC=m
-CONFIG_EDAC_E752X=m
-CONFIG_EDAC_POLL=y
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=m
-CONFIG_RTC_CLASS=m
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=m
-CONFIG_RTC_INTF_PROC=m
-CONFIG_RTC_INTF_DEV=m
-CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-
-#
-# RTC drivers
-#
-CONFIG_RTC_DRV_X1205=m
-CONFIG_RTC_DRV_DS1307=m
-CONFIG_RTC_DRV_DS1553=m
-CONFIG_RTC_DRV_ISL1208=m
-CONFIG_RTC_DRV_DS1672=m
-CONFIG_RTC_DRV_DS1742=m
-CONFIG_RTC_DRV_PCF8563=m
-CONFIG_RTC_DRV_PCF8583=m
-CONFIG_RTC_DRV_RS5C348=m
-CONFIG_RTC_DRV_RS5C372=m
-CONFIG_RTC_DRV_M48T86=m
-CONFIG_RTC_DRV_TEST=m
-CONFIG_RTC_DRV_MAX6902=m
-CONFIG_RTC_DRV_V3020=m
-
-#
-# DMA Engine support
-#
-CONFIG_DMA_ENGINE=y
-
-#
-# DMA Clients
-#
-CONFIG_NET_DMA=y
-
-#
-# DMA Devices
-#
-CONFIG_INTEL_IOATDMA=m
-
-#
-# Firmware Drivers
-#
-CONFIG_DELL_RBU=m
-CONFIG_DCDBAS=m
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_FS_XIP=y
-CONFIG_EXT3_FS=m
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=m
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=m
-# CONFIG_REISERFS_CHECK is not set
-CONFIG_REISERFS_PROC_INFO=y
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-CONFIG_JFS_SECURITY=y
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_QUOTA=y
-CONFIG_XFS_SECURITY=y
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_RT=y
-CONFIG_OCFS2_FS=m
-CONFIG_OCFS2_DEBUG_MASKLOG=y
-CONFIG_MINIX_FS=m
-CONFIG_ROMFS_FS=m
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-CONFIG_QUOTA=y
-# CONFIG_QFMT_V1 is not set
-CONFIG_QFMT_V2=m
-CONFIG_QUOTACTL=y
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_ZISOFS_FS=y
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-CONFIG_NTFS_FS=m
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_RW is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-CONFIG_CONFIGFS_FS=m
-
-#
-# Miscellaneous filesystems
-#
-CONFIG_ADFS_FS=m
-# CONFIG_ADFS_FS_RW is not set
-CONFIG_AFFS_FS=m
-CONFIG_HFS_FS=m
-CONFIG_HFSPLUS_FS=m
-CONFIG_BEFS_FS=m
-# CONFIG_BEFS_DEBUG is not set
-CONFIG_BFS_FS=m
-CONFIG_EFS_FS=m
-CONFIG_JFFS_FS=m
-CONFIG_JFFS_FS_VERBOSE=0
-CONFIG_JFFS_PROC_FS=y
-CONFIG_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_FS_XATTR=y
-CONFIG_JFFS2_FS_POSIX_ACL=y
-CONFIG_JFFS2_FS_SECURITY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_VXFS_FS=m
-CONFIG_HPFS_FS=m
-CONFIG_QNX4FS_FS=m
-CONFIG_SYSV_FS=m
-CONFIG_UFS_FS=m
-# CONFIG_UFS_FS_WRITE is not set
-# CONFIG_UFS_DEBUG is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=m
-CONFIG_NFS_V3=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=m
-CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
-CONFIG_NFSD_V3_ACL=y
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_ACL_SUPPORT=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-CONFIG_RPCSEC_GSS_SPKM3=m
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp850"
-CONFIG_CIFS=m
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_STATS2 is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-CONFIG_CIFS_XATTR=y
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-CONFIG_NCP_FS=m
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-CONFIG_NCPFS_SMALLDOS=y
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
-CONFIG_CODA_FS=m
-# CONFIG_CODA_FS_OLD_API is not set
-CONFIG_AFS_FS=m
-CONFIG_RXRPC=m
-CONFIG_9P_FS=m
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-CONFIG_OSF_PARTITION=y
-CONFIG_AMIGA_PARTITION=y
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_MAC_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-CONFIG_MINIX_SUBPARTITION=y
-CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_UNIXWARE_DISKLABEL=y
-# CONFIG_LDM_PARTITION is not set
-CONFIG_SGI_PARTITION=y
-# CONFIG_ULTRIX_PARTITION is not set
-CONFIG_SUN_PARTITION=y
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="utf8"
-CONFIG_NLS_CODEPAGE_437=m
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-CONFIG_NLS_CODEPAGE_1250=m
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ASCII=m
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_UTF8=m
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=15
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_FRAME_POINTER is not set
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_RODATA is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-CONFIG_SECURITY=y
-CONFIG_SECURITY_NETWORK=y
-# CONFIG_SECURITY_NETWORK_XFRM is not set
-CONFIG_SECURITY_CAPABILITIES=y
-CONFIG_SECURITY_ROOTPLUG=m
-CONFIG_SECURITY_SECLVL=m
-# CONFIG_SECURITY_SELINUX is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_AES_X86_64=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-CONFIG_XEN=y
-CONFIG_XEN_INTERFACE_VERSION=0x00030205
-
-#
-# XEN
-#
-CONFIG_XEN_PRIVILEGED_GUEST=y
-# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
-CONFIG_XEN_PRIVCMD=y
-CONFIG_XEN_XENBUS_DEV=y
-CONFIG_XEN_BACKEND=y
-CONFIG_XEN_BLKDEV_BACKEND=y
-CONFIG_XEN_BLKDEV_TAP=y
-CONFIG_XEN_NETDEV_BACKEND=y
-# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
-CONFIG_XEN_NETDEV_LOOPBACK=y
-CONFIG_XEN_PCIDEV_BACKEND=m
-# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
-CONFIG_XEN_PCIDEV_BACKEND_PASS=y
-# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
-# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
-CONFIG_XEN_TPMDEV_BACKEND=m
-CONFIG_XEN_BLKDEV_FRONTEND=y
-CONFIG_XEN_NETDEV_FRONTEND=y
-CONFIG_XEN_FRAMEBUFFER=y
-CONFIG_XEN_KEYBOARD=y
-CONFIG_XEN_SCRUB_PAGES=y
-CONFIG_XEN_DISABLE_SERIAL=y
-CONFIG_XEN_SYSFS=y
-CONFIG_XEN_COMPAT_030002_AND_LATER=y
-# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
-# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
-CONFIG_XEN_COMPAT_030002=y
-CONFIG_XEN_COMPAT_030004=y
-CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_XEN_UTIL=y
-CONFIG_XEN_BALLOON=y
-CONFIG_XEN_DEVMEM=y
-CONFIG_XEN_REBOOT=y
-CONFIG_XEN_SMPBOOT=y
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-CONFIG_CRC16=m
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_REED_SOLOMON=m
-CONFIG_REED_SOLOMON_DEC16=y
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
-CONFIG_PLIST=y
diff --git a/buildconfigs/src.sparse b/buildconfigs/src.sparse
deleted file mode 100644 (file)
index e9e2cb1..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-# Choose the best mirror to download linux kernel
-KERNEL_REPO = http://www.kernel.org
-
-LINUX_SRCDIR ?= linux-$(LINUX_VER)-xen
-
-# Setup pristine search path
-PRISTINE_SRC_PATH      ?= .:..
-vpath pristine-% $(PRISTINE_SRC_PATH)
-
-vpath linux-%.tar.bz2 $(LINUX_SRC_PATH)
-vpath patch-%.bz2 $(LINUX_SRC_PATH)
-
-# download a pristine Linux kernel tarball if there isn't one in LINUX_SRC_PATH
-linux-%.tar.bz2: override _LINUX_VDIR = $(word 1,$(subst ., ,$*)).$(word 2,$(subst ., ,$*))
-linux-%.tar.bz2:
-       @echo "Cannot find $@ in path $(LINUX_SRC_PATH)"
-       wget $(KERNEL_REPO)/pub/linux/kernel/v$(_LINUX_VDIR)/$@ -O./$@
-
-patch-%.bz2: override _LINUX_VDIR = $(word 1,$(subst ., ,$(*F))).$(word 2,$(subst ., ,$(*F)))
-patch-%.bz2: override _LINUX_XDIR = $(if $(word 3,$(subst -, ,$(*F))),snapshots,testing)
-patch-%.bz2:
-       @echo "Cannot find $(@F) in path $(LINUX_SRC_PATH)"
-       wget $(KERNEL_REPO)/pub/linux/kernel/v$(_LINUX_VDIR)/$(_LINUX_XDIR)/$(@F) -O./$@
-
-pristine-%: pristine-%/.valid-pristine
-       @true
-
-pristine-%/.valid-pristine: %.tar.bz2
-       rm -rf tmp-pristine-$* $(@D)
-       mkdir -p tmp-pristine-$*
-       tar -C tmp-pristine-$* -jxf $<
-       -@rm -f tmp-pristine-$*/pax_global_header
-       mv tmp-pristine-$*/* $(@D)
-       @rm -rf tmp-pristine-$*
-       touch $(@D)/.hgskip
-       touch $@ # update timestamp to avoid rebuild
-
-PATCHDIRS := $(wildcard patches/*-*)
-
-ifneq ($(PATCHDIRS),)
--include $(patsubst %,%/.makedep,$(PATCHDIRS))
-
-$(patsubst patches/%,patches/%/.makedep,$(PATCHDIRS)): patches/%/.makedep: 
-       @echo 'ref-$*/.valid-ref: $$(wildcard patches/$*/*.patch)' >$@
-
-ref-%/.valid-ref: pristine-%/.valid-pristine
-       set -e
-       rm -rf $(@D)
-       cp -al $(<D) $(@D)
-       if [ -d patches/$* ] ; then                                    \
-           echo Applying patches from patches/$*... ;                 \
-           for i in $$(cat patches/$*/series) ; do                    \
-               echo ... $$i ;                                         \
-               patch -d $(@D) -p1 --quiet <patches/$*/$$i || exit 1 ; \
-            done ;                                                    \
-       fi
-       touch $@ # update timestamp to avoid rebuild
-endif
-
-$(LINUX_SRCDIR)/.valid-src: ref-linux-$(LINUX_VER)/.valid-ref
-       rm -rf $(LINUX_SRCDIR)
-       cp -al $(<D) $(LINUX_SRCDIR)
-       # Apply arch-xen patches
-       ( cd linux-$(LINUX_SERIES)-xen-sparse && \
-          LINUX_ARCH=$(LINUX_ARCH) bash ./mkbuildtree ../$(LINUX_SRCDIR) )
-       ( cd $(LINUX_SRCDIR) && [ -e buildconfigs ] || ln -s $(PWD)/buildconfigs buildconfigs )
-       touch $@
-
-linux-2.6-xen.patch: ref-linux-$(LINUX_VER)/.valid-ref
-       rm -rf tmp-$@
-       cp -al $(<D) tmp-$@
-       ( cd linux-2.6-xen-sparse && bash ./mkbuildtree ../tmp-$@ )
-       diff -Nurp $(patsubst ref%,pristine%,$(<D)) tmp-$@ > $@ || true
-       rm -rf tmp-$@
diff --git a/linux-2.6-xen-sparse/arch/i386/Kconfig b/linux-2.6-xen-sparse/arch/i386/Kconfig
deleted file mode 100644 (file)
index f799b5f..0000000
+++ /dev/null
@@ -1,1244 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-
-mainmenu "Linux Kernel Configuration"
-
-config X86_32
-       bool
-       default y
-       help
-         This is Linux's home port.  Linux was originally native to the Intel
-         386, and runs on all the later x86 processors including the Intel
-         486, 586, Pentiums, and various instruction-set-compatible chips by
-         AMD, Cyrix, and others.
-
-config GENERIC_TIME
-       bool
-       depends on !X86_XEN
-       default y
-
-config LOCKDEP_SUPPORT
-       bool
-       default y
-
-config STACKTRACE_SUPPORT
-       bool
-       default y
-
-config SEMAPHORE_SLEEPERS
-       bool
-       default y
-
-config X86
-       bool
-       default y
-
-config MMU
-       bool
-       default y
-
-config SBUS
-       bool
-
-config GENERIC_ISA_DMA
-       bool
-       default y
-
-config GENERIC_IOMAP
-       bool
-       default y
-
-config GENERIC_HWEIGHT
-       bool
-       default y
-
-config ARCH_MAY_HAVE_PC_FDC
-       bool
-       default y
-
-config DMI
-       bool
-       default y
-
-source "init/Kconfig"
-
-menu "Processor type and features"
-
-config SMP
-       bool "Symmetric multi-processing support"
-       ---help---
-         This enables support for systems with more than one CPU. If you have
-         a system with only one CPU, like most personal computers, say N. If
-         you have a system with more than one CPU, say Y.
-
-         If you say N here, the kernel will run on single and multiprocessor
-         machines, but will use only one CPU of a multiprocessor machine. If
-         you say Y here, the kernel will run on many, but not all,
-         singleprocessor machines. On a singleprocessor machine, the kernel
-         will run faster if you say N here.
-
-         Note that if you say Y here and choose architecture "586" or
-         "Pentium" under "Processor family", the kernel will not work on 486
-         architectures. Similarly, multiprocessor kernels for the "PPro"
-         architecture may not work on all Pentium based boards.
-
-         People using multiprocessor machines who say Y here should also say
-         Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
-         Management" code will be disabled if you say Y here.
-
-         See also the <file:Documentation/smp.txt>,
-         <file:Documentation/i386/IO-APIC.txt>,
-         <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
-         <http://www.tldp.org/docs.html#howto>.
-
-         If you don't know what to do here, say N.
-
-choice
-       prompt "Subarchitecture Type"
-       default X86_PC
-
-config X86_PC
-       bool "PC-compatible"
-       help
-         Choose this option if your computer is a standard PC or compatible.
-
-config X86_XEN
-       bool "Xen-compatible"
-       select X86_UP_APIC if !SMP && XEN_PRIVILEGED_GUEST
-       select X86_UP_IOAPIC if !SMP && XEN_PRIVILEGED_GUEST
-       select SWIOTLB
-       help
-         Choose this option if you plan to run this kernel on top of the
-         Xen Hypervisor.
-
-config X86_ELAN
-       bool "AMD Elan"
-       help
-         Select this for an AMD Elan processor.
-
-         Do not use this option for K6/Athlon/Opteron processors!
-
-         If unsure, choose "PC-compatible" instead.
-
-config X86_VOYAGER
-       bool "Voyager (NCR)"
-       help
-         Voyager is an MCA-based 32-way capable SMP architecture proprietary
-         to NCR Corp.  Machine classes 345x/35xx/4100/51xx are Voyager-based.
-
-         *** WARNING ***
-
-         If you do not specifically know you have a Voyager based machine,
-         say N here, otherwise the kernel you build will not be bootable.
-
-config X86_NUMAQ
-       bool "NUMAQ (IBM/Sequent)"
-       select SMP
-       select NUMA
-       help
-         This option is used for getting Linux to run on a (IBM/Sequent) NUMA
-         multiquad box. This changes the way that processors are bootstrapped,
-         and uses Clustered Logical APIC addressing mode instead of Flat Logical.
-         You will need a new lynxer.elf file to flash your firmware with - send
-         email to <Martin.Bligh@us.ibm.com>.
-
-config X86_SUMMIT
-       bool "Summit/EXA (IBM x440)"
-       depends on SMP
-       help
-         This option is needed for IBM systems that use the Summit/EXA chipset.
-         In particular, it is needed for the x440.
-
-         If you don't have one of these computers, you should say N here.
-         If you want to build a NUMA kernel, you must select ACPI.
-
-config X86_BIGSMP
-       bool "Support for other sub-arch SMP systems with more than 8 CPUs"
-       depends on SMP
-       help
-         This option is needed for the systems that have more than 8 CPUs
-         and if the system is not of any sub-arch type above.
-
-         If you don't have such a system, you should say N here.
-
-config X86_VISWS
-       bool "SGI 320/540 (Visual Workstation)"
-       help
-         The SGI Visual Workstation series is an IA32-based workstation
-         based on SGI systems chips with some legacy PC hardware attached.
-
-         Say Y here to create a kernel to run on the SGI 320 or 540.
-
-         A kernel compiled for the Visual Workstation will not run on PCs
-         and vice versa. See <file:Documentation/sgi-visws.txt> for details.
-
-config X86_GENERICARCH
-       bool "Generic architecture (Summit, bigsmp, ES7000, default)"
-       depends on SMP
-       help
-          This option compiles in the Summit, bigsmp, ES7000, default subarchitectures.
-         It is intended for a generic binary kernel.
-         If you want a NUMA kernel, select ACPI.   We need SRAT for NUMA.
-
-config X86_ES7000
-       bool "Support for Unisys ES7000 IA32 series"
-       depends on SMP
-       help
-         Support for Unisys ES7000 systems.  Say 'Y' here if this kernel is
-         supposed to run on an IA32-based Unisys ES7000 system.
-         Only choose this option if you have such a system, otherwise you
-         should say N here.
-
-endchoice
-
-config ACPI_SRAT
-       bool
-       default y
-       depends on ACPI && NUMA && (X86_SUMMIT || X86_GENERICARCH)
-       select ACPI_NUMA
-
-config HAVE_ARCH_PARSE_SRAT
-       bool
-       default y
-       depends on ACPI_SRAT
-
-config X86_SUMMIT_NUMA
-       bool
-       default y
-       depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
-
-config X86_CYCLONE_TIMER
-       bool
-       default y
-       depends on X86_SUMMIT || X86_GENERICARCH
-
-config ES7000_CLUSTERED_APIC
-       bool
-       default y
-       depends on SMP && X86_ES7000 && MPENTIUMIII
-
-source "arch/i386/Kconfig.cpu"
-
-config HPET_TIMER
-       bool "HPET Timer Support"
-       depends on !X86_XEN
-       help
-         This enables the use of the HPET for the kernel's internal timer.
-         HPET is the next generation timer replacing legacy 8254s.
-         You can safely choose Y here.  However, HPET will only be
-         activated if the platform and the BIOS support this feature.
-         Otherwise the 8254 will be used for timing services.
-
-         Choose N to continue using the legacy 8254 timer.
-
-config HPET_EMULATE_RTC
-       bool
-       depends on HPET_TIMER && RTC=y
-       default y
-
-config NR_CPUS
-       int "Maximum number of CPUs (2-255)"
-       range 2 255
-       depends on SMP
-       default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000
-       default "8"
-       help
-         This allows you to specify the maximum number of CPUs which this
-         kernel will support.  The maximum supported value is 255 and the
-         minimum value which makes sense is 2.
-
-         This is purely to save memory - each supported CPU adds
-         approximately eight kilobytes to the kernel image.
-
-config SCHED_SMT
-       bool "SMT (Hyperthreading) scheduler support"
-       depends on X86_HT
-       help
-         SMT scheduler support improves the CPU scheduler's decision making
-         when dealing with Intel Pentium 4 chips with HyperThreading at a
-         cost of slightly increased overhead in some places. If unsure say
-         N here.
-
-config SCHED_MC
-       bool "Multi-core scheduler support"
-       depends on X86_HT
-       default y
-       help
-         Multi-core scheduler support improves the CPU scheduler's decision
-         making when dealing with multi-core CPU chips at a cost of slightly
-         increased overhead in some places. If unsure say N here.
-
-source "kernel/Kconfig.preempt"
-
-config X86_UP_APIC
-       bool "Local APIC support on uniprocessors"
-       depends on !SMP && !(X86_VISWS || X86_VOYAGER || XEN_UNPRIVILEGED_GUEST)
-       help
-         A local APIC (Advanced Programmable Interrupt Controller) is an
-         integrated interrupt controller in the CPU. If you have a single-CPU
-         system which has a processor with a local APIC, you can say Y here to
-         enable and use it. If you say Y here even though your machine doesn't
-         have a local APIC, then the kernel will still run with no slowdown at
-         all. The local APIC supports CPU-generated self-interrupts (timer,
-         performance counters), and the NMI watchdog which detects hard
-         lockups.
-
-config X86_UP_IOAPIC
-       bool "IO-APIC support on uniprocessors"
-       depends on X86_UP_APIC
-       help
-         An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an
-         SMP-capable replacement for PC-style interrupt controllers. Most
-         SMP systems and many recent uniprocessor systems have one.
-
-         If you have a single-CPU system with an IO-APIC, you can say Y here
-         to use it. If you say Y here even though your machine doesn't have
-         an IO-APIC, then the kernel will still run with no slowdown at all.
-
-config X86_LOCAL_APIC
-       bool
-       depends on X86_UP_APIC || ((X86_VISWS || SMP) && !(X86_VOYAGER || XEN_UNPRIVILEGED_GUEST))
-       default y
-
-config X86_IO_APIC
-       bool
-       depends on X86_UP_IOAPIC || (SMP && !(X86_VISWS || X86_VOYAGER || XEN_UNPRIVILEGED_GUEST))
-       default y
-
-config X86_VISWS_APIC
-       bool
-       depends on X86_VISWS
-       default y
-
-config X86_MCE
-       bool "Machine Check Exception"
-       depends on !(X86_VOYAGER || X86_XEN)
-       ---help---
-         Machine Check Exception support allows the processor to notify the
-         kernel if it detects a problem (e.g. overheating, component failure).
-         The action the kernel takes depends on the severity of the problem,
-         ranging from a warning message on the console, to halting the machine.
-         Your processor must be a Pentium or newer to support this - check the
-         flags in /proc/cpuinfo for mce.  Note that some older Pentium systems
-         have a design flaw which leads to false MCE events - hence MCE is
-         disabled on all P5 processors, unless explicitly enabled with "mce"
-         as a boot argument.  Similarly, if MCE is built in and creates a
-         problem on some new non-standard machine, you can boot with "nomce"
-         to disable it.  MCE support simply ignores non-MCE processors like
-         the 386 and 486, so nearly everyone can say Y here.
-
-config X86_MCE_NONFATAL
-       tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4"
-       depends on X86_MCE
-       help
-         Enabling this feature starts a timer that triggers every 5 seconds which
-         will look at the machine check registers to see if anything happened.
-         Non-fatal problems automatically get corrected (but still logged).
-         Disable this if you don't want to see these messages.
-         Seeing the messages this option prints out may be indicative of dying hardware,
-         or out-of-spec (ie, overclocked) hardware.
-         This option only does something on certain CPUs.
-         (AMD Athlon/Duron and Intel Pentium 4)
-
-config X86_MCE_P4THERMAL
-       bool "check for P4 thermal throttling interrupt."
-       depends on X86_MCE && (X86_UP_APIC || SMP) && !X86_VISWS
-       help
-         Enabling this feature will cause a message to be printed when the P4
-         enters thermal throttling.
-
-config VM86
-       default y
-       bool "Enable VM86 support" if EMBEDDED
-       help
-          This option is required by programs like DOSEMU to run 16-bit legacy
-         code on X86 processors. It also may be needed by software like
-          XFree86 to initialize some video cards via BIOS. Disabling this
-          option saves about 6k.
-
-config TOSHIBA
-       tristate "Toshiba Laptop support"
-       ---help---
-         This adds a driver to safely access the System Management Mode of
-         the CPU on Toshiba portables with a genuine Toshiba BIOS. It does
-         not work on models with a Phoenix BIOS. The System Management Mode
-         is used to set the BIOS and power saving options on Toshiba portables.
-
-         For information on utilities to make use of this driver see the
-         Toshiba Linux utilities web site at:
-         <http://www.buzzard.org.uk/toshiba/>.
-
-         Say Y if you intend to run this kernel on a Toshiba portable.
-         Say N otherwise.
-
-config I8K
-       tristate "Dell laptop support"
-       ---help---
-         This adds a driver to safely access the System Management Mode
-         of the CPU on the Dell Inspiron 8000. The System Management Mode
-         is used to read cpu temperature and cooling fan status and to
-         control the fans on the I8K portables.
-
-         This driver has been tested only on the Inspiron 8000 but it may
-         also work with other Dell laptops. You can force loading on other
-         models by passing the parameter `force=1' to the module. Use at
-         your own risk.
-
-         For information on utilities to make use of this driver see the
-         I8K Linux utilities web site at:
-         <http://people.debian.org/~dz/i8k/>
-
-         Say Y if you intend to run this kernel on a Dell Inspiron 8000.
-         Say N otherwise.
-
-config X86_REBOOTFIXUPS
-       bool "Enable X86 board specific fixups for reboot"
-       depends on X86
-       default n
-       ---help---
-         This enables chipset and/or board specific fixups to be done
-         in order to get reboot to work correctly. This is only needed on
-         some combinations of hardware and BIOS. The symptom, for which
-         this config is intended, is when reboot ends with a stalled/hung
-         system.
-
-         Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1.
-         combination.
-
-         Say Y if you want to enable the fixup. Currently, it's safe to
-         enable this option even if you don't need it.
-         Say N otherwise.
-
-config MICROCODE
-       tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
-       depends on !XEN_UNPRIVILEGED_GUEST
-       ---help---
-         If you say Y here and also to "/dev file system support" in the
-         'File systems' section, you will be able to update the microcode on
-         Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II,
-         Pentium III, Pentium 4, Xeon etc.  You will obviously need the
-         actual microcode binary data itself which is not shipped with the
-         Linux kernel.
-
-         For latest news and information on obtaining all the required
-         ingredients for this driver, check:
-         <http://www.urbanmyth.org/microcode/>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called microcode.
-
-config X86_MSR
-       tristate "/dev/cpu/*/msr - Model-specific register support"
-       depends on !X86_XEN
-       help
-         This device gives privileged processes access to the x86
-         Model-Specific Registers (MSRs).  It is a character device with
-         major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr.
-         MSR accesses are directed to a specific CPU on multi-processor
-         systems.
-
-config X86_CPUID
-       tristate "/dev/cpu/*/cpuid - CPU information support"
-       help
-         This device gives processes access to the x86 CPUID instruction to
-         be executed on a specific processor.  It is a character device
-         with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to
-         /dev/cpu/31/cpuid.
-
-config SWIOTLB
-       bool
-       default n
-
-source "drivers/firmware/Kconfig"
-
-choice
-       prompt "High Memory Support"
-       default NOHIGHMEM
-
-config NOHIGHMEM
-       bool "off"
-       depends on !X86_NUMAQ
-       ---help---
-         Linux can use up to 64 Gigabytes of physical memory on x86 systems.
-         However, the address space of 32-bit x86 processors is only 4
-         Gigabytes large. That means that, if you have a large amount of
-         physical memory, not all of it can be "permanently mapped" by the
-         kernel. The physical memory that's not permanently mapped is called
-         "high memory".
-
-         If you are compiling a kernel which will never run on a machine with
-         more than 1 Gigabyte total physical RAM, answer "off" here (default
-         choice and suitable for most users). This will result in a "3GB/1GB"
-         split: 3GB are mapped so that each process sees a 3GB virtual memory
-         space and the remaining part of the 4GB virtual memory space is used
-         by the kernel to permanently map as much physical memory as
-         possible.
-
-         If the machine has between 1 and 4 Gigabytes physical RAM, then
-         answer "4GB" here.
-
-         If more than 4 Gigabytes is used then answer "64GB" here. This
-         selection turns Intel PAE (Physical Address Extension) mode on.
-         PAE implements 3-level paging on IA32 processors. PAE is fully
-         supported by Linux, PAE mode is implemented on all recent Intel
-         processors (Pentium Pro and better). NOTE: If you say "64GB" here,
-         then the kernel will not boot on CPUs that don't support PAE!
-
-         The actual amount of total physical memory will either be
-         auto detected or can be forced by using a kernel command line option
-         such as "mem=256M". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-         If unsure, say "off".
-
-config HIGHMEM4G
-       bool "4GB"
-       depends on !X86_NUMAQ
-       help
-         Select this if you have a 32-bit processor and between 1 and 4
-         gigabytes of physical RAM.
-
-config HIGHMEM64G
-       bool "64GB"
-       depends on X86_CMPXCHG64
-       help
-         Select this if you have a 32-bit processor and more than 4
-         gigabytes of physical RAM.
-
-endchoice
-
-choice
-       depends on EXPERIMENTAL && !X86_PAE
-       prompt "Memory split" if EMBEDDED
-       default VMSPLIT_3G
-       help
-         Select the desired split between kernel and user memory.
-
-         If the address range available to the kernel is less than the
-         physical memory installed, the remaining memory will be available
-         as "high memory". Accessing high memory is a little more costly
-         than low memory, as it needs to be mapped into the kernel first.
-         Note that increasing the kernel address space limits the range
-         available to user programs, making the address space there
-         tighter.  Selecting anything other than the default 3G/1G split
-         will also likely make your kernel incompatible with binary-only
-         kernel modules.
-
-         If you are not absolutely sure what you are doing, leave this
-         option alone!
-
-       config VMSPLIT_3G
-               bool "3G/1G user/kernel split"
-       config VMSPLIT_3G_OPT
-               bool "3G/1G user/kernel split (for full 1G low memory)"
-       config VMSPLIT_2G
-               bool "2G/2G user/kernel split"
-       config VMSPLIT_1G
-               bool "1G/3G user/kernel split"
-endchoice
-
-config PAGE_OFFSET
-       hex
-       default 0xB0000000 if VMSPLIT_3G_OPT
-       default 0x78000000 if VMSPLIT_2G
-       default 0x40000000 if VMSPLIT_1G
-       default 0xC0000000
-
-config HIGHMEM
-       bool
-       depends on HIGHMEM64G || HIGHMEM4G
-       default y
-
-config X86_PAE
-       bool
-       depends on HIGHMEM64G
-       default y
-       select RESOURCES_64BIT
-
-# Common NUMA Features
-config NUMA
-       bool "Numa Memory Allocation and Scheduler Support"
-       depends on SMP && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI)
-       default n if X86_PC
-       default y if (X86_NUMAQ || X86_SUMMIT)
-
-comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
-       depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
-
-config NODES_SHIFT
-       int
-       default "4" if X86_NUMAQ
-       default "3"
-       depends on NEED_MULTIPLE_NODES
-
-config HAVE_ARCH_BOOTMEM_NODE
-       bool
-       depends on NUMA
-       default y
-
-config ARCH_HAVE_MEMORY_PRESENT
-       bool
-       depends on DISCONTIGMEM
-       default y
-
-config NEED_NODE_MEMMAP_SIZE
-       bool
-       depends on DISCONTIGMEM || SPARSEMEM
-       default y
-
-config HAVE_ARCH_ALLOC_REMAP
-       bool
-       depends on NUMA
-       default y
-
-config ARCH_FLATMEM_ENABLE
-       def_bool y
-       depends on (ARCH_SELECT_MEMORY_MODEL && X86_PC)
-
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on NUMA
-
-config ARCH_DISCONTIGMEM_DEFAULT
-       def_bool y
-       depends on NUMA
-
-config ARCH_SPARSEMEM_ENABLE
-       def_bool y
-       depends on (NUMA || (X86_PC && EXPERIMENTAL))
-       select SPARSEMEM_STATIC
-
-config ARCH_SELECT_MEMORY_MODEL
-       def_bool y
-       depends on ARCH_SPARSEMEM_ENABLE
-
-source "mm/Kconfig"
-
-config HAVE_ARCH_EARLY_PFN_TO_NID
-       bool
-       default y
-       depends on NUMA
-
-config HIGHPTE
-       bool "Allocate 3rd-level pagetables from highmem"
-       depends on HIGHMEM4G || HIGHMEM64G
-       help
-         The VM uses one page table entry for each page of physical memory.
-         For systems with a lot of RAM, this can be wasteful of precious
-         low memory.  Setting this option will put user-space page table
-         entries in high memory.
-
-config MATH_EMULATION
-       bool "Math emulation"
-       depends on !X86_XEN
-       ---help---
-         Linux can emulate a math coprocessor (used for floating point
-         operations) if you don't have one. 486DX and Pentium processors have
-         a math coprocessor built in, 486SX and 386 do not, unless you added
-         a 487DX or 387, respectively. (The messages during boot time can
-         give you some hints here ["man dmesg"].) Everyone needs either a
-         coprocessor or this emulation.
-
-         If you don't have a math coprocessor, you need to say Y here; if you
-         say Y here even though you have a coprocessor, the coprocessor will
-         be used nevertheless. (This behavior can be changed with the kernel
-         command line option "no387", which comes handy if your coprocessor
-         is broken. Try "man bootparam" or see the documentation of your boot
-         loader (lilo or loadlin) about how to pass options to the kernel at
-         boot time.) This means that it is a good idea to say Y here if you
-         intend to use this kernel on different machines.
-
-         More information about the internals of the Linux math coprocessor
-         emulation can be found in <file:arch/i386/math-emu/README>.
-
-         If you are not sure, say Y; apart from resulting in a 66 KB bigger
-         kernel, it won't hurt.
-
-config MTRR
-       bool "MTRR (Memory Type Range Register) support"
-       depends on !XEN_UNPRIVILEGED_GUEST
-       default y if X86_XEN
-       ---help---
-         On Intel P6 family processors (Pentium Pro, Pentium II and later)
-         the Memory Type Range Registers (MTRRs) may be used to control
-         processor access to memory ranges. This is most useful if you have
-         a video (VGA) card on a PCI or AGP bus. Enabling write-combining
-         allows bus write transfers to be combined into a larger transfer
-         before bursting over the PCI/AGP bus. This can increase performance
-         of image write operations 2.5 times or more. Saying Y here creates a
-         /proc/mtrr file which may be used to manipulate your processor's
-         MTRRs. Typically the X server should use this.
-
-         This code has a reasonably generic interface so that similar
-         control registers on other processors can be easily supported
-         as well:
-
-         The Cyrix 6x86, 6x86MX and M II processors have Address Range
-         Registers (ARRs) which provide a similar functionality to MTRRs. For
-         these, the ARRs are used to emulate the MTRRs.
-         The AMD K6-2 (stepping 8 and above) and K6-3 processors have two
-         MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing
-         write-combining. All of these processors are supported by this code
-         and it makes sense to say Y here if you have one of them.
-
-         Saying Y here also fixes a problem with buggy SMP BIOSes which only
-         set the MTRRs for the boot CPU and not for the secondary CPUs. This
-         can lead to all sorts of problems, so it's good to say Y here.
-
-         You can safely say Y even if your machine doesn't have MTRRs, you'll
-         just add about 9 KB to your kernel.
-
-         See <file:Documentation/mtrr.txt> for more information.
-
-config EFI
-       bool "Boot from EFI support"
-       depends on ACPI && !X86_XEN
-       default n
-       ---help---
-       This enables the the kernel to boot on EFI platforms using
-       system configuration information passed to it from the firmware.
-       This also enables the kernel to use any EFI runtime services that are
-       available (such as the EFI variable services).
-
-       This option is only useful on systems that have EFI firmware
-       and will result in a kernel image that is ~8k larger.  In addition,
-       you must use the latest ELILO loader available at
-       <http://elilo.sourceforge.net> in order to take advantage of
-       kernel initialization using EFI information (neither GRUB nor LILO know
-       anything about EFI).  However, even with this option, the resultant
-       kernel should continue to boot on existing non-EFI platforms.
-
-config IRQBALANCE
-       bool "Enable kernel irq balancing"
-       depends on SMP && X86_IO_APIC && !X86_XEN
-       default y
-       help
-         The default yes will allow the kernel to do irq load balancing.
-         Saying no will keep the kernel from doing irq load balancing.
-
-# turning this on wastes a bunch of space.
-# Summit needs it only when NUMA is on
-config BOOT_IOREMAP
-       bool
-       depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
-       default y
-
-config REGPARM
-       bool "Use register arguments"
-       default y
-       help
-       Compile the kernel with -mregparm=3. This instructs gcc to use
-       a more efficient function call ABI which passes the first three
-       arguments of a function call via registers, which results in denser
-       and faster code.
-
-       If this option is disabled, then the default ABI of passing
-       arguments via the stack is used.
-
-       If unsure, say Y.
-
-config SECCOMP
-       bool "Enable seccomp to safely compute untrusted bytecode"
-       depends on PROC_FS
-       default y
-       help
-         This kernel feature is useful for number crunching applications
-         that may need to compute untrusted bytecode during their
-         execution. By using pipes or other transports made available to
-         the process as file descriptors supporting the read/write
-         syscalls, it's possible to isolate those applications in
-         their own address space using seccomp. Once seccomp is
-         enabled via /proc/<pid>/seccomp, it cannot be disabled
-         and the task is only allowed to execute a few safe syscalls
-         defined by each seccomp mode.
-
-         If unsure, say Y. Only embedded should say N here.
-
-source kernel/Kconfig.hz
-
-config KEXEC
-       bool "kexec system call (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && !XEN_UNPRIVILEGED_GUEST
-       help
-         kexec is a system call that implements the ability to shutdown your
-         current kernel, and to start another kernel.  It is like a reboot
-         but it is independent of the system firmware.   And like a reboot
-         you can start any kernel with it, not just Linux.
-
-         The name comes from the similarity to the exec system call.
-
-         It is an ongoing process to be certain the hardware in a machine
-         is properly shutdown, so do not be surprised if this code does not
-         initially work for you.  It may help to enable device hotplugging
-         support.  As of this writing the exact hardware interface is
-         strongly in flux, so no good recommendation can be made.
-
-config CRASH_DUMP
-       bool "kernel crash dumps (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       depends on HIGHMEM
-       help
-         Generate crash dump after being started by kexec.
-
-config PHYSICAL_START
-       hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP)
-
-       default "0x1000000" if CRASH_DUMP
-       default "0x100000"
-       help
-         This gives the physical address where the kernel is loaded. Normally
-         for regular kernels this value is 0x100000 (1MB). But in the case
-         of kexec on panic the fail safe kernel needs to run at a different
-         address than the panic-ed kernel. This option is used to set the load
-         address for kernels used to capture crash dump on being kexec'ed
-         after panic. The default value for crash dump kernels is
-         0x1000000 (16MB). This can also be set based on the "X" value as
-         specified in the "crashkernel=YM@XM" command line boot parameter
-         passed to the panic-ed kernel. Typically this parameter is set as
-         crashkernel=64M@16M. Please take a look at
-         Documentation/kdump/kdump.txt for more details about crash dumps.
-
-         Don't change this unless you know what you are doing.
-
-config HOTPLUG_CPU
-       bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
-       depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER
-       ---help---
-         Say Y here to experiment with turning CPUs off and on, and to
-         enable suspend on SMP systems. CPUs can be controlled through
-         /sys/devices/system/cpu.
-
-config COMPAT_VDSO
-       bool "Compat VDSO support"
-       depends on !X86_XEN
-       default y
-       help
-         Map the VDSO to the predictable old-style address too.
-       ---help---
-         Say N here if you are running a sufficiently recent glibc
-         version (2.3.3 or later), to remove the high-mapped
-         VDSO mapping and to exclusively use the randomized VDSO.
-
-         If unsure, say Y.
-
-endmenu
-
-config ARCH_ENABLE_MEMORY_HOTPLUG
-       def_bool y
-       depends on HIGHMEM
-
-menu "Power management options (ACPI, APM)"
-       depends on !(X86_VOYAGER || XEN_UNPRIVILEGED_GUEST)
-
-if !X86_XEN
-source kernel/power/Kconfig
-endif
-
-source "drivers/acpi/Kconfig"
-
-menu "APM (Advanced Power Management) BIOS Support"
-depends on PM && !(X86_VISWS || X86_XEN)
-
-config APM
-       tristate "APM (Advanced Power Management) BIOS support"
-       depends on PM && PM_LEGACY
-       ---help---
-         APM is a BIOS specification for saving power using several different
-         techniques. This is mostly useful for battery powered laptops with
-         APM compliant BIOSes. If you say Y here, the system time will be
-         reset after a RESUME operation, the /proc/apm device will provide
-         battery status information, and user-space programs will receive
-         notification of APM "events" (e.g. battery status change).
-
-         If you select "Y" here, you can disable actual use of the APM
-         BIOS by passing the "apm=off" option to the kernel at boot time.
-
-         Note that the APM support is almost completely disabled for
-         machines with more than one CPU.
-
-         In order to use APM, you will need supporting software. For location
-         and more information, read <file:Documentation/pm.txt> and the
-         Battery Powered Linux mini-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         This driver does not spin down disk drives (see the hdparm(8)
-         manpage ("man 8 hdparm") for that), and it doesn't turn off
-         VESA-compliant "green" monitors.
-
-         This driver does not support the TI 4000M TravelMate and the ACER
-         486/DX4/75 because they don't have compliant BIOSes. Many "green"
-         desktop machines also don't have compliant BIOSes, and this driver
-         may cause those machines to panic during the boot phase.
-
-         Generally, if you don't have a battery in your machine, there isn't
-         much point in using this driver and you should say N. If you get
-         random kernel OOPSes or reboots that don't seem to be related to
-         anything, try disabling/enabling this option (or disabling/enabling
-         APM in your BIOS).
-
-         Some other things you should try when experiencing seemingly random,
-         "weird" problems:
-
-         1) make sure that you have enough swap space and that it is
-         enabled.
-         2) pass the "no-hlt" option to the kernel
-         3) switch on floating point emulation in the kernel and pass
-         the "no387" option to the kernel
-         4) pass the "floppy=nodma" option to the kernel
-         5) pass the "mem=4M" option to the kernel (thereby disabling
-         all but the first 4 MB of RAM)
-         6) make sure that the CPU is not over clocked.
-         7) read the sig11 FAQ at <http://www.bitwizard.nl/sig11/>
-         8) disable the cache from your BIOS settings
-         9) install a fan for the video card or exchange video RAM
-         10) install a better fan for the CPU
-         11) exchange RAM chips
-         12) exchange the motherboard.
-
-         To compile this driver as a module, choose M here: the
-         module will be called apm.
-
-config APM_IGNORE_USER_SUSPEND
-       bool "Ignore USER SUSPEND"
-       depends on APM
-       help
-         This option will ignore USER SUSPEND requests. On machines with a
-         compliant APM BIOS, you want to say N. However, on the NEC Versa M
-         series notebooks, it is necessary to say Y because of a BIOS bug.
-
-config APM_DO_ENABLE
-       bool "Enable PM at boot time"
-       depends on APM
-       ---help---
-         Enable APM features at boot time. From page 36 of the APM BIOS
-         specification: "When disabled, the APM BIOS does not automatically
-         power manage devices, enter the Standby State, enter the Suspend
-         State, or take power saving steps in response to CPU Idle calls."
-         This driver will make CPU Idle calls when Linux is idle (unless this
-         feature is turned off -- see "Do CPU IDLE calls", below). This
-         should always save battery power, but more complicated APM features
-         will be dependent on your BIOS implementation. You may need to turn
-         this option off if your computer hangs at boot time when using APM
-         support, or if it beeps continuously instead of suspending. Turn
-         this off if you have a NEC UltraLite Versa 33/C or a Toshiba
-         T400CDT. This is off by default since most machines do fine without
-         this feature.
-
-config APM_CPU_IDLE
-       bool "Make CPU Idle calls when idle"
-       depends on APM
-       help
-         Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop.
-         On some machines, this can activate improved power savings, such as
-         a slowed CPU clock rate, when the machine is idle. These idle calls
-         are made after the idle loop has run for some length of time (e.g.,
-         333 mS). On some machines, this will cause a hang at boot time or
-         whenever the CPU becomes idle. (On machines with more than one CPU,
-         this option does nothing.)
-
-config APM_DISPLAY_BLANK
-       bool "Enable console blanking using APM"
-       depends on APM
-       help
-         Enable console blanking using the APM. Some laptops can use this to
-         turn off the LCD backlight when the screen blanker of the Linux
-         virtual console blanks the screen. Note that this is only used by
-         the virtual console screen blanker, and won't turn off the backlight
-         when using the X Window system. This also doesn't have anything to
-         do with your VESA-compliant power-saving monitor. Further, this
-         option doesn't work for all laptops -- it might not turn off your
-         backlight at all, or it might print a lot of errors to the console,
-         especially if you are using gpm.
-
-config APM_RTC_IS_GMT
-       bool "RTC stores time in GMT"
-       depends on APM
-       help
-         Say Y here if your RTC (Real Time Clock a.k.a. hardware clock)
-         stores the time in GMT (Greenwich Mean Time). Say N if your RTC
-         stores localtime.
-
-         It is in fact recommended to store GMT in your RTC, because then you
-         don't have to worry about daylight savings time changes. The only
-         reason not to use GMT in your RTC is if you also run a broken OS
-         that doesn't understand GMT.
-
-config APM_ALLOW_INTS
-       bool "Allow interrupts during APM BIOS calls"
-       depends on APM
-       help
-         Normally we disable external interrupts while we are making calls to
-         the APM BIOS as a measure to lessen the effects of a badly behaving
-         BIOS implementation.  The BIOS should reenable interrupts if it
-         needs to.  Unfortunately, some BIOSes do not -- especially those in
-         many of the newer IBM Thinkpads.  If you experience hangs when you
-         suspend, try setting this to Y.  Otherwise, say N.
-
-config APM_REAL_MODE_POWER_OFF
-       bool "Use real mode APM BIOS call to power off"
-       depends on APM
-       help
-         Use real mode APM BIOS calls to switch off the computer. This is
-         a work-around for a number of buggy BIOSes. Switch this option on if
-         your computer crashes instead of powering off properly.
-
-endmenu
-
-source "arch/i386/kernel/cpu/cpufreq/Kconfig"
-
-endmenu
-
-menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
-
-config PCI
-       bool "PCI support" if !X86_VISWS
-       depends on !X86_VOYAGER
-       default y if X86_VISWS
-       help
-         Find out whether you have a PCI motherboard. PCI is the name of a
-         bus system, i.e. the way the CPU talks to the other stuff inside
-         your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
-         VESA. If you have PCI, say Y, otherwise N.
-
-         The PCI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>, contains valuable
-         information about which PCI hardware does work under Linux and which
-         doesn't.
-
-choice
-       prompt "PCI access mode"
-       depends on PCI && !X86_VISWS
-       default PCI_GOANY
-       ---help---
-         On PCI systems, the BIOS can be used to detect the PCI devices and
-         determine their configuration. However, some old PCI motherboards
-         have BIOS bugs and may crash if this is done. Also, some embedded
-         PCI-based systems don't have any BIOS at all. Linux can also try to
-         detect the PCI hardware directly without using the BIOS.
-
-         With this option, you can specify how Linux should detect the
-         PCI devices. If you choose "BIOS", the BIOS will be used,
-         if you choose "Direct", the BIOS won't be used, and if you
-         choose "MMConfig", then PCI Express MMCONFIG will be used.
-         If you choose "Any", the kernel will try MMCONFIG, then the
-         direct access method and falls back to the BIOS if that doesn't
-         work. If unsure, go with the default, which is "Any".
-
-config PCI_GOBIOS
-       bool "BIOS"
-       depends on !X86_XEN
-
-config PCI_GOMMCONFIG
-       bool "MMConfig"
-
-config PCI_GODIRECT
-       bool "Direct"
-
-config PCI_GOXEN_FE
-       bool "Xen PCI Frontend"
-       depends on X86_XEN
-       help
-         The PCI device frontend driver allows the kernel to import arbitrary
-         PCI devices from a PCI backend to support PCI driver domains.
-
-config PCI_GOANY
-       bool "Any"
-
-endchoice
-
-config PCI_BIOS
-       bool
-       depends on !(X86_VISWS || X86_XEN) && PCI && (PCI_GOBIOS || PCI_GOANY)
-       default y
-
-config PCI_DIRECT
-       bool
-       depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
-       default y
-
-config PCI_MMCONFIG
-       bool
-       depends on PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
-       default y
-
-config XEN_PCIDEV_FRONTEND
-       bool
-       depends on PCI && X86_XEN && (PCI_GOXEN_FE || PCI_GOANY)
-       default y
-
-config XEN_PCIDEV_FE_DEBUG
-       bool "Xen PCI Frontend Debugging"
-       depends on XEN_PCIDEV_FRONTEND
-       default n
-       help
-         Enables some debug statements within the PCI Frontend.
-
-source "drivers/pci/pcie/Kconfig"
-
-source "drivers/pci/Kconfig"
-
-config ISA_DMA_API
-       bool
-       default y
-
-config ISA
-       bool "ISA support"
-       depends on !(X86_VOYAGER || X86_VISWS || X86_XEN)
-       help
-         Find out whether you have ISA slots on your motherboard.  ISA is the
-         name of a bus system, i.e. the way the CPU talks to the other stuff
-         inside your box.  Other bus systems are PCI, EISA, MicroChannel
-         (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
-         newer boards don't support it.  If you have ISA, say Y, otherwise N.
-
-config EISA
-       bool "EISA support"
-       depends on ISA
-       ---help---
-         The Extended Industry Standard Architecture (EISA) bus was
-         developed as an open alternative to the IBM MicroChannel bus.
-
-         The EISA bus provided some of the features of the IBM MicroChannel
-         bus while maintaining backward compatibility with cards made for
-         the older ISA bus.  The EISA bus saw limited use between 1988 and
-         1995 when it was made obsolete by the PCI bus.
-
-         Say Y here if you are building a kernel for an EISA-based machine.
-
-         Otherwise, say N.
-
-source "drivers/eisa/Kconfig"
-
-config MCA
-       bool "MCA support" if !(X86_VISWS || X86_VOYAGER || X86_XEN)
-       default y if X86_VOYAGER
-       help
-         MicroChannel Architecture is found in some IBM PS/2 machines and
-         laptops.  It is a bus system similar to PCI or ISA. See
-         <file:Documentation/mca.txt> (and especially the web page given
-         there) before attempting to build an MCA bus kernel.
-
-source "drivers/mca/Kconfig"
-
-config SCx200
-       tristate "NatSemi SCx200 support"
-       depends on !X86_VOYAGER
-       help
-         This provides basic support for National Semiconductor's
-         (now AMD's) Geode processors.  The driver probes for the
-         PCI-IDs of several on-chip devices, so its a good dependency
-         for other scx200_* drivers.
-
-         If compiled as a module, the driver is named scx200.
-
-config SCx200HR_TIMER
-       tristate "NatSemi SCx200 27MHz High-Resolution Timer Support"
-       depends on SCx200 && GENERIC_TIME
-       default y
-       help
-         This driver provides a clocksource built upon the on-chip
-         27MHz high-resolution timer.  Its also a workaround for
-         NSC Geode SC-1100's buggy TSC, which loses time when the
-         processor goes idle (as is done by the scheduler).  The
-         other workaround is idle=poll boot option.
-
-config K8_NB
-       def_bool y
-       depends on AGP_AMD64
-
-source "drivers/pcmcia/Kconfig"
-
-source "drivers/pci/hotplug/Kconfig"
-
-endmenu
-
-menu "Executable file formats"
-
-source "fs/Kconfig.binfmt"
-
-endmenu
-
-source "net/Kconfig"
-
-source "drivers/Kconfig"
-
-source "fs/Kconfig"
-
-menu "Instrumentation Support"
-       depends on EXPERIMENTAL
-
-source "arch/i386/oprofile/Kconfig"
-
-config KPROBES
-       bool "Kprobes (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && MODULES
-       help
-         Kprobes allows you to trap at almost any kernel address and
-         execute a callback function.  register_kprobe() establishes
-         a probepoint and specifies the callback.  Kprobes is useful
-         for kernel debugging, non-intrusive instrumentation and testing.
-         If in doubt, say "N".
-endmenu
-
-source "arch/i386/Kconfig.debug"
-
-source "security/Kconfig"
-
-source "crypto/Kconfig"
-
-source "drivers/xen/Kconfig"
-
-source "lib/Kconfig"
-
-#
-# Use the generic interrupt handling code in kernel/irq/:
-#
-config GENERIC_HARDIRQS
-       bool
-       default y
-
-config GENERIC_IRQ_PROBE
-       bool
-       default y
-
-config GENERIC_PENDING_IRQ
-       bool
-       depends on GENERIC_HARDIRQS && SMP
-       default y
-
-config X86_SMP
-       bool
-       depends on SMP && !X86_VOYAGER
-       default y
-
-config X86_HT
-       bool
-       depends on SMP && !(X86_VISWS || X86_VOYAGER || X86_XEN)
-       default y
-
-config X86_BIOS_REBOOT
-       bool
-       depends on !(X86_VISWS || X86_VOYAGER)
-       default y
-
-config X86_TRAMPOLINE
-       bool
-       depends on X86_SMP || (X86_VOYAGER && SMP)
-       default y
-
-config X86_NO_TSS
-       bool
-       depends on X86_XEN
-       default y
-
-config X86_NO_IDT
-       bool
-       depends on X86_XEN
-       default y
-
-config KTIME_SCALAR
-       bool
-       default y
diff --git a/linux-2.6-xen-sparse/arch/i386/Kconfig.cpu b/linux-2.6-xen-sparse/arch/i386/Kconfig.cpu
deleted file mode 100644 (file)
index eb6c84b..0000000
+++ /dev/null
@@ -1,315 +0,0 @@
-# Put here option for CPU selection and depending optimization
-if !X86_ELAN
-
-choice
-       prompt "Processor family"
-       default M686
-
-config M386
-       bool "386"
-       ---help---
-         This is the processor type of your CPU. This information is used for
-         optimizing purposes. In order to compile a kernel that can run on
-         all x86 CPU types (albeit not optimally fast), you can specify
-         "386" here.
-
-         The kernel will not necessarily run on earlier architectures than
-         the one you have chosen, e.g. a Pentium optimized kernel will run on
-         a PPro, but not necessarily on a i486.
-
-         Here are the settings recommended for greatest speed:
-         - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
-         486DLC/DLC2, UMC 486SX-S and NexGen Nx586.  Only "386" kernels
-         will run on a 386 class machine.
-         - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or
-         SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.
-         - "586" for generic Pentium CPUs lacking the TSC
-         (time stamp counter) register.
-         - "Pentium-Classic" for the Intel Pentium.
-         - "Pentium-MMX" for the Intel Pentium MMX.
-         - "Pentium-Pro" for the Intel Pentium Pro.
-         - "Pentium-II" for the Intel Pentium II or pre-Coppermine Celeron.
-         - "Pentium-III" for the Intel Pentium III or Coppermine Celeron.
-         - "Pentium-4" for the Intel Pentium 4 or P4-based Celeron.
-         - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D).
-         - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird).
-         - "Crusoe" for the Transmeta Crusoe series.
-         - "Efficeon" for the Transmeta Efficeon series.
-         - "Winchip-C6" for original IDT Winchip.
-         - "Winchip-2" for IDT Winchip 2.
-         - "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
-         - "GeodeGX1" for Geode GX1 (Cyrix MediaGX).
-         - "Geode GX/LX" For AMD Geode GX and LX processors.
-         - "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
-         - "VIA C3-2" for VIA C3-2 "Nehemiah" (model 9 and above).
-
-         If you don't know what to do, choose "386".
-
-config M486
-       bool "486"
-       help
-         Select this for a 486 series processor, either Intel or one of the
-         compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX,
-         DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or
-         U5S.
-
-config M586
-       bool "586/K5/5x86/6x86/6x86MX"
-       help
-         Select this for an 586 or 686 series processor such as the AMD K5,
-         the Cyrix 5x86, 6x86 and 6x86MX.  This choice does not
-         assume the RDTSC (Read Time Stamp Counter) instruction.
-
-config M586TSC
-       bool "Pentium-Classic"
-       help
-         Select this for a Pentium Classic processor with the RDTSC (Read
-         Time Stamp Counter) instruction for benchmarking.
-
-config M586MMX
-       bool "Pentium-MMX"
-       help
-         Select this for a Pentium with the MMX graphics/multimedia
-         extended instructions.
-
-config M686
-       bool "Pentium-Pro"
-       help
-         Select this for Intel Pentium Pro chips.  This enables the use of
-         Pentium Pro extended instructions, and disables the init-time guard
-         against the f00f bug found in earlier Pentiums.
-
-config MPENTIUMII
-       bool "Pentium-II/Celeron(pre-Coppermine)"
-       help
-         Select this for Intel chips based on the Pentium-II and
-         pre-Coppermine Celeron core.  This option enables an unaligned
-         copy optimization, compiles the kernel with optimization flags
-         tailored for the chip, and applies any applicable Pentium Pro
-         optimizations.
-
-config MPENTIUMIII
-       bool "Pentium-III/Celeron(Coppermine)/Pentium-III Xeon"
-       help
-         Select this for Intel chips based on the Pentium-III and
-         Celeron-Coppermine core.  This option enables use of some
-         extended prefetch instructions in addition to the Pentium II
-         extensions.
-
-config MPENTIUMM
-       bool "Pentium M"
-       help
-         Select this for Intel Pentium M (not Pentium-4 M)
-         notebook chips.
-
-config MPENTIUM4
-       bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon"
-       help
-         Select this for Intel Pentium 4 chips.  This includes the
-         Pentium 4, P4-based Celeron and Xeon, and Pentium-4 M
-         (not Pentium M) chips.  This option enables compile flags
-         optimized for the chip, uses the correct cache shift, and
-         applies any applicable Pentium III optimizations.
-
-config MK6
-       bool "K6/K6-II/K6-III"
-       help
-         Select this for an AMD K6-family processor.  Enables use of
-         some extended instructions, and passes appropriate optimization
-         flags to GCC.
-
-config MK7
-       bool "Athlon/Duron/K7"
-       help
-         Select this for an AMD Athlon K7-family processor.  Enables use of
-         some extended instructions, and passes appropriate optimization
-         flags to GCC.
-
-config MK8
-       bool "Opteron/Athlon64/Hammer/K8"
-       help
-         Select this for an AMD Opteron or Athlon64 Hammer-family processor.  Enables
-         use of some extended instructions, and passes appropriate optimization
-         flags to GCC.
-
-config MCRUSOE
-       bool "Crusoe"
-       help
-         Select this for a Transmeta Crusoe processor.  Treats the processor
-         like a 586 with TSC, and sets some GCC optimization flags (like a
-         Pentium Pro with no alignment requirements).
-
-config MEFFICEON
-       bool "Efficeon"
-       help
-         Select this for a Transmeta Efficeon processor.
-
-config MWINCHIPC6
-       bool "Winchip-C6"
-       help
-         Select this for an IDT Winchip C6 chip.  Linux and GCC
-         treat this chip as a 586TSC with some extended instructions
-         and alignment requirements.
-
-config MWINCHIP2
-       bool "Winchip-2"
-       help
-         Select this for an IDT Winchip-2.  Linux and GCC
-         treat this chip as a 586TSC with some extended instructions
-         and alignment requirements.
-
-config MWINCHIP3D
-       bool "Winchip-2A/Winchip-3"
-       help
-         Select this for an IDT Winchip-2A or 3.  Linux and GCC
-         treat this chip as a 586TSC with some extended instructions
-         and alignment reqirements.  Also enable out of order memory
-         stores for this CPU, which can increase performance of some
-         operations.
-
-config MGEODEGX1
-       bool "GeodeGX1"
-       help
-         Select this for a Geode GX1 (Cyrix MediaGX) chip.
-
-config MGEODE_LX
-       bool "Geode GX/LX"
-       help
-         Select this for AMD Geode GX and LX processors.
-
-config MCYRIXIII
-       bool "CyrixIII/VIA-C3"
-       help
-         Select this for a Cyrix III or C3 chip.  Presently Linux and GCC
-         treat this chip as a generic 586. Whilst the CPU is 686 class,
-         it lacks the cmov extension which gcc assumes is present when
-         generating 686 code.
-         Note that Nehemiah (Model 9) and above will not boot with this
-         kernel due to them lacking the 3DNow! instructions used in earlier
-         incarnations of the CPU.
-
-config MVIAC3_2
-       bool "VIA C3-2 (Nehemiah)"
-       help
-         Select this for a VIA C3 "Nehemiah". Selecting this enables usage
-         of SSE and tells gcc to treat the CPU as a 686.
-         Note, this kernel will not boot on older (pre model 9) C3s.
-
-endchoice
-
-config X86_GENERIC
-       bool "Generic x86 support"
-       help
-         Instead of just including optimizations for the selected
-         x86 variant (e.g. PII, Crusoe or Athlon), include some more
-         generic optimizations as well. This will make the kernel
-         perform better on x86 CPUs other than that selected.
-
-         This is really intended for distributors who need more
-         generic optimizations.
-
-endif
-
-#
-# Define implied options from the CPU selection here
-#
-config X86_CMPXCHG
-       bool
-       depends on !M386
-       default y
-
-config X86_XADD
-       bool
-       depends on !M386
-       default y
-
-config X86_L1_CACHE_SHIFT
-       int
-       default "7" if MPENTIUM4 || X86_GENERIC
-       default "4" if X86_ELAN || M486 || M386 || MGEODEGX1
-       default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX
-       default "6" if MK7 || MK8 || MPENTIUMM
-
-config RWSEM_GENERIC_SPINLOCK
-       bool
-       depends on M386
-       default y
-
-config RWSEM_XCHGADD_ALGORITHM
-       bool
-       depends on !M386
-       default y
-
-config GENERIC_CALIBRATE_DELAY
-       bool
-       default y
-
-config X86_PPRO_FENCE
-       bool
-       depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
-       default y
-
-config X86_F00F_BUG
-       bool
-       depends on (M586MMX || M586TSC || M586 || M486 || M386) && !X86_NO_IDT
-       default y
-
-config X86_WP_WORKS_OK
-       bool
-       depends on !M386
-       default y
-
-config X86_INVLPG
-       bool
-       depends on !M386
-       default y
-
-config X86_BSWAP
-       bool
-       depends on !M386
-       default y
-
-config X86_POPAD_OK
-       bool
-       depends on !M386
-       default y
-
-config X86_CMPXCHG64
-       bool
-       depends on !M386 && !M486
-       default y
-
-config X86_ALIGNMENT_16
-       bool
-       depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1
-       default y
-
-config X86_GOOD_APIC
-       bool
-       depends on MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || MK8 || MEFFICEON
-       default y
-
-config X86_INTEL_USERCOPY
-       bool
-       depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON
-       default y
-
-config X86_USE_PPRO_CHECKSUM
-       bool
-       depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MEFFICEON || MGEODE_LX
-       default y
-
-config X86_USE_3DNOW
-       bool
-       depends on MCYRIXIII || MK7 || MGEODE_LX
-       default y
-
-config X86_OOSTORE
-       bool
-       depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
-       default y
-
-config X86_TSC
-       bool
-       depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ && !X86_XEN
-       default y
diff --git a/linux-2.6-xen-sparse/arch/i386/Kconfig.debug b/linux-2.6-xen-sparse/arch/i386/Kconfig.debug
deleted file mode 100644 (file)
index a454cbe..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-menu "Kernel hacking"
-
-config TRACE_IRQFLAGS_SUPPORT
-       bool
-       default y
-
-source "lib/Kconfig.debug"
-
-config EARLY_PRINTK
-       bool "Early printk" if EMBEDDED && DEBUG_KERNEL
-       default y
-       help
-         Write kernel log output directly into the VGA buffer or to a serial
-         port.
-
-         This is useful for kernel debugging when your machine crashes very
-         early before the console code is initialized. For normal operation
-         it is not recommended because it looks ugly and doesn't cooperate
-         with klogd/syslogd or the X server. You should normally N here,
-         unless you want to debug such a crash.
-
-config DEBUG_STACKOVERFLOW
-       bool "Check for stack overflows"
-       depends on DEBUG_KERNEL
-       help
-         This option will cause messages to be printed if free stack space
-         drops below a certain limit.
-
-config DEBUG_STACK_USAGE
-       bool "Stack utilization instrumentation"
-       depends on DEBUG_KERNEL
-       help
-         Enables the display of the minimum amount of free stack which each
-         task has ever had available in the sysrq-T and sysrq-P debug output.
-
-         This option will slow down process creation somewhat.
-
-comment "Page alloc debug is incompatible with Software Suspend on i386"
-       depends on DEBUG_KERNEL && SOFTWARE_SUSPEND
-
-config DEBUG_PAGEALLOC
-       bool "Debug page memory allocations"
-       depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND && !HUGETLBFS
-       help
-         Unmap pages from the kernel linear mapping after free_pages().
-         This results in a large slowdown, but helps to find certain types
-         of memory corruptions.
-
-config DEBUG_RODATA
-       bool "Write protect kernel read-only data structures"
-       depends on DEBUG_KERNEL
-       help
-         Mark the kernel read-only data as write-protected in the pagetables,
-         in order to catch accidental (and incorrect) writes to such const
-         data. This option may have a slight performance impact because a
-         portion of the kernel code won't be covered by a 2MB TLB anymore.
-         If in doubt, say "N".
-
-config 4KSTACKS
-       bool "Use 4Kb for kernel stacks instead of 8Kb"
-       depends on DEBUG_KERNEL
-       help
-         If you say Y here the kernel will use a 4Kb stacksize for the
-         kernel stack attached to each process/thread. This facilitates
-         running more threads on a system and also reduces the pressure
-         on the VM subsystem for higher order allocations. This option
-         will also use IRQ stacks to compensate for the reduced stackspace.
-
-config X86_FIND_SMP_CONFIG
-       bool
-       depends on X86_LOCAL_APIC || X86_VOYAGER
-       default y
-
-config X86_MPPARSE
-       bool
-       depends on X86_LOCAL_APIC && !X86_VISWS
-       default y
-
-config DOUBLEFAULT
-       default y
-       bool "Enable doublefault exception handler" if EMBEDDED
-       depends on !X86_NO_TSS
-       help
-          This option allows trapping of rare doublefault exceptions that
-          would otherwise cause a system to silently reboot. Disabling this
-          option saves about 4k and might cause you much additional grey
-          hair.
-
-endmenu
diff --git a/linux-2.6-xen-sparse/arch/i386/Makefile b/linux-2.6-xen-sparse/arch/i386/Makefile
deleted file mode 100644 (file)
index 07af557..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-#
-# i386/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies. Remember to do have actions
-# for "archclean" cleaning up for this architecture.
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (C) 1994 by Linus Torvalds
-#
-# 19990713  Artur Skawina <skawina@geocities.com>
-#           Added '-march' and '-mpreferred-stack-boundary' support
-#
-# 20050320  Kianusch Sayah Karadji <kianusch@sk-tech.net>
-#           Added support for GEODE CPU
-
-HAS_BIARCH      := $(call cc-option-yn, -m32)
-ifeq ($(HAS_BIARCH),y)
-AS              := $(AS) --32
-LD              := $(LD) -m elf_i386
-CC              := $(CC) -m32
-endif
-
-LDFLAGS                := -m elf_i386
-OBJCOPYFLAGS   := -O binary -R .note -R .comment -S
-LDFLAGS_vmlinux :=
-CHECKFLAGS     += -D__i386__
-
-CFLAGS += -pipe -msoft-float
-
-# prevent gcc from keeping the stack 16 byte aligned
-CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
-
-# CPU-specific tuning. Anything which can be shared with UML should go here.
-include $(srctree)/arch/i386/Makefile.cpu
-
-cflags-$(CONFIG_REGPARM) += -mregparm=3
-
-# temporary until string.h is fixed
-cflags-y += -ffreestanding
-
-# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
-# a lot more stack due to the lack of sharing of stacklots:
-CFLAGS                         += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;)
-
-CFLAGS += $(cflags-y)
-
-cppflags-$(CONFIG_XEN) += \
-       -D__XEN_INTERFACE_VERSION__=$(CONFIG_XEN_INTERFACE_VERSION)
-
-CPPFLAGS += $(cppflags-y)
-
-# Default subarch .c files
-mcore-y  := mach-default
-
-# Voyager subarch support
-mflags-$(CONFIG_X86_VOYAGER)   := -Iinclude/asm-i386/mach-voyager
-mcore-$(CONFIG_X86_VOYAGER)    := mach-voyager
-
-# VISWS subarch support
-mflags-$(CONFIG_X86_VISWS)     := -Iinclude/asm-i386/mach-visws
-mcore-$(CONFIG_X86_VISWS)      := mach-visws
-
-# NUMAQ subarch support
-mflags-$(CONFIG_X86_NUMAQ)     := -Iinclude/asm-i386/mach-numaq
-mcore-$(CONFIG_X86_NUMAQ)      := mach-default
-
-# BIGSMP subarch support
-mflags-$(CONFIG_X86_BIGSMP)    := -Iinclude/asm-i386/mach-bigsmp
-mcore-$(CONFIG_X86_BIGSMP)     := mach-default
-
-#Summit subarch support
-mflags-$(CONFIG_X86_SUMMIT) := -Iinclude/asm-i386/mach-summit
-mcore-$(CONFIG_X86_SUMMIT)  := mach-default
-
-# Xen subarch support
-mflags-$(CONFIG_X86_XEN)       := -Iinclude/asm-i386/mach-xen
-mcore-$(CONFIG_X86_XEN)                := mach-xen
-
-# generic subarchitecture
-mflags-$(CONFIG_X86_GENERICARCH) := -Iinclude/asm-i386/mach-generic
-mcore-$(CONFIG_X86_GENERICARCH) := mach-default
-core-$(CONFIG_X86_GENERICARCH) += arch/i386/mach-generic/
-
-# ES7000 subarch support
-mflags-$(CONFIG_X86_ES7000)    := -Iinclude/asm-i386/mach-es7000
-mcore-$(CONFIG_X86_ES7000)     := mach-default
-core-$(CONFIG_X86_ES7000)      := arch/i386/mach-es7000/
-
-# default subarch .h files
-mflags-y += -Iinclude/asm-i386/mach-default
-
-head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
-
-libs-y                                         += arch/i386/lib/
-core-y                                 += arch/i386/kernel/ \
-                                          arch/i386/mm/ \
-                                          arch/i386/$(mcore-y)/ \
-                                          arch/i386/crypto/
-drivers-$(CONFIG_MATH_EMULATION)       += arch/i386/math-emu/
-drivers-$(CONFIG_PCI)                  += arch/i386/pci/
-# must be linked after kernel/
-drivers-$(CONFIG_OPROFILE)             += arch/i386/oprofile/
-drivers-$(CONFIG_PM)                   += arch/i386/power/
-
-CFLAGS += $(mflags-y)
-AFLAGS += $(mflags-y)
-
-boot := arch/i386/boot
-
-PHONY += zImage bzImage compressed zlilo bzlilo \
-         zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
-
-ifdef CONFIG_XEN
-CPPFLAGS := -Iinclude$(if $(KBUILD_SRC),2)/asm/mach-xen $(CPPFLAGS)
-head-y := arch/i386/kernel/head-xen.o arch/i386/kernel/init_task-xen.o
-boot := arch/i386/boot-xen
-.PHONY: vmlinuz
-all: vmlinuz
-
-vmlinuz: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $@
-
-install:
-       $(Q)$(MAKE) $(build)=$(boot) $@
-else
-all: bzImage
-
-# KBUILD_IMAGE specify target image being built
-                    KBUILD_IMAGE := $(boot)/bzImage
-zImage zlilo zdisk: KBUILD_IMAGE := arch/i386/boot/zImage
-
-zImage bzImage: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
-
-compressed: zImage
-
-zlilo bzlilo: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zlilo
-
-zdisk bzdisk: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zdisk
-
-fdimage fdimage144 fdimage288 isoimage: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
-
-install:
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
-endif
-
-archclean:
-       $(Q)$(MAKE) $(clean)=arch/i386/boot
-
-define archhelp
-  echo  '* bzImage     - Compressed kernel image (arch/$(ARCH)/boot/bzImage)'
-  echo  '  install     - Install kernel using'
-  echo  '                 (your) ~/bin/installkernel or'
-  echo  '                 (distribution) /sbin/installkernel or'
-  echo  '                 install to $$(INSTALL_PATH) and run lilo'
-  echo  '  bzdisk       - Create a boot floppy in /dev/fd0'
-  echo  '  fdimage      - Create a boot floppy image'
-  echo  '  isoimage     - Create a boot CD-ROM image'
-endef
-
-CLEAN_FILES += arch/$(ARCH)/boot/fdimage \
-              arch/$(ARCH)/boot/image.iso \
-              arch/$(ARCH)/boot/mtools.conf
-CLEAN_FILES += vmlinuz vmlinux-stripped
diff --git a/linux-2.6-xen-sparse/arch/i386/boot-xen/Makefile b/linux-2.6-xen-sparse/arch/i386/boot-xen/Makefile
deleted file mode 100644 (file)
index a6aec62..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-
-OBJCOPYFLAGS := -g --strip-unneeded
-
-vmlinuz: vmlinux-stripped FORCE
-       $(call if_changed,gzip)
-
-vmlinux-stripped: vmlinux FORCE
-       $(call if_changed,objcopy)
-
-INSTALL_ROOT := $(patsubst %/boot,%,$(INSTALL_PATH))
-
-XINSTALL_NAME ?= $(KERNELRELEASE)
-install:
-       mkdir -p $(INSTALL_ROOT)/boot
-       install -m0644 vmlinuz $(INSTALL_ROOT)/boot/vmlinuz-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
-       install -m0644 vmlinux $(INSTALL_ROOT)/boot/vmlinux-syms-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
-       install -m0664 .config $(INSTALL_ROOT)/boot/config-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
-       install -m0664 System.map $(INSTALL_ROOT)/boot/System.map-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
-       ln -f -s vmlinuz-$(XINSTALL_NAME)$(INSTALL_SUFFIX) $(INSTALL_ROOT)/boot/vmlinuz-$(VERSION).$(PATCHLEVEL)$(shell [ -e $(objtree)/localversion-xen ] && cat $(objtree)/localversion-xen)$(INSTALL_SUFFIX)
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/Makefile b/linux-2.6-xen-sparse/arch/i386/kernel/Makefile
deleted file mode 100644 (file)
index 03d31c5..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-extra-y := head.o init_task.o vmlinux.lds
-
-obj-y  := process.o semaphore.o signal.o entry.o traps.o irq.o \
-               ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
-               pci-dma.o i386_ksyms.o i387.o bootflag.o \
-               quirks.o i8237.o topology.o alternative.o i8253.o tsc.o
-
-obj-$(CONFIG_STACKTRACE)       += stacktrace.o
-obj-y                          += cpu/
-obj-y                          += acpi/
-obj-$(CONFIG_X86_BIOS_REBOOT)  += reboot.o
-obj-$(CONFIG_MCA)              += mca.o
-obj-$(CONFIG_X86_MSR)          += msr.o
-obj-$(CONFIG_X86_CPUID)                += cpuid.o
-obj-$(CONFIG_MICROCODE)                += microcode.o
-obj-$(CONFIG_APM)              += apm.o
-obj-$(CONFIG_X86_SMP)          += smp.o smpboot.o
-obj-$(CONFIG_X86_TRAMPOLINE)   += trampoline.o
-obj-$(CONFIG_X86_MPPARSE)      += mpparse.o
-obj-$(CONFIG_X86_LOCAL_APIC)   += apic.o nmi.o
-obj-$(CONFIG_X86_IO_APIC)      += io_apic.o
-obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups.o
-obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o crash.o
-obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
-obj-$(CONFIG_X86_NUMAQ)                += numaq.o
-obj-$(CONFIG_X86_SUMMIT_NUMA)  += summit.o
-obj-$(CONFIG_KPROBES)          += kprobes.o
-obj-$(CONFIG_MODULES)          += module.o
-obj-y                          += sysenter.o vsyscall.o
-obj-$(CONFIG_ACPI_SRAT)        += srat.o
-obj-$(CONFIG_HPET_TIMER)       += time_hpet.o
-obj-$(CONFIG_EFI)              += efi.o efi_stub.o
-obj-$(CONFIG_DOUBLEFAULT)      += doublefault.o
-obj-$(CONFIG_VM86)             += vm86.o
-obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
-obj-$(CONFIG_HPET_TIMER)       += hpet.o
-obj-$(CONFIG_K8_NB)            += k8.o
-
-EXTRA_AFLAGS   := -traditional
-
-obj-$(CONFIG_SCx200)           += scx200.o
-
-ifdef CONFIG_XEN
-vsyscall_note := vsyscall-note-xen.o
-else
-vsyscall_note := vsyscall-note.o
-endif
-
-# vsyscall.o contains the vsyscall DSO images as __initdata.
-# We must build both images before we can assemble it.
-# Note: kbuild does not track this dependency due to usage of .incbin
-$(obj)/vsyscall.o: $(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so
-targets += $(foreach F,int80 sysenter,vsyscall-$F.o vsyscall-$F.so)
-targets += vsyscall-note.o vsyscall.lds
-
-# The DSO images are built using a special linker script.
-quiet_cmd_syscall = SYSCALL $@
-      cmd_syscall = $(CC) -m elf_i386 -nostdlib $(SYSCFLAGS_$(@F)) \
-                         -Wl,-T,$(filter-out FORCE,$^) -o $@
-
-export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH)
-
-vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \
-                $(call ld-option, -Wl$(comma)--hash-style=sysv)
-SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags)
-SYSCFLAGS_vsyscall-int80.so    = $(vsyscall-flags)
-
-$(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so: \
-$(obj)/vsyscall-%.so: $(src)/vsyscall.lds \
-                     $(obj)/vsyscall-%.o $(obj)/$(vsyscall_note) FORCE
-       $(call if_changed,syscall)
-
-# We also create a special relocatable object that should mirror the symbol
-# table and layout of the linked DSO.  With ld -R we can then refer to
-# these symbols in the kernel code rather than hand-coded addresses.
-extra-y += vsyscall-syms.o
-$(obj)/built-in.o: $(obj)/vsyscall-syms.o
-$(obj)/built-in.o: ld_flags += -R $(obj)/vsyscall-syms.o
-
-SYSCFLAGS_vsyscall-syms.o = -r
-$(obj)/vsyscall-syms.o: $(src)/vsyscall.lds \
-                       $(obj)/vsyscall-sysenter.o $(obj)/$(vsyscall_note) FORCE
-       $(call if_changed,syscall)
-
-k8-y                      += ../../x86_64/kernel/k8.o
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-
-obj-y += fixup.o
-microcode-$(subst m,y,$(CONFIG_MICROCODE)) := microcode-xen.o
-n-obj-xen := i8259.o timers/ reboot.o smpboot.o trampoline.o
-
-obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
-obj-y := $(call cherrypickxen, $(obj-y))
-extra-y := $(call cherrypickxen, $(extra-y))
-%/head-xen.o %/head-xen.s: EXTRA_AFLAGS :=
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile
deleted file mode 100644 (file)
index fa783e6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-obj-$(CONFIG_ACPI)             += boot.o
-obj-$(CONFIG_X86_IO_APIC)      += earlyquirk.o
-obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
-
-ifneq ($(CONFIG_ACPI_PROCESSOR),)
-obj-y                          += cstate.o processor.o
-endif
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-obj-y := $(call cherrypickxen, $(obj-y), $(src))
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c
deleted file mode 100644 (file)
index 13be515..0000000
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- *  boot.c - Architecture-Specific Low-Level ACPI Boot Support
- *
- *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
- *  Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-
-#include <linux/init.h>
-#include <linux/acpi.h>
-#include <linux/efi.h>
-#include <linux/module.h>
-#include <linux/dmi.h>
-#include <linux/irq.h>
-
-#include <asm/pgtable.h>
-#include <asm/io_apic.h>
-#include <asm/apic.h>
-#include <asm/io.h>
-#include <asm/mpspec.h>
-
-#ifdef CONFIG_X86_64
-
-extern void __init clustered_apic_check(void);
-
-extern int gsi_irq_sharing(int gsi);
-#include <asm/proto.h>
-
-static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
-
-
-#else                          /* X86 */
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#include <mach_apic.h>
-#include <mach_mpparse.h>
-#endif                         /* CONFIG_X86_LOCAL_APIC */
-
-static inline int gsi_irq_sharing(int gsi) { return gsi; }
-
-#endif                         /* X86 */
-
-#define BAD_MADT_ENTRY(entry, end) (                                       \
-               (!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
-               ((acpi_table_entry_header *)entry)->length < sizeof(*entry))
-
-#define PREFIX                 "ACPI: "
-
-int acpi_noirq __initdata;     /* skip ACPI IRQ initialization */
-int acpi_pci_disabled __initdata;      /* skip ACPI PCI scan and IRQ initialization */
-int acpi_ht __initdata = 1;    /* enable HT */
-
-int acpi_lapic;
-int acpi_ioapic;
-int acpi_strict;
-EXPORT_SYMBOL(acpi_strict);
-
-acpi_interrupt_flags acpi_sci_flags __initdata;
-int acpi_sci_override_gsi __initdata;
-int acpi_skip_timer_override __initdata;
-
-#ifdef CONFIG_X86_LOCAL_APIC
-static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
-#endif
-
-#ifndef __HAVE_ARCH_CMPXCHG
-#warning ACPI uses CMPXCHG, i486 and later hardware
-#endif
-
-#define MAX_MADT_ENTRIES       256
-u8 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
-    {[0 ... MAX_MADT_ENTRIES - 1] = 0xff };
-EXPORT_SYMBOL(x86_acpiid_to_apicid);
-
-/* --------------------------------------------------------------------------
-                              Boot-time Configuration
-   -------------------------------------------------------------------------- */
-
-/*
- * The default interrupt routing model is PIC (8259).  This gets
- * overriden if IOAPICs are enumerated (below).
- */
-enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
-
-#if defined(CONFIG_X86_64) && !defined(CONFIG_XEN)
-
-/* rely on all ACPI tables being in the direct mapping */
-char *__acpi_map_table(unsigned long phys_addr, unsigned long size)
-{
-       if (!phys_addr || !size)
-               return NULL;
-
-       if (phys_addr+size <= (end_pfn_map << PAGE_SHIFT) + PAGE_SIZE)
-               return __va(phys_addr);
-
-       return NULL;
-}
-
-#else
-
-/*
- * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
- * to map the target physical address. The problem is that set_fixmap()
- * provides a single page, and it is possible that the page is not
- * sufficient.
- * By using this area, we can map up to MAX_IO_APICS pages temporarily,
- * i.e. until the next __va_range() call.
- *
- * Important Safety Note:  The fixed I/O APIC page numbers are *subtracted*
- * from the fixed base.  That's why we start at FIX_IO_APIC_BASE_END and
- * count idx down while incrementing the phys address.
- */
-char *__acpi_map_table(unsigned long phys, unsigned long size)
-{
-       unsigned long base, offset, mapped_size;
-       int idx;
-
-#ifndef CONFIG_XEN
-       if (phys + size < 8 * 1024 * 1024)
-               return __va(phys);
-#endif
-
-       offset = phys & (PAGE_SIZE - 1);
-       mapped_size = PAGE_SIZE - offset;
-       set_fixmap(FIX_ACPI_END, phys);
-       base = fix_to_virt(FIX_ACPI_END);
-
-       /*
-        * Most cases can be covered by the below.
-        */
-       idx = FIX_ACPI_END;
-       while (mapped_size < size) {
-               if (--idx < FIX_ACPI_BEGIN)
-                       return NULL;    /* cannot handle this */
-               phys += PAGE_SIZE;
-               set_fixmap(idx, phys);
-               mapped_size += PAGE_SIZE;
-       }
-
-       return ((unsigned char *)base + offset);
-}
-#endif
-
-#ifdef CONFIG_PCI_MMCONFIG
-/* The physical address of the MMCONFIG aperture.  Set from ACPI tables. */
-struct acpi_table_mcfg_config *pci_mmcfg_config;
-int pci_mmcfg_config_num;
-
-int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
-{
-       struct acpi_table_mcfg *mcfg;
-       unsigned long i;
-       int config_size;
-
-       if (!phys_addr || !size)
-               return -EINVAL;
-
-       mcfg = (struct acpi_table_mcfg *)__acpi_map_table(phys_addr, size);
-       if (!mcfg) {
-               printk(KERN_WARNING PREFIX "Unable to map MCFG\n");
-               return -ENODEV;
-       }
-
-       /* how many config structures do we have */
-       pci_mmcfg_config_num = 0;
-       i = size - sizeof(struct acpi_table_mcfg);
-       while (i >= sizeof(struct acpi_table_mcfg_config)) {
-               ++pci_mmcfg_config_num;
-               i -= sizeof(struct acpi_table_mcfg_config);
-       };
-       if (pci_mmcfg_config_num == 0) {
-               printk(KERN_ERR PREFIX "MMCONFIG has no entries\n");
-               return -ENODEV;
-       }
-
-       config_size = pci_mmcfg_config_num * sizeof(*pci_mmcfg_config);
-       pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL);
-       if (!pci_mmcfg_config) {
-               printk(KERN_WARNING PREFIX
-                      "No memory for MCFG config tables\n");
-               return -ENOMEM;
-       }
-
-       memcpy(pci_mmcfg_config, &mcfg->config, config_size);
-       for (i = 0; i < pci_mmcfg_config_num; ++i) {
-               if (mcfg->config[i].base_reserved) {
-                       printk(KERN_ERR PREFIX
-                              "MMCONFIG not in low 4GB of memory\n");
-                       kfree(pci_mmcfg_config);
-                       pci_mmcfg_config_num = 0;
-                       return -ENODEV;
-               }
-       }
-
-       return 0;
-}
-#endif                         /* CONFIG_PCI_MMCONFIG */
-
-#ifdef CONFIG_X86_LOCAL_APIC
-static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
-{
-       struct acpi_table_madt *madt = NULL;
-
-       if (!phys_addr || !size || !cpu_has_apic)
-               return -EINVAL;
-
-       madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
-       if (!madt) {
-               printk(KERN_WARNING PREFIX "Unable to map MADT\n");
-               return -ENODEV;
-       }
-
-       if (madt->lapic_address) {
-               acpi_lapic_addr = (u64) madt->lapic_address;
-
-               printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n",
-                      madt->lapic_address);
-       }
-
-       acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
-
-       return 0;
-}
-
-static int __init
-acpi_parse_lapic(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_lapic *processor = NULL;
-
-       processor = (struct acpi_table_lapic *)header;
-
-       if (BAD_MADT_ENTRY(processor, end))
-               return -EINVAL;
-
-       acpi_table_print_madt_entry(header);
-
-       /* Record local apic id only when enabled */
-       if (processor->flags.enabled)
-               x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
-
-       /*
-        * We need to register disabled CPU as well to permit
-        * counting disabled CPUs. This allows us to size
-        * cpus_possible_map more accurately, to permit
-        * to not preallocating memory for all NR_CPUS
-        * when we use CPU hotplug.
-        */
-       mp_register_lapic(processor->id,        /* APIC ID */
-                         processor->flags.enabled);    /* Enabled? */
-
-       return 0;
-}
-
-static int __init
-acpi_parse_lapic_addr_ovr(acpi_table_entry_header * header,
-                         const unsigned long end)
-{
-       struct acpi_table_lapic_addr_ovr *lapic_addr_ovr = NULL;
-
-       lapic_addr_ovr = (struct acpi_table_lapic_addr_ovr *)header;
-
-       if (BAD_MADT_ENTRY(lapic_addr_ovr, end))
-               return -EINVAL;
-
-       acpi_lapic_addr = lapic_addr_ovr->address;
-
-       return 0;
-}
-
-static int __init
-acpi_parse_lapic_nmi(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_lapic_nmi *lapic_nmi = NULL;
-
-       lapic_nmi = (struct acpi_table_lapic_nmi *)header;
-
-       if (BAD_MADT_ENTRY(lapic_nmi, end))
-               return -EINVAL;
-
-       acpi_table_print_madt_entry(header);
-
-       if (lapic_nmi->lint != 1)
-               printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
-
-       return 0;
-}
-
-#endif                         /*CONFIG_X86_LOCAL_APIC */
-
-#ifdef CONFIG_X86_IO_APIC
-
-static int __init
-acpi_parse_ioapic(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_ioapic *ioapic = NULL;
-
-       ioapic = (struct acpi_table_ioapic *)header;
-
-       if (BAD_MADT_ENTRY(ioapic, end))
-               return -EINVAL;
-
-       acpi_table_print_madt_entry(header);
-
-       mp_register_ioapic(ioapic->id,
-                          ioapic->address, ioapic->global_irq_base);
-
-       return 0;
-}
-
-/*
- * Parse Interrupt Source Override for the ACPI SCI
- */
-static void acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger)
-{
-       if (trigger == 0)       /* compatible SCI trigger is level */
-               trigger = 3;
-
-       if (polarity == 0)      /* compatible SCI polarity is low */
-               polarity = 3;
-
-       /* Command-line over-ride via acpi_sci= */
-       if (acpi_sci_flags.trigger)
-               trigger = acpi_sci_flags.trigger;
-
-       if (acpi_sci_flags.polarity)
-               polarity = acpi_sci_flags.polarity;
-
-       /*
-        * mp_config_acpi_legacy_irqs() already setup IRQs < 16
-        * If GSI is < 16, this will update its flags,
-        * else it will create a new mp_irqs[] entry.
-        */
-       mp_override_legacy_irq(gsi, polarity, trigger, gsi);
-
-       /*
-        * stash over-ride to indicate we've been here
-        * and for later update of acpi_fadt
-        */
-       acpi_sci_override_gsi = gsi;
-       return;
-}
-
-static int __init
-acpi_parse_int_src_ovr(acpi_table_entry_header * header,
-                      const unsigned long end)
-{
-       struct acpi_table_int_src_ovr *intsrc = NULL;
-
-       intsrc = (struct acpi_table_int_src_ovr *)header;
-
-       if (BAD_MADT_ENTRY(intsrc, end))
-               return -EINVAL;
-
-       acpi_table_print_madt_entry(header);
-
-       if (intsrc->bus_irq == acpi_fadt.sci_int) {
-               acpi_sci_ioapic_setup(intsrc->global_irq,
-                                     intsrc->flags.polarity,
-                                     intsrc->flags.trigger);
-               return 0;
-       }
-
-       if (acpi_skip_timer_override &&
-           intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
-               printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
-               return 0;
-       }
-
-       mp_override_legacy_irq(intsrc->bus_irq,
-                              intsrc->flags.polarity,
-                              intsrc->flags.trigger, intsrc->global_irq);
-
-       return 0;
-}
-
-static int __init
-acpi_parse_nmi_src(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_nmi_src *nmi_src = NULL;
-
-       nmi_src = (struct acpi_table_nmi_src *)header;
-
-       if (BAD_MADT_ENTRY(nmi_src, end))
-               return -EINVAL;
-
-       acpi_table_print_madt_entry(header);
-
-       /* TBD: Support nimsrc entries? */
-
-       return 0;
-}
-
-#endif                         /* CONFIG_X86_IO_APIC */
-
-/*
- * acpi_pic_sci_set_trigger()
- * 
- * use ELCR to set PIC-mode trigger type for SCI
- *
- * If a PIC-mode SCI is not recognized or gives spurious IRQ7's
- * it may require Edge Trigger -- use "acpi_sci=edge"
- *
- * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
- * for the 8259 PIC.  bit[n] = 1 means irq[n] is Level, otherwise Edge.
- * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
- * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
- */
-
-void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
-{
-       unsigned int mask = 1 << irq;
-       unsigned int old, new;
-
-       /* Real old ELCR mask */
-       old = inb(0x4d0) | (inb(0x4d1) << 8);
-
-       /*
-        * If we use ACPI to set PCI irq's, then we should clear ELCR
-        * since we will set it correctly as we enable the PCI irq
-        * routing.
-        */
-       new = acpi_noirq ? old : 0;
-
-       /*
-        * Update SCI information in the ELCR, it isn't in the PCI
-        * routing tables..
-        */
-       switch (trigger) {
-       case 1:         /* Edge - clear */
-               new &= ~mask;
-               break;
-       case 3:         /* Level - set */
-               new |= mask;
-               break;
-       }
-
-       if (old == new)
-               return;
-
-       printk(PREFIX "setting ELCR to %04x (from %04x)\n", new, old);
-       outb(new, 0x4d0);
-       outb(new >> 8, 0x4d1);
-}
-
-int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
-{
-#ifdef CONFIG_X86_IO_APIC
-       if (use_pci_vector() && !platform_legacy_irq(gsi))
-               *irq = IO_APIC_VECTOR(gsi);
-       else
-#endif
-               *irq = gsi_irq_sharing(gsi);
-       return 0;
-}
-
-/*
- * success: return IRQ number (>=0)
- * failure: return < 0
- */
-int acpi_register_gsi(u32 gsi, int triggering, int polarity)
-{
-       unsigned int irq;
-       unsigned int plat_gsi = gsi;
-
-#ifdef CONFIG_PCI
-       /*
-        * Make sure all (legacy) PCI IRQs are set as level-triggered.
-        */
-       if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
-               extern void eisa_set_level_irq(unsigned int irq);
-
-               if (triggering == ACPI_LEVEL_SENSITIVE)
-                       eisa_set_level_irq(gsi);
-       }
-#endif
-
-#ifdef CONFIG_X86_IO_APIC
-       if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) {
-               plat_gsi = mp_register_gsi(gsi, triggering, polarity);
-       }
-#endif
-       acpi_gsi_to_irq(plat_gsi, &irq);
-       return irq;
-}
-
-EXPORT_SYMBOL(acpi_register_gsi);
-
-/*
- *  ACPI based hotplug support for CPU
- */
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-int acpi_map_lsapic(acpi_handle handle, int *pcpu)
-{
-       /* TBD */
-       return -EINVAL;
-}
-
-EXPORT_SYMBOL(acpi_map_lsapic);
-
-int acpi_unmap_lsapic(int cpu)
-{
-       /* TBD */
-       return -EINVAL;
-}
-
-EXPORT_SYMBOL(acpi_unmap_lsapic);
-#endif                         /* CONFIG_ACPI_HOTPLUG_CPU */
-
-int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
-{
-       /* TBD */
-       return -EINVAL;
-}
-
-EXPORT_SYMBOL(acpi_register_ioapic);
-
-int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
-{
-       /* TBD */
-       return -EINVAL;
-}
-
-EXPORT_SYMBOL(acpi_unregister_ioapic);
-
-static unsigned long __init
-acpi_scan_rsdp(unsigned long start, unsigned long length)
-{
-       unsigned long offset = 0;
-       unsigned long sig_len = sizeof("RSD PTR ") - 1;
-       unsigned long vstart = (unsigned long)isa_bus_to_virt(start);
-
-       /*
-        * Scan all 16-byte boundaries of the physical memory region for the
-        * RSDP signature.
-        */
-       for (offset = 0; offset < length; offset += 16) {
-               if (strncmp((char *)(vstart + offset), "RSD PTR ", sig_len))
-                       continue;
-               return (start + offset);
-       }
-
-       return 0;
-}
-
-static int __init acpi_parse_sbf(unsigned long phys_addr, unsigned long size)
-{
-       struct acpi_table_sbf *sb;
-
-       if (!phys_addr || !size)
-               return -EINVAL;
-
-       sb = (struct acpi_table_sbf *)__acpi_map_table(phys_addr, size);
-       if (!sb) {
-               printk(KERN_WARNING PREFIX "Unable to map SBF\n");
-               return -ENODEV;
-       }
-
-       sbf_port = sb->sbf_cmos;        /* Save CMOS port */
-
-       return 0;
-}
-
-#ifdef CONFIG_HPET_TIMER
-
-static int __init acpi_parse_hpet(unsigned long phys, unsigned long size)
-{
-       struct acpi_table_hpet *hpet_tbl;
-
-       if (!phys || !size)
-               return -EINVAL;
-
-       hpet_tbl = (struct acpi_table_hpet *)__acpi_map_table(phys, size);
-       if (!hpet_tbl) {
-               printk(KERN_WARNING PREFIX "Unable to map HPET\n");
-               return -ENODEV;
-       }
-
-       if (hpet_tbl->addr.space_id != ACPI_SPACE_MEM) {
-               printk(KERN_WARNING PREFIX "HPET timers must be located in "
-                      "memory.\n");
-               return -1;
-       }
-#ifdef CONFIG_X86_64
-       vxtime.hpet_address = hpet_tbl->addr.addrl |
-           ((long)hpet_tbl->addr.addrh << 32);
-
-       printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
-              hpet_tbl->id, vxtime.hpet_address);
-#else                          /* X86 */
-       {
-               extern unsigned long hpet_address;
-
-               hpet_address = hpet_tbl->addr.addrl;
-               printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
-                      hpet_tbl->id, hpet_address);
-       }
-#endif                         /* X86 */
-
-       return 0;
-}
-#else
-#define        acpi_parse_hpet NULL
-#endif
-
-#ifdef CONFIG_X86_PM_TIMER
-extern u32 pmtmr_ioport;
-#endif
-
-static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
-{
-       struct fadt_descriptor *fadt = NULL;
-
-       fadt = (struct fadt_descriptor *)__acpi_map_table(phys, size);
-       if (!fadt) {
-               printk(KERN_WARNING PREFIX "Unable to map FADT\n");
-               return 0;
-       }
-       /* initialize sci_int early for INT_SRC_OVR MADT parsing */
-       acpi_fadt.sci_int = fadt->sci_int;
-
-       /* initialize rev and apic_phys_dest_mode for x86_64 genapic */
-       acpi_fadt.revision = fadt->revision;
-       acpi_fadt.force_apic_physical_destination_mode =
-           fadt->force_apic_physical_destination_mode;
-
-#if defined(CONFIG_X86_PM_TIMER) && !defined(CONFIG_XEN)
-       /* detect the location of the ACPI PM Timer */
-       if (fadt->revision >= FADT2_REVISION_ID) {
-               /* FADT rev. 2 */
-               if (fadt->xpm_tmr_blk.address_space_id !=
-                   ACPI_ADR_SPACE_SYSTEM_IO)
-                       return 0;
-
-               pmtmr_ioport = fadt->xpm_tmr_blk.address;
-               /*
-                * "X" fields are optional extensions to the original V1.0
-                * fields, so we must selectively expand V1.0 fields if the
-                * corresponding X field is zero.
-                */
-               if (!pmtmr_ioport)
-                       pmtmr_ioport = fadt->V1_pm_tmr_blk;
-       } else {
-               /* FADT rev. 1 */
-               pmtmr_ioport = fadt->V1_pm_tmr_blk;
-       }
-       if (pmtmr_ioport)
-               printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n",
-                      pmtmr_ioport);
-#endif
-       return 0;
-}
-
-unsigned long __init acpi_find_rsdp(void)
-{
-       unsigned long rsdp_phys = 0;
-
-       if (efi_enabled) {
-               if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
-                       return efi.acpi20;
-               else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
-                       return efi.acpi;
-       }
-       /*
-        * Scan memory looking for the RSDP signature. First search EBDA (low
-        * memory) paragraphs and then search upper memory (E0000-FFFFF).
-        */
-       rsdp_phys = acpi_scan_rsdp(0, 0x400);
-       if (!rsdp_phys)
-               rsdp_phys = acpi_scan_rsdp(0xE0000, 0x20000);
-
-       return rsdp_phys;
-}
-
-#ifdef CONFIG_X86_LOCAL_APIC
-/*
- * Parse LAPIC entries in MADT
- * returns 0 on success, < 0 on error
- */
-static int __init acpi_parse_madt_lapic_entries(void)
-{
-       int count;
-
-       if (!cpu_has_apic)
-               return -ENODEV;
-
-       /* 
-        * Note that the LAPIC address is obtained from the MADT (32-bit value)
-        * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value).
-        */
-
-       count =
-           acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR,
-                                 acpi_parse_lapic_addr_ovr, 0);
-       if (count < 0) {
-               printk(KERN_ERR PREFIX
-                      "Error parsing LAPIC address override entry\n");
-               return count;
-       }
-
-       mp_register_lapic_address(acpi_lapic_addr);
-
-       count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic,
-                                     MAX_APICS);
-       if (!count) {
-               printk(KERN_ERR PREFIX "No LAPIC entries present\n");
-               /* TBD: Cleanup to allow fallback to MPS */
-               return -ENODEV;
-       } else if (count < 0) {
-               printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
-               /* TBD: Cleanup to allow fallback to MPS */
-               return count;
-       }
-
-       count =
-           acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0);
-       if (count < 0) {
-               printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
-               /* TBD: Cleanup to allow fallback to MPS */
-               return count;
-       }
-       return 0;
-}
-#endif                         /* CONFIG_X86_LOCAL_APIC */
-
-#ifdef CONFIG_X86_IO_APIC
-/*
- * Parse IOAPIC related entries in MADT
- * returns 0 on success, < 0 on error
- */
-static int __init acpi_parse_madt_ioapic_entries(void)
-{
-       int count;
-
-       /*
-        * ACPI interpreter is required to complete interrupt setup,
-        * so if it is off, don't enumerate the io-apics with ACPI.
-        * If MPS is present, it will handle them,
-        * otherwise the system will stay in PIC mode
-        */
-       if (acpi_disabled || acpi_noirq) {
-               return -ENODEV;
-       }
-
-       if (!cpu_has_apic) 
-               return -ENODEV;
-
-       /*
-        * if "noapic" boot option, don't look for IO-APICs
-        */
-       if (skip_ioapic_setup) {
-               printk(KERN_INFO PREFIX "Skipping IOAPIC probe "
-                      "due to 'noapic' option.\n");
-               return -ENODEV;
-       }
-
-       count =
-           acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic,
-                                 MAX_IO_APICS);
-       if (!count) {
-               printk(KERN_ERR PREFIX "No IOAPIC entries present\n");
-               return -ENODEV;
-       } else if (count < 0) {
-               printk(KERN_ERR PREFIX "Error parsing IOAPIC entry\n");
-               return count;
-       }
-
-       count =
-           acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr,
-                                 NR_IRQ_VECTORS);
-       if (count < 0) {
-               printk(KERN_ERR PREFIX
-                      "Error parsing interrupt source overrides entry\n");
-               /* TBD: Cleanup to allow fallback to MPS */
-               return count;
-       }
-
-       /*
-        * If BIOS did not supply an INT_SRC_OVR for the SCI
-        * pretend we got one so we can set the SCI flags.
-        */
-       if (!acpi_sci_override_gsi)
-               acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0);
-
-       /* Fill in identity legacy mapings where no override */
-       mp_config_acpi_legacy_irqs();
-
-       count =
-           acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src,
-                                 NR_IRQ_VECTORS);
-       if (count < 0) {
-               printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
-               /* TBD: Cleanup to allow fallback to MPS */
-               return count;
-       }
-
-       return 0;
-}
-#else
-static inline int acpi_parse_madt_ioapic_entries(void)
-{
-       return -1;
-}
-#endif /* !CONFIG_X86_IO_APIC */
-
-static void __init acpi_process_madt(void)
-{
-#ifdef CONFIG_X86_LOCAL_APIC
-       int count, error;
-
-       count = acpi_table_parse(ACPI_APIC, acpi_parse_madt);
-       if (count >= 1) {
-
-               /*
-                * Parse MADT LAPIC entries
-                */
-               error = acpi_parse_madt_lapic_entries();
-               if (!error) {
-                       acpi_lapic = 1;
-
-#ifdef CONFIG_X86_GENERICARCH
-                       generic_bigsmp_probe();
-#endif
-                       /*
-                        * Parse MADT IO-APIC entries
-                        */
-                       error = acpi_parse_madt_ioapic_entries();
-                       if (!error) {
-                               acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
-                               acpi_irq_balance_set(NULL);
-                               acpi_ioapic = 1;
-
-                               smp_found_config = 1;
-                               clustered_apic_check();
-                       }
-               }
-               if (error == -EINVAL) {
-                       /*
-                        * Dell Precision Workstation 410, 610 come here.
-                        */
-                       printk(KERN_ERR PREFIX
-                              "Invalid BIOS MADT, disabling ACPI\n");
-                       disable_acpi();
-               }
-       }
-#endif
-       return;
-}
-
-extern int acpi_force;
-
-#ifdef __i386__
-
-static int __init disable_acpi_irq(struct dmi_system_id *d)
-{
-       if (!acpi_force) {
-               printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
-                      d->ident);
-               acpi_noirq_set();
-       }
-       return 0;
-}
-
-static int __init disable_acpi_pci(struct dmi_system_id *d)
-{
-       if (!acpi_force) {
-               printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
-                      d->ident);
-               acpi_disable_pci();
-       }
-       return 0;
-}
-
-static int __init dmi_disable_acpi(struct dmi_system_id *d)
-{
-       if (!acpi_force) {
-               printk(KERN_NOTICE "%s detected: acpi off\n", d->ident);
-               disable_acpi();
-       } else {
-               printk(KERN_NOTICE
-                      "Warning: DMI blacklist says broken, but acpi forced\n");
-       }
-       return 0;
-}
-
-/*
- * Limit ACPI to CPU enumeration for HT
- */
-static int __init force_acpi_ht(struct dmi_system_id *d)
-{
-       if (!acpi_force) {
-               printk(KERN_NOTICE "%s detected: force use of acpi=ht\n",
-                      d->ident);
-               disable_acpi();
-               acpi_ht = 1;
-       } else {
-               printk(KERN_NOTICE
-                      "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
-       }
-       return 0;
-}
-
-/*
- * If your system is blacklisted here, but you find that acpi=force
- * works for you, please contact acpi-devel@sourceforge.net
- */
-static struct dmi_system_id __initdata acpi_dmi_table[] = {
-       /*
-        * Boxes that need ACPI disabled
-        */
-       {
-        .callback = dmi_disable_acpi,
-        .ident = "IBM Thinkpad",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                    DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
-                    },
-        },
-
-       /*
-        * Boxes that need acpi=ht
-        */
-       {
-        .callback = force_acpi_ht,
-        .ident = "FSC Primergy T850",
-        .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "DELL GX240",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
-                    DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "HP VISUALIZE NT Workstation",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "Compaq Workstation W8000",
-        .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "ASUS P4B266",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-                    DMI_MATCH(DMI_BOARD_NAME, "P4B266"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "ASUS P2B-DS",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-                    DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "ASUS CUR-DLS",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-                    DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "ABIT i440BX-W83977",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
-                    DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "IBM Bladecenter",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                    DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "IBM eServer xSeries 360",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                    DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "IBM eserver xSeries 330",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                    DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
-                    },
-        },
-       {
-        .callback = force_acpi_ht,
-        .ident = "IBM eserver xSeries 440",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
-                    },
-        },
-
-       /*
-        * Boxes that need ACPI PCI IRQ routing disabled
-        */
-       {
-        .callback = disable_acpi_irq,
-        .ident = "ASUS A7V",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
-                    DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),
-                    /* newer BIOS, Revision 1011, does work */
-                    DMI_MATCH(DMI_BIOS_VERSION,
-                              "ASUS A7V ACPI BIOS Revision 1007"),
-                    },
-        },
-
-       /*
-        * Boxes that need ACPI PCI IRQ routing and PCI scan disabled
-        */
-       {                       /* _BBN 0 bug */
-        .callback = disable_acpi_pci,
-        .ident = "ASUS PR-DLS",
-        .matches = {
-                    DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-                    DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
-                    DMI_MATCH(DMI_BIOS_VERSION,
-                              "ASUS PR-DLS ACPI BIOS Revision 1010"),
-                    DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")
-                    },
-        },
-       {
-        .callback = disable_acpi_pci,
-        .ident = "Acer TravelMate 36x Laptop",
-        .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
-                    },
-        },
-       {}
-};
-
-#endif                         /* __i386__ */
-
-/*
- * acpi_boot_table_init() and acpi_boot_init()
- *  called from setup_arch(), always.
- *     1. checksums all tables
- *     2. enumerates lapics
- *     3. enumerates io-apics
- *
- * acpi_table_init() is separate to allow reading SRAT without
- * other side effects.
- *
- * side effects of acpi_boot_init:
- *     acpi_lapic = 1 if LAPIC found
- *     acpi_ioapic = 1 if IOAPIC found
- *     if (acpi_lapic && acpi_ioapic) smp_found_config = 1;
- *     if acpi_blacklisted() acpi_disabled = 1;
- *     acpi_irq_model=...
- *     ...
- *
- * return value: (currently ignored)
- *     0: success
- *     !0: failure
- */
-
-int __init acpi_boot_table_init(void)
-{
-       int error;
-
-#ifdef __i386__
-       dmi_check_system(acpi_dmi_table);
-#endif
-
-       /*
-        * If acpi_disabled, bail out
-        * One exception: acpi=ht continues far enough to enumerate LAPICs
-        */
-       if (acpi_disabled && !acpi_ht)
-               return 1;
-
-       /* 
-        * Initialize the ACPI boot-time table parser.
-        */
-       error = acpi_table_init();
-       if (error) {
-               disable_acpi();
-               return error;
-       }
-
-       acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
-
-       /*
-        * blacklist may disable ACPI entirely
-        */
-       error = acpi_blacklisted();
-       if (error) {
-               if (acpi_force) {
-                       printk(KERN_WARNING PREFIX "acpi=force override\n");
-               } else {
-                       printk(KERN_WARNING PREFIX "Disabling ACPI support\n");
-                       disable_acpi();
-                       return error;
-               }
-       }
-
-       return 0;
-}
-
-int __init acpi_boot_init(void)
-{
-       /*
-        * If acpi_disabled, bail out
-        * One exception: acpi=ht continues far enough to enumerate LAPICs
-        */
-       if (acpi_disabled && !acpi_ht)
-               return 1;
-
-       acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
-
-       /*
-        * set sci_int and PM timer address
-        */
-       acpi_table_parse(ACPI_FADT, acpi_parse_fadt);
-
-       /*
-        * Process the Multiple APIC Description Table (MADT), if present
-        */
-       acpi_process_madt();
-
-       acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/apic-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/apic-xen.c
deleted file mode 100644 (file)
index 0743f42..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *     Local APIC handling, local APIC timers
- *
- *     (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *     Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
- *                                     thanks to Eric Gilmore
- *                                     and Rolf G. Tews
- *                                     for testing these extensively.
- *     Maciej W. Rozycki       :       Various updates and fixes.
- *     Mikael Pettersson       :       Power Management for UP-APIC.
- *     Pavel Machek and
- *     Mikael Pettersson       :       PM converted to driver model.
- */
-
-#include <linux/init.h>
-
-#include <linux/mm.h>
-#include <linux/delay.h>
-#include <linux/bootmem.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-#include <linux/mc146818rtc.h>
-#include <linux/kernel_stat.h>
-#include <linux/sysdev.h>
-#include <linux/cpu.h>
-#include <linux/module.h>
-
-#include <asm/atomic.h>
-#include <asm/smp.h>
-#include <asm/mtrr.h>
-#include <asm/mpspec.h>
-#include <asm/desc.h>
-#include <asm/arch_hooks.h>
-#include <asm/hpet.h>
-#include <asm/i8253.h>
-#include <asm/nmi.h>
-
-#include <mach_apic.h>
-#include <mach_apicdef.h>
-#include <mach_ipi.h>
-
-#include "io_ports.h"
-
-#ifndef CONFIG_XEN
-/*
- * cpu_mask that denotes the CPUs that needs timer interrupt coming in as
- * IPIs in place of local APIC timers
- */
-static cpumask_t timer_bcast_ipi;
-#endif
-
-/*
- * Knob to control our willingness to enable the local APIC.
- */
-int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
-
-/*
- * Debug level
- */
-int apic_verbosity;
-
-#ifndef CONFIG_XEN
-static int modern_apic(void)
-{
-       unsigned int lvr, version;
-       /* AMD systems use old APIC versions, so check the CPU */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-               boot_cpu_data.x86 >= 0xf)
-               return 1;
-       lvr = apic_read(APIC_LVR);
-       version = GET_APIC_VERSION(lvr);
-       return version >= 0x14;
-}
-#endif /* !CONFIG_XEN */
-
-/*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
- */
-void ack_bad_irq(unsigned int irq)
-{
-       printk("unexpected IRQ trap at vector %02x\n", irq);
-       /*
-        * Currently unexpected vectors happen only on SMP and APIC.
-        * We _must_ ack these because every local APIC has only N
-        * irq slots per priority level, and a 'hanging, unacked' IRQ
-        * holds up an irq slot - in excessive cases (when multiple
-        * unexpected vectors occur) that might lock up the APIC
-        * completely.
-        * But only ack when the APIC is enabled -AK
-        */
-       if (cpu_has_apic)
-               ack_APIC_irq();
-}
-
-int get_physical_broadcast(void)
-{
-        return 0xff;
-}
-
-#ifndef CONFIG_XEN
-#ifndef CONFIG_SMP
-static void up_apic_timer_interrupt_call(struct pt_regs *regs)
-{
-       int cpu = smp_processor_id();
-
-       /*
-        * the NMI deadlock-detector uses this.
-        */
-       per_cpu(irq_stat, cpu).apic_timer_irqs++;
-
-       smp_local_timer_interrupt(regs);
-}
-#endif
-
-void smp_send_timer_broadcast_ipi(struct pt_regs *regs)
-{
-       cpumask_t mask;
-
-       cpus_and(mask, cpu_online_map, timer_bcast_ipi);
-       if (!cpus_empty(mask)) {
-#ifdef CONFIG_SMP
-               send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
-#else
-               /*
-                * We can directly call the apic timer interrupt handler
-                * in UP case. Minus all irq related functions
-                */
-               up_apic_timer_interrupt_call(regs);
-#endif
-       }
-}
-#endif
-
-int setup_profiling_timer(unsigned int multiplier)
-{
-       return -EINVAL;
-}
-
-/*
- * This initializes the IO-APIC and APIC hardware if this is
- * a UP kernel.
- */
-int __init APIC_init_uniprocessor (void)
-{
-#ifdef CONFIG_X86_IO_APIC
-       if (smp_found_config)
-               if (!skip_ioapic_setup && nr_ioapics)
-                       setup_IO_APIC();
-#endif
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/asm-offsets.c b/linux-2.6-xen-sparse/arch/i386/kernel/asm-offsets.c
deleted file mode 100644 (file)
index 8eda1ab..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed
- * to extract and format the required data.
- */
-
-#include <linux/crypto.h>
-#include <linux/sched.h>
-#include <linux/signal.h>
-#include <linux/personality.h>
-#include <linux/suspend.h>
-#include <asm/ucontext.h>
-#include "sigframe.h"
-#include <asm/fixmap.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/elf.h>
-
-#define DEFINE(sym, val) \
-        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-#define OFFSET(sym, str, mem) \
-       DEFINE(sym, offsetof(struct str, mem));
-
-void foo(void)
-{
-       OFFSET(SIGCONTEXT_eax, sigcontext, eax);
-       OFFSET(SIGCONTEXT_ebx, sigcontext, ebx);
-       OFFSET(SIGCONTEXT_ecx, sigcontext, ecx);
-       OFFSET(SIGCONTEXT_edx, sigcontext, edx);
-       OFFSET(SIGCONTEXT_esi, sigcontext, esi);
-       OFFSET(SIGCONTEXT_edi, sigcontext, edi);
-       OFFSET(SIGCONTEXT_ebp, sigcontext, ebp);
-       OFFSET(SIGCONTEXT_esp, sigcontext, esp);
-       OFFSET(SIGCONTEXT_eip, sigcontext, eip);
-       BLANK();
-
-       OFFSET(CPUINFO_x86, cpuinfo_x86, x86);
-       OFFSET(CPUINFO_x86_vendor, cpuinfo_x86, x86_vendor);
-       OFFSET(CPUINFO_x86_model, cpuinfo_x86, x86_model);
-       OFFSET(CPUINFO_x86_mask, cpuinfo_x86, x86_mask);
-       OFFSET(CPUINFO_hard_math, cpuinfo_x86, hard_math);
-       OFFSET(CPUINFO_cpuid_level, cpuinfo_x86, cpuid_level);
-       OFFSET(CPUINFO_x86_capability, cpuinfo_x86, x86_capability);
-       OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id);
-       BLANK();
-
-       OFFSET(TI_task, thread_info, task);
-       OFFSET(TI_exec_domain, thread_info, exec_domain);
-       OFFSET(TI_flags, thread_info, flags);
-       OFFSET(TI_status, thread_info, status);
-       OFFSET(TI_cpu, thread_info, cpu);
-       OFFSET(TI_preempt_count, thread_info, preempt_count);
-       OFFSET(TI_addr_limit, thread_info, addr_limit);
-       OFFSET(TI_restart_block, thread_info, restart_block);
-       OFFSET(TI_sysenter_return, thread_info, sysenter_return);
-       BLANK();
-
-       OFFSET(EXEC_DOMAIN_handler, exec_domain, handler);
-       OFFSET(RT_SIGFRAME_sigcontext, rt_sigframe, uc.uc_mcontext);
-       BLANK();
-
-       OFFSET(pbe_address, pbe, address);
-       OFFSET(pbe_orig_address, pbe, orig_address);
-       OFFSET(pbe_next, pbe, next);
-
-#ifndef CONFIG_X86_NO_TSS
-       /* Offset from the sysenter stack to tss.esp0 */
-       DEFINE(SYSENTER_stack_esp0, offsetof(struct tss_struct, esp0) -
-                sizeof(struct tss_struct));
-#else
-       /* sysenter stack points directly to esp0 */
-       DEFINE(SYSENTER_stack_esp0, 0);
-#endif
-
-       DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
-       DEFINE(VDSO_PRELINK, VDSO_PRELINK);
-
-       OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/Makefile b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/Makefile
deleted file mode 100644 (file)
index 753f1d7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Makefile for x86-compatible CPU details and quirks
-#
-
-obj-y  :=      common.o proc.o
-
-obj-y  +=      amd.o
-obj-y  +=      cyrix.o
-obj-y  +=      centaur.o
-obj-y  +=      transmeta.o
-obj-y  +=      intel.o intel_cacheinfo.o
-obj-y  +=      rise.o
-obj-y  +=      nexgen.o
-obj-y  +=      umc.o
-
-obj-$(CONFIG_X86_MCE)  +=      mcheck/
-
-obj-$(CONFIG_MTRR)     +=      mtrr/
-obj-$(CONFIG_CPU_FREQ) +=      cpufreq/
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-obj-y := $(call cherrypickxen, $(obj-y), $(src))
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c
deleted file mode 100644 (file)
index 10d7777..0000000
+++ /dev/null
@@ -1,743 +0,0 @@
-#include <linux/init.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/smp.h>
-#include <linux/module.h>
-#include <linux/percpu.h>
-#include <linux/bootmem.h>
-#include <asm/semaphore.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/msr.h>
-#include <asm/io.h>
-#include <asm/mmu_context.h>
-#include <asm/mtrr.h>
-#include <asm/mce.h>
-#ifdef CONFIG_X86_LOCAL_APIC
-#include <asm/mpspec.h>
-#include <asm/apic.h>
-#include <mach_apic.h>
-#else
-#ifdef CONFIG_XEN
-#define phys_pkg_id(a,b) a
-#endif
-#endif
-#include <asm/hypervisor.h>
-
-#include "cpu.h"
-
-DEFINE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
-EXPORT_PER_CPU_SYMBOL(cpu_gdt_descr);
-
-#ifndef CONFIG_XEN
-DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
-EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
-#endif
-
-static int cachesize_override __cpuinitdata = -1;
-static int disable_x86_fxsr __cpuinitdata;
-static int disable_x86_serial_nr __cpuinitdata = 1;
-static int disable_x86_sep __cpuinitdata;
-
-struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
-
-extern int disable_pse;
-
-static void default_init(struct cpuinfo_x86 * c)
-{
-       /* Not much we can do here... */
-       /* Check if at least it has cpuid */
-       if (c->cpuid_level == -1) {
-               /* No cpuid. It must be an ancient CPU */
-               if (c->x86 == 4)
-                       strcpy(c->x86_model_id, "486");
-               else if (c->x86 == 3)
-                       strcpy(c->x86_model_id, "386");
-       }
-}
-
-static struct cpu_dev default_cpu = {
-       .c_init = default_init,
-       .c_vendor = "Unknown",
-};
-static struct cpu_dev * this_cpu = &default_cpu;
-
-static int __init cachesize_setup(char *str)
-{
-       get_option (&str, &cachesize_override);
-       return 1;
-}
-__setup("cachesize=", cachesize_setup);
-
-int __cpuinit get_model_name(struct cpuinfo_x86 *c)
-{
-       unsigned int *v;
-       char *p, *q;
-
-       if (cpuid_eax(0x80000000) < 0x80000004)
-               return 0;
-
-       v = (unsigned int *) c->x86_model_id;
-       cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
-       cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
-       cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
-       c->x86_model_id[48] = 0;
-
-       /* Intel chips right-justify this string for some dumb reason;
-          undo that brain damage */
-       p = q = &c->x86_model_id[0];
-       while ( *p == ' ' )
-            p++;
-       if ( p != q ) {
-            while ( *p )
-                 *q++ = *p++;
-            while ( q <= &c->x86_model_id[48] )
-                 *q++ = '\0';  /* Zero-pad the rest */
-       }
-
-       return 1;
-}
-
-
-void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
-{
-       unsigned int n, dummy, ecx, edx, l2size;
-
-       n = cpuid_eax(0x80000000);
-
-       if (n >= 0x80000005) {
-               cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
-               printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-                       edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-               c->x86_cache_size=(ecx>>24)+(edx>>24);  
-       }
-
-       if (n < 0x80000006)     /* Some chips just has a large L1. */
-               return;
-
-       ecx = cpuid_ecx(0x80000006);
-       l2size = ecx >> 16;
-       
-       /* do processor-specific cache resizing */
-       if (this_cpu->c_size_cache)
-               l2size = this_cpu->c_size_cache(c,l2size);
-
-       /* Allow user to override all this if necessary. */
-       if (cachesize_override != -1)
-               l2size = cachesize_override;
-
-       if ( l2size == 0 )
-               return;         /* Again, no L2 cache is possible */
-
-       c->x86_cache_size = l2size;
-
-       printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-              l2size, ecx & 0xFF);
-}
-
-/* Naming convention should be: <Name> [(<Codename>)] */
-/* This table only is used unless init_<vendor>() below doesn't set it; */
-/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
-
-/* Look up CPU names by table lookup. */
-static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
-{
-       struct cpu_model_info *info;
-
-       if ( c->x86_model >= 16 )
-               return NULL;    /* Range check */
-
-       if (!this_cpu)
-               return NULL;
-
-       info = this_cpu->c_models;
-
-       while (info && info->family) {
-               if (info->family == c->x86)
-                       return info->model_names[c->x86_model];
-               info++;
-       }
-       return NULL;            /* Not found */
-}
-
-
-static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
-{
-       char *v = c->x86_vendor_id;
-       int i;
-       static int printed;
-
-       for (i = 0; i < X86_VENDOR_NUM; i++) {
-               if (cpu_devs[i]) {
-                       if (!strcmp(v,cpu_devs[i]->c_ident[0]) ||
-                           (cpu_devs[i]->c_ident[1] && 
-                            !strcmp(v,cpu_devs[i]->c_ident[1]))) {
-                               c->x86_vendor = i;
-                               if (!early)
-                                       this_cpu = cpu_devs[i];
-                               return;
-                       }
-               }
-       }
-       if (!printed) {
-               printed++;
-               printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
-               printk(KERN_ERR "CPU: Your system may be unstable.\n");
-       }
-       c->x86_vendor = X86_VENDOR_UNKNOWN;
-       this_cpu = &default_cpu;
-}
-
-
-static int __init x86_fxsr_setup(char * s)
-{
-       disable_x86_fxsr = 1;
-       return 1;
-}
-__setup("nofxsr", x86_fxsr_setup);
-
-
-static int __init x86_sep_setup(char * s)
-{
-       disable_x86_sep = 1;
-       return 1;
-}
-__setup("nosep", x86_sep_setup);
-
-
-/* Standard macro to see if a specific flag is changeable */
-static inline int flag_is_changeable_p(u32 flag)
-{
-       u32 f1, f2;
-
-       asm("pushfl\n\t"
-           "pushfl\n\t"
-           "popl %0\n\t"
-           "movl %0,%1\n\t"
-           "xorl %2,%0\n\t"
-           "pushl %0\n\t"
-           "popfl\n\t"
-           "pushfl\n\t"
-           "popl %0\n\t"
-           "popfl\n\t"
-           : "=&r" (f1), "=&r" (f2)
-           : "ir" (flag));
-
-       return ((f1^f2) & flag) != 0;
-}
-
-
-/* Probe for the CPUID instruction */
-static int __cpuinit have_cpuid_p(void)
-{
-       return flag_is_changeable_p(X86_EFLAGS_ID);
-}
-
-/* Do minimum CPU detection early.
-   Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment.
-   The others are not touched to avoid unwanted side effects.
-
-   WARNING: this function is only called on the BP.  Don't add code here
-   that is supposed to run on all CPUs. */
-static void __init early_cpu_detect(void)
-{
-       struct cpuinfo_x86 *c = &boot_cpu_data;
-
-       c->x86_cache_alignment = 32;
-
-       if (!have_cpuid_p())
-               return;
-
-       /* Get vendor name */
-       cpuid(0x00000000, &c->cpuid_level,
-             (int *)&c->x86_vendor_id[0],
-             (int *)&c->x86_vendor_id[8],
-             (int *)&c->x86_vendor_id[4]);
-
-       get_cpu_vendor(c, 1);
-
-       c->x86 = 4;
-       if (c->cpuid_level >= 0x00000001) {
-               u32 junk, tfms, cap0, misc;
-               cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
-               c->x86 = (tfms >> 8) & 15;
-               c->x86_model = (tfms >> 4) & 15;
-               if (c->x86 == 0xf)
-                       c->x86 += (tfms >> 20) & 0xff;
-               if (c->x86 >= 0x6)
-                       c->x86_model += ((tfms >> 16) & 0xF) << 4;
-               c->x86_mask = tfms & 15;
-               if (cap0 & (1<<19))
-                       c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
-       }
-}
-
-void __cpuinit generic_identify(struct cpuinfo_x86 * c)
-{
-       u32 tfms, xlvl;
-       int ebx;
-
-       if (have_cpuid_p()) {
-               /* Get vendor name */
-               cpuid(0x00000000, &c->cpuid_level,
-                     (int *)&c->x86_vendor_id[0],
-                     (int *)&c->x86_vendor_id[8],
-                     (int *)&c->x86_vendor_id[4]);
-               
-               get_cpu_vendor(c, 0);
-               /* Initialize the standard set of capabilities */
-               /* Note that the vendor-specific code below might override */
-       
-               /* Intel-defined flags: level 0x00000001 */
-               if ( c->cpuid_level >= 0x00000001 ) {
-                       u32 capability, excap;
-                       cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
-                       c->x86_capability[0] = capability;
-                       c->x86_capability[4] = excap;
-                       c->x86 = (tfms >> 8) & 15;
-                       c->x86_model = (tfms >> 4) & 15;
-                       if (c->x86 == 0xf)
-                               c->x86 += (tfms >> 20) & 0xff;
-                       if (c->x86 >= 0x6)
-                               c->x86_model += ((tfms >> 16) & 0xF) << 4;
-                       c->x86_mask = tfms & 15;
-#ifdef CONFIG_X86_HT
-                       c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
-#else
-                       c->apicid = (ebx >> 24) & 0xFF;
-#endif
-               } else {
-                       /* Have CPUID level 0 only - unheard of */
-                       c->x86 = 4;
-               }
-
-               /* AMD-defined flags: level 0x80000001 */
-               xlvl = cpuid_eax(0x80000000);
-               if ( (xlvl & 0xffff0000) == 0x80000000 ) {
-                       if ( xlvl >= 0x80000001 ) {
-                               c->x86_capability[1] = cpuid_edx(0x80000001);
-                               c->x86_capability[6] = cpuid_ecx(0x80000001);
-                       }
-                       if ( xlvl >= 0x80000004 )
-                               get_model_name(c); /* Default name */
-               }
-       }
-
-       early_intel_workaround(c);
-
-#ifdef CONFIG_X86_HT
-       c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
-#endif
-}
-
-static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
-{
-       if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) {
-               /* Disable processor serial number */
-               unsigned long lo,hi;
-               rdmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
-               lo |= 0x200000;
-               wrmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
-               printk(KERN_NOTICE "CPU serial number disabled.\n");
-               clear_bit(X86_FEATURE_PN, c->x86_capability);
-
-               /* Disabling the serial number may affect the cpuid level */
-               c->cpuid_level = cpuid_eax(0);
-       }
-}
-
-static int __init x86_serial_nr_setup(char *s)
-{
-       disable_x86_serial_nr = 0;
-       return 1;
-}
-__setup("serialnumber", x86_serial_nr_setup);
-
-
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
-{
-       int i;
-
-       c->loops_per_jiffy = loops_per_jiffy;
-       c->x86_cache_size = -1;
-       c->x86_vendor = X86_VENDOR_UNKNOWN;
-       c->cpuid_level = -1;    /* CPUID not detected */
-       c->x86_model = c->x86_mask = 0; /* So far unknown... */
-       c->x86_vendor_id[0] = '\0'; /* Unset */
-       c->x86_model_id[0] = '\0';  /* Unset */
-       c->x86_max_cores = 1;
-       memset(&c->x86_capability, 0, sizeof c->x86_capability);
-
-       if (!have_cpuid_p()) {
-               /* First of all, decide if this is a 486 or higher */
-               /* It's a 486 if we can modify the AC flag */
-               if ( flag_is_changeable_p(X86_EFLAGS_AC) )
-                       c->x86 = 4;
-               else
-                       c->x86 = 3;
-       }
-
-       generic_identify(c);
-
-       printk(KERN_DEBUG "CPU: After generic identify, caps:");
-       for (i = 0; i < NCAPINTS; i++)
-               printk(" %08lx", c->x86_capability[i]);
-       printk("\n");
-
-       if (this_cpu->c_identify) {
-               this_cpu->c_identify(c);
-
-               printk(KERN_DEBUG "CPU: After vendor identify, caps:");
-               for (i = 0; i < NCAPINTS; i++)
-                       printk(" %08lx", c->x86_capability[i]);
-               printk("\n");
-       }
-
-       /*
-        * Vendor-specific initialization.  In this section we
-        * canonicalize the feature flags, meaning if there are
-        * features a certain CPU supports which CPUID doesn't
-        * tell us, CPUID claiming incorrect flags, or other bugs,
-        * we handle them here.
-        *
-        * At the end of this section, c->x86_capability better
-        * indicate the features this CPU genuinely supports!
-        */
-       if (this_cpu->c_init)
-               this_cpu->c_init(c);
-
-       /* Disable the PN if appropriate */
-       squash_the_stupid_serial_number(c);
-
-       /*
-        * The vendor-specific functions might have changed features.  Now
-        * we do "generic changes."
-        */
-
-       /* TSC disabled? */
-       if ( tsc_disable )
-               clear_bit(X86_FEATURE_TSC, c->x86_capability);
-
-       /* FXSR disabled? */
-       if (disable_x86_fxsr) {
-               clear_bit(X86_FEATURE_FXSR, c->x86_capability);
-               clear_bit(X86_FEATURE_XMM, c->x86_capability);
-       }
-
-       /* SEP disabled? */
-       if (disable_x86_sep)
-               clear_bit(X86_FEATURE_SEP, c->x86_capability);
-
-       if (disable_pse)
-               clear_bit(X86_FEATURE_PSE, c->x86_capability);
-
-       /* If the model name is still unset, do table lookup. */
-       if ( !c->x86_model_id[0] ) {
-               char *p;
-               p = table_lookup_model(c);
-               if ( p )
-                       strcpy(c->x86_model_id, p);
-               else
-                       /* Last resort... */
-                       sprintf(c->x86_model_id, "%02x/%02x",
-                               c->x86, c->x86_model);
-       }
-
-       /* Now the feature flags better reflect actual CPU features! */
-
-       printk(KERN_DEBUG "CPU: After all inits, caps:");
-       for (i = 0; i < NCAPINTS; i++)
-               printk(" %08lx", c->x86_capability[i]);
-       printk("\n");
-
-       /*
-        * On SMP, boot_cpu_data holds the common feature set between
-        * all CPUs; so make sure that we indicate which features are
-        * common between the CPUs.  The first time this routine gets
-        * executed, c == &boot_cpu_data.
-        */
-       if ( c != &boot_cpu_data ) {
-               /* AND the already accumulated flags with these */
-               for ( i = 0 ; i < NCAPINTS ; i++ )
-                       boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
-       }
-
-       /* Init Machine Check Exception if available. */
-       mcheck_init(c);
-
-       if (c == &boot_cpu_data)
-               sysenter_setup();
-       enable_sep_cpu();
-
-       if (c == &boot_cpu_data)
-               mtrr_bp_init();
-       else
-               mtrr_ap_init();
-}
-
-#ifdef CONFIG_X86_HT
-void __cpuinit detect_ht(struct cpuinfo_x86 *c)
-{
-       u32     eax, ebx, ecx, edx;
-       int     index_msb, core_bits;
-
-       cpuid(1, &eax, &ebx, &ecx, &edx);
-
-       if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
-               return;
-
-       smp_num_siblings = (ebx & 0xff0000) >> 16;
-
-       if (smp_num_siblings == 1) {
-               printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-       } else if (smp_num_siblings > 1 ) {
-
-               if (smp_num_siblings > NR_CPUS) {
-                       printk(KERN_WARNING "CPU: Unsupported number of the "
-                                       "siblings %d", smp_num_siblings);
-                       smp_num_siblings = 1;
-                       return;
-               }
-
-               index_msb = get_count_order(smp_num_siblings);
-               c->phys_proc_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
-
-               printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
-                      c->phys_proc_id);
-
-               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
-
-               index_msb = get_count_order(smp_num_siblings) ;
-
-               core_bits = get_count_order(c->x86_max_cores);
-
-               c->cpu_core_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
-                                              ((1 << core_bits) - 1);
-
-               if (c->x86_max_cores > 1)
-                       printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
-                              c->cpu_core_id);
-       }
-}
-#endif
-
-void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
-{
-       char *vendor = NULL;
-
-       if (c->x86_vendor < X86_VENDOR_NUM)
-               vendor = this_cpu->c_vendor;
-       else if (c->cpuid_level >= 0)
-               vendor = c->x86_vendor_id;
-
-       if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
-               printk("%s ", vendor);
-
-       if (!c->x86_model_id[0])
-               printk("%d86", c->x86);
-       else
-               printk("%s", c->x86_model_id);
-
-       if (c->x86_mask || c->cpuid_level >= 0) 
-               printk(" stepping %02x\n", c->x86_mask);
-       else
-               printk("\n");
-}
-
-cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
-
-/* This is hacky. :)
- * We're emulating future behavior.
- * In the future, the cpu-specific init functions will be called implicitly
- * via the magic of initcalls.
- * They will insert themselves into the cpu_devs structure.
- * Then, when cpu_init() is called, we can just iterate over that array.
- */
-
-extern int intel_cpu_init(void);
-extern int cyrix_init_cpu(void);
-extern int nsc_init_cpu(void);
-extern int amd_init_cpu(void);
-extern int centaur_init_cpu(void);
-extern int transmeta_init_cpu(void);
-extern int rise_init_cpu(void);
-extern int nexgen_init_cpu(void);
-extern int umc_init_cpu(void);
-
-void __init early_cpu_init(void)
-{
-       intel_cpu_init();
-       cyrix_init_cpu();
-       nsc_init_cpu();
-       amd_init_cpu();
-       centaur_init_cpu();
-       transmeta_init_cpu();
-       rise_init_cpu();
-       nexgen_init_cpu();
-       umc_init_cpu();
-       early_cpu_detect();
-
-#ifdef CONFIG_DEBUG_PAGEALLOC
-       /* pse is not compatible with on-the-fly unmapping,
-        * disable it even if the cpus claim to support it.
-        */
-       clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
-       disable_pse = 1;
-#endif
-}
-
-void __cpuinit cpu_gdt_init(struct Xgt_desc_struct *gdt_descr)
-{
-       unsigned long frames[16];
-       unsigned long va;
-       int f;
-
-       for (va = gdt_descr->address, f = 0;
-            va < gdt_descr->address + gdt_descr->size;
-            va += PAGE_SIZE, f++) {
-               frames[f] = virt_to_mfn(va);
-               make_lowmem_page_readonly(
-                       (void *)va, XENFEAT_writable_descriptor_tables);
-       }
-       if (HYPERVISOR_set_gdt(frames, gdt_descr->size / 8))
-               BUG();
-}
-
-/*
- * cpu_init() initializes state that is per-CPU. Some data is already
- * initialized (naturally) in the bootstrap process, such as the GDT
- * and IDT. We reload them nevertheless, this function acts as a
- * 'CPU state barrier', nothing should get across.
- */
-void __cpuinit cpu_init(void)
-{
-       int cpu = smp_processor_id();
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct * t = &per_cpu(init_tss, cpu);
-#endif
-       struct thread_struct *thread = &current->thread;
-       struct desc_struct *gdt;
-       struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-
-       if (cpu_test_and_set(cpu, cpu_initialized)) {
-               printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
-               for (;;) local_irq_enable();
-       }
-       printk(KERN_INFO "Initializing CPU#%d\n", cpu);
-
-       if (cpu_has_vme || cpu_has_de)
-               clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
-       if (tsc_disable && cpu_has_tsc) {
-               printk(KERN_NOTICE "Disabling TSC...\n");
-               /**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/
-               clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability);
-               set_in_cr4(X86_CR4_TSD);
-       }
-
-#ifndef CONFIG_XEN
-       /* The CPU hotplug case */
-       if (cpu_gdt_descr->address) {
-               gdt = (struct desc_struct *)cpu_gdt_descr->address;
-               memset(gdt, 0, PAGE_SIZE);
-               goto old_gdt;
-       }
-       /*
-        * This is a horrible hack to allocate the GDT.  The problem
-        * is that cpu_init() is called really early for the boot CPU
-        * (and hence needs bootmem) but much later for the secondary
-        * CPUs, when bootmem will have gone away
-        */
-       if (NODE_DATA(0)->bdata->node_bootmem_map) {
-               gdt = (struct desc_struct *)alloc_bootmem_pages(PAGE_SIZE);
-               /* alloc_bootmem_pages panics on failure, so no check */
-               memset(gdt, 0, PAGE_SIZE);
-       } else {
-               gdt = (struct desc_struct *)get_zeroed_page(GFP_KERNEL);
-               if (unlikely(!gdt)) {
-                       printk(KERN_CRIT "CPU%d failed to allocate GDT\n", cpu);
-                       for (;;)
-                               local_irq_enable();
-               }
-       }
-old_gdt:
-       /*
-        * Initialize the per-CPU GDT with the boot GDT,
-        * and set up the GDT descriptor:
-        */
-       memcpy(gdt, cpu_gdt_table, GDT_SIZE);
-
-       /* Set up GDT entry for 16bit stack */
-       *(__u64 *)(&gdt[GDT_ENTRY_ESPFIX_SS]) |=
-               ((((__u64)stk16_off) << 16) & 0x000000ffffff0000ULL) |
-               ((((__u64)stk16_off) << 32) & 0xff00000000000000ULL) |
-               (CPU_16BIT_STACK_SIZE - 1);
-
-       cpu_gdt_descr->size = GDT_SIZE - 1;
-       cpu_gdt_descr->address = (unsigned long)gdt;
-#else
-       if (cpu == 0 && cpu_gdt_descr->address == 0) {
-               gdt = (struct desc_struct *)alloc_bootmem_pages(PAGE_SIZE);
-               /* alloc_bootmem_pages panics on failure, so no check */
-               memset(gdt, 0, PAGE_SIZE);
-
-               memcpy(gdt, cpu_gdt_table, GDT_SIZE);
-               
-               cpu_gdt_descr->size = GDT_SIZE;
-               cpu_gdt_descr->address = (unsigned long)gdt;
-       }
-#endif
-
-       cpu_gdt_init(cpu_gdt_descr);
-
-       /*
-        * Set up and load the per-CPU TSS and LDT
-        */
-       atomic_inc(&init_mm.mm_count);
-       current->active_mm = &init_mm;
-       if (current->mm)
-               BUG();
-       enter_lazy_tlb(&init_mm, current);
-
-       load_esp0(t, thread);
-
-       load_LDT(&init_mm.context);
-
-#ifdef CONFIG_DOUBLEFAULT
-       /* Set up doublefault TSS pointer in the GDT */
-       __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
-#endif
-
-       /* Clear %fs and %gs. */
-       asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
-
-       /* Clear all 6 debug registers: */
-       set_debugreg(0, 0);
-       set_debugreg(0, 1);
-       set_debugreg(0, 2);
-       set_debugreg(0, 3);
-       set_debugreg(0, 6);
-       set_debugreg(0, 7);
-
-       /*
-        * Force FPU initialization:
-        */
-       current_thread_info()->status = 0;
-       clear_used_math();
-       mxcsr_feature_mask_init();
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-void __cpuinit cpu_uninit(void)
-{
-       int cpu = raw_smp_processor_id();
-       cpu_clear(cpu, cpu_initialized);
-
-       /* lazy TLB state */
-       per_cpu(cpu_tlbstate, cpu).state = 0;
-       per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm;
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/Makefile b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/Makefile
deleted file mode 100644 (file)
index 06df4fe..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-obj-y          := main.o if.o generic.o state.o
-obj-y          += amd.o
-obj-y          += cyrix.o
-obj-y          += centaur.o
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-n-obj-xen := generic.o state.o amd.o cyrix.o centaur.o
-
-obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c
deleted file mode 100644 (file)
index 6b0b18b..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <linux/ctype.h>
-#include <linux/module.h>
-#include <linux/seq_file.h>
-#include <asm/uaccess.h>
-#include <linux/mutex.h>
-
-#include <asm/mtrr.h>
-#include "mtrr.h"
-
-static DEFINE_MUTEX(mtrr_mutex);
-
-void generic_get_mtrr(unsigned int reg, unsigned long *base,
-                     unsigned int *size, mtrr_type * type)
-{
-       struct xen_platform_op op;
-
-       op.cmd = XENPF_read_memtype;
-       op.u.read_memtype.reg = reg;
-       (void)HYPERVISOR_platform_op(&op);
-
-       *size = op.u.read_memtype.nr_mfns;
-       *base = op.u.read_memtype.mfn;
-       *type = op.u.read_memtype.type;
-}
-
-struct mtrr_ops generic_mtrr_ops = {
-       .use_intel_if      = 1,
-       .get               = generic_get_mtrr,
-};
-
-struct mtrr_ops *mtrr_if = &generic_mtrr_ops;
-unsigned int num_var_ranges;
-unsigned int *usage_table;
-
-static void __init set_num_var_ranges(void)
-{
-       struct xen_platform_op op;
-
-       for (num_var_ranges = 0; ; num_var_ranges++) {
-               op.cmd = XENPF_read_memtype;
-               op.u.read_memtype.reg = num_var_ranges;
-               if (HYPERVISOR_platform_op(&op) != 0)
-                       break;
-       }
-}
-
-static void __init init_table(void)
-{
-       int i, max;
-
-       max = num_var_ranges;
-       if ((usage_table = kmalloc(max * sizeof *usage_table, GFP_KERNEL))
-           == NULL) {
-               printk(KERN_ERR "mtrr: could not allocate\n");
-               return;
-       }
-       for (i = 0; i < max; i++)
-               usage_table[i] = 0;
-}
-
-int mtrr_add_page(unsigned long base, unsigned long size, 
-                 unsigned int type, char increment)
-{
-       int error;
-       struct xen_platform_op op;
-
-       mutex_lock(&mtrr_mutex);
-
-       op.cmd = XENPF_add_memtype;
-       op.u.add_memtype.mfn     = base;
-       op.u.add_memtype.nr_mfns = size;
-       op.u.add_memtype.type    = type;
-       error = HYPERVISOR_platform_op(&op);
-       if (error) {
-               mutex_unlock(&mtrr_mutex);
-               BUG_ON(error > 0);
-               return error;
-       }
-
-       if (increment)
-               ++usage_table[op.u.add_memtype.reg];
-
-       mutex_unlock(&mtrr_mutex);
-
-       return op.u.add_memtype.reg;
-}
-
-static int mtrr_check(unsigned long base, unsigned long size)
-{
-       if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
-               printk(KERN_WARNING
-                       "mtrr: size and base must be multiples of 4 kiB\n");
-               printk(KERN_DEBUG
-                       "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
-               dump_stack();
-               return -1;
-       }
-       return 0;
-}
-
-int
-mtrr_add(unsigned long base, unsigned long size, unsigned int type,
-        char increment)
-{
-       if (mtrr_check(base, size))
-               return -EINVAL;
-       return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type,
-                            increment);
-}
-
-int mtrr_del_page(int reg, unsigned long base, unsigned long size)
-{
-       unsigned i;
-       mtrr_type ltype;
-       unsigned long lbase;
-       unsigned int lsize;
-       int error = -EINVAL;
-       struct xen_platform_op op;
-
-       mutex_lock(&mtrr_mutex);
-
-       if (reg < 0) {
-               /*  Search for existing MTRR  */
-               for (i = 0; i < num_var_ranges; ++i) {
-                       mtrr_if->get(i, &lbase, &lsize, &ltype);
-                       if (lbase == base && lsize == size) {
-                               reg = i;
-                               break;
-                       }
-               }
-               if (reg < 0) {
-                       printk(KERN_DEBUG "mtrr: no MTRR for %lx000,%lx000 found\n", base,
-                              size);
-                       goto out;
-               }
-       }
-       if (usage_table[reg] < 1) {
-               printk(KERN_WARNING "mtrr: reg: %d has count=0\n", reg);
-               goto out;
-       }
-       if (--usage_table[reg] < 1) {
-               op.cmd = XENPF_del_memtype;
-               op.u.del_memtype.handle = 0;
-               op.u.del_memtype.reg    = reg;
-               error = HYPERVISOR_platform_op(&op);
-               if (error) {
-                       BUG_ON(error > 0);
-                       goto out;
-               }
-       }
-       error = reg;
- out:
-       mutex_unlock(&mtrr_mutex);
-       return error;
-}
-
-int
-mtrr_del(int reg, unsigned long base, unsigned long size)
-{
-       if (mtrr_check(base, size))
-               return -EINVAL;
-       return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT);
-}
-
-EXPORT_SYMBOL(mtrr_add);
-EXPORT_SYMBOL(mtrr_del);
-
-void __init mtrr_bp_init(void)
-{
-}
-
-void mtrr_ap_init(void)
-{
-}
-
-static int __init mtrr_init(void)
-{
-       struct cpuinfo_x86 *c = &boot_cpu_data;
-
-       if (!is_initial_xendomain())
-               return -ENODEV;
-
-       if ((!cpu_has(c, X86_FEATURE_MTRR)) &&
-           (!cpu_has(c, X86_FEATURE_K6_MTRR)) &&
-           (!cpu_has(c, X86_FEATURE_CYRIX_ARR)) &&
-           (!cpu_has(c, X86_FEATURE_CENTAUR_MCR)))
-               return -ENODEV;
-
-       set_num_var_ranges();
-       init_table();
-
-       return 0;
-}
-
-subsys_initcall(mtrr_init);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/crash.c b/linux-2.6-xen-sparse/arch/i386/kernel/crash.c
deleted file mode 100644 (file)
index 615878f..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Architecture specific (i386) functions for kexec based crash dumps.
- *
- * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
- *
- * Copyright (C) IBM Corporation, 2004. All rights reserved.
- *
- */
-
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/smp.h>
-#include <linux/reboot.h>
-#include <linux/kexec.h>
-#include <linux/delay.h>
-#include <linux/elf.h>
-#include <linux/elfcore.h>
-
-#include <asm/processor.h>
-#include <asm/hardirq.h>
-#include <asm/nmi.h>
-#include <asm/hw_irq.h>
-#include <asm/apic.h>
-#include <mach_ipi.h>
-
-
-/* This keeps a track of which one is crashing cpu. */
-static int crashing_cpu;
-
-static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data,
-                                                              size_t data_len)
-{
-       struct elf_note note;
-
-       note.n_namesz = strlen(name) + 1;
-       note.n_descsz = data_len;
-       note.n_type   = type;
-       memcpy(buf, &note, sizeof(note));
-       buf += (sizeof(note) +3)/4;
-       memcpy(buf, name, note.n_namesz);
-       buf += (note.n_namesz + 3)/4;
-       memcpy(buf, data, note.n_descsz);
-       buf += (note.n_descsz + 3)/4;
-
-       return buf;
-}
-
-static void final_note(u32 *buf)
-{
-       struct elf_note note;
-
-       note.n_namesz = 0;
-       note.n_descsz = 0;
-       note.n_type   = 0;
-       memcpy(buf, &note, sizeof(note));
-}
-
-static void crash_save_this_cpu(struct pt_regs *regs, int cpu)
-{
-       struct elf_prstatus prstatus;
-       u32 *buf;
-
-       if ((cpu < 0) || (cpu >= NR_CPUS))
-               return;
-
-       /* Using ELF notes here is opportunistic.
-        * I need a well defined structure format
-        * for the data I pass, and I need tags
-        * on the data to indicate what information I have
-        * squirrelled away.  ELF notes happen to provide
-        * all of that, so there is no need to invent something new.
-        */
-       buf = (u32*)per_cpu_ptr(crash_notes, cpu);
-       if (!buf)
-               return;
-       memset(&prstatus, 0, sizeof(prstatus));
-       prstatus.pr_pid = current->pid;
-       elf_core_copy_regs(&prstatus.pr_reg, regs);
-       buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
-                               sizeof(prstatus));
-       final_note(buf);
-}
-
-static void crash_save_self(struct pt_regs *regs)
-{
-       int cpu;
-
-       cpu = smp_processor_id();
-       crash_save_this_cpu(regs, cpu);
-}
-
-#ifndef CONFIG_XEN
-#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
-static atomic_t waiting_for_crash_ipi;
-
-static int crash_nmi_callback(struct pt_regs *regs, int cpu)
-{
-       struct pt_regs fixed_regs;
-
-       /* Don't do anything if this handler is invoked on crashing cpu.
-        * Otherwise, system will completely hang. Crashing cpu can get
-        * an NMI if system was initially booted with nmi_watchdog parameter.
-        */
-       if (cpu == crashing_cpu)
-               return 1;
-       local_irq_disable();
-
-       if (!user_mode_vm(regs)) {
-               crash_fixup_ss_esp(&fixed_regs, regs);
-               regs = &fixed_regs;
-       }
-       crash_save_this_cpu(regs, cpu);
-       disable_local_APIC();
-       atomic_dec(&waiting_for_crash_ipi);
-       /* Assume hlt works */
-       halt();
-       for (;;)
-               cpu_relax();
-
-       return 1;
-}
-
-static void smp_send_nmi_allbutself(void)
-{
-       send_IPI_allbutself(NMI_VECTOR);
-}
-
-static void nmi_shootdown_cpus(void)
-{
-       unsigned long msecs;
-
-       atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
-       /* Would it be better to replace the trap vector here? */
-       set_nmi_callback(crash_nmi_callback);
-       /* Ensure the new callback function is set before sending
-        * out the NMI
-        */
-       wmb();
-
-       smp_send_nmi_allbutself();
-
-       msecs = 1000; /* Wait at most a second for the other cpus to stop */
-       while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
-               mdelay(1);
-               msecs--;
-       }
-
-       /* Leave the nmi callback set */
-       disable_local_APIC();
-}
-#else
-static void nmi_shootdown_cpus(void)
-{
-       /* There are no cpus to shootdown */
-}
-#endif
-#endif /* CONFIG_XEN */
-
-void machine_crash_shutdown(struct pt_regs *regs)
-{
-       /* This function is only called after the system
-        * has panicked or is otherwise in a critical state.
-        * The minimum amount of code to allow a kexec'd kernel
-        * to run successfully needs to happen here.
-        *
-        * In practice this means shooting down the other cpus in
-        * an SMP system.
-        */
-       /* The kernel is broken so disable interrupts */
-       local_irq_disable();
-
-       /* Make a note of crashing cpu. Will be used in NMI callback.*/
-       crashing_cpu = smp_processor_id();
-#ifndef CONFIG_XEN
-       nmi_shootdown_cpus();
-       lapic_shutdown();
-#if defined(CONFIG_X86_IO_APIC)
-       disable_IO_APIC();
-#endif
-#endif /* CONFIG_XEN */
-       crash_save_self(regs);
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/early_printk-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/early_printk-xen.c
deleted file mode 100644 (file)
index 7a5d206..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#include "../../x86_64/kernel/early_printk-xen.c"
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S b/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S
deleted file mode 100644 (file)
index c7f3848..0000000
+++ /dev/null
@@ -1,1216 +0,0 @@
-/*
- *  linux/arch/i386/entry.S
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * entry.S contains the system-call and fault low-level handling routines.
- * This also contains the timer-interrupt handler, as well as all interrupts
- * and faults that can result in a task-switch.
- *
- * NOTE: This code handles signal-recognition, which happens every time
- * after a timer-interrupt and after each system call.
- *
- * I changed all the .align's to 4 (16 byte alignment), as that's faster
- * on a 486.
- *
- * Stack layout in 'ret_from_system_call':
- *     ptrace needs to have all regs on the stack.
- *     if the order here is changed, it needs to be
- *     updated in fork.c:copy_process, signal.c:do_signal,
- *     ptrace.c and ptrace.h
- *
- *      0(%esp) - %ebx
- *      4(%esp) - %ecx
- *      8(%esp) - %edx
- *       C(%esp) - %esi
- *     10(%esp) - %edi
- *     14(%esp) - %ebp
- *     18(%esp) - %eax
- *     1C(%esp) - %ds
- *     20(%esp) - %es
- *     24(%esp) - orig_eax
- *     28(%esp) - %eip
- *     2C(%esp) - %cs
- *     30(%esp) - %eflags
- *     34(%esp) - %oldesp
- *     38(%esp) - %oldss
- *
- * "current" is in register %ebx during any slow entries.
- */
-
-#include <linux/linkage.h>
-#include <asm/thread_info.h>
-#include <asm/irqflags.h>
-#include <asm/errno.h>
-#include <asm/segment.h>
-#include <asm/smp.h>
-#include <asm/page.h>
-#include <asm/desc.h>
-#include <asm/dwarf2.h>
-#include "irq_vectors.h"
-#include <xen/interface/xen.h>
-
-#define nr_syscalls ((syscall_table_size)/4)
-
-EBX            = 0x00
-ECX            = 0x04
-EDX            = 0x08
-ESI            = 0x0C
-EDI            = 0x10
-EBP            = 0x14
-EAX            = 0x18
-DS             = 0x1C
-ES             = 0x20
-ORIG_EAX       = 0x24
-EIP            = 0x28
-CS             = 0x2C
-EFLAGS         = 0x30
-OLDESP         = 0x34
-OLDSS          = 0x38
-
-CF_MASK                = 0x00000001
-TF_MASK                = 0x00000100
-IF_MASK                = 0x00000200
-DF_MASK                = 0x00000400 
-NT_MASK                = 0x00004000
-VM_MASK                = 0x00020000
-/* Pseudo-eflags. */
-NMI_MASK       = 0x80000000
-
-#ifndef CONFIG_XEN
-#define DISABLE_INTERRUPTS     cli
-#define ENABLE_INTERRUPTS      sti
-#else
-/* Offsets into shared_info_t. */
-#define evtchn_upcall_pending          /* 0 */
-#define evtchn_upcall_mask             1
-
-#define sizeof_vcpu_shift              6
-
-#ifdef CONFIG_SMP
-#define GET_VCPU_INFO          movl TI_cpu(%ebp),%esi                  ; \
-                               shl  $sizeof_vcpu_shift,%esi            ; \
-                               addl HYPERVISOR_shared_info,%esi
-#else
-#define GET_VCPU_INFO          movl HYPERVISOR_shared_info,%esi
-#endif
-
-#define __DISABLE_INTERRUPTS   movb $1,evtchn_upcall_mask(%esi)
-#define __ENABLE_INTERRUPTS    movb $0,evtchn_upcall_mask(%esi)
-#define DISABLE_INTERRUPTS     GET_VCPU_INFO                           ; \
-                               __DISABLE_INTERRUPTS
-#define ENABLE_INTERRUPTS      GET_VCPU_INFO                           ; \
-                               __ENABLE_INTERRUPTS
-#define __TEST_PENDING         testb $0xFF,evtchn_upcall_pending(%esi)
-#endif
-
-#ifdef CONFIG_PREEMPT
-#define preempt_stop           cli; TRACE_IRQS_OFF
-#else
-#define preempt_stop
-#define resume_kernel          restore_nocheck
-#endif
-
-.macro TRACE_IRQS_IRET
-#ifdef CONFIG_TRACE_IRQFLAGS
-       testl $IF_MASK,EFLAGS(%esp)     # interrupts off?
-       jz 1f
-       TRACE_IRQS_ON
-1:
-#endif
-.endm
-
-#ifdef CONFIG_VM86
-#define resume_userspace_sig   check_userspace
-#else
-#define resume_userspace_sig   resume_userspace
-#endif
-
-#define SAVE_ALL \
-       cld; \
-       pushl %es; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       /*CFI_REL_OFFSET es, 0;*/\
-       pushl %ds; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       /*CFI_REL_OFFSET ds, 0;*/\
-       pushl %eax; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET eax, 0;\
-       pushl %ebp; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET ebp, 0;\
-       pushl %edi; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET edi, 0;\
-       pushl %esi; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET esi, 0;\
-       pushl %edx; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET edx, 0;\
-       pushl %ecx; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET ecx, 0;\
-       pushl %ebx; \
-       CFI_ADJUST_CFA_OFFSET 4;\
-       CFI_REL_OFFSET ebx, 0;\
-       movl $(__USER_DS), %edx; \
-       movl %edx, %ds; \
-       movl %edx, %es;
-
-#define RESTORE_INT_REGS \
-       popl %ebx;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE ebx;\
-       popl %ecx;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE ecx;\
-       popl %edx;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE edx;\
-       popl %esi;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE esi;\
-       popl %edi;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE edi;\
-       popl %ebp;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE ebp;\
-       popl %eax;      \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       CFI_RESTORE eax
-
-#define RESTORE_REGS   \
-       RESTORE_INT_REGS; \
-1:     popl %ds;       \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       /*CFI_RESTORE ds;*/\
-2:     popl %es;       \
-       CFI_ADJUST_CFA_OFFSET -4;\
-       /*CFI_RESTORE es;*/\
-.section .fixup,"ax";  \
-3:     movl $0,(%esp); \
-       jmp 1b;         \
-4:     movl $0,(%esp); \
-       jmp 2b;         \
-.previous;             \
-.section __ex_table,"a";\
-       .align 4;       \
-       .long 1b,3b;    \
-       .long 2b,4b;    \
-.previous
-
-#define RING0_INT_FRAME \
-       CFI_STARTPROC simple;\
-       CFI_DEF_CFA esp, 3*4;\
-       /*CFI_OFFSET cs, -2*4;*/\
-       CFI_OFFSET eip, -3*4
-
-#define RING0_EC_FRAME \
-       CFI_STARTPROC simple;\
-       CFI_DEF_CFA esp, 4*4;\
-       /*CFI_OFFSET cs, -2*4;*/\
-       CFI_OFFSET eip, -3*4
-
-#define RING0_PTREGS_FRAME \
-       CFI_STARTPROC simple;\
-       CFI_DEF_CFA esp, OLDESP-EBX;\
-       /*CFI_OFFSET cs, CS-OLDESP;*/\
-       CFI_OFFSET eip, EIP-OLDESP;\
-       /*CFI_OFFSET es, ES-OLDESP;*/\
-       /*CFI_OFFSET ds, DS-OLDESP;*/\
-       CFI_OFFSET eax, EAX-OLDESP;\
-       CFI_OFFSET ebp, EBP-OLDESP;\
-       CFI_OFFSET edi, EDI-OLDESP;\
-       CFI_OFFSET esi, ESI-OLDESP;\
-       CFI_OFFSET edx, EDX-OLDESP;\
-       CFI_OFFSET ecx, ECX-OLDESP;\
-       CFI_OFFSET ebx, EBX-OLDESP
-
-ENTRY(ret_from_fork)
-       CFI_STARTPROC
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       call schedule_tail
-       GET_THREAD_INFO(%ebp)
-       popl %eax
-       CFI_ADJUST_CFA_OFFSET -4
-       pushl $0x0202                   # Reset kernel eflags
-       CFI_ADJUST_CFA_OFFSET 4
-       popfl
-       CFI_ADJUST_CFA_OFFSET -4
-       jmp syscall_exit
-       CFI_ENDPROC
-
-/*
- * Return to user mode is not as complex as all this looks,
- * but we want the default path for a system call return to
- * go as quickly as possible which is why some of this is
- * less clear than it otherwise should be.
- */
-
-       # userspace resumption stub bypassing syscall exit tracing
-       ALIGN
-       RING0_PTREGS_FRAME
-ret_from_exception:
-       preempt_stop
-ret_from_intr:
-       GET_THREAD_INFO(%ebp)
-check_userspace:
-       movl EFLAGS(%esp), %eax         # mix EFLAGS and CS
-       movb CS(%esp), %al
-       testl $(VM_MASK | 2), %eax
-       jz resume_kernel
-ENTRY(resume_userspace)
-       DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-                                       # setting need_resched or sigpending
-                                       # between sampling and the iret
-       movl TI_flags(%ebp), %ecx
-       andl $_TIF_WORK_MASK, %ecx      # is there any work to be done on
-                                       # int/exception return?
-       jne work_pending
-       jmp restore_all
-
-#ifdef CONFIG_PREEMPT
-ENTRY(resume_kernel)
-       cli
-       cmpl $0,TI_preempt_count(%ebp)  # non-zero preempt_count ?
-       jnz restore_nocheck
-need_resched:
-       movl TI_flags(%ebp), %ecx       # need_resched set ?
-       testb $_TIF_NEED_RESCHED, %cl
-       jz restore_all
-       testl $IF_MASK,EFLAGS(%esp)     # interrupts off (exception path) ?
-       jz restore_all
-       call preempt_schedule_irq
-       jmp need_resched
-#endif
-       CFI_ENDPROC
-
-/* SYSENTER_RETURN points to after the "sysenter" instruction in
-   the vsyscall page.  See vsyscall-sysentry.S, which defines the symbol.  */
-
-       # sysenter call handler stub
-ENTRY(sysenter_entry)
-       CFI_STARTPROC simple
-       CFI_DEF_CFA esp, 0
-       CFI_REGISTER esp, ebp
-       movl SYSENTER_stack_esp0(%esp),%esp
-sysenter_past_esp:
-       /*
-        * No need to follow this irqs on/off section: the syscall
-        * disabled irqs and here we enable it straight after entry:
-        */
-       sti
-       pushl $(__USER_DS)
-       CFI_ADJUST_CFA_OFFSET 4
-       /*CFI_REL_OFFSET ss, 0*/
-       pushl %ebp
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET esp, 0
-       pushfl
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $(__USER_CS)
-       CFI_ADJUST_CFA_OFFSET 4
-       /*CFI_REL_OFFSET cs, 0*/
-       /*
-        * Push current_thread_info()->sysenter_return to the stack.
-        * A tiny bit of offset fixup is necessary - 4*4 means the 4 words
-        * pushed above; +8 corresponds to copy_thread's esp0 setting.
-        */
-       pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET eip, 0
-
-/*
- * Load the potential sixth argument from user stack.
- * Careful about security.
- */
-       cmpl $__PAGE_OFFSET-3,%ebp
-       jae syscall_fault
-1:     movl (%ebp),%ebp
-.section __ex_table,"a"
-       .align 4
-       .long 1b,syscall_fault
-.previous
-
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       GET_THREAD_INFO(%ebp)
-
-       /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
-       testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
-       jnz syscall_trace_entry
-       cmpl $(nr_syscalls), %eax
-       jae syscall_badsys
-       call *sys_call_table(,%eax,4)
-       movl %eax,EAX(%esp)
-       DISABLE_INTERRUPTS
-       TRACE_IRQS_OFF
-       movl TI_flags(%ebp), %ecx
-       testw $_TIF_ALLWORK_MASK, %cx
-       jne syscall_exit_work
-/* if something modifies registers it must also disable sysexit */
-       movl EIP(%esp), %edx
-       movl OLDESP(%esp), %ecx
-       xorl %ebp,%ebp
-#ifdef CONFIG_XEN
-       TRACE_IRQS_ON
-       __ENABLE_INTERRUPTS
-sysexit_scrit: /**** START OF SYSEXIT CRITICAL REGION ****/
-       __TEST_PENDING
-       jnz  14f                        # process more events if necessary...
-       movl ESI(%esp), %esi
-       sysexit
-14:    __DISABLE_INTERRUPTS
-       TRACE_IRQS_OFF
-sysexit_ecrit: /**** END OF SYSEXIT CRITICAL REGION ****/
-       push %esp
-       call evtchn_do_upcall
-       add  $4,%esp
-       jmp  ret_from_intr
-#else
-       TRACE_IRQS_ON
-       sti
-       sysexit
-#endif /* !CONFIG_XEN */
-       CFI_ENDPROC
-
-
-       # system call handler stub
-ENTRY(system_call)
-       RING0_INT_FRAME                 # can't unwind into user space anyway
-       pushl %eax                      # save orig_eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       GET_THREAD_INFO(%ebp)
-       testl $TF_MASK,EFLAGS(%esp)
-       jz no_singlestep
-       orl $_TIF_SINGLESTEP,TI_flags(%ebp)
-no_singlestep:
-                                       # system call tracing in operation / emulation
-       /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
-       testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
-       jnz syscall_trace_entry
-       cmpl $(nr_syscalls), %eax
-       jae syscall_badsys
-syscall_call:
-       call *sys_call_table(,%eax,4)
-       movl %eax,EAX(%esp)             # store the return value
-syscall_exit:
-       DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-                                       # setting need_resched or sigpending
-                                       # between sampling and the iret
-       TRACE_IRQS_OFF
-       movl TI_flags(%ebp), %ecx
-       testw $_TIF_ALLWORK_MASK, %cx   # current->work
-       jne syscall_exit_work
-
-restore_all:
-#ifndef CONFIG_XEN
-       movl EFLAGS(%esp), %eax         # mix EFLAGS, SS and CS
-       # Warning: OLDSS(%esp) contains the wrong/random values if we
-       # are returning to the kernel.
-       # See comments in process.c:copy_thread() for details.
-       movb OLDSS(%esp), %ah
-       movb CS(%esp), %al
-       andl $(VM_MASK | (4 << 8) | 3), %eax
-       cmpl $((4 << 8) | 3), %eax
-       CFI_REMEMBER_STATE
-       je ldt_ss                       # returning to user-space with LDT SS
-restore_nocheck:
-#else
-restore_nocheck:
-       movl EFLAGS(%esp), %eax
-       testl $(VM_MASK|NMI_MASK), %eax
-       CFI_REMEMBER_STATE
-       jnz hypervisor_iret
-       shr $9, %eax                    # EAX[0] == IRET_EFLAGS.IF
-       GET_VCPU_INFO
-       andb evtchn_upcall_mask(%esi),%al
-       andb $1,%al                     # EAX[0] == IRET_EFLAGS.IF & event_mask
-       CFI_REMEMBER_STATE
-       jnz restore_all_enable_events   #        != 0 => enable event delivery
-#endif
-       TRACE_IRQS_IRET
-restore_nocheck_notrace:
-       RESTORE_REGS
-       addl $4, %esp
-       CFI_ADJUST_CFA_OFFSET -4
-1:     iret
-.section .fixup,"ax"
-iret_exc:
-#ifndef CONFIG_XEN
-       TRACE_IRQS_ON
-       sti
-#endif
-       pushl $0                        # no error code
-       pushl $do_iret_error
-       jmp error_code
-.previous
-.section __ex_table,"a"
-       .align 4
-       .long 1b,iret_exc
-.previous
-
-       CFI_RESTORE_STATE
-#ifndef CONFIG_XEN
-ldt_ss:
-       larl OLDSS(%esp), %eax
-       jnz restore_nocheck
-       testl $0x00400000, %eax         # returning to 32bit stack?
-       jnz restore_nocheck             # allright, normal return
-       /* If returning to userspace with 16bit stack,
-        * try to fix the higher word of ESP, as the CPU
-        * won't restore it.
-        * This is an "official" bug of all the x86-compatible
-        * CPUs, which we can try to work around to make
-        * dosemu and wine happy. */
-       subl $8, %esp           # reserve space for switch16 pointer
-       CFI_ADJUST_CFA_OFFSET 8
-       cli
-       TRACE_IRQS_OFF
-       movl %esp, %eax
-       /* Set up the 16bit stack frame with switch32 pointer on top,
-        * and a switch16 pointer on top of the current frame. */
-       call setup_x86_bogus_stack
-       CFI_ADJUST_CFA_OFFSET -8        # frame has moved
-       TRACE_IRQS_IRET
-       RESTORE_REGS
-       lss 20+4(%esp), %esp    # switch to 16bit stack
-1:     iret
-.section __ex_table,"a"
-       .align 4
-       .long 1b,iret_exc
-.previous
-#else
-        ALIGN
-restore_all_enable_events:
-       TRACE_IRQS_ON
-       __ENABLE_INTERRUPTS
-scrit: /**** START OF CRITICAL REGION ****/
-       __TEST_PENDING
-       jnz  14f                        # process more events if necessary...
-       RESTORE_REGS
-       addl $4, %esp
-       CFI_ADJUST_CFA_OFFSET -4
-1:     iret
-.section __ex_table,"a"
-       .align 4
-       .long 1b,iret_exc
-.previous
-14:    __DISABLE_INTERRUPTS
-       TRACE_IRQS_OFF
-       jmp  11f
-ecrit:  /**** END OF CRITICAL REGION ****/
-
-       CFI_RESTORE_STATE
-hypervisor_iret:
-       andl $~NMI_MASK, EFLAGS(%esp)
-       RESTORE_REGS
-       addl $4, %esp
-       CFI_ADJUST_CFA_OFFSET -4
-       jmp  hypercall_page + (__HYPERVISOR_iret * 32)
-#endif
-       CFI_ENDPROC
-
-       # perform work that needs to be done immediately before resumption
-       ALIGN
-       RING0_PTREGS_FRAME              # can't unwind into user space anyway
-work_pending:
-       testb $_TIF_NEED_RESCHED, %cl
-       jz work_notifysig
-work_resched:
-       call schedule
-       DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-                                       # setting need_resched or sigpending
-                                       # between sampling and the iret
-       TRACE_IRQS_OFF
-       movl TI_flags(%ebp), %ecx
-       andl $_TIF_WORK_MASK, %ecx      # is there any work to be done other
-                                       # than syscall tracing?
-       jz restore_all
-       testb $_TIF_NEED_RESCHED, %cl
-       jnz work_resched
-
-work_notifysig:                                # deal with pending signals and
-                                       # notify-resume requests
-       testl $VM_MASK, EFLAGS(%esp)
-       movl %esp, %eax
-       jne work_notifysig_v86          # returning to kernel-space or
-                                       # vm86-space
-       xorl %edx, %edx
-       call do_notify_resume
-       jmp resume_userspace_sig
-
-       ALIGN
-work_notifysig_v86:
-#ifdef CONFIG_VM86
-       pushl %ecx                      # save ti_flags for do_notify_resume
-       CFI_ADJUST_CFA_OFFSET 4
-       call save_v86_state             # %eax contains pt_regs pointer
-       popl %ecx
-       CFI_ADJUST_CFA_OFFSET -4
-       movl %eax, %esp
-       xorl %edx, %edx
-       call do_notify_resume
-       jmp resume_userspace_sig
-#endif
-
-       # perform syscall exit tracing
-       ALIGN
-syscall_trace_entry:
-       movl $-ENOSYS,EAX(%esp)
-       movl %esp, %eax
-       xorl %edx,%edx
-       call do_syscall_trace
-       cmpl $0, %eax
-       jne resume_userspace            # ret != 0 -> running under PTRACE_SYSEMU,
-                                       # so must skip actual syscall
-       movl ORIG_EAX(%esp), %eax
-       cmpl $(nr_syscalls), %eax
-       jnae syscall_call
-       jmp syscall_exit
-
-       # perform syscall exit tracing
-       ALIGN
-syscall_exit_work:
-       testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
-       jz work_pending
-       TRACE_IRQS_ON
-       ENABLE_INTERRUPTS               # could let do_syscall_trace() call
-                                       # schedule() instead
-       movl %esp, %eax
-       movl $1, %edx
-       call do_syscall_trace
-       jmp resume_userspace
-       CFI_ENDPROC
-
-       RING0_INT_FRAME                 # can't unwind into user space anyway
-syscall_fault:
-       pushl %eax                      # save orig_eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       GET_THREAD_INFO(%ebp)
-       movl $-EFAULT,EAX(%esp)
-       jmp resume_userspace
-
-syscall_badsys:
-       movl $-ENOSYS,EAX(%esp)
-       jmp resume_userspace
-       CFI_ENDPROC
-
-#ifndef CONFIG_XEN
-#define FIXUP_ESPFIX_STACK \
-       movl %esp, %eax; \
-       /* switch to 32bit stack using the pointer on top of 16bit stack */ \
-       lss %ss:CPU_16BIT_STACK_SIZE-8, %esp; \
-       /* copy data from 16bit stack to 32bit stack */ \
-       call fixup_x86_bogus_stack; \
-       /* put ESP to the proper location */ \
-       movl %eax, %esp;
-#define UNWIND_ESPFIX_STACK \
-       pushl %eax; \
-       CFI_ADJUST_CFA_OFFSET 4; \
-       movl %ss, %eax; \
-       /* see if on 16bit stack */ \
-       cmpw $__ESPFIX_SS, %ax; \
-       je 28f; \
-27:    popl %eax; \
-       CFI_ADJUST_CFA_OFFSET -4; \
-.section .fixup,"ax"; \
-28:    movl $__KERNEL_DS, %eax; \
-       movl %eax, %ds; \
-       movl %eax, %es; \
-       /* switch to 32bit stack */ \
-       FIXUP_ESPFIX_STACK; \
-       jmp 27b; \
-.previous
-
-/*
- * Build the entry stubs and pointer table with
- * some assembler magic.
- */
-.data
-ENTRY(interrupt)
-.text
-
-vector=0
-ENTRY(irq_entries_start)
-       RING0_INT_FRAME
-.rept NR_IRQS
-       ALIGN
- .if vector
-       CFI_ADJUST_CFA_OFFSET -4
- .endif
-1:     pushl $~(vector)
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp common_interrupt
-.data
-       .long 1b
-.text
-vector=vector+1
-.endr
-
-/*
- * the CPU automatically disables interrupts when executing an IRQ vector,
- * so IRQ-flags tracing has to follow that:
- */
-       ALIGN
-common_interrupt:
-       SAVE_ALL
-       TRACE_IRQS_OFF
-       movl %esp,%eax
-       call do_IRQ
-       jmp ret_from_intr
-       CFI_ENDPROC
-
-#define BUILD_INTERRUPT(name, nr)      \
-ENTRY(name)                            \
-       RING0_INT_FRAME;                \
-       pushl $~(nr);                   \
-       CFI_ADJUST_CFA_OFFSET 4;        \
-       SAVE_ALL;                       \
-       TRACE_IRQS_OFF                  \
-       movl %esp,%eax;                 \
-       call smp_/**/name;              \
-       jmp ret_from_intr;              \
-       CFI_ENDPROC
-
-/* The include is where all of the SMP etc. interrupts come from */
-#include "entry_arch.h"
-#else
-#define UNWIND_ESPFIX_STACK
-#endif
-
-ENTRY(divide_error)
-       RING0_INT_FRAME
-       pushl $0                        # no error code
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_divide_error
-       CFI_ADJUST_CFA_OFFSET 4
-       ALIGN
-error_code:
-       pushl %ds
-       CFI_ADJUST_CFA_OFFSET 4
-       /*CFI_REL_OFFSET ds, 0*/
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET eax, 0
-       xorl %eax, %eax
-       pushl %ebp
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET ebp, 0
-       pushl %edi
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET edi, 0
-       pushl %esi
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET esi, 0
-       pushl %edx
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET edx, 0
-       decl %eax                       # eax = -1
-       pushl %ecx
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET ecx, 0
-       pushl %ebx
-       CFI_ADJUST_CFA_OFFSET 4
-       CFI_REL_OFFSET ebx, 0
-       cld
-       pushl %es
-       CFI_ADJUST_CFA_OFFSET 4
-       /*CFI_REL_OFFSET es, 0*/
-       UNWIND_ESPFIX_STACK
-       popl %ecx
-       CFI_ADJUST_CFA_OFFSET -4
-       /*CFI_REGISTER es, ecx*/
-       movl ES(%esp), %edi             # get the function address
-       movl ORIG_EAX(%esp), %edx       # get the error code
-       movl %eax, ORIG_EAX(%esp)
-       movl %ecx, ES(%esp)
-       /*CFI_REL_OFFSET es, ES*/
-       movl $(__USER_DS), %ecx
-       movl %ecx, %ds
-       movl %ecx, %es
-       movl %esp,%eax                  # pt_regs pointer
-       call *%edi
-       jmp ret_from_exception
-       CFI_ENDPROC
-
-#ifdef CONFIG_XEN
-# A note on the "critical region" in our callback handler.
-# We want to avoid stacking callback handlers due to events occurring
-# during handling of the last event. To do this, we keep events disabled
-# until we've done all processing. HOWEVER, we must enable events before
-# popping the stack frame (can't be done atomically) and so it would still
-# be possible to get enough handler activations to overflow the stack.
-# Although unlikely, bugs of that kind are hard to track down, so we'd
-# like to avoid the possibility.
-# So, on entry to the handler we detect whether we interrupted an
-# existing activation in its critical region -- if so, we pop the current
-# activation and restart the handler using the previous one.
-#
-# The sysexit critical region is slightly different. sysexit
-# atomically removes the entire stack frame. If we interrupt in the
-# critical region we know that the entire frame is present and correct
-# so we can simply throw away the new one.
-ENTRY(hypervisor_callback)
-       RING0_INT_FRAME
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       movl EIP(%esp),%eax
-       cmpl $scrit,%eax
-       jb   11f
-       cmpl $ecrit,%eax
-       jb   critical_region_fixup
-       cmpl $sysexit_scrit,%eax
-       jb   11f
-       cmpl $sysexit_ecrit,%eax
-       ja   11f
-       addl $OLDESP,%esp               # Remove eflags...ebx from stack frame.
-11:    push %esp
-       CFI_ADJUST_CFA_OFFSET 4
-       call evtchn_do_upcall
-       add  $4,%esp
-       CFI_ADJUST_CFA_OFFSET -4
-       jmp  ret_from_intr
-       CFI_ENDPROC
-
-# [How we do the fixup]. We want to merge the current stack frame with the
-# just-interrupted frame. How we do this depends on where in the critical
-# region the interrupted handler was executing, and so how many saved
-# registers are in each frame. We do this quickly using the lookup table
-# 'critical_fixup_table'. For each byte offset in the critical region, it
-# provides the number of bytes which have already been popped from the
-# interrupted stack frame.
-critical_region_fixup:
-       movzbl critical_fixup_table-scrit(%eax),%ecx # %eax contains num bytes popped
-       cmpb $0xff,%cl                  # 0xff => vcpu_info critical region
-       jne  15f
-       xorl %ecx,%ecx
-15:    leal (%esp,%ecx),%esi           # %esi points at end of src region
-       leal OLDESP(%esp),%edi          # %edi points at end of dst region
-       shrl $2,%ecx                    # convert words to bytes
-       je   17f                        # skip loop if nothing to copy
-16:    subl $4,%esi                    # pre-decrementing copy loop
-       subl $4,%edi
-       movl (%esi),%eax
-       movl %eax,(%edi)
-       loop 16b
-17:    movl %edi,%esp                  # final %edi is top of merged stack
-       jmp  11b
-
-.section .rodata,"a"
-critical_fixup_table:
-       .byte 0xff,0xff,0xff            # testb $0xff,(%esi) = __TEST_PENDING
-       .byte 0xff,0xff                 # jnz  14f
-       .byte 0x00                      # pop  %ebx
-       .byte 0x04                      # pop  %ecx
-       .byte 0x08                      # pop  %edx
-       .byte 0x0c                      # pop  %esi
-       .byte 0x10                      # pop  %edi
-       .byte 0x14                      # pop  %ebp
-       .byte 0x18                      # pop  %eax
-       .byte 0x1c                      # pop  %ds
-       .byte 0x20                      # pop  %es
-       .byte 0x24,0x24,0x24            # add  $4,%esp
-       .byte 0x28                      # iret
-       .byte 0xff,0xff,0xff,0xff       # movb $1,1(%esi)
-       .byte 0x00,0x00                 # jmp  11b
-.previous
-
-# Hypervisor uses this for application faults while it executes.
-# We get here for two reasons:
-#  1. Fault while reloading DS, ES, FS or GS
-#  2. Fault while executing IRET
-# Category 1 we fix up by reattempting the load, and zeroing the segment
-# register if the load fails.
-# Category 2 we fix up by jumping to do_iret_error. We cannot use the
-# normal Linux return path in this case because if we use the IRET hypercall
-# to pop the stack frame we end up in an infinite loop of failsafe callbacks.
-# We distinguish between categories by maintaining a status value in EAX.
-ENTRY(failsafe_callback)
-       pushl %eax
-       movl $1,%eax
-1:     mov 4(%esp),%ds
-2:     mov 8(%esp),%es
-3:     mov 12(%esp),%fs
-4:     mov 16(%esp),%gs
-       testl %eax,%eax
-       popl %eax
-       jz 5f
-       addl $16,%esp           # EAX != 0 => Category 2 (Bad IRET)
-       jmp iret_exc
-5:     addl $16,%esp           # EAX == 0 => Category 1 (Bad segment)
-       RING0_INT_FRAME
-       pushl $0
-       SAVE_ALL
-       jmp ret_from_exception
-.section .fixup,"ax";          \
-6:     xorl %eax,%eax;         \
-       movl %eax,4(%esp);      \
-       jmp 1b;                 \
-7:     xorl %eax,%eax;         \
-       movl %eax,8(%esp);      \
-       jmp 2b;                 \
-8:     xorl %eax,%eax;         \
-       movl %eax,12(%esp);     \
-       jmp 3b;                 \
-9:     xorl %eax,%eax;         \
-       movl %eax,16(%esp);     \
-       jmp 4b;                 \
-.previous;                     \
-.section __ex_table,"a";       \
-       .align 4;               \
-       .long 1b,6b;            \
-       .long 2b,7b;            \
-       .long 3b,8b;            \
-       .long 4b,9b;            \
-.previous
-#endif
-       CFI_ENDPROC
-
-ENTRY(coprocessor_error)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_coprocessor_error
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(simd_coprocessor_error)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_simd_coprocessor_error
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(device_not_available)
-       RING0_INT_FRAME
-       pushl $-1                       # mark this as an int
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-#ifndef CONFIG_XEN
-       movl %cr0, %eax
-       testl $0x4, %eax                # EM (math emulation bit)
-       je device_available_emulate
-       pushl $0                        # temporary storage for ORIG_EIP
-       CFI_ADJUST_CFA_OFFSET 4
-       call math_emulate
-       addl $4, %esp
-       CFI_ADJUST_CFA_OFFSET -4
-       jmp ret_from_exception
-device_available_emulate:
-#endif
-       preempt_stop
-       call math_state_restore
-       jmp ret_from_exception
-       CFI_ENDPROC
-
-#ifndef CONFIG_XEN
-/*
- * Debug traps and NMI can happen at the one SYSENTER instruction
- * that sets up the real kernel stack. Check here, since we can't
- * allow the wrong stack to be used.
- *
- * "SYSENTER_stack_esp0+12" is because the NMI/debug handler will have
- * already pushed 3 words if it hits on the sysenter instruction:
- * eflags, cs and eip.
- *
- * We just load the right stack, and push the three (known) values
- * by hand onto the new stack - while updating the return eip past
- * the instruction that would have done it for sysenter.
- */
-#define FIX_STACK(offset, ok, label)           \
-       cmpw $__KERNEL_CS,4(%esp);              \
-       jne ok;                                 \
-label:                                         \
-       movl SYSENTER_stack_esp0+offset(%esp),%esp;     \
-       pushfl;                                 \
-       pushl $__KERNEL_CS;                     \
-       pushl $sysenter_past_esp
-#endif /* CONFIG_XEN */
-
-KPROBE_ENTRY(debug)
-       RING0_INT_FRAME
-#ifndef CONFIG_XEN
-       cmpl $sysenter_entry,(%esp)
-       jne debug_stack_correct
-       FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn)
-debug_stack_correct:
-#endif /* !CONFIG_XEN */
-       pushl $-1                       # mark this as an int
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       xorl %edx,%edx                  # error code 0
-       movl %esp,%eax                  # pt_regs pointer
-       call do_debug
-       jmp ret_from_exception
-       CFI_ENDPROC
-       .previous .text
-#ifndef CONFIG_XEN
-/*
- * NMI is doubly nasty. It can happen _while_ we're handling
- * a debug fault, and the debug fault hasn't yet been able to
- * clear up the stack. So we first check whether we got  an
- * NMI on the sysenter entry path, but after that we need to
- * check whether we got an NMI on the debug path where the debug
- * fault happened on the sysenter path.
- */
-ENTRY(nmi)
-       RING0_INT_FRAME
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       movl %ss, %eax
-       cmpw $__ESPFIX_SS, %ax
-       popl %eax
-       CFI_ADJUST_CFA_OFFSET -4
-       je nmi_16bit_stack
-       cmpl $sysenter_entry,(%esp)
-       je nmi_stack_fixup
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       movl %esp,%eax
-       /* Do not access memory above the end of our stack page,
-        * it might not exist.
-        */
-       andl $(THREAD_SIZE-1),%eax
-       cmpl $(THREAD_SIZE-20),%eax
-       popl %eax
-       CFI_ADJUST_CFA_OFFSET -4
-       jae nmi_stack_correct
-       cmpl $sysenter_entry,12(%esp)
-       je nmi_debug_stack_check
-nmi_stack_correct:
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       xorl %edx,%edx          # zero error code
-       movl %esp,%eax          # pt_regs pointer
-       call do_nmi
-       jmp restore_nocheck_notrace
-       CFI_ENDPROC
-
-nmi_stack_fixup:
-       FIX_STACK(12,nmi_stack_correct, 1)
-       jmp nmi_stack_correct
-nmi_debug_stack_check:
-       cmpw $__KERNEL_CS,16(%esp)
-       jne nmi_stack_correct
-       cmpl $debug,(%esp)
-       jb nmi_stack_correct
-       cmpl $debug_esp_fix_insn,(%esp)
-       ja nmi_stack_correct
-       FIX_STACK(24,nmi_stack_correct, 1)
-       jmp nmi_stack_correct
-
-nmi_16bit_stack:
-       RING0_INT_FRAME
-       /* create the pointer to lss back */
-       pushl %ss
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl %esp
-       CFI_ADJUST_CFA_OFFSET 4
-       movzwl %sp, %esp
-       addw $4, (%esp)
-       /* copy the iret frame of 12 bytes */
-       .rept 3
-       pushl 16(%esp)
-       CFI_ADJUST_CFA_OFFSET 4
-       .endr
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       FIXUP_ESPFIX_STACK              # %eax == %esp
-       CFI_ADJUST_CFA_OFFSET -20       # the frame has now moved
-       xorl %edx,%edx                  # zero error code
-       call do_nmi
-       RESTORE_REGS
-       lss 12+4(%esp), %esp            # back to 16bit stack
-1:     iret
-       CFI_ENDPROC
-.section __ex_table,"a"
-       .align 4
-       .long 1b,iret_exc
-.previous
-#else
-ENTRY(nmi)
-       RING0_INT_FRAME
-       pushl %eax
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       xorl %edx,%edx          # zero error code
-       movl %esp,%eax          # pt_regs pointer
-       call do_nmi
-       orl  $NMI_MASK, EFLAGS(%esp)
-       jmp restore_all
-       CFI_ENDPROC
-#endif
-
-KPROBE_ENTRY(int3)
-       RING0_INT_FRAME
-       pushl $-1                       # mark this as an int
-       CFI_ADJUST_CFA_OFFSET 4
-       SAVE_ALL
-       xorl %edx,%edx          # zero error code
-       movl %esp,%eax          # pt_regs pointer
-       call do_int3
-       jmp ret_from_exception
-       CFI_ENDPROC
-       .previous .text
-
-ENTRY(overflow)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_overflow
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(bounds)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_bounds
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(invalid_op)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_invalid_op
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(coprocessor_segment_overrun)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_coprocessor_segment_overrun
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(invalid_TSS)
-       RING0_EC_FRAME
-       pushl $do_invalid_TSS
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(segment_not_present)
-       RING0_EC_FRAME
-       pushl $do_segment_not_present
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-ENTRY(stack_segment)
-       RING0_EC_FRAME
-       pushl $do_stack_segment
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-KPROBE_ENTRY(general_protection)
-       RING0_EC_FRAME
-       pushl $do_general_protection
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-       .previous .text
-
-ENTRY(alignment_check)
-       RING0_EC_FRAME
-       pushl $do_alignment_check
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-KPROBE_ENTRY(page_fault)
-       RING0_EC_FRAME
-       pushl $do_page_fault
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-       .previous .text
-
-#ifdef CONFIG_X86_MCE
-ENTRY(machine_check)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl machine_check_vector
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-#endif
-
-#ifndef CONFIG_XEN
-ENTRY(spurious_interrupt_bug)
-       RING0_INT_FRAME
-       pushl $0
-       CFI_ADJUST_CFA_OFFSET 4
-       pushl $do_spurious_interrupt_bug
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-#endif /* !CONFIG_XEN */
-
-#ifdef CONFIG_STACK_UNWIND
-ENTRY(arch_unwind_init_running)
-       CFI_STARTPROC
-       movl    4(%esp), %edx
-       movl    (%esp), %ecx
-       leal    4(%esp), %eax
-       movl    %ebx, EBX(%edx)
-       xorl    %ebx, %ebx
-       movl    %ebx, ECX(%edx)
-       movl    %ebx, EDX(%edx)
-       movl    %esi, ESI(%edx)
-       movl    %edi, EDI(%edx)
-       movl    %ebp, EBP(%edx)
-       movl    %ebx, EAX(%edx)
-       movl    $__USER_DS, DS(%edx)
-       movl    $__USER_DS, ES(%edx)
-       movl    %ebx, ORIG_EAX(%edx)
-       movl    %ecx, EIP(%edx)
-       movl    12(%esp), %ecx
-       movl    $__KERNEL_CS, CS(%edx)
-       movl    %ebx, EFLAGS(%edx)
-       movl    %eax, OLDESP(%edx)
-       movl    8(%esp), %eax
-       movl    %ecx, 8(%esp)
-       movl    EBX(%edx), %ebx
-       movl    $__KERNEL_DS, OLDSS(%edx)
-       jmpl    *%eax
-       CFI_ENDPROC
-ENDPROC(arch_unwind_init_running)
-#endif
-
-ENTRY(fixup_4gb_segment)
-       RING0_EC_FRAME
-       pushl $do_fixup_4gb_segment
-       CFI_ADJUST_CFA_OFFSET 4
-       jmp error_code
-       CFI_ENDPROC
-
-.section .rodata,"a"
-.align 4
-#include "syscall_table.S"
-
-syscall_table_size=(.-sys_call_table)
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/fixup.c b/linux-2.6-xen-sparse/arch/i386/kernel/fixup.c
deleted file mode 100644 (file)
index aa6b12c..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/******************************************************************************
- * fixup.c
- * 
- * Binary-rewriting of certain IA32 instructions, on notification by Xen.
- * Used to avoid repeated slow emulation of common instructions used by the
- * user-space TLS (Thread-Local Storage) libraries.
- * 
- * **** NOTE ****
- *  Issues with the binary rewriting have caused it to be removed. Instead
- *  we rely on Xen's emulator to boot the kernel, and then print a banner
- *  message recommending that the user disables /lib/tls.
- * 
- * Copyright (c) 2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/version.h>
-
-#define DP(_f, _args...) printk(KERN_ALERT "  " _f "\n" , ## _args )
-
-fastcall void do_fixup_4gb_segment(struct pt_regs *regs, long error_code)
-{
-       static unsigned long printed = 0;
-       char info[100];
-       int i;
-
-       /* Ignore statically-linked init. */
-       if (current->tgid == 1)
-               return;
-            
-       HYPERVISOR_vm_assist(
-               VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify);
-
-       if (test_and_set_bit(0, &printed))
-               return;
-
-       sprintf(info, "%s (pid=%d)", current->comm, current->tgid);
-
-       DP("");
-       DP("***************************************************************");
-       DP("***************************************************************");
-       DP("** WARNING: Currently emulating unsupported memory accesses  **");
-       DP("**          in /lib/tls glibc libraries. The emulation is    **");
-       DP("**          slow. To ensure full performance you should      **");
-       DP("**          install a 'xen-friendly' (nosegneg) version of   **");
-       DP("**          the library, or disable tls support by executing **");
-       DP("**          the following as root:                           **");
-       DP("**          mv /lib/tls /lib/tls.disabled                    **");
-       DP("** Offending process: %-38.38s **", info);
-       DP("***************************************************************");
-       DP("***************************************************************");
-       DP("");
-
-       for (i = 5; i > 0; i--) {
-               touch_softlockup_watchdog();
-               printk("Pausing... %d", i);
-               mdelay(1000);
-               printk("\b\b\b\b\b\b\b\b\b\b\b\b");
-       }
-
-       printk("Continuing...\n\n");
-}
-
-static int __init fixup_init(void)
-{
-       HYPERVISOR_vm_assist(
-               VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
-       return 0;
-}
-__initcall(fixup_init);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S b/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S
deleted file mode 100644 (file)
index b96ff49..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-
-
-.text
-#include <linux/elfnote.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/cache.h>
-#include <asm/thread_info.h>
-#include <asm/asm-offsets.h>
-#include <asm/dwarf2.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/elfnote.h>
-
-/*
- * References to members of the new_cpu_data structure.
- */
-
-#define X86            new_cpu_data+CPUINFO_x86
-#define X86_VENDOR     new_cpu_data+CPUINFO_x86_vendor
-#define X86_MODEL      new_cpu_data+CPUINFO_x86_model
-#define X86_MASK       new_cpu_data+CPUINFO_x86_mask
-#define X86_HARD_MATH  new_cpu_data+CPUINFO_hard_math
-#define X86_CPUID      new_cpu_data+CPUINFO_cpuid_level
-#define X86_CAPABILITY new_cpu_data+CPUINFO_x86_capability
-#define X86_VENDOR_ID  new_cpu_data+CPUINFO_x86_vendor_id
-
-#define VIRT_ENTRY_OFFSET 0x0
-.org VIRT_ENTRY_OFFSET
-ENTRY(startup_32)
-       movl %esi,xen_start_info
-       cld
-
-       /* Set up the stack pointer */
-       movl $(init_thread_union+THREAD_SIZE),%esp
-
-       /* get vendor info */
-       xorl %eax,%eax                  # call CPUID with 0 -> return vendor ID
-       XEN_CPUID
-       movl %eax,X86_CPUID             # save CPUID level
-       movl %ebx,X86_VENDOR_ID         # lo 4 chars
-       movl %edx,X86_VENDOR_ID+4       # next 4 chars
-       movl %ecx,X86_VENDOR_ID+8       # last 4 chars
-
-       movl $1,%eax            # Use the CPUID instruction to get CPU type
-       XEN_CPUID
-       movb %al,%cl            # save reg for future use
-       andb $0x0f,%ah          # mask processor family
-       movb %ah,X86
-       andb $0xf0,%al          # mask model
-       shrb $4,%al
-       movb %al,X86_MODEL
-       andb $0x0f,%cl          # mask mask revision
-       movb %cl,X86_MASK
-       movl %edx,X86_CAPABILITY
-
-       movb $1,X86_HARD_MATH
-
-       xorl %eax,%eax                  # Clear FS/GS and LDT
-       movl %eax,%fs
-       movl %eax,%gs
-       cld                     # gcc2 wants the direction flag cleared at all times
-
-       pushl %eax              # fake return address
-       jmp start_kernel
-
-#define HYPERCALL_PAGE_OFFSET 0x1000
-.org HYPERCALL_PAGE_OFFSET
-ENTRY(hypercall_page)
-       CFI_STARTPROC
-.skip 0x1000
-       CFI_ENDPROC
-
-/*
- * Real beginning of normal "text" segment
- */
-ENTRY(stext)
-ENTRY(_stext)
-
-/*
- * BSS section
- */
-.section ".bss.page_aligned","w"
-ENTRY(empty_zero_page)
-       .fill 4096,1,0
-
-/*
- * This starts the data section.
- */
-.data
-
-/*
- * The Global Descriptor Table contains 28 quadwords, per-CPU.
- */
-       .align L1_CACHE_BYTES
-ENTRY(cpu_gdt_table)
-       .quad 0x0000000000000000        /* NULL descriptor */
-       .quad 0x0000000000000000        /* 0x0b reserved */
-       .quad 0x0000000000000000        /* 0x13 reserved */
-       .quad 0x0000000000000000        /* 0x1b reserved */
-       .quad 0x0000000000000000        /* 0x20 unused */
-       .quad 0x0000000000000000        /* 0x28 unused */
-       .quad 0x0000000000000000        /* 0x33 TLS entry 1 */
-       .quad 0x0000000000000000        /* 0x3b TLS entry 2 */
-       .quad 0x0000000000000000        /* 0x43 TLS entry 3 */
-       .quad 0x0000000000000000        /* 0x4b reserved */
-       .quad 0x0000000000000000        /* 0x53 reserved */
-       .quad 0x0000000000000000        /* 0x5b reserved */
-
-       .quad 0x00cf9a000000ffff        /* 0x60 kernel 4GB code at 0x00000000 */
-       .quad 0x00cf92000000ffff        /* 0x68 kernel 4GB data at 0x00000000 */
-       .quad 0x00cffa000000ffff        /* 0x73 user 4GB code at 0x00000000 */
-       .quad 0x00cff2000000ffff        /* 0x7b user 4GB data at 0x00000000 */
-
-       .quad 0x0000000000000000        /* 0x80 TSS descriptor */
-       .quad 0x0000000000000000        /* 0x88 LDT descriptor */
-
-       /*
-        * Segments used for calling PnP BIOS have byte granularity.
-        * They code segments and data segments have fixed 64k limits,
-        * the transfer segment sizes are set at run time.
-        */
-       .quad 0x0000000000000000        /* 0x90 32-bit code */
-       .quad 0x0000000000000000        /* 0x98 16-bit code */
-       .quad 0x0000000000000000        /* 0xa0 16-bit data */
-       .quad 0x0000000000000000        /* 0xa8 16-bit data */
-       .quad 0x0000000000000000        /* 0xb0 16-bit data */
-
-       /*
-        * The APM segments have byte granularity and their bases
-        * are set at run time.  All have 64k limits.
-        */
-       .quad 0x0000000000000000        /* 0xb8 APM CS    code */
-       .quad 0x0000000000000000        /* 0xc0 APM CS 16 code (16 bit) */
-       .quad 0x0000000000000000        /* 0xc8 APM DS    data */
-
-       .quad 0x0000000000000000        /* 0xd0 - ESPFIX 16-bit SS */
-       .quad 0x0000000000000000        /* 0xd8 - unused */
-       .quad 0x0000000000000000        /* 0xe0 - unused */
-       .quad 0x0000000000000000        /* 0xe8 - unused */
-       .quad 0x0000000000000000        /* 0xf0 - unused */
-       .quad 0x0000000000000000        /* 0xf8 - GDT entry 31: double-fault TSS */
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-/*
- * __xen_guest information
- */
-.macro utoa value
- .if (\value) < 0 || (\value) >= 0x10
-       utoa (((\value)>>4)&0x0fffffff)
- .endif
- .if ((\value) & 0xf) < 10
-  .byte '0' + ((\value) & 0xf)
- .else
-  .byte 'A' + ((\value) & 0xf) - 10
- .endif
-.endm
-
-.section __xen_guest
-       .ascii  "GUEST_OS=linux,GUEST_VER=2.6"
-       .ascii  ",XEN_VER=xen-3.0"
-       .ascii  ",VIRT_BASE=0x"
-               utoa __PAGE_OFFSET
-       .ascii  ",ELF_PADDR_OFFSET=0x"
-               utoa __PAGE_OFFSET
-       .ascii  ",VIRT_ENTRY=0x"
-               utoa (__PAGE_OFFSET + __PHYSICAL_START + VIRT_ENTRY_OFFSET)
-       .ascii  ",HYPERCALL_PAGE=0x"
-               utoa ((__PHYSICAL_START+HYPERCALL_PAGE_OFFSET)>>PAGE_SHIFT)
-       .ascii  ",FEATURES=writable_page_tables"
-       .ascii           "|writable_descriptor_tables"
-       .ascii           "|auto_translated_physmap"
-       .ascii           "|pae_pgdir_above_4gb"
-       .ascii           "|supervisor_mode_kernel"
-#ifdef CONFIG_X86_PAE
-       .ascii  ",PAE=yes[extended-cr3]"
-#else
-       .ascii  ",PAE=no"
-#endif
-       .ascii  ",LOADER=generic"
-       .byte   0
-#endif /* CONFIG_XEN_COMPAT <= 0x030002 */
-
-
-       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz, "linux")       
-       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, "2.6")
-       ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz, "xen-3.0")
-       ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .long,  __PAGE_OFFSET)
-#if CONFIG_XEN_COMPAT <= 0x030002
-       ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .long,  __PAGE_OFFSET)
-#else
-       ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .long,  0)
-#endif
-       ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .long,  startup_32)
-       ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long,  hypercall_page)
-       ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .long,  HYPERVISOR_VIRT_START)
-       ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
-#ifdef CONFIG_X86_PAE
-       ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "yes")
-       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  _PAGE_PRESENT,_PAGE_PRESENT)
-#else
-       ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "no")
-       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  _PAGE_PRESENT,_PAGE_PRESENT)
-#endif
-       ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-       ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/init_task-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/init_task-xen.c
deleted file mode 100644 (file)
index c4da1cc..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/init_task.h>
-#include <linux/fs.h>
-#include <linux/mqueue.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/desc.h>
-
-static struct fs_struct init_fs = INIT_FS;
-static struct files_struct init_files = INIT_FILES;
-static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
-static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-
-#define swapper_pg_dir ((pgd_t *)NULL)
-struct mm_struct init_mm = INIT_MM(init_mm);
-#undef swapper_pg_dir
-
-EXPORT_SYMBOL(init_mm);
-
-/*
- * Initial thread structure.
- *
- * We need to make sure that this is THREAD_SIZE aligned due to the
- * way process stacks are handled. This is done by having a special
- * "init_task" linker map entry..
- */
-union thread_union init_thread_union 
-       __attribute__((__section__(".data.init_task"))) =
-               { INIT_THREAD_INFO(init_task) };
-
-/*
- * Initial task structure.
- *
- * All other task structs will be allocated on slabs in fork.c
- */
-struct task_struct init_task = INIT_TASK(init_task);
-
-EXPORT_SYMBOL(init_task);
-
-#ifndef CONFIG_X86_NO_TSS
-/*
- * per-CPU TSS segments. Threads are completely 'soft' on Linux,
- * no more per-task TSS's.
- */ 
-DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
-#endif
-
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c
deleted file mode 100644 (file)
index 8d50b28..0000000
+++ /dev/null
@@ -1,2777 +0,0 @@
-/*
- *     Intel IO-APIC support for multi-Pentium hosts.
- *
- *     Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar, Hajnalka Szabo
- *
- *     Many thanks to Stig Venaas for trying out countless experimental
- *     patches and reporting/debugging problems patiently!
- *
- *     (c) 1999, Multiple IO-APIC support, developed by
- *     Ken-ichi Yaku <yaku@css1.kbnes.nec.co.jp> and
- *      Hidemi Kishimoto <kisimoto@css1.kbnes.nec.co.jp>,
- *     further tested and cleaned up by Zach Brown <zab@redhat.com>
- *     and Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *     Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
- *                                     thanks to Eric Gilmore
- *                                     and Rolf G. Tews
- *                                     for testing these extensively
- *     Paul Diefenbaugh        :       Added full ACPI support
- */
-
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/smp_lock.h>
-#include <linux/mc146818rtc.h>
-#include <linux/compiler.h>
-#include <linux/acpi.h>
-#include <linux/module.h>
-#include <linux/sysdev.h>
-
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/desc.h>
-#include <asm/timer.h>
-#include <asm/i8259.h>
-#include <asm/nmi.h>
-
-#include <mach_apic.h>
-
-#include "io_ports.h"
-
-#ifdef CONFIG_XEN
-
-#include <xen/interface/xen.h>
-#include <xen/interface/physdev.h>
-
-/* Fake i8259 */
-#define make_8259A_irq(_irq)     (io_apic_irqs &= ~(1UL<<(_irq)))
-#define disable_8259A_irq(_irq)  ((void)0)
-#define i8259A_irq_pending(_irq) (0)
-
-unsigned long io_apic_irqs;
-
-static inline unsigned int xen_io_apic_read(unsigned int apic, unsigned int reg)
-{
-       struct physdev_apic apic_op;
-       int ret;
-
-       apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-       apic_op.reg = reg;
-       ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
-       if (ret)
-               return ret;
-       return apic_op.value;
-}
-
-static inline void xen_io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
-{
-       struct physdev_apic apic_op;
-
-       apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-       apic_op.reg = reg;
-       apic_op.value = value;
-       HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
-}
-
-#define io_apic_read(a,r)    xen_io_apic_read(a,r)
-#define io_apic_write(a,r,v) xen_io_apic_write(a,r,v)
-
-#endif /* CONFIG_XEN */
-
-int (*ioapic_renumber_irq)(int ioapic, int irq);
-atomic_t irq_mis_count;
-
-/* Where if anywhere is the i8259 connect in external int mode */
-static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
-
-static DEFINE_SPINLOCK(ioapic_lock);
-static DEFINE_SPINLOCK(vector_lock);
-
-int timer_over_8254 __initdata = 1;
-
-/*
- *     Is the SiS APIC rmw bug present ?
- *     -1 = don't know, 0 = no, 1 = yes
- */
-int sis_apic_bug = -1;
-
-/*
- * # of IRQ routing registers
- */
-int nr_ioapic_registers[MAX_IO_APICS];
-
-int disable_timer_pin_1 __initdata;
-
-/*
- * Rough estimation of how many shared IRQs there are, can
- * be changed anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
-
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
-
-static struct irq_pin_list {
-       int apic, pin, next;
-} irq_2_pin[PIN_MAP_SIZE];
-
-int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1};
-#ifdef CONFIG_PCI_MSI
-#define vector_to_irq(vector)  \
-       (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-#else
-#define vector_to_irq(vector)  (vector)
-#endif
-
-/*
- * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
- * shared ISA-space IRQs, so we have to support them. We are super
- * fast in the common case, and fast for shared ISA-space IRQs.
- */
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
-{
-       static int first_free_entry = NR_IRQS;
-       struct irq_pin_list *entry = irq_2_pin + irq;
-
-       while (entry->next)
-               entry = irq_2_pin + entry->next;
-
-       if (entry->pin != -1) {
-               entry->next = first_free_entry;
-               entry = irq_2_pin + entry->next;
-               if (++first_free_entry >= PIN_MAP_SIZE)
-                       panic("io_apic.c: whoops");
-       }
-       entry->apic = apic;
-       entry->pin = pin;
-}
-
-#ifdef CONFIG_XEN
-#define clear_IO_APIC() ((void)0)
-#else
-/*
- * Reroute an IRQ to a different pin.
- */
-static void __init replace_pin_at_irq(unsigned int irq,
-                                     int oldapic, int oldpin,
-                                     int newapic, int newpin)
-{
-       struct irq_pin_list *entry = irq_2_pin + irq;
-
-       while (1) {
-               if (entry->apic == oldapic && entry->pin == oldpin) {
-                       entry->apic = newapic;
-                       entry->pin = newpin;
-               }
-               if (!entry->next)
-                       break;
-               entry = irq_2_pin + entry->next;
-       }
-}
-
-static void __modify_IO_APIC_irq (unsigned int irq, unsigned long enable, unsigned long disable)
-{
-       struct irq_pin_list *entry = irq_2_pin + irq;
-       unsigned int pin, reg;
-
-       for (;;) {
-               pin = entry->pin;
-               if (pin == -1)
-                       break;
-               reg = io_apic_read(entry->apic, 0x10 + pin*2);
-               reg &= ~disable;
-               reg |= enable;
-               io_apic_modify(entry->apic, 0x10 + pin*2, reg);
-               if (!entry->next)
-                       break;
-               entry = irq_2_pin + entry->next;
-       }
-}
-
-/* mask = 1 */
-static void __mask_IO_APIC_irq (unsigned int irq)
-{
-       __modify_IO_APIC_irq(irq, 0x00010000, 0);
-}
-
-/* mask = 0 */
-static void __unmask_IO_APIC_irq (unsigned int irq)
-{
-       __modify_IO_APIC_irq(irq, 0, 0x00010000);
-}
-
-/* mask = 1, trigger = 0 */
-static void __mask_and_edge_IO_APIC_irq (unsigned int irq)
-{
-       __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000);
-}
-
-/* mask = 0, trigger = 1 */
-static void __unmask_and_level_IO_APIC_irq (unsigned int irq)
-{
-       __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000);
-}
-
-static void mask_IO_APIC_irq (unsigned int irq)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       __mask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void unmask_IO_APIC_irq (unsigned int irq)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       __unmask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-       
-       /* Check delivery_mode to be sure we're not clearing an SMI pin */
-       spin_lock_irqsave(&ioapic_lock, flags);
-       *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-       *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-       if (entry.delivery_mode == dest_SMI)
-               return;
-
-       /*
-        * Disable it in the IO-APIC irq-routing table:
-        */
-       memset(&entry, 0, sizeof(entry));
-       entry.mask = 1;
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry) + 0));
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry) + 1));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void clear_IO_APIC (void)
-{
-       int apic, pin;
-
-       for (apic = 0; apic < nr_ioapics; apic++)
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
-                       clear_IO_APIC_pin(apic, pin);
-}
-
-#ifdef CONFIG_SMP
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
-{
-       unsigned long flags;
-       int pin;
-       struct irq_pin_list *entry = irq_2_pin + irq;
-       unsigned int apicid_value;
-       cpumask_t tmp;
-       
-       cpus_and(tmp, cpumask, cpu_online_map);
-       if (cpus_empty(tmp))
-               tmp = TARGET_CPUS;
-
-       cpus_and(cpumask, tmp, CPU_MASK_ALL);
-
-       apicid_value = cpu_mask_to_apicid(cpumask);
-       /* Prepare to do the io_apic_write */
-       apicid_value = apicid_value << 24;
-       spin_lock_irqsave(&ioapic_lock, flags);
-       for (;;) {
-               pin = entry->pin;
-               if (pin == -1)
-                       break;
-               io_apic_write(entry->apic, 0x10 + 1 + pin*2, apicid_value);
-               if (!entry->next)
-                       break;
-               entry = irq_2_pin + entry->next;
-       }
-       set_irq_info(irq, cpumask);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-#if defined(CONFIG_IRQBALANCE)
-# include <asm/processor.h>    /* kernel_thread() */
-# include <linux/kernel_stat.h>        /* kstat */
-# include <linux/slab.h>               /* kmalloc() */
-# include <linux/timer.h>      /* time_after() */
-#ifdef CONFIG_BALANCED_IRQ_DEBUG
-#  define TDprintk(x...) do { printk("<%ld:%s:%d>: ", jiffies, __FILE__, __LINE__); printk(x); } while (0)
-#  define Dprintk(x...) do { TDprintk(x); } while (0)
-# else
-#  define TDprintk(x...) 
-#  define Dprintk(x...) 
-# endif
-
-#define IRQBALANCE_CHECK_ARCH -999
-#define MAX_BALANCED_IRQ_INTERVAL      (5*HZ)
-#define MIN_BALANCED_IRQ_INTERVAL      (HZ/2)
-#define BALANCED_IRQ_MORE_DELTA                (HZ/10)
-#define BALANCED_IRQ_LESS_DELTA                (HZ)
-
-static int irqbalance_disabled __read_mostly = IRQBALANCE_CHECK_ARCH;
-static int physical_balance __read_mostly;
-static long balanced_irq_interval __read_mostly = MAX_BALANCED_IRQ_INTERVAL;
-
-static struct irq_cpu_info {
-       unsigned long * last_irq;
-       unsigned long * irq_delta;
-       unsigned long irq;
-} irq_cpu_data[NR_CPUS];
-
-#define CPU_IRQ(cpu)           (irq_cpu_data[cpu].irq)
-#define LAST_CPU_IRQ(cpu,irq)   (irq_cpu_data[cpu].last_irq[irq])
-#define IRQ_DELTA(cpu,irq)     (irq_cpu_data[cpu].irq_delta[irq])
-
-#define IDLE_ENOUGH(cpu,now) \
-       (idle_cpu(cpu) && ((now) - per_cpu(irq_stat, (cpu)).idle_timestamp > 1))
-
-#define IRQ_ALLOWED(cpu, allowed_mask) cpu_isset(cpu, allowed_mask)
-
-#define CPU_TO_PACKAGEINDEX(i) (first_cpu(cpu_sibling_map[i]))
-
-static cpumask_t balance_irq_affinity[NR_IRQS] = {
-       [0 ... NR_IRQS-1] = CPU_MASK_ALL
-};
-
-void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
-{
-       balance_irq_affinity[irq] = mask;
-}
-
-static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
-                       unsigned long now, int direction)
-{
-       int search_idle = 1;
-       int cpu = curr_cpu;
-
-       goto inside;
-
-       do {
-               if (unlikely(cpu == curr_cpu))
-                       search_idle = 0;
-inside:
-               if (direction == 1) {
-                       cpu++;
-                       if (cpu >= NR_CPUS)
-                               cpu = 0;
-               } else {
-                       cpu--;
-                       if (cpu == -1)
-                               cpu = NR_CPUS-1;
-               }
-       } while (!cpu_online(cpu) || !IRQ_ALLOWED(cpu,allowed_mask) ||
-                       (search_idle && !IDLE_ENOUGH(cpu,now)));
-
-       return cpu;
-}
-
-static inline void balance_irq(int cpu, int irq)
-{
-       unsigned long now = jiffies;
-       cpumask_t allowed_mask;
-       unsigned int new_cpu;
-               
-       if (irqbalance_disabled)
-               return; 
-
-       cpus_and(allowed_mask, cpu_online_map, balance_irq_affinity[irq]);
-       new_cpu = move(cpu, allowed_mask, now, 1);
-       if (cpu != new_cpu) {
-               set_pending_irq(irq, cpumask_of_cpu(new_cpu));
-       }
-}
-
-static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold)
-{
-       int i, j;
-       Dprintk("Rotating IRQs among CPUs.\n");
-       for_each_online_cpu(i) {
-               for (j = 0; j < NR_IRQS; j++) {
-                       if (!irq_desc[j].action)
-                               continue;
-                       /* Is it a significant load ?  */
-                       if (IRQ_DELTA(CPU_TO_PACKAGEINDEX(i),j) <
-                                               useful_load_threshold)
-                               continue;
-                       balance_irq(i, j);
-               }
-       }
-       balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
-               balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);       
-       return;
-}
-
-static void do_irq_balance(void)
-{
-       int i, j;
-       unsigned long max_cpu_irq = 0, min_cpu_irq = (~0);
-       unsigned long move_this_load = 0;
-       int max_loaded = 0, min_loaded = 0;
-       int load;
-       unsigned long useful_load_threshold = balanced_irq_interval + 10;
-       int selected_irq;
-       int tmp_loaded, first_attempt = 1;
-       unsigned long tmp_cpu_irq;
-       unsigned long imbalance = 0;
-       cpumask_t allowed_mask, target_cpu_mask, tmp;
-
-       for_each_possible_cpu(i) {
-               int package_index;
-               CPU_IRQ(i) = 0;
-               if (!cpu_online(i))
-                       continue;
-               package_index = CPU_TO_PACKAGEINDEX(i);
-               for (j = 0; j < NR_IRQS; j++) {
-                       unsigned long value_now, delta;
-                       /* Is this an active IRQ? */
-                       if (!irq_desc[j].action)
-                               continue;
-                       if ( package_index == i )
-                               IRQ_DELTA(package_index,j) = 0;
-                       /* Determine the total count per processor per IRQ */
-                       value_now = (unsigned long) kstat_cpu(i).irqs[j];
-
-                       /* Determine the activity per processor per IRQ */
-                       delta = value_now - LAST_CPU_IRQ(i,j);
-
-                       /* Update last_cpu_irq[][] for the next time */
-                       LAST_CPU_IRQ(i,j) = value_now;
-
-                       /* Ignore IRQs whose rate is less than the clock */
-                       if (delta < useful_load_threshold)
-                               continue;
-                       /* update the load for the processor or package total */
-                       IRQ_DELTA(package_index,j) += delta;
-
-                       /* Keep track of the higher numbered sibling as well */
-                       if (i != package_index)
-                               CPU_IRQ(i) += delta;
-                       /*
-                        * We have sibling A and sibling B in the package
-                        *
-                        * cpu_irq[A] = load for cpu A + load for cpu B
-                        * cpu_irq[B] = load for cpu B
-                        */
-                       CPU_IRQ(package_index) += delta;
-               }
-       }
-       /* Find the least loaded processor package */
-       for_each_online_cpu(i) {
-               if (i != CPU_TO_PACKAGEINDEX(i))
-                       continue;
-               if (min_cpu_irq > CPU_IRQ(i)) {
-                       min_cpu_irq = CPU_IRQ(i);
-                       min_loaded = i;
-               }
-       }
-       max_cpu_irq = ULONG_MAX;
-
-tryanothercpu:
-       /* Look for heaviest loaded processor.
-        * We may come back to get the next heaviest loaded processor.
-        * Skip processors with trivial loads.
-        */
-       tmp_cpu_irq = 0;
-       tmp_loaded = -1;
-       for_each_online_cpu(i) {
-               if (i != CPU_TO_PACKAGEINDEX(i))
-                       continue;
-               if (max_cpu_irq <= CPU_IRQ(i)) 
-                       continue;
-               if (tmp_cpu_irq < CPU_IRQ(i)) {
-                       tmp_cpu_irq = CPU_IRQ(i);
-                       tmp_loaded = i;
-               }
-       }
-
-       if (tmp_loaded == -1) {
-        /* In the case of small number of heavy interrupt sources, 
-         * loading some of the cpus too much. We use Ingo's original 
-         * approach to rotate them around.
-         */
-               if (!first_attempt && imbalance >= useful_load_threshold) {
-                       rotate_irqs_among_cpus(useful_load_threshold);
-                       return;
-               }
-               goto not_worth_the_effort;
-       }
-       
-       first_attempt = 0;              /* heaviest search */
-       max_cpu_irq = tmp_cpu_irq;      /* load */
-       max_loaded = tmp_loaded;        /* processor */
-       imbalance = (max_cpu_irq - min_cpu_irq) / 2;
-       
-       Dprintk("max_loaded cpu = %d\n", max_loaded);
-       Dprintk("min_loaded cpu = %d\n", min_loaded);
-       Dprintk("max_cpu_irq load = %ld\n", max_cpu_irq);
-       Dprintk("min_cpu_irq load = %ld\n", min_cpu_irq);
-       Dprintk("load imbalance = %lu\n", imbalance);
-
-       /* if imbalance is less than approx 10% of max load, then
-        * observe diminishing returns action. - quit
-        */
-       if (imbalance < (max_cpu_irq >> 3)) {
-               Dprintk("Imbalance too trivial\n");
-               goto not_worth_the_effort;
-       }
-
-tryanotherirq:
-       /* if we select an IRQ to move that can't go where we want, then
-        * see if there is another one to try.
-        */
-       move_this_load = 0;
-       selected_irq = -1;
-       for (j = 0; j < NR_IRQS; j++) {
-               /* Is this an active IRQ? */
-               if (!irq_desc[j].action)
-                       continue;
-               if (imbalance <= IRQ_DELTA(max_loaded,j))
-                       continue;
-               /* Try to find the IRQ that is closest to the imbalance
-                * without going over.
-                */
-               if (move_this_load < IRQ_DELTA(max_loaded,j)) {
-                       move_this_load = IRQ_DELTA(max_loaded,j);
-                       selected_irq = j;
-               }
-       }
-       if (selected_irq == -1) {
-               goto tryanothercpu;
-       }
-
-       imbalance = move_this_load;
-       
-       /* For physical_balance case, we accumlated both load
-        * values in the one of the siblings cpu_irq[],
-        * to use the same code for physical and logical processors
-        * as much as possible. 
-        *
-        * NOTE: the cpu_irq[] array holds the sum of the load for
-        * sibling A and sibling B in the slot for the lowest numbered
-        * sibling (A), _AND_ the load for sibling B in the slot for
-        * the higher numbered sibling.
-        *
-        * We seek the least loaded sibling by making the comparison
-        * (A+B)/2 vs B
-        */
-       load = CPU_IRQ(min_loaded) >> 1;
-       for_each_cpu_mask(j, cpu_sibling_map[min_loaded]) {
-               if (load > CPU_IRQ(j)) {
-                       /* This won't change cpu_sibling_map[min_loaded] */
-                       load = CPU_IRQ(j);
-                       min_loaded = j;
-               }
-       }
-
-       cpus_and(allowed_mask,
-               cpu_online_map,
-               balance_irq_affinity[selected_irq]);
-       target_cpu_mask = cpumask_of_cpu(min_loaded);
-       cpus_and(tmp, target_cpu_mask, allowed_mask);
-
-       if (!cpus_empty(tmp)) {
-
-               Dprintk("irq = %d moved to cpu = %d\n",
-                               selected_irq, min_loaded);
-               /* mark for change destination */
-               set_pending_irq(selected_irq, cpumask_of_cpu(min_loaded));
-
-               /* Since we made a change, come back sooner to 
-                * check for more variation.
-                */
-               balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
-                       balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);       
-               return;
-       }
-       goto tryanotherirq;
-
-not_worth_the_effort:
-       /*
-        * if we did not find an IRQ to move, then adjust the time interval
-        * upward
-        */
-       balanced_irq_interval = min((long)MAX_BALANCED_IRQ_INTERVAL,
-               balanced_irq_interval + BALANCED_IRQ_MORE_DELTA);       
-       Dprintk("IRQ worth rotating not found\n");
-       return;
-}
-
-static int balanced_irq(void *unused)
-{
-       int i;
-       unsigned long prev_balance_time = jiffies;
-       long time_remaining = balanced_irq_interval;
-
-       daemonize("kirqd");
-       
-       /* push everything to CPU 0 to give us a starting point.  */
-       for (i = 0 ; i < NR_IRQS ; i++) {
-               irq_desc[i].pending_mask = cpumask_of_cpu(0);
-               set_pending_irq(i, cpumask_of_cpu(0));
-       }
-
-       for ( ; ; ) {
-               time_remaining = schedule_timeout_interruptible(time_remaining);
-               try_to_freeze();
-               if (time_after(jiffies,
-                               prev_balance_time+balanced_irq_interval)) {
-                       preempt_disable();
-                       do_irq_balance();
-                       prev_balance_time = jiffies;
-                       time_remaining = balanced_irq_interval;
-                       preempt_enable();
-               }
-       }
-       return 0;
-}
-
-static int __init balanced_irq_init(void)
-{
-       int i;
-       struct cpuinfo_x86 *c;
-       cpumask_t tmp;
-
-       cpus_shift_right(tmp, cpu_online_map, 2);
-        c = &boot_cpu_data;
-       /* When not overwritten by the command line ask subarchitecture. */
-       if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH)
-               irqbalance_disabled = NO_BALANCE_IRQ;
-       if (irqbalance_disabled)
-               return 0;
-       
-        /* disable irqbalance completely if there is only one processor online */
-       if (num_online_cpus() < 2) {
-               irqbalance_disabled = 1;
-               return 0;
-       }
-       /*
-        * Enable physical balance only if more than 1 physical processor
-        * is present
-        */
-       if (smp_num_siblings > 1 && !cpus_empty(tmp))
-               physical_balance = 1;
-
-       for_each_online_cpu(i) {
-               irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
-               irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
-               if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) {
-                       printk(KERN_ERR "balanced_irq_init: out of memory");
-                       goto failed;
-               }
-               memset(irq_cpu_data[i].irq_delta,0,sizeof(unsigned long) * NR_IRQS);
-               memset(irq_cpu_data[i].last_irq,0,sizeof(unsigned long) * NR_IRQS);
-       }
-       
-       printk(KERN_INFO "Starting balanced_irq\n");
-       if (kernel_thread(balanced_irq, NULL, CLONE_KERNEL) >= 0) 
-               return 0;
-       else 
-               printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq");
-failed:
-       for_each_possible_cpu(i) {
-               kfree(irq_cpu_data[i].irq_delta);
-               irq_cpu_data[i].irq_delta = NULL;
-               kfree(irq_cpu_data[i].last_irq);
-               irq_cpu_data[i].last_irq = NULL;
-       }
-       return 0;
-}
-
-int __init irqbalance_disable(char *str)
-{
-       irqbalance_disabled = 1;
-       return 1;
-}
-
-__setup("noirqbalance", irqbalance_disable);
-
-late_initcall(balanced_irq_init);
-#endif /* CONFIG_IRQBALANCE */
-#endif /* CONFIG_SMP */
-#endif
-
-#ifndef CONFIG_SMP
-void fastcall send_IPI_self(int vector)
-{
-#ifndef CONFIG_XEN
-       unsigned int cfg;
-
-       /*
-        * Wait for idle.
-        */
-       apic_wait_icr_idle();
-       cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL;
-       /*
-        * Send the IPI. The write to APIC_ICR fires this off.
-        */
-       apic_write_around(APIC_ICR, cfg);
-#endif
-}
-#endif /* !CONFIG_SMP */
-
-
-/*
- * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
- * specific CPU-side IRQs.
- */
-
-#define MAX_PIRQS 8
-static int pirq_entries [MAX_PIRQS];
-static int pirqs_enabled;
-int skip_ioapic_setup;
-
-static int __init ioapic_setup(char *str)
-{
-       skip_ioapic_setup = 1;
-       return 1;
-}
-
-__setup("noapic", ioapic_setup);
-
-static int __init ioapic_pirq_setup(char *str)
-{
-       int i, max;
-       int ints[MAX_PIRQS+1];
-
-       get_options(str, ARRAY_SIZE(ints), ints);
-
-       for (i = 0; i < MAX_PIRQS; i++)
-               pirq_entries[i] = -1;
-
-       pirqs_enabled = 1;
-       apic_printk(APIC_VERBOSE, KERN_INFO
-                       "PIRQ redirection, working around broken MP-BIOS.\n");
-       max = MAX_PIRQS;
-       if (ints[0] < MAX_PIRQS)
-               max = ints[0];
-
-       for (i = 0; i < max; i++) {
-               apic_printk(APIC_VERBOSE, KERN_DEBUG
-                               "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
-               /*
-                * PIRQs are mapped upside down, usually.
-                */
-               pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
-       }
-       return 1;
-}
-
-__setup("pirq=", ioapic_pirq_setup);
-
-/*
- * Find the IRQ entry number of a certain pin.
- */
-static int find_irq_entry(int apic, int pin, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++)
-               if (mp_irqs[i].mpc_irqtype == type &&
-                   (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid ||
-                    mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
-                   mp_irqs[i].mpc_dstirq == pin)
-                       return i;
-
-       return -1;
-}
-
-/*
- * Find the pin to which IRQ[irq] (ISA) is connected
- */
-static int __init find_isa_irq_pin(int irq, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_MCA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_NEC98
-                   ) &&
-                   (mp_irqs[i].mpc_irqtype == type) &&
-                   (mp_irqs[i].mpc_srcbusirq == irq))
-
-                       return mp_irqs[i].mpc_dstirq;
-       }
-       return -1;
-}
-
-static int __init find_isa_irq_apic(int irq, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_MCA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_NEC98
-                   ) &&
-                   (mp_irqs[i].mpc_irqtype == type) &&
-                   (mp_irqs[i].mpc_srcbusirq == irq))
-                       break;
-       }
-       if (i < mp_irq_entries) {
-               int apic;
-               for(apic = 0; apic < nr_ioapics; apic++) {
-                       if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
-                               return apic;
-               }
-       }
-
-       return -1;
-}
-
-/*
- * Find a specific PCI IRQ entry.
- * Not an __init, possibly needed by modules
- */
-static int pin_2_irq(int idx, int apic, int pin);
-
-int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
-{
-       int apic, i, best_guess = -1;
-
-       apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, "
-               "slot:%d, pin:%d.\n", bus, slot, pin);
-       if (mp_bus_id_to_pci_bus[bus] == -1) {
-               printk(KERN_WARNING "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
-               return -1;
-       }
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               for (apic = 0; apic < nr_ioapics; apic++)
-                       if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic ||
-                           mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
-                               break;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) &&
-                   !mp_irqs[i].mpc_irqtype &&
-                   (bus == lbus) &&
-                   (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
-                       int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
-
-                       if (!(apic || IO_APIC_IRQ(irq)))
-                               continue;
-
-                       if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
-                               return irq;
-                       /*
-                        * Use the first all-but-pin matching entry as a
-                        * best-guess fuzzy result for broken mptables.
-                        */
-                       if (best_guess < 0)
-                               best_guess = irq;
-               }
-       }
-       return best_guess;
-}
-EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
-
-/*
- * This function currently is only a helper for the i386 smp boot process where 
- * we need to reprogram the ioredtbls to cater for the cpus which have come online
- * so mask in all cases should simply be TARGET_CPUS
- */
-#ifdef CONFIG_SMP
-#ifndef CONFIG_XEN
-void __init setup_ioapic_dest(void)
-{
-       int pin, ioapic, irq, irq_entry;
-
-       if (skip_ioapic_setup == 1)
-               return;
-
-       for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
-               for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
-                       irq_entry = find_irq_entry(ioapic, pin, mp_INT);
-                       if (irq_entry == -1)
-                               continue;
-                       irq = pin_2_irq(irq_entry, ioapic, pin);
-                       set_ioapic_affinity_irq(irq, TARGET_CPUS);
-               }
-
-       }
-}
-#endif /* !CONFIG_XEN */
-#endif
-
-/*
- * EISA Edge/Level control register, ELCR
- */
-static int EISA_ELCR(unsigned int irq)
-{
-       if (irq < 16) {
-               unsigned int port = 0x4d0 + (irq >> 3);
-               return (inb(port) >> (irq & 7)) & 1;
-       }
-       apic_printk(APIC_VERBOSE, KERN_INFO
-                       "Broken MPtable reports ISA irq %d\n", irq);
-       return 0;
-}
-
-/* EISA interrupts are always polarity zero and can be edge or level
- * trigger depending on the ELCR value.  If an interrupt is listed as
- * EISA conforming in the MP table, that means its trigger type must
- * be read in from the ELCR */
-
-#define default_EISA_trigger(idx)      (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
-#define default_EISA_polarity(idx)     (0)
-
-/* ISA interrupts are always polarity zero edge triggered,
- * when listed as conforming in the MP table. */
-
-#define default_ISA_trigger(idx)       (0)
-#define default_ISA_polarity(idx)      (0)
-
-/* PCI interrupts are always polarity one level triggered,
- * when listed as conforming in the MP table. */
-
-#define default_PCI_trigger(idx)       (1)
-#define default_PCI_polarity(idx)      (1)
-
-/* MCA interrupts are always polarity zero level triggered,
- * when listed as conforming in the MP table. */
-
-#define default_MCA_trigger(idx)       (1)
-#define default_MCA_polarity(idx)      (0)
-
-/* NEC98 interrupts are always polarity zero edge triggered,
- * when listed as conforming in the MP table. */
-
-#define default_NEC98_trigger(idx)     (0)
-#define default_NEC98_polarity(idx)    (0)
-
-static int __init MPBIOS_polarity(int idx)
-{
-       int bus = mp_irqs[idx].mpc_srcbus;
-       int polarity;
-
-       /*
-        * Determine IRQ line polarity (high active or low active):
-        */
-       switch (mp_irqs[idx].mpc_irqflag & 3)
-       {
-               case 0: /* conforms, ie. bus-type dependent polarity */
-               {
-                       switch (mp_bus_id_to_type[bus])
-                       {
-                               case MP_BUS_ISA: /* ISA pin */
-                               {
-                                       polarity = default_ISA_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_EISA: /* EISA pin */
-                               {
-                                       polarity = default_EISA_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_PCI: /* PCI pin */
-                               {
-                                       polarity = default_PCI_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_MCA: /* MCA pin */
-                               {
-                                       polarity = default_MCA_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_NEC98: /* NEC 98 pin */
-                               {
-                                       polarity = default_NEC98_polarity(idx);
-                                       break;
-                               }
-                               default:
-                               {
-                                       printk(KERN_WARNING "broken BIOS!!\n");
-                                       polarity = 1;
-                                       break;
-                               }
-                       }
-                       break;
-               }
-               case 1: /* high active */
-               {
-                       polarity = 0;
-                       break;
-               }
-               case 2: /* reserved */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       polarity = 1;
-                       break;
-               }
-               case 3: /* low active */
-               {
-                       polarity = 1;
-                       break;
-               }
-               default: /* invalid */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       polarity = 1;
-                       break;
-               }
-       }
-       return polarity;
-}
-
-static int MPBIOS_trigger(int idx)
-{
-       int bus = mp_irqs[idx].mpc_srcbus;
-       int trigger;
-
-       /*
-        * Determine IRQ trigger mode (edge or level sensitive):
-        */
-       switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
-       {
-               case 0: /* conforms, ie. bus-type dependent */
-               {
-                       switch (mp_bus_id_to_type[bus])
-                       {
-                               case MP_BUS_ISA: /* ISA pin */
-                               {
-                                       trigger = default_ISA_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_EISA: /* EISA pin */
-                               {
-                                       trigger = default_EISA_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_PCI: /* PCI pin */
-                               {
-                                       trigger = default_PCI_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_MCA: /* MCA pin */
-                               {
-                                       trigger = default_MCA_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_NEC98: /* NEC 98 pin */
-                               {
-                                       trigger = default_NEC98_trigger(idx);
-                                       break;
-                               }
-                               default:
-                               {
-                                       printk(KERN_WARNING "broken BIOS!!\n");
-                                       trigger = 1;
-                                       break;
-                               }
-                       }
-                       break;
-               }
-               case 1: /* edge */
-               {
-                       trigger = 0;
-                       break;
-               }
-               case 2: /* reserved */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       trigger = 1;
-                       break;
-               }
-               case 3: /* level */
-               {
-                       trigger = 1;
-                       break;
-               }
-               default: /* invalid */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       trigger = 0;
-                       break;
-               }
-       }
-       return trigger;
-}
-
-static inline int irq_polarity(int idx)
-{
-       return MPBIOS_polarity(idx);
-}
-
-static inline int irq_trigger(int idx)
-{
-       return MPBIOS_trigger(idx);
-}
-
-static int pin_2_irq(int idx, int apic, int pin)
-{
-       int irq, i;
-       int bus = mp_irqs[idx].mpc_srcbus;
-
-       /*
-        * Debugging check, we are in big trouble if this message pops up!
-        */
-       if (mp_irqs[idx].mpc_dstirq != pin)
-               printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
-
-       switch (mp_bus_id_to_type[bus])
-       {
-               case MP_BUS_ISA: /* ISA pin */
-               case MP_BUS_EISA:
-               case MP_BUS_MCA:
-               case MP_BUS_NEC98:
-               {
-                       irq = mp_irqs[idx].mpc_srcbusirq;
-                       break;
-               }
-               case MP_BUS_PCI: /* PCI pin */
-               {
-                       /*
-                        * PCI IRQs are mapped in order
-                        */
-                       i = irq = 0;
-                       while (i < apic)
-                               irq += nr_ioapic_registers[i++];
-                       irq += pin;
-
-                       /*
-                        * For MPS mode, so far only needed by ES7000 platform
-                        */
-                       if (ioapic_renumber_irq)
-                               irq = ioapic_renumber_irq(apic, irq);
-
-                       break;
-               }
-               default:
-               {
-                       printk(KERN_ERR "unknown bus type %d.\n",bus); 
-                       irq = 0;
-                       break;
-               }
-       }
-
-       /*
-        * PCI IRQ command line redirection. Yes, limits are hardcoded.
-        */
-       if ((pin >= 16) && (pin <= 23)) {
-               if (pirq_entries[pin-16] != -1) {
-                       if (!pirq_entries[pin-16]) {
-                               apic_printk(APIC_VERBOSE, KERN_DEBUG
-                                               "disabling PIRQ%d\n", pin-16);
-                       } else {
-                               irq = pirq_entries[pin-16];
-                               apic_printk(APIC_VERBOSE, KERN_DEBUG
-                                               "using PIRQ%d -> IRQ %d\n",
-                                               pin-16, irq);
-                       }
-               }
-       }
-       return irq;
-}
-
-static inline int IO_APIC_irq_trigger(int irq)
-{
-       int apic, idx, pin;
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-                       idx = find_irq_entry(apic,pin,mp_INT);
-                       if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
-                               return irq_trigger(idx);
-               }
-       }
-       /*
-        * nonexistent IRQs are edge default
-        */
-       return 0;
-}
-
-/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-u8 irq_vector[NR_IRQ_VECTORS] __read_mostly; /* = { FIRST_DEVICE_VECTOR , 0 }; */
-
-int assign_irq_vector(int irq)
-{
-       unsigned long flags;
-       int vector;
-       struct physdev_irq irq_op;
-
-       BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
-
-       spin_lock_irqsave(&vector_lock, flags);
-
-       if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-               spin_unlock_irqrestore(&vector_lock, flags);
-               return IO_APIC_VECTOR(irq);
-       }
-
-       irq_op.irq = irq;
-       if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-               spin_unlock_irqrestore(&vector_lock, flags);
-               return -ENOSPC;
-       }
-
-       vector = irq_op.vector;
-       vector_irq[vector] = irq;
-       if (irq != AUTO_ASSIGN)
-               IO_APIC_VECTOR(irq) = vector;
-
-       spin_unlock_irqrestore(&vector_lock, flags);
-
-       return vector;
-}
-
-#ifndef CONFIG_XEN
-static struct hw_interrupt_type ioapic_level_type;
-static struct hw_interrupt_type ioapic_edge_type;
-
-#define IOAPIC_AUTO    -1
-#define IOAPIC_EDGE    0
-#define IOAPIC_LEVEL   1
-
-static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-{
-       unsigned idx;
-
-       idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq;
-
-       if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-                       trigger == IOAPIC_LEVEL)
-               irq_desc[idx].chip = &ioapic_level_type;
-       else
-               irq_desc[idx].chip = &ioapic_edge_type;
-       set_intr_gate(vector, interrupt[idx]);
-}
-#else
-#define ioapic_register_intr(_irq,_vector,_trigger) ((void)0)
-#endif
-
-static void __init setup_IO_APIC_irqs(void)
-{
-       struct IO_APIC_route_entry entry;
-       int apic, pin, idx, irq, first_notcon = 1, vector;
-       unsigned long flags;
-
-       apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-       for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-
-               /*
-                * add it to the IO-APIC irq-routing table:
-                */
-               memset(&entry,0,sizeof(entry));
-
-               entry.delivery_mode = INT_DELIVERY_MODE;
-               entry.dest_mode = INT_DEST_MODE;
-               entry.mask = 0;                         /* enable IRQ */
-               entry.dest.logical.logical_dest = 
-                                       cpu_mask_to_apicid(TARGET_CPUS);
-
-               idx = find_irq_entry(apic,pin,mp_INT);
-               if (idx == -1) {
-                       if (first_notcon) {
-                               apic_printk(APIC_VERBOSE, KERN_DEBUG
-                                               " IO-APIC (apicid-pin) %d-%d",
-                                               mp_ioapics[apic].mpc_apicid,
-                                               pin);
-                               first_notcon = 0;
-                       } else
-                               apic_printk(APIC_VERBOSE, ", %d-%d",
-                                       mp_ioapics[apic].mpc_apicid, pin);
-                       continue;
-               }
-
-               entry.trigger = irq_trigger(idx);
-               entry.polarity = irq_polarity(idx);
-
-               if (irq_trigger(idx)) {
-                       entry.trigger = 1;
-                       entry.mask = 1;
-               }
-
-               irq = pin_2_irq(idx, apic, pin);
-               /*
-                * skip adding the timer int on secondary nodes, which causes
-                * a small but painful rift in the time-space continuum
-                */
-               if (multi_timer_check(apic, irq))
-                       continue;
-               else
-                       add_pin_to_irq(irq, apic, pin);
-
-               if (/*!apic &&*/ !IO_APIC_IRQ(irq))
-                       continue;
-
-               if (IO_APIC_IRQ(irq)) {
-                       vector = assign_irq_vector(irq);
-                       entry.vector = vector;
-                       ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-               
-                       if (!apic && (irq < 16))
-                               disable_8259A_irq(irq);
-               }
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-               io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-               set_native_irq_info(irq, TARGET_CPUS);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-       }
-       }
-
-       if (!first_notcon)
-               apic_printk(APIC_VERBOSE, " not connected.\n");
-}
-
-/*
- * Set up the 8259A-master output pin:
- */
-#ifndef CONFIG_XEN
-static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-
-       memset(&entry,0,sizeof(entry));
-
-       disable_8259A_irq(0);
-
-       /* mask LVT0 */
-       apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-
-       /*
-        * We use logical delivery to get the timer IRQ
-        * to the first CPU.
-        */
-       entry.dest_mode = INT_DEST_MODE;
-       entry.mask = 0;                                 /* unmask IRQ now */
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-       entry.delivery_mode = INT_DELIVERY_MODE;
-       entry.polarity = 0;
-       entry.trigger = 0;
-       entry.vector = vector;
-
-       /*
-        * The timer IRQ doesn't have to know that behind the
-        * scene we have a 8259A-master in AEOI mode ...
-        */
-       irq_desc[0].chip = &ioapic_edge_type;
-
-       /*
-        * Add it to the IO-APIC irq-routing table:
-        */
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-       io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       enable_8259A_irq(0);
-}
-
-static inline void UNEXPECTED_IO_APIC(void)
-{
-}
-
-void __init print_IO_APIC(void)
-{
-       int apic, i;
-       union IO_APIC_reg_00 reg_00;
-       union IO_APIC_reg_01 reg_01;
-       union IO_APIC_reg_02 reg_02;
-       union IO_APIC_reg_03 reg_03;
-       unsigned long flags;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
-       for (i = 0; i < nr_ioapics; i++)
-               printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
-                      mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
-
-       /*
-        * We are a bit conservative about what we expect.  We have to
-        * know about every hardware change ASAP.
-        */
-       printk(KERN_INFO "testing the IO APIC.......................\n");
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(apic, 0);
-       reg_01.raw = io_apic_read(apic, 1);
-       if (reg_01.bits.version >= 0x10)
-               reg_02.raw = io_apic_read(apic, 2);
-       if (reg_01.bits.version >= 0x20)
-               reg_03.raw = io_apic_read(apic, 3);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
-       printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
-       printk(KERN_DEBUG ".......    : physical APIC id: %02X\n", reg_00.bits.ID);
-       printk(KERN_DEBUG ".......    : Delivery Type: %X\n", reg_00.bits.delivery_type);
-       printk(KERN_DEBUG ".......    : LTS          : %X\n", reg_00.bits.LTS);
-       if (reg_00.bits.ID >= get_physical_broadcast())
-               UNEXPECTED_IO_APIC();
-       if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
-               UNEXPECTED_IO_APIC();
-
-       printk(KERN_DEBUG ".... register #01: %08X\n", reg_01.raw);
-       printk(KERN_DEBUG ".......     : max redirection entries: %04X\n", reg_01.bits.entries);
-       if (    (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
-               (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
-               (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
-               (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
-               (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
-               (reg_01.bits.entries != 0x2E) &&
-               (reg_01.bits.entries != 0x3F)
-       )
-               UNEXPECTED_IO_APIC();
-
-       printk(KERN_DEBUG ".......     : PRQ implemented: %X\n", reg_01.bits.PRQ);
-       printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.bits.version);
-       if (    (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
-               (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
-               (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
-               (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
-               (reg_01.bits.version != 0x20)    /* Intel P64H (82806 AA) */
-       )
-               UNEXPECTED_IO_APIC();
-       if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
-               UNEXPECTED_IO_APIC();
-
-       /*
-        * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
-        * but the value of reg_02 is read as the previous read register
-        * value, so ignore it if reg_02 == reg_01.
-        */
-       if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
-               printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
-               printk(KERN_DEBUG ".......     : arbitration: %02X\n", reg_02.bits.arbitration);
-               if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
-                       UNEXPECTED_IO_APIC();
-       }
-
-       /*
-        * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
-        * or reg_03, but the value of reg_0[23] is read as the previous read
-        * register value, so ignore it if reg_03 == reg_0[12].
-        */
-       if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
-           reg_03.raw != reg_01.raw) {
-               printk(KERN_DEBUG ".... register #03: %08X\n", reg_03.raw);
-               printk(KERN_DEBUG ".......     : Boot DT    : %X\n", reg_03.bits.boot_DT);
-               if (reg_03.bits.__reserved_1)
-                       UNEXPECTED_IO_APIC();
-       }
-
-       printk(KERN_DEBUG ".... IRQ redirection table:\n");
-
-       printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
-                         " Stat Dest Deli Vect:   \n");
-
-       for (i = 0; i <= reg_01.bits.entries; i++) {
-               struct IO_APIC_route_entry entry;
-
-               spin_lock_irqsave(&ioapic_lock, flags);
-               *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
-               *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               printk(KERN_DEBUG " %02x %03X %02X  ",
-                       i,
-                       entry.dest.logical.logical_dest,
-                       entry.dest.physical.physical_dest
-               );
-
-               printk("%1d    %1d    %1d   %1d   %1d    %1d    %1d    %02X\n",
-                       entry.mask,
-                       entry.trigger,
-                       entry.irr,
-                       entry.polarity,
-                       entry.delivery_status,
-                       entry.dest_mode,
-                       entry.delivery_mode,
-                       entry.vector
-               );
-       }
-       }
-       if (use_pci_vector())
-               printk(KERN_INFO "Using vector-based indexing\n");
-       printk(KERN_DEBUG "IRQ to pin mappings:\n");
-       for (i = 0; i < NR_IRQS; i++) {
-               struct irq_pin_list *entry = irq_2_pin + i;
-               if (entry->pin < 0)
-                       continue;
-               if (use_pci_vector() && !platform_legacy_irq(i))
-                       printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
-               else
-                       printk(KERN_DEBUG "IRQ%d ", i);
-               for (;;) {
-                       printk("-> %d:%d", entry->apic, entry->pin);
-                       if (!entry->next)
-                               break;
-                       entry = irq_2_pin + entry->next;
-               }
-               printk("\n");
-       }
-
-       printk(KERN_INFO ".................................... done.\n");
-
-       return;
-}
-
-#if 0
-
-static void print_APIC_bitfield (int base)
-{
-       unsigned int v;
-       int i, j;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
-       for (i = 0; i < 8; i++) {
-               v = apic_read(base + i*0x10);
-               for (j = 0; j < 32; j++) {
-                       if (v & (1<<j))
-                               printk("1");
-                       else
-                               printk("0");
-               }
-               printk("\n");
-       }
-}
-
-void /*__init*/ print_local_APIC(void * dummy)
-{
-       unsigned int v, ver, maxlvt;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
-               smp_processor_id(), hard_smp_processor_id());
-       v = apic_read(APIC_ID);
-       printk(KERN_INFO "... APIC ID:      %08x (%01x)\n", v, GET_APIC_ID(v));
-       v = apic_read(APIC_LVR);
-       printk(KERN_INFO "... APIC VERSION: %08x\n", v);
-       ver = GET_APIC_VERSION(v);
-       maxlvt = get_maxlvt();
-
-       v = apic_read(APIC_TASKPRI);
-       printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
-
-       if (APIC_INTEGRATED(ver)) {                     /* !82489DX */
-               v = apic_read(APIC_ARBPRI);
-               printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
-                       v & APIC_ARBPRI_MASK);
-               v = apic_read(APIC_PROCPRI);
-               printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
-       }
-
-       v = apic_read(APIC_EOI);
-       printk(KERN_DEBUG "... APIC EOI: %08x\n", v);
-       v = apic_read(APIC_RRR);
-       printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
-       v = apic_read(APIC_LDR);
-       printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
-       v = apic_read(APIC_DFR);
-       printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
-       v = apic_read(APIC_SPIV);
-       printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
-
-       printk(KERN_DEBUG "... APIC ISR field:\n");
-       print_APIC_bitfield(APIC_ISR);
-       printk(KERN_DEBUG "... APIC TMR field:\n");
-       print_APIC_bitfield(APIC_TMR);
-       printk(KERN_DEBUG "... APIC IRR field:\n");
-       print_APIC_bitfield(APIC_IRR);
-
-       if (APIC_INTEGRATED(ver)) {             /* !82489DX */
-               if (maxlvt > 3)         /* Due to the Pentium erratum 3AP. */
-                       apic_write(APIC_ESR, 0);
-               v = apic_read(APIC_ESR);
-               printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
-       }
-
-       v = apic_read(APIC_ICR);
-       printk(KERN_DEBUG "... APIC ICR: %08x\n", v);
-       v = apic_read(APIC_ICR2);
-       printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
-
-       v = apic_read(APIC_LVTT);
-       printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
-
-       if (maxlvt > 3) {                       /* PC is LVT#4. */
-               v = apic_read(APIC_LVTPC);
-               printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
-       }
-       v = apic_read(APIC_LVT0);
-       printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
-       v = apic_read(APIC_LVT1);
-       printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
-
-       if (maxlvt > 2) {                       /* ERR is LVT#3. */
-               v = apic_read(APIC_LVTERR);
-               printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
-       }
-
-       v = apic_read(APIC_TMICT);
-       printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
-       v = apic_read(APIC_TMCCT);
-       printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
-       v = apic_read(APIC_TDCR);
-       printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
-       printk("\n");
-}
-
-void print_all_local_APICs (void)
-{
-       on_each_cpu(print_local_APIC, NULL, 1, 1);
-}
-
-void /*__init*/ print_PIC(void)
-{
-       unsigned int v;
-       unsigned long flags;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "\nprinting PIC contents\n");
-
-       spin_lock_irqsave(&i8259A_lock, flags);
-
-       v = inb(0xa1) << 8 | inb(0x21);
-       printk(KERN_DEBUG "... PIC  IMR: %04x\n", v);
-
-       v = inb(0xa0) << 8 | inb(0x20);
-       printk(KERN_DEBUG "... PIC  IRR: %04x\n", v);
-
-       outb(0x0b,0xa0);
-       outb(0x0b,0x20);
-       v = inb(0xa0) << 8 | inb(0x20);
-       outb(0x0a,0xa0);
-       outb(0x0a,0x20);
-
-       spin_unlock_irqrestore(&i8259A_lock, flags);
-
-       printk(KERN_DEBUG "... PIC  ISR: %04x\n", v);
-
-       v = inb(0x4d1) << 8 | inb(0x4d0);
-       printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
-}
-
-#endif  /*  0  */
-
-#else
-void __init print_IO_APIC(void) { }
-#endif /* !CONFIG_XEN */
-
-static void __init enable_IO_APIC(void)
-{
-       union IO_APIC_reg_01 reg_01;
-       int i8259_apic, i8259_pin;
-       int i, apic;
-       unsigned long flags;
-
-       for (i = 0; i < PIN_MAP_SIZE; i++) {
-               irq_2_pin[i].pin = -1;
-               irq_2_pin[i].next = 0;
-       }
-       if (!pirqs_enabled)
-               for (i = 0; i < MAX_PIRQS; i++)
-                       pirq_entries[i] = -1;
-
-       /*
-        * The number of IO-APIC IRQ registers (== #pins):
-        */
-       for (apic = 0; apic < nr_ioapics; apic++) {
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_01.raw = io_apic_read(apic, 1);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               nr_ioapic_registers[apic] = reg_01.bits.entries+1;
-       }
-       for(apic = 0; apic < nr_ioapics; apic++) {
-               int pin;
-               /* See if any of the pins is in ExtINT mode */
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-                       struct IO_APIC_route_entry entry;
-                       spin_lock_irqsave(&ioapic_lock, flags);
-                       *(((int *)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-                       *(((int *)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-                       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-
-                       /* If the interrupt line is enabled and in ExtInt mode
-                        * I have found the pin where the i8259 is connected.
-                        */
-                       if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
-                               ioapic_i8259.apic = apic;
-                               ioapic_i8259.pin  = pin;
-                               goto found_i8259;
-                       }
-               }
-       }
- found_i8259:
-       /* Look to see what if the MP table has reported the ExtINT */
-       /* If we could not find the appropriate pin by looking at the ioapic
-        * the i8259 probably is not connected the ioapic but give the
-        * mptable a chance anyway.
-        */
-       i8259_pin  = find_isa_irq_pin(0, mp_ExtINT);
-       i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
-       /* Trust the MP table if nothing is setup in the hardware */
-       if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
-               printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
-               ioapic_i8259.pin  = i8259_pin;
-               ioapic_i8259.apic = i8259_apic;
-       }
-       /* Complain if the MP table and the hardware disagree */
-       if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
-               (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
-       {
-               printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
-       }
-
-       /*
-        * Do not trust the IO-APIC being empty at bootup
-        */
-       clear_IO_APIC();
-}
-
-/*
- * Not an __init, needed by the reboot code
- */
-void disable_IO_APIC(void)
-{
-       /*
-        * Clear the IO-APIC before rebooting:
-        */
-       clear_IO_APIC();
-
-#ifndef CONFIG_XEN
-       /*
-        * If the i8259 is routed through an IOAPIC
-        * Put that IOAPIC in virtual wire mode
-        * so legacy interrupts can be delivered.
-        */
-       if (ioapic_i8259.pin != -1) {
-               struct IO_APIC_route_entry entry;
-               unsigned long flags;
-
-               memset(&entry, 0, sizeof(entry));
-               entry.mask            = 0; /* Enabled */
-               entry.trigger         = 0; /* Edge */
-               entry.irr             = 0;
-               entry.polarity        = 0; /* High */
-               entry.delivery_status = 0;
-               entry.dest_mode       = 0; /* Physical */
-               entry.delivery_mode   = dest_ExtINT; /* ExtInt */
-               entry.vector          = 0;
-               entry.dest.physical.physical_dest =
-                                       GET_APIC_ID(apic_read(APIC_ID));
-
-               /*
-                * Add it to the IO-APIC irq-routing table:
-                */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(ioapic_i8259.apic, 0x11+2*ioapic_i8259.pin,
-                       *(((int *)&entry)+1));
-               io_apic_write(ioapic_i8259.apic, 0x10+2*ioapic_i8259.pin,
-                       *(((int *)&entry)+0));
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-       }
-       disconnect_bsp_APIC(ioapic_i8259.pin != -1);
-#endif
-}
-
-/*
- * function to set the IO-APIC physical IDs based on the
- * values stored in the MPC table.
- *
- * by Matt Domsch <Matt_Domsch@dell.com>  Tue Dec 21 12:25:05 CST 1999
- */
-
-#if !defined(CONFIG_XEN) && !defined(CONFIG_X86_NUMAQ)
-static void __init setup_ioapic_ids_from_mpc(void)
-{
-       union IO_APIC_reg_00 reg_00;
-       physid_mask_t phys_id_present_map;
-       int apic;
-       int i;
-       unsigned char old_id;
-       unsigned long flags;
-
-       /*
-        * Don't check I/O APIC IDs for xAPIC systems.  They have
-        * no meaning without the serial APIC bus.
-        */
-       if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-               || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-               return;
-       /*
-        * This is broken; anything with a real cpu count has to
-        * circumvent this idiocy regardless.
-        */
-       phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
-
-       /*
-        * Set the IOAPIC ID to the value stored in the MPC table.
-        */
-       for (apic = 0; apic < nr_ioapics; apic++) {
-
-               /* Read the register 0 value */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_00.raw = io_apic_read(apic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               
-               old_id = mp_ioapics[apic].mpc_apicid;
-
-               if (mp_ioapics[apic].mpc_apicid >= get_physical_broadcast()) {
-                       printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
-                               apic, mp_ioapics[apic].mpc_apicid);
-                       printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
-                               reg_00.bits.ID);
-                       mp_ioapics[apic].mpc_apicid = reg_00.bits.ID;
-               }
-
-               /*
-                * Sanity check, is the ID really free? Every APIC in a
-                * system must have a unique ID or we get lots of nice
-                * 'stuck on smp_invalidate_needed IPI wait' messages.
-                */
-               if (check_apicid_used(phys_id_present_map,
-                                       mp_ioapics[apic].mpc_apicid)) {
-                       printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
-                               apic, mp_ioapics[apic].mpc_apicid);
-                       for (i = 0; i < get_physical_broadcast(); i++)
-                               if (!physid_isset(i, phys_id_present_map))
-                                       break;
-                       if (i >= get_physical_broadcast())
-                               panic("Max APIC ID exceeded!\n");
-                       printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
-                               i);
-                       physid_set(i, phys_id_present_map);
-                       mp_ioapics[apic].mpc_apicid = i;
-               } else {
-                       physid_mask_t tmp;
-                       tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
-                       apic_printk(APIC_VERBOSE, "Setting %d in the "
-                                       "phys_id_present_map\n",
-                                       mp_ioapics[apic].mpc_apicid);
-                       physids_or(phys_id_present_map, phys_id_present_map, tmp);
-               }
-
-
-               /*
-                * We need to adjust the IRQ routing table
-                * if the ID changed.
-                */
-               if (old_id != mp_ioapics[apic].mpc_apicid)
-                       for (i = 0; i < mp_irq_entries; i++)
-                               if (mp_irqs[i].mpc_dstapic == old_id)
-                                       mp_irqs[i].mpc_dstapic
-                                               = mp_ioapics[apic].mpc_apicid;
-
-               /*
-                * Read the right value from the MPC table and
-                * write it into the ID register.
-                */
-               apic_printk(APIC_VERBOSE, KERN_INFO
-                       "...changing IO-APIC physical APIC ID to %d ...",
-                       mp_ioapics[apic].mpc_apicid);
-
-               reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(apic, 0, reg_00.raw);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               /*
-                * Sanity check
-                */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_00.raw = io_apic_read(apic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
-                       printk("could not set ID!\n");
-               else
-                       apic_printk(APIC_VERBOSE, " ok.\n");
-       }
-}
-#else
-static void __init setup_ioapic_ids_from_mpc(void) { }
-#endif
-
-#ifndef CONFIG_XEN
-/*
- * There is a nasty bug in some older SMP boards, their mptable lies
- * about the timer IRQ. We do the following to work around the situation:
- *
- *     - timer IRQ defaults to IO-APIC IRQ
- *     - if this function detects that timer IRQs are defunct, then we fall
- *       back to ISA timer IRQs
- */
-static int __init timer_irq_works(void)
-{
-       unsigned long t1 = jiffies;
-
-       local_irq_enable();
-       /* Let ten ticks pass... */
-       mdelay((10 * 1000) / HZ);
-
-       /*
-        * Expect a few ticks at least, to be sure some possible
-        * glue logic does not lock up after one or two first
-        * ticks in a non-ExtINT mode.  Also the local APIC
-        * might have cached one ExtINT interrupt.  Finally, at
-        * least one tick may be lost due to delays.
-        */
-       if (jiffies - t1 > 4)
-               return 1;
-
-       return 0;
-}
-
-/*
- * In the SMP+IOAPIC case it might happen that there are an unspecified
- * number of pending IRQ events unhandled. These cases are very rare,
- * so we 'resend' these IRQs via IPIs, to the same CPU. It's much
- * better to do it this way as thus we do not have to be aware of
- * 'pending' interrupts in the IRQ path, except at this point.
- */
-/*
- * Edge triggered needs to resend any interrupt
- * that was delayed but this is now handled in the device
- * independent code.
- */
-
-/*
- * Starting up a edge-triggered IO-APIC interrupt is
- * nasty - we need to make sure that we get the edge.
- * If it is already asserted for some reason, we need
- * return 1 to indicate that is was pending.
- *
- * This is not complete - we should be able to fake
- * an edge even if it isn't on the 8259A...
- */
-static unsigned int startup_edge_ioapic_irq(unsigned int irq)
-{
-       int was_pending = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       if (irq < 16) {
-               disable_8259A_irq(irq);
-               if (i8259A_irq_pending(irq))
-                       was_pending = 1;
-       }
-       __unmask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return was_pending;
-}
-
-/*
- * Once we have recorded IRQ_PENDING already, we can mask the
- * interrupt for real. This prevents IRQ storms from unhandled
- * devices.
- */
-static void ack_edge_ioapic_irq(unsigned int irq)
-{
-       move_irq(irq);
-       if ((irq_desc[irq].status & (IRQ_PENDING | IRQ_DISABLED))
-                                       == (IRQ_PENDING | IRQ_DISABLED))
-               mask_IO_APIC_irq(irq);
-       ack_APIC_irq();
-}
-
-/*
- * Level triggered interrupts can just be masked,
- * and shutting down and starting up the interrupt
- * is the same as enabling and disabling them -- except
- * with a startup need to return a "was pending" value.
- *
- * Level triggered interrupts are special because we
- * do not touch any IO-APIC register while handling
- * them. We ack the APIC in the end-IRQ handler, not
- * in the start-IRQ-handler. Protection against reentrance
- * from the same interrupt is still provided, both by the
- * generic IRQ layer and by the fact that an unacked local
- * APIC does not accept IRQs.
- */
-static unsigned int startup_level_ioapic_irq (unsigned int irq)
-{
-       unmask_IO_APIC_irq(irq);
-
-       return 0; /* don't check for pending */
-}
-
-static void end_level_ioapic_irq (unsigned int irq)
-{
-       unsigned long v;
-       int i;
-
-       move_irq(irq);
-/*
- * It appears there is an erratum which affects at least version 0x11
- * of I/O APIC (that's the 82093AA and cores integrated into various
- * chipsets).  Under certain conditions a level-triggered interrupt is
- * erroneously delivered as edge-triggered one but the respective IRR
- * bit gets set nevertheless.  As a result the I/O unit expects an EOI
- * message but it will never arrive and further interrupts are blocked
- * from the source.  The exact reason is so far unknown, but the
- * phenomenon was observed when two consecutive interrupt requests
- * from a given source get delivered to the same CPU and the source is
- * temporarily disabled in between.
- *
- * A workaround is to simulate an EOI message manually.  We achieve it
- * by setting the trigger mode to edge and then to level when the edge
- * trigger mode gets detected in the TMR of a local APIC for a
- * level-triggered interrupt.  We mask the source for the time of the
- * operation to prevent an edge-triggered interrupt escaping meanwhile.
- * The idea is from Manfred Spraul.  --macro
- */
-       i = IO_APIC_VECTOR(irq);
-
-       v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
-
-       ack_APIC_irq();
-
-       if (!(v & (1 << (i & 0x1f)))) {
-               atomic_inc(&irq_mis_count);
-               spin_lock(&ioapic_lock);
-               __mask_and_edge_IO_APIC_irq(irq);
-               __unmask_and_level_IO_APIC_irq(irq);
-               spin_unlock(&ioapic_lock);
-       }
-}
-
-#ifdef CONFIG_PCI_MSI
-static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       return startup_edge_ioapic_irq(irq);
-}
-
-static void ack_edge_ioapic_vector(unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       move_native_irq(vector);
-       ack_edge_ioapic_irq(irq);
-}
-
-static unsigned int startup_level_ioapic_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       return startup_level_ioapic_irq (irq);
-}
-
-static void end_level_ioapic_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       move_native_irq(vector);
-       end_level_ioapic_irq(irq);
-}
-
-static void mask_IO_APIC_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       mask_IO_APIC_irq(irq);
-}
-
-static void unmask_IO_APIC_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       unmask_IO_APIC_irq(irq);
-}
-
-#ifdef CONFIG_SMP
-static void set_ioapic_affinity_vector (unsigned int vector,
-                                       cpumask_t cpu_mask)
-{
-       int irq = vector_to_irq(vector);
-
-       set_native_irq_info(vector, cpu_mask);
-       set_ioapic_affinity_irq(irq, cpu_mask);
-}
-#endif
-#endif
-
-static int ioapic_retrigger(unsigned int irq)
-{
-       send_IPI_self(IO_APIC_VECTOR(irq));
-
-       return 1;
-}
-
-/*
- * Level and edge triggered IO-APIC interrupts need different handling,
- * so we use two separate IRQ descriptors. Edge triggered IRQs can be
- * handled with the level-triggered descriptor, but that one has slightly
- * more overhead. Level-triggered interrupts cannot be handled with the
- * edge-triggered handler, without risking IRQ storms and other ugly
- * races.
- */
-static struct hw_interrupt_type ioapic_edge_type __read_mostly = {
-       .typename       = "IO-APIC-edge",
-       .startup        = startup_edge_ioapic,
-       .shutdown       = shutdown_edge_ioapic,
-       .enable         = enable_edge_ioapic,
-       .disable        = disable_edge_ioapic,
-       .ack            = ack_edge_ioapic,
-       .end            = end_edge_ioapic,
-#ifdef CONFIG_SMP
-       .set_affinity   = set_ioapic_affinity,
-#endif
-       .retrigger      = ioapic_retrigger,
-};
-
-static struct hw_interrupt_type ioapic_level_type __read_mostly = {
-       .typename       = "IO-APIC-level",
-       .startup        = startup_level_ioapic,
-       .shutdown       = shutdown_level_ioapic,
-       .enable         = enable_level_ioapic,
-       .disable        = disable_level_ioapic,
-       .ack            = mask_and_ack_level_ioapic,
-       .end            = end_level_ioapic,
-#ifdef CONFIG_SMP
-       .set_affinity   = set_ioapic_affinity,
-#endif
-       .retrigger      = ioapic_retrigger,
-};
-#endif /* !CONFIG_XEN */
-
-static inline void init_IO_APIC_traps(void)
-{
-       int irq;
-
-       /*
-        * NOTE! The local APIC isn't very good at handling
-        * multiple interrupts at the same interrupt level.
-        * As the interrupt level is determined by taking the
-        * vector number and shifting that right by 4, we
-        * want to spread these out a bit so that they don't
-        * all fall in the same interrupt level.
-        *
-        * Also, we've got to be careful not to trash gate
-        * 0x80, because int 0x80 is hm, kind of importantish. ;)
-        */
-       for (irq = 0; irq < NR_IRQS ; irq++) {
-               int tmp = irq;
-               if (use_pci_vector()) {
-                       if (!platform_legacy_irq(tmp))
-                               if ((tmp = vector_to_irq(tmp)) == -1)
-                                       continue;
-               }
-               if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
-                       /*
-                        * Hmm.. We don't have an entry for this,
-                        * so default to an old-fashioned 8259
-                        * interrupt if we can..
-                        */
-                       if (irq < 16)
-                               make_8259A_irq(irq);
-#ifndef CONFIG_XEN
-                       else
-                               /* Strange. Oh, well.. */
-                               irq_desc[irq].chip = &no_irq_type;
-#endif
-               }
-       }
-}
-
-#ifndef CONFIG_XEN
-static void enable_lapic_irq (unsigned int irq)
-{
-       unsigned long v;
-
-       v = apic_read(APIC_LVT0);
-       apic_write_around(APIC_LVT0, v & ~APIC_LVT_MASKED);
-}
-
-static void disable_lapic_irq (unsigned int irq)
-{
-       unsigned long v;
-
-       v = apic_read(APIC_LVT0);
-       apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED);
-}
-
-static void ack_lapic_irq (unsigned int irq)
-{
-       ack_APIC_irq();
-}
-
-static void end_lapic_irq (unsigned int i) { /* nothing */ }
-
-static struct hw_interrupt_type lapic_irq_type __read_mostly = {
-       .typename       = "local-APIC-edge",
-       .startup        = NULL, /* startup_irq() not used for IRQ0 */
-       .shutdown       = NULL, /* shutdown_irq() not used for IRQ0 */
-       .enable         = enable_lapic_irq,
-       .disable        = disable_lapic_irq,
-       .ack            = ack_lapic_irq,
-       .end            = end_lapic_irq
-};
-
-static void setup_nmi (void)
-{
-       /*
-        * Dirty trick to enable the NMI watchdog ...
-        * We put the 8259A master into AEOI mode and
-        * unmask on all local APICs LVT0 as NMI.
-        *
-        * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire')
-        * is from Maciej W. Rozycki - so we do not have to EOI from
-        * the NMI handler or the timer interrupt.
-        */ 
-       apic_printk(APIC_VERBOSE, KERN_INFO "activating NMI Watchdog ...");
-
-       on_each_cpu(enable_NMI_through_LVT0, NULL, 1, 1);
-
-       apic_printk(APIC_VERBOSE, " done.\n");
-}
-
-/*
- * This looks a bit hackish but it's about the only one way of sending
- * a few INTA cycles to 8259As and any associated glue logic.  ICR does
- * not support the ExtINT mode, unfortunately.  We need to send these
- * cycles as some i82489DX-based boards have glue logic that keeps the
- * 8259A interrupt line asserted until INTA.  --macro
- */
-static inline void unlock_ExtINT_logic(void)
-{
-       int apic, pin, i;
-       struct IO_APIC_route_entry entry0, entry1;
-       unsigned char save_control, save_freq_select;
-       unsigned long flags;
-
-       pin  = find_isa_irq_pin(8, mp_INT);
-       apic = find_isa_irq_apic(8, mp_INT);
-       if (pin == -1)
-               return;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       *(((int *)&entry0) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-       *(((int *)&entry0) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-       clear_IO_APIC_pin(apic, pin);
-
-       memset(&entry1, 0, sizeof(entry1));
-
-       entry1.dest_mode = 0;                   /* physical delivery */
-       entry1.mask = 0;                        /* unmask IRQ now */
-       entry1.dest.physical.physical_dest = hard_smp_processor_id();
-       entry1.delivery_mode = dest_ExtINT;
-       entry1.polarity = entry0.polarity;
-       entry1.trigger = 0;
-       entry1.vector = 0;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry1) + 1));
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry1) + 0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       save_control = CMOS_READ(RTC_CONTROL);
-       save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
-       CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
-                  RTC_FREQ_SELECT);
-       CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
-
-       i = 100;
-       while (i-- > 0) {
-               mdelay(10);
-               if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
-                       i -= 10;
-       }
-
-       CMOS_WRITE(save_control, RTC_CONTROL);
-       CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-       clear_IO_APIC_pin(apic, pin);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry0) + 1));
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry0) + 0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-int timer_uses_ioapic_pin_0;
-
-/*
- * This code may look a bit paranoid, but it's supposed to cooperate with
- * a wide range of boards and BIOS bugs.  Fortunately only the timer IRQ
- * is so screwy.  Thanks to Brian Perkins for testing/hacking this beast
- * fanatically on his truly buggy board.
- */
-static inline void check_timer(void)
-{
-       int apic1, pin1, apic2, pin2;
-       int vector;
-
-       /*
-        * get/set the timer IRQ vector:
-        */
-       disable_8259A_irq(0);
-       vector = assign_irq_vector(0);
-       set_intr_gate(vector, interrupt[0]);
-
-       /*
-        * Subtle, code in do_timer_interrupt() expects an AEOI
-        * mode for the 8259A whenever interrupts are routed
-        * through I/O APICs.  Also IRQ0 has to be enabled in
-        * the 8259A which implies the virtual wire has to be
-        * disabled in the local APIC.
-        */
-       apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-       init_8259A(1);
-       timer_ack = 1;
-       if (timer_over_8254 > 0)
-               enable_8259A_irq(0);
-
-       pin1  = find_isa_irq_pin(0, mp_INT);
-       apic1 = find_isa_irq_apic(0, mp_INT);
-       pin2  = ioapic_i8259.pin;
-       apic2 = ioapic_i8259.apic;
-
-       if (pin1 == 0)
-               timer_uses_ioapic_pin_0 = 1;
-
-       printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
-               vector, apic1, pin1, apic2, pin2);
-
-       if (pin1 != -1) {
-               /*
-                * Ok, does IRQ0 through the IOAPIC work?
-                */
-               unmask_IO_APIC_irq(0);
-               if (timer_irq_works()) {
-                       if (nmi_watchdog == NMI_IO_APIC) {
-                               disable_8259A_irq(0);
-                               setup_nmi();
-                               enable_8259A_irq(0);
-                       }
-                       if (disable_timer_pin_1 > 0)
-                               clear_IO_APIC_pin(0, pin1);
-                       return;
-               }
-               clear_IO_APIC_pin(apic1, pin1);
-               printk(KERN_ERR "..MP-BIOS bug: 8254 timer not connected to "
-                               "IO-APIC\n");
-       }
-
-       printk(KERN_INFO "...trying to set up timer (IRQ0) through the 8259A ... ");
-       if (pin2 != -1) {
-               printk("\n..... (found pin %d) ...", pin2);
-               /*
-                * legacy devices should be connected to IO APIC #0
-                */
-               setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
-               if (timer_irq_works()) {
-                       printk("works.\n");
-                       if (pin1 != -1)
-                               replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
-                       else
-                               add_pin_to_irq(0, apic2, pin2);
-                       if (nmi_watchdog == NMI_IO_APIC) {
-                               setup_nmi();
-                       }
-                       return;
-               }
-               /*
-                * Cleanup, just in case ...
-                */
-               clear_IO_APIC_pin(apic2, pin2);
-       }
-       printk(" failed.\n");
-
-       if (nmi_watchdog == NMI_IO_APIC) {
-               printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
-               nmi_watchdog = 0;
-       }
-
-       printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
-
-       disable_8259A_irq(0);
-       irq_desc[0].chip = &lapic_irq_type;
-       apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector);   /* Fixed mode */
-       enable_8259A_irq(0);
-
-       if (timer_irq_works()) {
-               printk(" works.\n");
-               return;
-       }
-       apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
-       printk(" failed.\n");
-
-       printk(KERN_INFO "...trying to set up timer as ExtINT IRQ...");
-
-       timer_ack = 0;
-       init_8259A(0);
-       make_8259A_irq(0);
-       apic_write_around(APIC_LVT0, APIC_DM_EXTINT);
-
-       unlock_ExtINT_logic();
-
-       if (timer_irq_works()) {
-               printk(" works.\n");
-               return;
-       }
-       printk(" failed :(.\n");
-       panic("IO-APIC + timer doesn't work!  Boot with apic=debug and send a "
-               "report.  Then try booting with the 'noapic' option");
-}
-#else
-int timer_uses_ioapic_pin_0 = 0;
-#define check_timer() ((void)0)
-#endif
-
-/*
- *
- * IRQ's that are handled by the PIC in the MPS IOAPIC case.
- * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
- *   Linux doesn't really care, as it's not actually used
- *   for any interrupt handling anyway.
- */
-#define PIC_IRQS       (1 << PIC_CASCADE_IR)
-
-void __init setup_IO_APIC(void)
-{
-       enable_IO_APIC();
-
-       if (acpi_ioapic)
-               io_apic_irqs = ~0;      /* all IRQs go through IOAPIC */
-       else
-               io_apic_irqs = ~PIC_IRQS;
-
-       printk("ENABLING IO-APIC IRQs\n");
-
-       /*
-        * Set up IO-APIC IRQ routing.
-        */
-       if (!acpi_ioapic)
-               setup_ioapic_ids_from_mpc();
-#ifndef CONFIG_XEN
-       sync_Arb_IDs();
-#endif
-       setup_IO_APIC_irqs();
-       init_IO_APIC_traps();
-       check_timer();
-       if (!acpi_ioapic)
-               print_IO_APIC();
-}
-
-static int __init setup_disable_8254_timer(char *s)
-{
-       timer_over_8254 = -1;
-       return 1;
-}
-static int __init setup_enable_8254_timer(char *s)
-{
-       timer_over_8254 = 2;
-       return 1;
-}
-
-__setup("disable_8254_timer", setup_disable_8254_timer);
-__setup("enable_8254_timer", setup_enable_8254_timer);
-
-/*
- *     Called after all the initialization is done. If we didnt find any
- *     APIC bugs then we can allow the modify fast path
- */
-static int __init io_apic_bug_finalize(void)
-{
-       if(sis_apic_bug == -1)
-               sis_apic_bug = 0;
-       if (is_initial_xendomain()) {
-               struct xen_platform_op op = { .cmd = XENPF_platform_quirk };
-               op.u.platform_quirk.quirk_id = sis_apic_bug ?
-                       QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
-               HYPERVISOR_platform_op(&op);
-       }
-       return 0;
-}
-
-late_initcall(io_apic_bug_finalize);
-
-struct sysfs_ioapic_data {
-       struct sys_device dev;
-       struct IO_APIC_route_entry entry[0];
-};
-static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
-
-static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
-{
-       struct IO_APIC_route_entry *entry;
-       struct sysfs_ioapic_data *data;
-       unsigned long flags;
-       int i;
-       
-       data = container_of(dev, struct sysfs_ioapic_data, dev);
-       entry = data->entry;
-       spin_lock_irqsave(&ioapic_lock, flags);
-       for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-               *(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i);
-               *(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i);
-       }
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-static int ioapic_resume(struct sys_device *dev)
-{
-       struct IO_APIC_route_entry *entry;
-       struct sysfs_ioapic_data *data;
-       unsigned long flags;
-       union IO_APIC_reg_00 reg_00;
-       int i;
-       
-       data = container_of(dev, struct sysfs_ioapic_data, dev);
-       entry = data->entry;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(dev->id, 0);
-       if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
-               reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
-               io_apic_write(dev->id, 0, reg_00.raw);
-       }
-       for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-               io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1));
-               io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0));
-       }
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-static struct sysdev_class ioapic_sysdev_class = {
-       set_kset_name("ioapic"),
-       .suspend = ioapic_suspend,
-       .resume = ioapic_resume,
-};
-
-static int __init ioapic_init_sysfs(void)
-{
-       struct sys_device * dev;
-       int i, size, error = 0;
-
-       error = sysdev_class_register(&ioapic_sysdev_class);
-       if (error)
-               return error;
-
-       for (i = 0; i < nr_ioapics; i++ ) {
-               size = sizeof(struct sys_device) + nr_ioapic_registers[i] 
-                       * sizeof(struct IO_APIC_route_entry);
-               mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
-               if (!mp_ioapic_data[i]) {
-                       printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-                       continue;
-               }
-               memset(mp_ioapic_data[i], 0, size);
-               dev = &mp_ioapic_data[i]->dev;
-               dev->id = i; 
-               dev->cls = &ioapic_sysdev_class;
-               error = sysdev_register(dev);
-               if (error) {
-                       kfree(mp_ioapic_data[i]);
-                       mp_ioapic_data[i] = NULL;
-                       printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-                       continue;
-               }
-       }
-
-       return 0;
-}
-
-device_initcall(ioapic_init_sysfs);
-
-/* --------------------------------------------------------------------------
-                          ACPI-based IOAPIC Configuration
-   -------------------------------------------------------------------------- */
-
-#ifdef CONFIG_ACPI
-
-int __init io_apic_get_unique_id (int ioapic, int apic_id)
-{
-#ifndef CONFIG_XEN
-       union IO_APIC_reg_00 reg_00;
-       static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
-       physid_mask_t tmp;
-       unsigned long flags;
-       int i = 0;
-
-       /*
-        * The P4 platform supports up to 256 APIC IDs on two separate APIC 
-        * buses (one for LAPICs, one for IOAPICs), where predecessors only 
-        * supports up to 16 on one shared APIC bus.
-        * 
-        * TBD: Expand LAPIC/IOAPIC support on P4-class systems to take full
-        *      advantage of new APIC bus architecture.
-        */
-
-       if (physids_empty(apic_id_map))
-               apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(ioapic, 0);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       if (apic_id >= get_physical_broadcast()) {
-               printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
-                       "%d\n", ioapic, apic_id, reg_00.bits.ID);
-               apic_id = reg_00.bits.ID;
-       }
-
-       /*
-        * Every APIC in a system must have a unique ID or we get lots of nice 
-        * 'stuck on smp_invalidate_needed IPI wait' messages.
-        */
-       if (check_apicid_used(apic_id_map, apic_id)) {
-
-               for (i = 0; i < get_physical_broadcast(); i++) {
-                       if (!check_apicid_used(apic_id_map, i))
-                               break;
-               }
-
-               if (i == get_physical_broadcast())
-                       panic("Max apic_id exceeded!\n");
-
-               printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
-                       "trying %d\n", ioapic, apic_id, i);
-
-               apic_id = i;
-       } 
-
-       tmp = apicid_to_cpu_present(apic_id);
-       physids_or(apic_id_map, apic_id_map, tmp);
-
-       if (reg_00.bits.ID != apic_id) {
-               reg_00.bits.ID = apic_id;
-
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(ioapic, 0, reg_00.raw);
-               reg_00.raw = io_apic_read(ioapic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               /* Sanity check */
-               if (reg_00.bits.ID != apic_id) {
-                       printk("IOAPIC[%d]: Unable to change apic_id!\n", ioapic);
-                       return -1;
-               }
-       }
-
-       apic_printk(APIC_VERBOSE, KERN_INFO
-                       "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
-#endif /* !CONFIG_XEN */
-
-       return apic_id;
-}
-
-
-int __init io_apic_get_version (int ioapic)
-{
-       union IO_APIC_reg_01    reg_01;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_01.raw = io_apic_read(ioapic, 1);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return reg_01.bits.version;
-}
-
-
-int __init io_apic_get_redir_entries (int ioapic)
-{
-       union IO_APIC_reg_01    reg_01;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_01.raw = io_apic_read(ioapic, 1);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return reg_01.bits.entries;
-}
-
-
-int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-
-       if (!IO_APIC_IRQ(irq)) {
-               printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
-                       ioapic);
-               return -EINVAL;
-       }
-
-       /*
-        * Generate a PCI IRQ routing entry and program the IOAPIC accordingly.
-        * Note that we mask (disable) IRQs now -- these get enabled when the
-        * corresponding device driver registers for this IRQ.
-        */
-
-       memset(&entry,0,sizeof(entry));
-
-       entry.delivery_mode = INT_DELIVERY_MODE;
-       entry.dest_mode = INT_DEST_MODE;
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-       entry.trigger = edge_level;
-       entry.polarity = active_high_low;
-       entry.mask  = 1;
-
-       /*
-        * IRQs < 16 are already in the irq_2_pin[] map
-        */
-       if (irq >= 16)
-               add_pin_to_irq(irq, ioapic, pin);
-
-       entry.vector = assign_irq_vector(irq);
-
-       apic_printk(APIC_DEBUG, KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry "
-               "(%d-%d -> 0x%x -> IRQ %d Mode:%i Active:%i)\n", ioapic,
-               mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
-               edge_level, active_high_low);
-
-       ioapic_register_intr(irq, entry.vector, edge_level);
-
-       if (!ioapic && (irq < 16))
-               disable_8259A_irq(irq);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
-       io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
-       set_native_irq_info(use_pci_vector() ? entry.vector : irq, TARGET_CPUS);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-#endif /* CONFIG_ACPI */
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/ioport-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/ioport-xen.c
deleted file mode 100644 (file)
index 1f70421..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *     linux/arch/i386/kernel/ioport.c
- *
- * This contains the io-permission bitmap code - written by obz, with changes
- * by Linus.
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/capability.h>
-#include <linux/errno.h>
-#include <linux/types.h>
-#include <linux/ioport.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/stddef.h>
-#include <linux/slab.h>
-#include <linux/thread_info.h>
-#include <xen/interface/physdev.h>
-
-/* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
-static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
-{
-       unsigned long mask;
-       unsigned long *bitmap_base = bitmap + (base / BITS_PER_LONG);
-       unsigned int low_index = base & (BITS_PER_LONG-1);
-       int length = low_index + extent;
-
-       if (low_index != 0) {
-               mask = (~0UL << low_index);
-               if (length < BITS_PER_LONG)
-                       mask &= ~(~0UL << length);
-               if (new_value)
-                       *bitmap_base++ |= mask;
-               else
-                       *bitmap_base++ &= ~mask;
-               length -= BITS_PER_LONG;
-       }
-
-       mask = (new_value ? ~0UL : 0UL);
-       while (length >= BITS_PER_LONG) {
-               *bitmap_base++ = mask;
-               length -= BITS_PER_LONG;
-       }
-
-       if (length > 0) {
-               mask = ~(~0UL << length);
-               if (new_value)
-                       *bitmap_base++ |= mask;
-               else
-                       *bitmap_base++ &= ~mask;
-       }
-}
-
-
-/*
- * this changes the io permissions bitmap in the current task.
- */
-asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-{
-       struct thread_struct * t = &current->thread;
-       unsigned long *bitmap;
-       struct physdev_set_iobitmap set_iobitmap;
-
-       if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
-               return -EINVAL;
-       if (turn_on && !capable(CAP_SYS_RAWIO))
-               return -EPERM;
-
-       /*
-        * If it's the first ioperm() call in this thread's lifetime, set the
-        * IO bitmap up. ioperm() is much less timing critical than clone(),
-        * this is why we delay this operation until now:
-        */
-       if (!t->io_bitmap_ptr) {
-               bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-               if (!bitmap)
-                       return -ENOMEM;
-
-               memset(bitmap, 0xff, IO_BITMAP_BYTES);
-               t->io_bitmap_ptr = bitmap;
-               set_thread_flag(TIF_IO_BITMAP);
-
-               set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
-               set_iobitmap.nr_ports = IO_BITMAP_BITS;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
-       }
-
-       set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
-
-       return 0;
-}
-
-/*
- * sys_iopl has to be used when you want to access the IO ports
- * beyond the 0x3ff range: to get the full 65536 ports bitmapped
- * you'd need 8kB of bitmaps/process, which is a bit excessive.
- *
- * Here we just change the eflags value on the stack: we allow
- * only the super-user to do it. This depends on the stack-layout
- * on system-call entry - see also fork() and the signal handling
- * code.
- */
-
-asmlinkage long sys_iopl(unsigned long unused)
-{
-       volatile struct pt_regs * regs = (struct pt_regs *) &unused;
-       unsigned int level = regs->ebx;
-       struct thread_struct *t = &current->thread;
-       unsigned int old = (t->iopl >> 12) & 3;
-
-       if (level > 3)
-               return -EINVAL;
-       /* Trying to gain more privileges? */
-       if (level > old) {
-               if (!capable(CAP_SYS_RAWIO))
-                       return -EPERM;
-       }
-       t->iopl = level << 12;
-       set_iopl_mask(t->iopl);
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c
deleted file mode 100644 (file)
index a72fcdf..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *     linux/arch/i386/kernel/irq.c
- *
- *     Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
- *
- * This file contains the lowest level x86-specific interrupt
- * entry, irq-stacks and irq statistics code. All the remaining
- * irq logic is done by the generic kernel/irq/ code and
- * by the x86-specific irq controller code. (e.g. i8259.c and
- * io_apic.c.)
- */
-
-#include <asm/uaccess.h>
-#include <linux/module.h>
-#include <linux/seq_file.h>
-#include <linux/interrupt.h>
-#include <linux/kernel_stat.h>
-#include <linux/notifier.h>
-#include <linux/cpu.h>
-#include <linux/delay.h>
-
-DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
-EXPORT_PER_CPU_SYMBOL(irq_stat);
-
-#ifndef CONFIG_X86_LOCAL_APIC
-/*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
- */
-void ack_bad_irq(unsigned int irq)
-{
-       printk("unexpected IRQ trap at vector %02x\n", irq);
-}
-#endif
-
-#ifdef CONFIG_4KSTACKS
-/*
- * per-CPU IRQ handling contexts (thread information and stack)
- */
-union irq_ctx {
-       struct thread_info      tinfo;
-       u32                     stack[THREAD_SIZE/sizeof(u32)];
-};
-
-static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
-static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
-#endif
-
-/*
- * do_IRQ handles all normal device IRQ's (the special
- * SMP cross-CPU interrupts have their own specific
- * handlers).
- */
-fastcall unsigned int do_IRQ(struct pt_regs *regs)
-{      
-       /* high bit used in ret_from_ code */
-       int irq = ~regs->orig_eax;
-#ifdef CONFIG_4KSTACKS
-       union irq_ctx *curctx, *irqctx;
-       u32 *isp;
-#endif
-
-       if (unlikely((unsigned)irq >= NR_IRQS)) {
-               printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
-                                       __FUNCTION__, irq);
-               BUG();
-       }
-
-       irq_enter();
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
-       /* Debugging check for stack overflow: is there less than 1KB free? */
-       {
-               long esp;
-
-               __asm__ __volatile__("andl %%esp,%0" :
-                                       "=r" (esp) : "0" (THREAD_SIZE - 1));
-               if (unlikely(esp < (sizeof(struct thread_info) + STACK_WARN))) {
-                       printk("do_IRQ: stack overflow: %ld\n",
-                               esp - sizeof(struct thread_info));
-                       dump_stack();
-               }
-       }
-#endif
-
-#ifdef CONFIG_4KSTACKS
-
-       curctx = (union irq_ctx *) current_thread_info();
-       irqctx = hardirq_ctx[smp_processor_id()];
-
-       /*
-        * this is where we switch to the IRQ stack. However, if we are
-        * already using the IRQ stack (because we interrupted a hardirq
-        * handler) we can't do that and just have to keep using the
-        * current stack (which is the irq stack already after all)
-        */
-       if (curctx != irqctx) {
-               int arg1, arg2, ebx;
-
-               /* build the stack frame on the IRQ stack */
-               isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
-               irqctx->tinfo.task = curctx->tinfo.task;
-               irqctx->tinfo.previous_esp = current_stack_pointer;
-
-               /*
-                * Copy the softirq bits in preempt_count so that the
-                * softirq checks work in the hardirq context.
-                */
-               irqctx->tinfo.preempt_count =
-                       (irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) |
-                       (curctx->tinfo.preempt_count & SOFTIRQ_MASK);
-
-               asm volatile(
-                       "       xchgl   %%ebx,%%esp      \n"
-                       "       call    __do_IRQ         \n"
-                       "       movl   %%ebx,%%esp      \n"
-                       : "=a" (arg1), "=d" (arg2), "=b" (ebx)
-                       :  "0" (irq),   "1" (regs),  "2" (isp)
-                       : "memory", "cc", "ecx"
-               );
-       } else
-#endif
-               __do_IRQ(irq, regs);
-
-       irq_exit();
-
-       return 1;
-}
-
-#ifdef CONFIG_4KSTACKS
-
-/*
- * These should really be __section__(".bss.page_aligned") as well, but
- * gcc's 3.0 and earlier don't handle that correctly.
- */
-static char softirq_stack[NR_CPUS * THREAD_SIZE]
-               __attribute__((__aligned__(THREAD_SIZE)));
-
-static char hardirq_stack[NR_CPUS * THREAD_SIZE]
-               __attribute__((__aligned__(THREAD_SIZE)));
-
-/*
- * allocate per-cpu stacks for hardirq and for softirq processing
- */
-void irq_ctx_init(int cpu)
-{
-       union irq_ctx *irqctx;
-
-       if (hardirq_ctx[cpu])
-               return;
-
-       irqctx = (union irq_ctx*) &hardirq_stack[cpu*THREAD_SIZE];
-       irqctx->tinfo.task              = NULL;
-       irqctx->tinfo.exec_domain       = NULL;
-       irqctx->tinfo.cpu               = cpu;
-       irqctx->tinfo.preempt_count     = HARDIRQ_OFFSET;
-       irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
-
-       hardirq_ctx[cpu] = irqctx;
-
-       irqctx = (union irq_ctx*) &softirq_stack[cpu*THREAD_SIZE];
-       irqctx->tinfo.task              = NULL;
-       irqctx->tinfo.exec_domain       = NULL;
-       irqctx->tinfo.cpu               = cpu;
-       irqctx->tinfo.preempt_count     = 0;
-       irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
-
-       softirq_ctx[cpu] = irqctx;
-
-       printk("CPU %u irqstacks, hard=%p soft=%p\n",
-               cpu,hardirq_ctx[cpu],softirq_ctx[cpu]);
-}
-
-void irq_ctx_exit(int cpu)
-{
-       hardirq_ctx[cpu] = NULL;
-}
-
-extern asmlinkage void __do_softirq(void);
-
-asmlinkage void do_softirq(void)
-{
-       unsigned long flags;
-       struct thread_info *curctx;
-       union irq_ctx *irqctx;
-       u32 *isp;
-
-       if (in_interrupt())
-               return;
-
-       local_irq_save(flags);
-
-       if (local_softirq_pending()) {
-               curctx = current_thread_info();
-               irqctx = softirq_ctx[smp_processor_id()];
-               irqctx->tinfo.task = curctx->task;
-               irqctx->tinfo.previous_esp = current_stack_pointer;
-
-               /* build the stack frame on the softirq stack */
-               isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
-
-               asm volatile(
-                       "       xchgl   %%ebx,%%esp     \n"
-                       "       call    __do_softirq    \n"
-                       "       movl    %%ebx,%%esp     \n"
-                       : "=b"(isp)
-                       : "0"(isp)
-                       : "memory", "cc", "edx", "ecx", "eax"
-               );
-               /*
-                * Shouldnt happen, we returned above if in_interrupt():
-                */
-               WARN_ON_ONCE(softirq_count());
-       }
-
-       local_irq_restore(flags);
-}
-
-EXPORT_SYMBOL(do_softirq);
-#endif
-
-/*
- * Interrupt statistics:
- */
-
-atomic_t irq_err_count;
-
-/*
- * /proc/interrupts printing:
- */
-
-int show_interrupts(struct seq_file *p, void *v)
-{
-       int i = *(loff_t *) v, j;
-       struct irqaction * action;
-       unsigned long flags;
-
-       if (i == 0) {
-               seq_printf(p, "           ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "CPU%-8d",j);
-               seq_putc(p, '\n');
-       }
-
-       if (i < NR_IRQS) {
-               spin_lock_irqsave(&irq_desc[i].lock, flags);
-               action = irq_desc[i].action;
-               if (!action)
-                       goto skip;
-               seq_printf(p, "%3d: ",i);
-#ifndef CONFIG_SMP
-               seq_printf(p, "%10u ", kstat_irqs(i));
-#else
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
-#endif
-               seq_printf(p, " %14s", irq_desc[i].chip->typename);
-               seq_printf(p, "  %s", action->name);
-
-               for (action=action->next; action; action = action->next)
-                       seq_printf(p, ", %s", action->name);
-
-               seq_putc(p, '\n');
-skip:
-               spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-       } else if (i == NR_IRQS) {
-               seq_printf(p, "NMI: ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", nmi_count(j));
-               seq_putc(p, '\n');
-#ifdef CONFIG_X86_LOCAL_APIC
-               seq_printf(p, "LOC: ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ",
-                               per_cpu(irq_stat,j).apic_timer_irqs);
-               seq_putc(p, '\n');
-#endif
-               seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-#if defined(CONFIG_X86_IO_APIC)
-               seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-#endif
-       }
-       return 0;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-
-void fixup_irqs(cpumask_t map)
-{
-       unsigned int irq;
-       static int warned;
-
-       for (irq = 0; irq < NR_IRQS; irq++) {
-               cpumask_t mask;
-               if (irq == 2)
-                       continue;
-
-               cpus_and(mask, irq_desc[irq].affinity, map);
-               if (any_online_cpu(mask) == NR_CPUS) {
-                       /*printk("Breaking affinity for irq %i\n", irq);*/
-                       mask = map;
-               }
-               if (irq_desc[irq].chip->set_affinity)
-                       irq_desc[irq].chip->set_affinity(irq, mask);
-               else if (irq_desc[irq].action && !(warned++))
-                       printk("Cannot set affinity for irq %i\n", irq);
-       }
-
-#if 0
-       barrier();
-       /* Ingo Molnar says: "after the IO-APIC masks have been redirected
-          [note the nop - the interrupt-enable boundary on x86 is two
-          instructions from sti] - to flush out pending hardirqs and
-          IPIs. After this point nothing is supposed to reach this CPU." */
-       __asm__ __volatile__("sti; nop; cli");
-       barrier();
-#else
-       /* That doesn't seem sufficient.  Give it 1ms. */
-       local_irq_enable();
-       mdelay(1);
-       local_irq_disable();
-#endif
-}
-#endif
-
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/ldt-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/ldt-xen.c
deleted file mode 100644 (file)
index d2cceff..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * linux/kernel/ldt.c
- *
- * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/vmalloc.h>
-#include <linux/slab.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/ldt.h>
-#include <asm/desc.h>
-#include <asm/mmu_context.h>
-
-#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
-static void flush_ldt(void *null)
-{
-       if (current->active_mm)
-               load_LDT(&current->active_mm->context);
-}
-#endif
-
-static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
-{
-       void *oldldt;
-       void *newldt;
-       int oldsize;
-
-       if (mincount <= pc->size)
-               return 0;
-       oldsize = pc->size;
-       mincount = (mincount+511)&(~511);
-       if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-               newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-       else
-               newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
-
-       if (!newldt)
-               return -ENOMEM;
-
-       if (oldsize)
-               memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-       oldldt = pc->ldt;
-       memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-       pc->ldt = newldt;
-       wmb();
-       pc->size = mincount;
-       wmb();
-
-       if (reload) {
-#ifdef CONFIG_SMP
-               cpumask_t mask;
-               preempt_disable();
-#endif
-               make_pages_readonly(
-                       pc->ldt,
-                       (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               load_LDT(pc);
-#ifdef CONFIG_SMP
-               mask = cpumask_of_cpu(smp_processor_id());
-               if (!cpus_equal(current->mm->cpu_vm_mask, mask))
-                       smp_call_function(flush_ldt, NULL, 1, 1);
-               preempt_enable();
-#endif
-       }
-       if (oldsize) {
-               make_pages_writable(
-                       oldldt,
-                       (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-                       vfree(oldldt);
-               else
-                       kfree(oldldt);
-       }
-       return 0;
-}
-
-static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
-{
-       int err = alloc_ldt(new, old->size, 0);
-       if (err < 0)
-               return err;
-       memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
-       make_pages_readonly(
-               new->ldt,
-               (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-               XENFEAT_writable_descriptor_tables);
-       return 0;
-}
-
-/*
- * we do not have to muck with descriptors here, that is
- * done in switch_mm() as needed.
- */
-int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-{
-       struct mm_struct * old_mm;
-       int retval = 0;
-
-       init_MUTEX(&mm->context.sem);
-       mm->context.size = 0;
-       mm->context.has_foreign_mappings = 0;
-       old_mm = current->mm;
-       if (old_mm && old_mm->context.size > 0) {
-               down(&old_mm->context.sem);
-               retval = copy_ldt(&mm->context, &old_mm->context);
-               up(&old_mm->context.sem);
-       }
-       return retval;
-}
-
-/*
- * No need to lock the MM as we are the last user
- */
-void destroy_context(struct mm_struct *mm)
-{
-       if (mm->context.size) {
-               if (mm == current->active_mm)
-                       clear_LDT();
-               make_pages_writable(
-                       mm->context.ldt,
-                       (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-                       vfree(mm->context.ldt);
-               else
-                       kfree(mm->context.ldt);
-               mm->context.size = 0;
-       }
-}
-
-static int read_ldt(void __user * ptr, unsigned long bytecount)
-{
-       int err;
-       unsigned long size;
-       struct mm_struct * mm = current->mm;
-
-       if (!mm->context.size)
-               return 0;
-       if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
-               bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
-
-       down(&mm->context.sem);
-       size = mm->context.size*LDT_ENTRY_SIZE;
-       if (size > bytecount)
-               size = bytecount;
-
-       err = 0;
-       if (copy_to_user(ptr, mm->context.ldt, size))
-               err = -EFAULT;
-       up(&mm->context.sem);
-       if (err < 0)
-               goto error_return;
-       if (size != bytecount) {
-               /* zero-fill the rest */
-               if (clear_user(ptr+size, bytecount-size) != 0) {
-                       err = -EFAULT;
-                       goto error_return;
-               }
-       }
-       return bytecount;
-error_return:
-       return err;
-}
-
-static int read_default_ldt(void __user * ptr, unsigned long bytecount)
-{
-       int err;
-       unsigned long size;
-       void *address;
-
-       err = 0;
-       address = &default_ldt[0];
-       size = 5*sizeof(struct desc_struct);
-       if (size > bytecount)
-               size = bytecount;
-
-       err = size;
-       if (copy_to_user(ptr, address, size))
-               err = -EFAULT;
-
-       return err;
-}
-
-static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode)
-{
-       struct mm_struct * mm = current->mm;
-       __u32 entry_1, entry_2;
-       int error;
-       struct user_desc ldt_info;
-
-       error = -EINVAL;
-       if (bytecount != sizeof(ldt_info))
-               goto out;
-       error = -EFAULT;        
-       if (copy_from_user(&ldt_info, ptr, sizeof(ldt_info)))
-               goto out;
-
-       error = -EINVAL;
-       if (ldt_info.entry_number >= LDT_ENTRIES)
-               goto out;
-       if (ldt_info.contents == 3) {
-               if (oldmode)
-                       goto out;
-               if (ldt_info.seg_not_present == 0)
-                       goto out;
-       }
-
-       down(&mm->context.sem);
-       if (ldt_info.entry_number >= mm->context.size) {
-               error = alloc_ldt(&current->mm->context, ldt_info.entry_number+1, 1);
-               if (error < 0)
-                       goto out_unlock;
-       }
-
-       /* Allow LDTs to be cleared by the user. */
-       if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-               if (oldmode || LDT_empty(&ldt_info)) {
-                       entry_1 = 0;
-                       entry_2 = 0;
-                       goto install;
-               }
-       }
-
-       entry_1 = LDT_entry_a(&ldt_info);
-       entry_2 = LDT_entry_b(&ldt_info);
-       if (oldmode)
-               entry_2 &= ~(1 << 20);
-
-       /* Install the new entry ...  */
-install:
-       error = write_ldt_entry(mm->context.ldt, ldt_info.entry_number,
-                               entry_1, entry_2);
-
-out_unlock:
-       up(&mm->context.sem);
-out:
-       return error;
-}
-
-asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
-{
-       int ret = -ENOSYS;
-
-       switch (func) {
-       case 0:
-               ret = read_ldt(ptr, bytecount);
-               break;
-       case 1:
-               ret = write_ldt(ptr, bytecount, 1);
-               break;
-       case 2:
-               ret = read_default_ldt(ptr, bytecount);
-               break;
-       case 0x11:
-               ret = write_ldt(ptr, bytecount, 0);
-               break;
-       }
-       return ret;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/machine_kexec.c b/linux-2.6-xen-sparse/arch/i386/kernel/machine_kexec.c
deleted file mode 100644 (file)
index d3979a6..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * machine_kexec.c - handle transition of Linux booting another kernel
- * Copyright (C) 2002-2005 Eric Biederman  <ebiederm@xmission.com>
- *
- * This source code is licensed under the GNU General Public License,
- * Version 2.  See the file COPYING for more details.
- */
-
-#include <linux/mm.h>
-#include <linux/kexec.h>
-#include <linux/delay.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/tlbflush.h>
-#include <asm/mmu_context.h>
-#include <asm/io.h>
-#include <asm/apic.h>
-#include <asm/cpufeature.h>
-#include <asm/desc.h>
-#include <asm/system.h>
-
-#ifdef CONFIG_XEN
-#include <xen/interface/kexec.h>
-#endif
-
-#define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
-static u32 kexec_pgd[1024] PAGE_ALIGNED;
-#ifdef CONFIG_X86_PAE
-static u32 kexec_pmd0[1024] PAGE_ALIGNED;
-static u32 kexec_pmd1[1024] PAGE_ALIGNED;
-#endif
-static u32 kexec_pte0[1024] PAGE_ALIGNED;
-static u32 kexec_pte1[1024] PAGE_ALIGNED;
-
-#ifdef CONFIG_XEN
-
-#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-
-#if PAGES_NR > KEXEC_XEN_NO_PAGES
-#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-#endif
-
-#if PA_CONTROL_PAGE != 0
-#error PA_CONTROL_PAGE is non zero - Xen support will break
-#endif
-
-void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-{
-       void *control_page;
-
-       memset(xki->page_list, 0, sizeof(xki->page_list));
-
-       control_page = page_address(image->control_code_page);
-       memcpy(control_page, relocate_kernel, PAGE_SIZE);
-
-       xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-       xki->page_list[PA_PGD] = __ma(kexec_pgd);
-#ifdef CONFIG_X86_PAE
-       xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-       xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-#endif
-       xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-       xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-
-}
-
-#endif /* CONFIG_XEN */
-
-/*
- * A architecture hook called to validate the
- * proposed image and prepare the control pages
- * as needed.  The pages for KEXEC_CONTROL_CODE_SIZE
- * have been allocated, but the segments have yet
- * been copied into the kernel.
- *
- * Do what every setup is needed on image and the
- * reboot code buffer to allow us to avoid allocations
- * later.
- *
- * Currently nothing.
- */
-int machine_kexec_prepare(struct kimage *image)
-{
-       return 0;
-}
-
-/*
- * Undo anything leftover by machine_kexec_prepare
- * when an image is freed.
- */
-void machine_kexec_cleanup(struct kimage *image)
-{
-}
-
-#ifndef CONFIG_XEN
-/*
- * Do not allocate memory (or fail in any way) in machine_kexec().
- * We are past the point of no return, committed to rebooting now.
- */
-NORET_TYPE void machine_kexec(struct kimage *image)
-{
-       unsigned long page_list[PAGES_NR];
-       void *control_page;
-
-       /* Interrupts aren't acceptable while we reboot */
-       local_irq_disable();
-
-       control_page = page_address(image->control_code_page);
-       memcpy(control_page, relocate_kernel, PAGE_SIZE);
-
-       page_list[PA_CONTROL_PAGE] = __pa(control_page);
-       page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel;
-       page_list[PA_PGD] = __pa(kexec_pgd);
-       page_list[VA_PGD] = (unsigned long)kexec_pgd;
-#ifdef CONFIG_X86_PAE
-       page_list[PA_PMD_0] = __pa(kexec_pmd0);
-       page_list[VA_PMD_0] = (unsigned long)kexec_pmd0;
-       page_list[PA_PMD_1] = __pa(kexec_pmd1);
-       page_list[VA_PMD_1] = (unsigned long)kexec_pmd1;
-#endif
-       page_list[PA_PTE_0] = __pa(kexec_pte0);
-       page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-       page_list[PA_PTE_1] = __pa(kexec_pte1);
-       page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
-
-       relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-                       image->start, cpu_has_pae);
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c
deleted file mode 100644 (file)
index 15e30d1..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *     Intel CPU Microcode Update Driver for Linux
- *
- *     Copyright (C) 2000-2004 Tigran Aivazian
- *
- *     This driver allows to upgrade microcode on Intel processors
- *     belonging to IA-32 family - PentiumPro, Pentium II, 
- *     Pentium III, Xeon, Pentium 4, etc.
- *
- *     Reference: Section 8.10 of Volume III, Intel Pentium 4 Manual, 
- *     Order Number 245472 or free download from:
- *             
- *     http://developer.intel.com/design/pentium4/manuals/245472.htm
- *
- *     For more information, go to http://www.urbanmyth.org/microcode
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License
- *     as published by the Free Software Foundation; either version
- *     2 of the License, or (at your option) any later version.
- */
-
-//#define DEBUG /* pr_debug */
-#include <linux/capability.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/cpumask.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/miscdevice.h>
-#include <linux/spinlock.h>
-#include <linux/mm.h>
-#include <linux/mutex.h>
-#include <linux/syscalls.h>
-
-#include <asm/msr.h>
-#include <asm/uaccess.h>
-#include <asm/processor.h>
-
-MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver");
-MODULE_AUTHOR("Tigran Aivazian <tigran@veritas.com>");
-MODULE_LICENSE("GPL");
-
-static int verbose;
-module_param(verbose, int, 0644);
-
-#define MICROCODE_VERSION      "1.14a-xen"
-
-#define DEFAULT_UCODE_DATASIZE         (2000)    /* 2000 bytes */
-#define MC_HEADER_SIZE         (sizeof (microcode_header_t))     /* 48 bytes */
-#define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE) /* 2048 bytes */
-
-/* no concurrent ->write()s are allowed on /dev/cpu/microcode */
-static DEFINE_MUTEX(microcode_mutex);
-                               
-static int microcode_open (struct inode *unused1, struct file *unused2)
-{
-       return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-}
-
-
-static int do_microcode_update (const void __user *ubuf, size_t len)
-{
-       int err;
-       void *kbuf;
-
-       kbuf = vmalloc(len);
-       if (!kbuf)
-               return -ENOMEM;
-
-       if (copy_from_user(kbuf, ubuf, len) == 0) {
-               struct xen_platform_op op;
-
-               op.cmd = XENPF_microcode_update;
-               set_xen_guest_handle(op.u.microcode.data, kbuf);
-               op.u.microcode.length = len;
-               err = HYPERVISOR_platform_op(&op);
-       } else
-               err = -EFAULT;
-
-       vfree(kbuf);
-
-       return err;
-}
-
-static ssize_t microcode_write (struct file *file, const char __user *buf, size_t len, loff_t *ppos)
-{
-       ssize_t ret;
-
-       if (len < MC_HEADER_SIZE) {
-               printk(KERN_ERR "microcode: not enough data\n"); 
-               return -EINVAL;
-       }
-
-       mutex_lock(&microcode_mutex);
-
-       ret = do_microcode_update(buf, len);
-       if (!ret)
-               ret = (ssize_t)len;
-
-       mutex_unlock(&microcode_mutex);
-
-       return ret;
-}
-
-static struct file_operations microcode_fops = {
-       .owner          = THIS_MODULE,
-       .write          = microcode_write,
-       .open           = microcode_open,
-};
-
-static struct miscdevice microcode_dev = {
-       .minor          = MICROCODE_MINOR,
-       .name           = "microcode",
-       .fops           = &microcode_fops,
-};
-
-static int __init microcode_init (void)
-{
-       int error;
-
-       error = misc_register(&microcode_dev);
-       if (error) {
-               printk(KERN_ERR
-                       "microcode: can't misc_register on minor=%d\n",
-                       MICROCODE_MINOR);
-               return error;
-       }
-
-       printk(KERN_INFO 
-               "IA-32 Microcode Update Driver: v" MICROCODE_VERSION " <tigran@veritas.com>\n");
-       return 0;
-}
-
-static void __exit microcode_exit (void)
-{
-       misc_deregister(&microcode_dev);
-}
-
-module_init(microcode_init)
-module_exit(microcode_exit)
-MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/mpparse-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/mpparse-xen.c
deleted file mode 100644 (file)
index 3e15788..0000000
+++ /dev/null
@@ -1,1185 +0,0 @@
-/*
- *     Intel Multiprocessor Specification 1.1 and 1.4
- *     compliant MP-table parsing routines.
- *
- *     (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
- *     (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *             Erich Boleyn    :       MP v1.4 and additional changes.
- *             Alan Cox        :       Added EBDA scanning
- *             Ingo Molnar     :       various cleanups and rewrites
- *             Maciej W. Rozycki:      Bits for default MP configurations
- *             Paul Diefenbaugh:       Added full ACPI support
- */
-
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/acpi.h>
-#include <linux/delay.h>
-#include <linux/bootmem.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel_stat.h>
-#include <linux/mc146818rtc.h>
-#include <linux/bitops.h>
-
-#include <asm/smp.h>
-#include <asm/acpi.h>
-#include <asm/mtrr.h>
-#include <asm/mpspec.h>
-#include <asm/io_apic.h>
-
-#include <mach_apic.h>
-#include <mach_mpparse.h>
-#include <bios_ebda.h>
-
-/* Have we found an MP table */
-int smp_found_config;
-unsigned int __initdata maxcpus = NR_CPUS;
-
-/*
- * Various Linux-internal data structures created from the
- * MP-table.
- */
-int apic_version [MAX_APICS];
-int mp_bus_id_to_type [MAX_MP_BUSSES];
-int mp_bus_id_to_node [MAX_MP_BUSSES];
-int mp_bus_id_to_local [MAX_MP_BUSSES];
-int quad_local_to_mp_bus_id [NR_CPUS/4][4];
-int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-static int mp_current_pci_id;
-
-/* I/O APIC entries */
-struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
-
-/* # of MP IRQ source entries */
-struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
-
-/* MP IRQ source entries */
-int mp_irq_entries;
-
-int nr_ioapics;
-
-int pic_mode;
-unsigned long mp_lapic_addr;
-
-unsigned int def_to_bigsmp = 0;
-
-/* Processor that is doing the boot up */
-unsigned int boot_cpu_physical_apicid = -1U;
-/* Internal processor count */
-static unsigned int __devinitdata num_processors;
-
-/* Bitmask of physically existing CPUs */
-physid_mask_t phys_cpu_present_map;
-
-u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-
-/*
- * Intel MP BIOS table parsing routines:
- */
-
-
-/*
- * Checksum an MP configuration block.
- */
-
-static int __init mpf_checksum(unsigned char *mp, int len)
-{
-       int sum = 0;
-
-       while (len--)
-               sum += *mp++;
-
-       return sum & 0xFF;
-}
-
-/*
- * Have to match translation table entries to main table entries by counter
- * hence the mpc_record variable .... can't see a less disgusting way of
- * doing this ....
- */
-
-static int mpc_record; 
-static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
-
-#ifndef CONFIG_XEN
-static void __devinit MP_processor_info (struct mpc_config_processor *m)
-{
-       int ver, apicid;
-       physid_mask_t phys_cpu;
-       
-       if (!(m->mpc_cpuflag & CPU_ENABLED))
-               return;
-
-       apicid = mpc_apic_id(m, translation_table[mpc_record]);
-
-       if (m->mpc_featureflag&(1<<0))
-               Dprintk("    Floating point unit present.\n");
-       if (m->mpc_featureflag&(1<<7))
-               Dprintk("    Machine Exception supported.\n");
-       if (m->mpc_featureflag&(1<<8))
-               Dprintk("    64 bit compare & exchange supported.\n");
-       if (m->mpc_featureflag&(1<<9))
-               Dprintk("    Internal APIC present.\n");
-       if (m->mpc_featureflag&(1<<11))
-               Dprintk("    SEP present.\n");
-       if (m->mpc_featureflag&(1<<12))
-               Dprintk("    MTRR  present.\n");
-       if (m->mpc_featureflag&(1<<13))
-               Dprintk("    PGE  present.\n");
-       if (m->mpc_featureflag&(1<<14))
-               Dprintk("    MCA  present.\n");
-       if (m->mpc_featureflag&(1<<15))
-               Dprintk("    CMOV  present.\n");
-       if (m->mpc_featureflag&(1<<16))
-               Dprintk("    PAT  present.\n");
-       if (m->mpc_featureflag&(1<<17))
-               Dprintk("    PSE  present.\n");
-       if (m->mpc_featureflag&(1<<18))
-               Dprintk("    PSN  present.\n");
-       if (m->mpc_featureflag&(1<<19))
-               Dprintk("    Cache Line Flush Instruction present.\n");
-       /* 20 Reserved */
-       if (m->mpc_featureflag&(1<<21))
-               Dprintk("    Debug Trace and EMON Store present.\n");
-       if (m->mpc_featureflag&(1<<22))
-               Dprintk("    ACPI Thermal Throttle Registers  present.\n");
-       if (m->mpc_featureflag&(1<<23))
-               Dprintk("    MMX  present.\n");
-       if (m->mpc_featureflag&(1<<24))
-               Dprintk("    FXSR  present.\n");
-       if (m->mpc_featureflag&(1<<25))
-               Dprintk("    XMM  present.\n");
-       if (m->mpc_featureflag&(1<<26))
-               Dprintk("    Willamette New Instructions  present.\n");
-       if (m->mpc_featureflag&(1<<27))
-               Dprintk("    Self Snoop  present.\n");
-       if (m->mpc_featureflag&(1<<28))
-               Dprintk("    HT  present.\n");
-       if (m->mpc_featureflag&(1<<29))
-               Dprintk("    Thermal Monitor present.\n");
-       /* 30, 31 Reserved */
-
-
-       if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-               Dprintk("    Bootup CPU\n");
-               boot_cpu_physical_apicid = m->mpc_apicid;
-       }
-
-       ver = m->mpc_apicver;
-
-       /*
-        * Validate version
-        */
-       if (ver == 0x0) {
-               printk(KERN_WARNING "BIOS bug, APIC version is 0 for CPU#%d! "
-                               "fixing up to 0x10. (tell your hw vendor)\n",
-                               m->mpc_apicid);
-               ver = 0x10;
-       }
-       apic_version[m->mpc_apicid] = ver;
-
-       phys_cpu = apicid_to_cpu_present(apicid);
-       physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu);
-
-       if (num_processors >= NR_CPUS) {
-               printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
-                       "  Processor ignored.\n", NR_CPUS);
-               return;
-       }
-
-       if (num_processors >= maxcpus) {
-               printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-                       " Processor ignored.\n", maxcpus);
-               return;
-       }
-
-       cpu_set(num_processors, cpu_possible_map);
-       num_processors++;
-
-       /*
-        * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y
-        * but we need to work other dependencies like SMP_SUSPEND etc
-        * before this can be done without some confusion.
-        * if (CPU_HOTPLUG_ENABLED || num_processors > 8)
-        *       - Ashok Raj <ashok.raj@intel.com>
-        */
-       if (num_processors > 8) {
-               switch (boot_cpu_data.x86_vendor) {
-               case X86_VENDOR_INTEL:
-                       if (!APIC_XAPIC(ver)) {
-                               def_to_bigsmp = 0;
-                               break;
-                       }
-                       /* If P4 and above fall through */
-               case X86_VENDOR_AMD:
-                       def_to_bigsmp = 1;
-               }
-       }
-       bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
-}
-#else
-void __init MP_processor_info (struct mpc_config_processor *m)
-{
-       num_processors++;
-}
-#endif /* CONFIG_XEN */
-
-static void __init MP_bus_info (struct mpc_config_bus *m)
-{
-       char str[7];
-
-       memcpy(str, m->mpc_bustype, 6);
-       str[6] = 0;
-
-       mpc_oem_bus_info(m, str, translation_table[mpc_record]);
-
-       if (m->mpc_busid >= MAX_MP_BUSSES) {
-               printk(KERN_WARNING "MP table busid value (%d) for bustype %s "
-                       " is too large, max. supported is %d\n",
-                       m->mpc_busid, str, MAX_MP_BUSSES - 1);
-               return;
-       }
-
-       if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
-       } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
-       } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI)-1) == 0) {
-               mpc_oem_pci_bus(m, translation_table[mpc_record]);
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
-               mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
-               mp_current_pci_id++;
-       } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA)-1) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
-       } else if (strncmp(str, BUSTYPE_NEC98, sizeof(BUSTYPE_NEC98)-1) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_NEC98;
-       } else {
-               printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
-       }
-}
-
-static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
-{
-       if (!(m->mpc_flags & MPC_APIC_USABLE))
-               return;
-
-       printk(KERN_INFO "I/O APIC #%d Version %d at 0x%lX.\n",
-               m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
-       if (nr_ioapics >= MAX_IO_APICS) {
-               printk(KERN_CRIT "Max # of I/O APICs (%d) exceeded (found %d).\n",
-                       MAX_IO_APICS, nr_ioapics);
-               panic("Recompile kernel with bigger MAX_IO_APICS!.\n");
-       }
-       if (!m->mpc_apicaddr) {
-               printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
-                       " found in MP table, skipping!\n");
-               return;
-       }
-       mp_ioapics[nr_ioapics] = *m;
-       nr_ioapics++;
-}
-
-static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
-{
-       mp_irqs [mp_irq_entries] = *m;
-       Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
-               " IRQ %02x, APIC ID %x, APIC INT %02x\n",
-                       m->mpc_irqtype, m->mpc_irqflag & 3,
-                       (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
-                       m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
-       if (++mp_irq_entries == MAX_IRQ_SOURCES)
-               panic("Max # of irq sources exceeded!!\n");
-}
-
-static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
-{
-       Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
-               " IRQ %02x, APIC ID %x, APIC LINT %02x\n",
-                       m->mpc_irqtype, m->mpc_irqflag & 3,
-                       (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid,
-                       m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
-       /*
-        * Well it seems all SMP boards in existence
-        * use ExtINT/LVT1 == LINT0 and
-        * NMI/LVT2 == LINT1 - the following check
-        * will show us if this assumptions is false.
-        * Until then we do not have to add baggage.
-        */
-       if ((m->mpc_irqtype == mp_ExtINT) &&
-               (m->mpc_destapiclint != 0))
-                       BUG();
-       if ((m->mpc_irqtype == mp_NMI) &&
-               (m->mpc_destapiclint != 1))
-                       BUG();
-}
-
-#ifdef CONFIG_X86_NUMAQ
-static void __init MP_translation_info (struct mpc_config_translation *m)
-{
-       printk(KERN_INFO "Translation: record %d, type %d, quad %d, global %d, local %d\n", mpc_record, m->trans_type, m->trans_quad, m->trans_global, m->trans_local);
-
-       if (mpc_record >= MAX_MPC_ENTRY) 
-               printk(KERN_ERR "MAX_MPC_ENTRY exceeded!\n");
-       else
-               translation_table[mpc_record] = m; /* stash this for later */
-       if (m->trans_quad < MAX_NUMNODES && !node_online(m->trans_quad))
-               node_set_online(m->trans_quad);
-}
-
-/*
- * Read/parse the MPC oem tables
- */
-
-static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, \
-       unsigned short oemsize)
-{
-       int count = sizeof (*oemtable); /* the header size */
-       unsigned char *oemptr = ((unsigned char *)oemtable)+count;
-       
-       mpc_record = 0;
-       printk(KERN_INFO "Found an OEM MPC table at %8p - parsing it ... \n", oemtable);
-       if (memcmp(oemtable->oem_signature,MPC_OEM_SIGNATURE,4))
-       {
-               printk(KERN_WARNING "SMP mpc oemtable: bad signature [%c%c%c%c]!\n",
-                       oemtable->oem_signature[0],
-                       oemtable->oem_signature[1],
-                       oemtable->oem_signature[2],
-                       oemtable->oem_signature[3]);
-               return;
-       }
-       if (mpf_checksum((unsigned char *)oemtable,oemtable->oem_length))
-       {
-               printk(KERN_WARNING "SMP oem mptable: checksum error!\n");
-               return;
-       }
-       while (count < oemtable->oem_length) {
-               switch (*oemptr) {
-                       case MP_TRANSLATION:
-                       {
-                               struct mpc_config_translation *m=
-                                       (struct mpc_config_translation *)oemptr;
-                               MP_translation_info(m);
-                               oemptr += sizeof(*m);
-                               count += sizeof(*m);
-                               ++mpc_record;
-                               break;
-                       }
-                       default:
-                       {
-                               printk(KERN_WARNING "Unrecognised OEM table entry type! - %d\n", (int) *oemptr);
-                               return;
-                       }
-               }
-       }
-}
-
-static inline void mps_oem_check(struct mp_config_table *mpc, char *oem,
-               char *productid)
-{
-       if (strncmp(oem, "IBM NUMA", 8))
-               printk("Warning!  May not be a NUMA-Q system!\n");
-       if (mpc->mpc_oemptr)
-               smp_read_mpc_oem((struct mp_config_oemtable *) mpc->mpc_oemptr,
-                               mpc->mpc_oemsize);
-}
-#endif /* CONFIG_X86_NUMAQ */
-
-/*
- * Read/parse the MPC
- */
-
-static int __init smp_read_mpc(struct mp_config_table *mpc)
-{
-       char str[16];
-       char oem[10];
-       int count=sizeof(*mpc);
-       unsigned char *mpt=((unsigned char *)mpc)+count;
-
-       if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-               printk(KERN_ERR "SMP mptable: bad signature [0x%x]!\n",
-                       *(u32 *)mpc->mpc_signature);
-               return 0;
-       }
-       if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-               printk(KERN_ERR "SMP mptable: checksum error!\n");
-               return 0;
-       }
-       if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
-               printk(KERN_ERR "SMP mptable: bad table version (%d)!!\n",
-                       mpc->mpc_spec);
-               return 0;
-       }
-       if (!mpc->mpc_lapic) {
-               printk(KERN_ERR "SMP mptable: null local APIC address!\n");
-               return 0;
-       }
-       memcpy(oem,mpc->mpc_oem,8);
-       oem[8]=0;
-       printk(KERN_INFO "OEM ID: %s ",oem);
-
-       memcpy(str,mpc->mpc_productid,12);
-       str[12]=0;
-       printk("Product ID: %s ",str);
-
-       mps_oem_check(mpc, oem, str);
-
-       printk("APIC at: 0x%lX\n",mpc->mpc_lapic);
-
-       /* 
-        * Save the local APIC address (it might be non-default) -- but only
-        * if we're not using ACPI.
-        */
-       if (!acpi_lapic)
-               mp_lapic_addr = mpc->mpc_lapic;
-
-       /*
-        *      Now process the configuration blocks.
-        */
-       mpc_record = 0;
-       while (count < mpc->mpc_length) {
-               switch(*mpt) {
-                       case MP_PROCESSOR:
-                       {
-                               struct mpc_config_processor *m=
-                                       (struct mpc_config_processor *)mpt;
-                               /* ACPI may have already provided this data */
-                               if (!acpi_lapic)
-                                       MP_processor_info(m);
-                               mpt += sizeof(*m);
-                               count += sizeof(*m);
-                               break;
-                       }
-                       case MP_BUS:
-                       {
-                               struct mpc_config_bus *m=
-                                       (struct mpc_config_bus *)mpt;
-                               MP_bus_info(m);
-                               mpt += sizeof(*m);
-                               count += sizeof(*m);
-                               break;
-                       }
-                       case MP_IOAPIC:
-                       {
-                               struct mpc_config_ioapic *m=
-                                       (struct mpc_config_ioapic *)mpt;
-                               MP_ioapic_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-                       case MP_INTSRC:
-                       {
-                               struct mpc_config_intsrc *m=
-                                       (struct mpc_config_intsrc *)mpt;
-
-                               MP_intsrc_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-                       case MP_LINTSRC:
-                       {
-                               struct mpc_config_lintsrc *m=
-                                       (struct mpc_config_lintsrc *)mpt;
-                               MP_lintsrc_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-                       default:
-                       {
-                               count = mpc->mpc_length;
-                               break;
-                       }
-               }
-               ++mpc_record;
-       }
-       clustered_apic_check();
-       if (!num_processors)
-               printk(KERN_ERR "SMP mptable: no processors registered!\n");
-       return num_processors;
-}
-
-static int __init ELCR_trigger(unsigned int irq)
-{
-       unsigned int port;
-
-       port = 0x4d0 + (irq >> 3);
-       return (inb(port) >> (irq & 7)) & 1;
-}
-
-static void __init construct_default_ioirq_mptable(int mpc_default_type)
-{
-       struct mpc_config_intsrc intsrc;
-       int i;
-       int ELCR_fallback = 0;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqflag = 0;                 /* conforming */
-       intsrc.mpc_srcbus = 0;
-       intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid;
-
-       intsrc.mpc_irqtype = mp_INT;
-
-       /*
-        *  If true, we have an ISA/PCI system with no IRQ entries
-        *  in the MP table. To prevent the PCI interrupts from being set up
-        *  incorrectly, we try to use the ELCR. The sanity check to see if
-        *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
-        *  never be level sensitive, so we simply see if the ELCR agrees.
-        *  If it does, we assume it's valid.
-        */
-       if (mpc_default_type == 5) {
-               printk(KERN_INFO "ISA/PCI bus type with no IRQ information... falling back to ELCR\n");
-
-               if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13))
-                       printk(KERN_WARNING "ELCR contains invalid data... not using ELCR\n");
-               else {
-                       printk(KERN_INFO "Using ELCR to identify PCI interrupts\n");
-                       ELCR_fallback = 1;
-               }
-       }
-
-       for (i = 0; i < 16; i++) {
-               switch (mpc_default_type) {
-               case 2:
-                       if (i == 0 || i == 13)
-                               continue;       /* IRQ0 & IRQ13 not connected */
-                       /* fall through */
-               default:
-                       if (i == 2)
-                               continue;       /* IRQ2 is never connected */
-               }
-
-               if (ELCR_fallback) {
-                       /*
-                        *  If the ELCR indicates a level-sensitive interrupt, we
-                        *  copy that information over to the MP table in the
-                        *  irqflag field (level sensitive, active high polarity).
-                        */
-                       if (ELCR_trigger(i))
-                               intsrc.mpc_irqflag = 13;
-                       else
-                               intsrc.mpc_irqflag = 0;
-               }
-
-               intsrc.mpc_srcbusirq = i;
-               intsrc.mpc_dstirq = i ? i : 2;          /* IRQ0 to INTIN2 */
-               MP_intsrc_info(&intsrc);
-       }
-
-       intsrc.mpc_irqtype = mp_ExtINT;
-       intsrc.mpc_srcbusirq = 0;
-       intsrc.mpc_dstirq = 0;                          /* 8259A to INTIN0 */
-       MP_intsrc_info(&intsrc);
-}
-
-static inline void __init construct_default_ISA_mptable(int mpc_default_type)
-{
-       struct mpc_config_processor processor;
-       struct mpc_config_bus bus;
-       struct mpc_config_ioapic ioapic;
-       struct mpc_config_lintsrc lintsrc;
-       int linttypes[2] = { mp_ExtINT, mp_NMI };
-       int i;
-
-       /*
-        * local APIC has default address
-        */
-       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-
-       /*
-        * 2 CPUs, numbered 0 & 1.
-        */
-       processor.mpc_type = MP_PROCESSOR;
-       /* Either an integrated APIC or a discrete 82489DX. */
-       processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-       processor.mpc_cpuflag = CPU_ENABLED;
-       processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
-                                  (boot_cpu_data.x86_model << 4) |
-                                  boot_cpu_data.x86_mask;
-       processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-       processor.mpc_reserved[0] = 0;
-       processor.mpc_reserved[1] = 0;
-       for (i = 0; i < 2; i++) {
-               processor.mpc_apicid = i;
-               MP_processor_info(&processor);
-       }
-
-       bus.mpc_type = MP_BUS;
-       bus.mpc_busid = 0;
-       switch (mpc_default_type) {
-               default:
-                       printk("???\n");
-                       printk(KERN_ERR "Unknown standard configuration %d\n",
-                               mpc_default_type);
-                       /* fall through */
-               case 1:
-               case 5:
-                       memcpy(bus.mpc_bustype, "ISA   ", 6);
-                       break;
-               case 2:
-               case 6:
-               case 3:
-                       memcpy(bus.mpc_bustype, "EISA  ", 6);
-                       break;
-               case 4:
-               case 7:
-                       memcpy(bus.mpc_bustype, "MCA   ", 6);
-       }
-       MP_bus_info(&bus);
-       if (mpc_default_type > 4) {
-               bus.mpc_busid = 1;
-               memcpy(bus.mpc_bustype, "PCI   ", 6);
-               MP_bus_info(&bus);
-       }
-
-       ioapic.mpc_type = MP_IOAPIC;
-       ioapic.mpc_apicid = 2;
-       ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-       ioapic.mpc_flags = MPC_APIC_USABLE;
-       ioapic.mpc_apicaddr = 0xFEC00000;
-       MP_ioapic_info(&ioapic);
-
-       /*
-        * We set up most of the low 16 IO-APIC pins according to MPS rules.
-        */
-       construct_default_ioirq_mptable(mpc_default_type);
-
-       lintsrc.mpc_type = MP_LINTSRC;
-       lintsrc.mpc_irqflag = 0;                /* conforming */
-       lintsrc.mpc_srcbusid = 0;
-       lintsrc.mpc_srcbusirq = 0;
-       lintsrc.mpc_destapic = MP_APIC_ALL;
-       for (i = 0; i < 2; i++) {
-               lintsrc.mpc_irqtype = linttypes[i];
-               lintsrc.mpc_destapiclint = i;
-               MP_lintsrc_info(&lintsrc);
-       }
-}
-
-static struct intel_mp_floating *mpf_found;
-
-/*
- * Scan the memory blocks for an SMP configuration block.
- */
-void __init get_smp_config (void)
-{
-       struct intel_mp_floating *mpf = mpf_found;
-
-       /*
-        * ACPI supports both logical (e.g. Hyper-Threading) and physical 
-        * processors, where MPS only supports physical.
-        */
-       if (acpi_lapic && acpi_ioapic) {
-               printk(KERN_INFO "Using ACPI (MADT) for SMP configuration information\n");
-               return;
-       }
-       else if (acpi_lapic)
-               printk(KERN_INFO "Using ACPI for processor (LAPIC) configuration information\n");
-
-       printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
-       if (mpf->mpf_feature2 & (1<<7)) {
-               printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
-               pic_mode = 1;
-       } else {
-               printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
-               pic_mode = 0;
-       }
-
-       /*
-        * Now see if we need to read further.
-        */
-       if (mpf->mpf_feature1 != 0) {
-
-               printk(KERN_INFO "Default MP configuration #%d\n", mpf->mpf_feature1);
-               construct_default_ISA_mptable(mpf->mpf_feature1);
-
-       } else if (mpf->mpf_physptr) {
-
-               /*
-                * Read the physical hardware table.  Anything here will
-                * override the defaults.
-                */
-               if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr))) {
-                       smp_found_config = 0;
-                       printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
-                       printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
-                       return;
-               }
-               /*
-                * If there are no explicit MP IRQ entries, then we are
-                * broken.  We set up most of the low 16 IO-APIC pins to
-                * ISA defaults and hope it will work.
-                */
-               if (!mp_irq_entries) {
-                       struct mpc_config_bus bus;
-
-                       printk(KERN_ERR "BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n");
-
-                       bus.mpc_type = MP_BUS;
-                       bus.mpc_busid = 0;
-                       memcpy(bus.mpc_bustype, "ISA   ", 6);
-                       MP_bus_info(&bus);
-
-                       construct_default_ioirq_mptable(0);
-               }
-
-       } else
-               BUG();
-
-       printk(KERN_INFO "Processors: %d\n", num_processors);
-       /*
-        * Only use the first configuration found.
-        */
-}
-
-static int __init smp_scan_config (unsigned long base, unsigned long length)
-{
-       unsigned long *bp = isa_bus_to_virt(base);
-       struct intel_mp_floating *mpf;
-
-       Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length);
-       if (sizeof(*mpf) != 16)
-               printk("Error: MPF size\n");
-
-       while (length > 0) {
-               mpf = (struct intel_mp_floating *)bp;
-               if ((*bp == SMP_MAGIC_IDENT) &&
-                       (mpf->mpf_length == 1) &&
-                       !mpf_checksum((unsigned char *)bp, 16) &&
-                       ((mpf->mpf_specification == 1)
-                               || (mpf->mpf_specification == 4)) ) {
-
-                       smp_found_config = 1;
-#ifndef CONFIG_XEN
-                       printk(KERN_INFO "found SMP MP-table at %08lx\n",
-                                               virt_to_phys(mpf));
-                       reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
-                       if (mpf->mpf_physptr) {
-                               /*
-                                * We cannot access to MPC table to compute
-                                * table size yet, as only few megabytes from
-                                * the bottom is mapped now.
-                                * PC-9800's MPC table places on the very last
-                                * of physical memory; so that simply reserving
-                                * PAGE_SIZE from mpg->mpf_physptr yields BUG()
-                                * in reserve_bootmem.
-                                */
-                               unsigned long size = PAGE_SIZE;
-                               unsigned long end = max_low_pfn * PAGE_SIZE;
-                               if (mpf->mpf_physptr + size > end)
-                                       size = end - mpf->mpf_physptr;
-                               reserve_bootmem(mpf->mpf_physptr, size);
-                       }
-#else
-                       printk(KERN_INFO "found SMP MP-table at %08lx\n",
-                               ((unsigned long)bp - (unsigned long)isa_bus_to_virt(base)) + base);
-#endif
-
-                       mpf_found = mpf;
-                       return 1;
-               }
-               bp += 4;
-               length -= 16;
-       }
-       return 0;
-}
-
-void __init find_smp_config (void)
-{
-#ifndef CONFIG_XEN
-       unsigned int address;
-#endif
-
-       /*
-        * FIXME: Linux assumes you have 640K of base ram..
-        * this continues the error...
-        *
-        * 1) Scan the bottom 1K for a signature
-        * 2) Scan the top 1K of base RAM
-        * 3) Scan the 64K of bios
-        */
-       if (smp_scan_config(0x0,0x400) ||
-               smp_scan_config(639*0x400,0x400) ||
-                       smp_scan_config(0xF0000,0x10000))
-               return;
-       /*
-        * If it is an SMP machine we should know now, unless the
-        * configuration is in an EISA/MCA bus machine with an
-        * extended bios data area.
-        *
-        * there is a real-mode segmented pointer pointing to the
-        * 4K EBDA area at 0x40E, calculate and scan it here.
-        *
-        * NOTE! There are Linux loaders that will corrupt the EBDA
-        * area, and as such this kind of SMP config may be less
-        * trustworthy, simply because the SMP table may have been
-        * stomped on during early boot. These loaders are buggy and
-        * should be fixed.
-        *
-        * MP1.4 SPEC states to only scan first 1K of 4K EBDA.
-        */
-
-#ifndef CONFIG_XEN
-       address = get_bios_ebda();
-       if (address)
-               smp_scan_config(address, 0x400);
-#endif
-}
-
-int es7000_plat;
-
-/* --------------------------------------------------------------------------
-                            ACPI-based MP Configuration
-   -------------------------------------------------------------------------- */
-
-#ifdef CONFIG_ACPI
-
-void __init mp_register_lapic_address (
-       u64                     address)
-{
-#ifndef CONFIG_XEN
-       mp_lapic_addr = (unsigned long) address;
-
-       set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
-
-       if (boot_cpu_physical_apicid == -1U)
-               boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
-
-       Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid);
-#endif
-}
-
-
-void __devinit mp_register_lapic (
-       u8                      id, 
-       u8                      enabled)
-{
-       struct mpc_config_processor processor;
-       int                     boot_cpu = 0;
-       
-       if (MAX_APICS - id <= 0) {
-               printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
-                       id, MAX_APICS);
-               return;
-       }
-
-       if (id == boot_cpu_physical_apicid)
-               boot_cpu = 1;
-
-#ifndef CONFIG_XEN
-       processor.mpc_type = MP_PROCESSOR;
-       processor.mpc_apicid = id;
-       processor.mpc_apicver = GET_APIC_VERSION(apic_read(APIC_LVR));
-       processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0);
-       processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0);
-       processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | 
-               (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
-       processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-       processor.mpc_reserved[0] = 0;
-       processor.mpc_reserved[1] = 0;
-#endif
-
-       MP_processor_info(&processor);
-}
-
-#ifdef CONFIG_X86_IO_APIC
-
-#define MP_ISA_BUS             0
-#define MP_MAX_IOAPIC_PIN      127
-
-static struct mp_ioapic_routing {
-       int                     apic_id;
-       int                     gsi_base;
-       int                     gsi_end;
-       u32                     pin_programmed[4];
-} mp_ioapic_routing[MAX_IO_APICS];
-
-
-static int mp_find_ioapic (
-       int                     gsi)
-{
-       int                     i = 0;
-
-       /* Find the IOAPIC that manages this GSI. */
-       for (i = 0; i < nr_ioapics; i++) {
-               if ((gsi >= mp_ioapic_routing[i].gsi_base)
-                       && (gsi <= mp_ioapic_routing[i].gsi_end))
-                       return i;
-       }
-
-       printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
-
-       return -1;
-}
-       
-
-void __init mp_register_ioapic (
-       u8                      id, 
-       u32                     address,
-       u32                     gsi_base)
-{
-       int                     idx = 0;
-       int                     tmpid;
-
-       if (nr_ioapics >= MAX_IO_APICS) {
-               printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
-                       "(found %d)\n", MAX_IO_APICS, nr_ioapics);
-               panic("Recompile kernel with bigger MAX_IO_APICS!\n");
-       }
-       if (!address) {
-               printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
-                       " found in MADT table, skipping!\n");
-               return;
-       }
-
-       idx = nr_ioapics++;
-
-       mp_ioapics[idx].mpc_type = MP_IOAPIC;
-       mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
-       mp_ioapics[idx].mpc_apicaddr = address;
-
-#ifndef CONFIG_XEN
-       set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-#endif
-       if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-               && !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-               tmpid = io_apic_get_unique_id(idx, id);
-       else
-               tmpid = id;
-       if (tmpid == -1) {
-               nr_ioapics--;
-               return;
-       }
-       mp_ioapics[idx].mpc_apicid = tmpid;
-       mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx);
-       
-       /* 
-        * Build basic GSI lookup table to facilitate gsi->io_apic lookups
-        * and to prevent reprogramming of IOAPIC pins (PCI GSIs).
-        */
-       mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid;
-       mp_ioapic_routing[idx].gsi_base = gsi_base;
-       mp_ioapic_routing[idx].gsi_end = gsi_base + 
-               io_apic_get_redir_entries(idx);
-
-       printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, "
-               "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, 
-               mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr,
-               mp_ioapic_routing[idx].gsi_base,
-               mp_ioapic_routing[idx].gsi_end);
-
-       return;
-}
-
-
-void __init mp_override_legacy_irq (
-       u8                      bus_irq,
-       u8                      polarity, 
-       u8                      trigger, 
-       u32                     gsi)
-{
-       struct mpc_config_intsrc intsrc;
-       int                     ioapic = -1;
-       int                     pin = -1;
-
-       /* 
-        * Convert 'gsi' to 'ioapic.pin'.
-        */
-       ioapic = mp_find_ioapic(gsi);
-       if (ioapic < 0)
-               return;
-       pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
-
-       /*
-        * TBD: This check is for faulty timer entries, where the override
-        *      erroneously sets the trigger to level, resulting in a HUGE 
-        *      increase of timer interrupts!
-        */
-       if ((bus_irq == 0) && (trigger == 3))
-               trigger = 1;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqtype = mp_INT;
-       intsrc.mpc_irqflag = (trigger << 2) | polarity;
-       intsrc.mpc_srcbus = MP_ISA_BUS;
-       intsrc.mpc_srcbusirq = bus_irq;                                /* IRQ */
-       intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;        /* APIC ID */
-       intsrc.mpc_dstirq = pin;                                    /* INTIN# */
-
-       Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n",
-               intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-               (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-               intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
-
-       mp_irqs[mp_irq_entries] = intsrc;
-       if (++mp_irq_entries == MAX_IRQ_SOURCES)
-               panic("Max # of irq sources exceeded!\n");
-
-       return;
-}
-
-void __init mp_config_acpi_legacy_irqs (void)
-{
-       struct mpc_config_intsrc intsrc;
-       int                     i = 0;
-       int                     ioapic = -1;
-
-       /* 
-        * Fabricate the legacy ISA bus (bus #31).
-        */
-       mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
-       Dprintk("Bus #%d is ISA\n", MP_ISA_BUS);
-
-       /*
-        * Older generations of ES7000 have no legacy identity mappings
-        */
-       if (es7000_plat == 1)
-               return;
-
-       /* 
-        * Locate the IOAPIC that manages the ISA IRQs (0-15). 
-        */
-       ioapic = mp_find_ioapic(0);
-       if (ioapic < 0)
-               return;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqflag = 0;                                 /* Conforming */
-       intsrc.mpc_srcbus = MP_ISA_BUS;
-       intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
-
-       /* 
-        * Use the default configuration for the IRQs 0-15.  Unless
-        * overriden by (MADT) interrupt source override entries.
-        */
-       for (i = 0; i < 16; i++) {
-               int idx;
-
-               for (idx = 0; idx < mp_irq_entries; idx++) {
-                       struct mpc_config_intsrc *irq = mp_irqs + idx;
-
-                       /* Do we already have a mapping for this ISA IRQ? */
-                       if (irq->mpc_srcbus == MP_ISA_BUS && irq->mpc_srcbusirq == i)
-                               break;
-
-                       /* Do we already have a mapping for this IOAPIC pin */
-                       if ((irq->mpc_dstapic == intsrc.mpc_dstapic) &&
-                               (irq->mpc_dstirq == i))
-                               break;
-               }
-
-               if (idx != mp_irq_entries) {
-                       printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
-                       continue;                       /* IRQ already used */
-               }
-
-               intsrc.mpc_irqtype = mp_INT;
-               intsrc.mpc_srcbusirq = i;                  /* Identity mapped */
-               intsrc.mpc_dstirq = i;
-
-               Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, "
-                       "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-                       (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-                       intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, 
-                       intsrc.mpc_dstirq);
-
-               mp_irqs[mp_irq_entries] = intsrc;
-               if (++mp_irq_entries == MAX_IRQ_SOURCES)
-                       panic("Max # of irq sources exceeded!\n");
-       }
-}
-
-#define MAX_GSI_NUM    4096
-
-int mp_register_gsi (u32 gsi, int triggering, int polarity)
-{
-       int                     ioapic = -1;
-       int                     ioapic_pin = 0;
-       int                     idx, bit = 0;
-       static int              pci_irq = 16;
-       /*
-        * Mapping between Global System Interrups, which
-        * represent all possible interrupts, and IRQs
-        * assigned to actual devices.
-        */
-       static int              gsi_to_irq[MAX_GSI_NUM];
-
-       /* Don't set up the ACPI SCI because it's already set up */
-       if (acpi_fadt.sci_int == gsi)
-               return gsi;
-
-       ioapic = mp_find_ioapic(gsi);
-       if (ioapic < 0) {
-               printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
-               return gsi;
-       }
-
-       ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
-
-       if (ioapic_renumber_irq)
-               gsi = ioapic_renumber_irq(ioapic, gsi);
-
-       /* 
-        * Avoid pin reprogramming.  PRTs typically include entries  
-        * with redundant pin->gsi mappings (but unique PCI devices);
-        * we only program the IOAPIC on the first.
-        */
-       bit = ioapic_pin % 32;
-       idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32);
-       if (idx > 3) {
-               printk(KERN_ERR "Invalid reference to IOAPIC pin "
-                       "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, 
-                       ioapic_pin);
-               return gsi;
-       }
-       if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
-               Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n",
-                       mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-               return gsi_to_irq[gsi];
-       }
-
-       mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-
-       if (triggering == ACPI_LEVEL_SENSITIVE) {
-               /*
-                * For PCI devices assign IRQs in order, avoiding gaps
-                * due to unused I/O APIC pins.
-                */
-               int irq = gsi;
-               if (gsi < MAX_GSI_NUM) {
-                       /*
-                        * Retain the VIA chipset work-around (gsi > 15), but
-                        * avoid a problem where the 8254 timer (IRQ0) is setup
-                        * via an override (so it's not on pin 0 of the ioapic),
-                        * and at the same time, the pin 0 interrupt is a PCI
-                        * type.  The gsi > 15 test could cause these two pins
-                        * to be shared as IRQ0, and they are not shareable.
-                        * So test for this condition, and if necessary, avoid
-                        * the pin collision.
-                        */
-                       if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
-                               gsi = pci_irq++;
-                       /*
-                        * Don't assign IRQ used by ACPI SCI
-                        */
-                       if (gsi == acpi_fadt.sci_int)
-                               gsi = pci_irq++;
-                       gsi_to_irq[irq] = gsi;
-               } else {
-                       printk(KERN_ERR "GSI %u is too high\n", gsi);
-                       return gsi;
-               }
-       }
-
-       io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-                   triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
-                   polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
-       return gsi;
-}
-
-#endif /* CONFIG_X86_IO_APIC */
-#endif /* CONFIG_ACPI */
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c
deleted file mode 100644 (file)
index bafc920..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Dynamic DMA mapping support.
- *
- * On i386 there is no hardware dynamic DMA address translation,
- * so consistent alloc/free are merely page allocation/freeing.
- * The rest of the dynamic DMA mapping interface is implemented
- * in asm/pci.h.
- */
-
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/pci.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <asm/io.h>
-#include <xen/balloon.h>
-#include <xen/gnttab.h>
-#include <asm/swiotlb.h>
-#include <asm/tlbflush.h>
-#include <asm-i386/mach-xen/asm/swiotlb.h>
-#include <asm/bug.h>
-
-#ifdef __x86_64__
-#include <asm/proto.h>
-
-int iommu_merge __read_mostly = 0;
-EXPORT_SYMBOL(iommu_merge);
-
-dma_addr_t bad_dma_address __read_mostly;
-EXPORT_SYMBOL(bad_dma_address);
-
-/* This tells the BIO block layer to assume merging. Default to off
-   because we cannot guarantee merging later. */
-int iommu_bio_merge __read_mostly = 0;
-EXPORT_SYMBOL(iommu_bio_merge);
-
-int force_iommu __read_mostly= 0;
-
-__init int iommu_setup(char *p)
-{
-    return 1;
-}
-
-void __init pci_iommu_alloc(void)
-{
-#ifdef CONFIG_SWIOTLB
-       pci_swiotlb_init();
-#endif
-}
-
-static int __init pci_iommu_init(void)
-{
-       no_iommu_init();
-       return 0;
-}
-
-/* Must execute after PCI subsystem */
-fs_initcall(pci_iommu_init);
-#endif
-
-struct dma_coherent_mem {
-       void            *virt_base;
-       u32             device_base;
-       int             size;
-       int             flags;
-       unsigned long   *bitmap;
-};
-
-#define IOMMU_BUG_ON(test)                             \
-do {                                                   \
-       if (unlikely(test)) {                           \
-               printk(KERN_ALERT "Fatal DMA error! "   \
-                      "Please use 'swiotlb=force'\n"); \
-               BUG();                                  \
-       }                                               \
-} while (0)
-
-int
-dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-          enum dma_data_direction direction)
-{
-       int i, rc;
-
-       if (direction == DMA_NONE)
-               BUG();
-       WARN_ON(nents == 0 || sg[0].length == 0);
-
-       if (swiotlb) {
-               rc = swiotlb_map_sg(hwdev, sg, nents, direction);
-       } else {
-               for (i = 0; i < nents; i++ ) {
-                       sg[i].dma_address =
-                               gnttab_dma_map_page(sg[i].page) + sg[i].offset;
-                       sg[i].dma_length  = sg[i].length;
-                       BUG_ON(!sg[i].page);
-                       IOMMU_BUG_ON(address_needs_mapping(
-                               hwdev, sg[i].dma_address));
-               }
-               rc = nents;
-       }
-
-       flush_write_buffers();
-       return rc;
-}
-EXPORT_SYMBOL(dma_map_sg);
-
-void
-dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-            enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-       if (swiotlb)
-               swiotlb_unmap_sg(hwdev, sg, nents, direction);
-       else {
-               for (i = 0; i < nents; i++ )
-                       gnttab_dma_unmap_page(sg[i].dma_address);
-       }
-}
-EXPORT_SYMBOL(dma_unmap_sg);
-
-#ifdef CONFIG_HIGHMEM
-dma_addr_t
-dma_map_page(struct device *dev, struct page *page, unsigned long offset,
-            size_t size, enum dma_data_direction direction)
-{
-       dma_addr_t dma_addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       if (swiotlb) {
-               dma_addr = swiotlb_map_page(
-                       dev, page, offset, size, direction);
-       } else {
-               dma_addr = gnttab_dma_map_page(page) + offset;
-               IOMMU_BUG_ON(address_needs_mapping(dev, dma_addr));
-       }
-
-       return dma_addr;
-}
-EXPORT_SYMBOL(dma_map_page);
-
-void
-dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       if (swiotlb)
-               swiotlb_unmap_page(dev, dma_address, size, direction);
-       else
-               gnttab_dma_unmap_page(dma_address);
-}
-EXPORT_SYMBOL(dma_unmap_page);
-#endif /* CONFIG_HIGHMEM */
-
-int
-dma_mapping_error(dma_addr_t dma_addr)
-{
-       if (swiotlb)
-               return swiotlb_dma_mapping_error(dma_addr);
-       return 0;
-}
-EXPORT_SYMBOL(dma_mapping_error);
-
-int
-dma_supported(struct device *dev, u64 mask)
-{
-       if (swiotlb)
-               return swiotlb_dma_supported(dev, mask);
-       /*
-        * By default we'll BUG when an infeasible DMA is requested, and
-        * request swiotlb=force (see IOMMU_BUG_ON).
-        */
-       return 1;
-}
-EXPORT_SYMBOL(dma_supported);
-
-void *dma_alloc_coherent(struct device *dev, size_t size,
-                          dma_addr_t *dma_handle, gfp_t gfp)
-{
-       void *ret;
-       struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
-       unsigned int order = get_order(size);
-       unsigned long vstart;
-       u64 mask;
-
-       /* ignore region specifiers */
-       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-
-       if (mem) {
-               int page = bitmap_find_free_region(mem->bitmap, mem->size,
-                                                    order);
-               if (page >= 0) {
-                       *dma_handle = mem->device_base + (page << PAGE_SHIFT);
-                       ret = mem->virt_base + (page << PAGE_SHIFT);
-                       memset(ret, 0, size);
-                       return ret;
-               }
-               if (mem->flags & DMA_MEMORY_EXCLUSIVE)
-                       return NULL;
-       }
-
-       if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-               gfp |= GFP_DMA;
-
-       vstart = __get_free_pages(gfp, order);
-       ret = (void *)vstart;
-
-       if (dev != NULL && dev->coherent_dma_mask)
-               mask = dev->coherent_dma_mask;
-       else
-               mask = 0xffffffff;
-
-       if (ret != NULL) {
-               if (xen_create_contiguous_region(vstart, order,
-                                                fls64(mask)) != 0) {
-                       free_pages(vstart, order);
-                       return NULL;
-               }
-               memset(ret, 0, size);
-               *dma_handle = virt_to_bus(ret);
-       }
-       return ret;
-}
-EXPORT_SYMBOL(dma_alloc_coherent);
-
-void dma_free_coherent(struct device *dev, size_t size,
-                        void *vaddr, dma_addr_t dma_handle)
-{
-       struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
-       int order = get_order(size);
-       
-       if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {
-               int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;
-
-               bitmap_release_region(mem->bitmap, page, order);
-       } else {
-               xen_destroy_contiguous_region((unsigned long)vaddr, order);
-               free_pages((unsigned long)vaddr, order);
-       }
-}
-EXPORT_SYMBOL(dma_free_coherent);
-
-#ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
-                               dma_addr_t device_addr, size_t size, int flags)
-{
-       void __iomem *mem_base;
-       int pages = size >> PAGE_SHIFT;
-       int bitmap_size = (pages + 31)/32;
-
-       if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
-               goto out;
-       if (!size)
-               goto out;
-       if (dev->dma_mem)
-               goto out;
-
-       /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
-
-       mem_base = ioremap(bus_addr, size);
-       if (!mem_base)
-               goto out;
-
-       dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
-       if (!dev->dma_mem)
-               goto out;
-       memset(dev->dma_mem, 0, sizeof(struct dma_coherent_mem));
-       dev->dma_mem->bitmap = kmalloc(bitmap_size, GFP_KERNEL);
-       if (!dev->dma_mem->bitmap)
-               goto free1_out;
-       memset(dev->dma_mem->bitmap, 0, bitmap_size);
-
-       dev->dma_mem->virt_base = mem_base;
-       dev->dma_mem->device_base = device_addr;
-       dev->dma_mem->size = pages;
-       dev->dma_mem->flags = flags;
-
-       if (flags & DMA_MEMORY_MAP)
-               return DMA_MEMORY_MAP;
-
-       return DMA_MEMORY_IO;
-
- free1_out:
-       kfree(dev->dma_mem->bitmap);
- out:
-       return 0;
-}
-EXPORT_SYMBOL(dma_declare_coherent_memory);
-
-void dma_release_declared_memory(struct device *dev)
-{
-       struct dma_coherent_mem *mem = dev->dma_mem;
-       
-       if(!mem)
-               return;
-       dev->dma_mem = NULL;
-       iounmap(mem->virt_base);
-       kfree(mem->bitmap);
-       kfree(mem);
-}
-EXPORT_SYMBOL(dma_release_declared_memory);
-
-void *dma_mark_declared_memory_occupied(struct device *dev,
-                                       dma_addr_t device_addr, size_t size)
-{
-       struct dma_coherent_mem *mem = dev->dma_mem;
-       int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       int pos, err;
-
-       if (!mem)
-               return ERR_PTR(-EINVAL);
-
-       pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
-       err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
-       if (err != 0)
-               return ERR_PTR(err);
-       return mem->virt_base + (pos << PAGE_SHIFT);
-}
-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
-#endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
-
-dma_addr_t
-dma_map_single(struct device *dev, void *ptr, size_t size,
-              enum dma_data_direction direction)
-{
-       dma_addr_t dma;
-
-       if (direction == DMA_NONE)
-               BUG();
-       WARN_ON(size == 0);
-
-       if (swiotlb) {
-               dma = swiotlb_map_single(dev, ptr, size, direction);
-       } else {
-               dma = gnttab_dma_map_page(virt_to_page(ptr)) +
-                     offset_in_page(ptr);
-               IOMMU_BUG_ON(range_straddles_page_boundary(ptr, size));
-               IOMMU_BUG_ON(address_needs_mapping(dev, dma));
-       }
-
-       flush_write_buffers();
-       return dma;
-}
-EXPORT_SYMBOL(dma_map_single);
-
-void
-dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction)
-{
-       if (direction == DMA_NONE)
-               BUG();
-       if (swiotlb)
-               swiotlb_unmap_single(dev, dma_addr, size, direction);
-       else
-               gnttab_dma_unmap_page(dma_addr);
-}
-EXPORT_SYMBOL(dma_unmap_single);
-
-void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-                       enum dma_data_direction direction)
-{
-       if (swiotlb)
-               swiotlb_sync_single_for_cpu(dev, dma_handle, size, direction);
-}
-EXPORT_SYMBOL(dma_sync_single_for_cpu);
-
-void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-                           enum dma_data_direction direction)
-{
-       if (swiotlb)
-               swiotlb_sync_single_for_device(dev, dma_handle, size, direction);
-}
-EXPORT_SYMBOL(dma_sync_single_for_device);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c
deleted file mode 100644 (file)
index 6c19ecc..0000000
+++ /dev/null
@@ -1,853 +0,0 @@
-/*
- *  linux/arch/i386/kernel/process.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * This file handles the architecture-dependent parts of process handling..
- */
-
-#include <stdarg.h>
-
-#include <linux/cpu.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/fs.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/elfcore.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/stddef.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/interrupt.h>
-#include <linux/utsname.h>
-#include <linux/delay.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-#include <linux/mc146818rtc.h>
-#include <linux/module.h>
-#include <linux/kallsyms.h>
-#include <linux/ptrace.h>
-#include <linux/random.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/ldt.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/desc.h>
-#include <asm/vm86.h>
-#ifdef CONFIG_MATH_EMULATION
-#include <asm/math_emu.h>
-#endif
-
-#include <xen/interface/physdev.h>
-#include <xen/interface/vcpu.h>
-#include <xen/cpu_hotplug.h>
-
-#include <linux/err.h>
-
-#include <asm/tlbflush.h>
-#include <asm/cpu.h>
-
-asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
-
-static int hlt_counter;
-
-unsigned long boot_option_idle_override = 0;
-EXPORT_SYMBOL(boot_option_idle_override);
-
-/*
- * Return saved PC of a blocked thread.
- */
-unsigned long thread_saved_pc(struct task_struct *tsk)
-{
-       return ((unsigned long *)tsk->thread.esp)[3];
-}
-
-/*
- * Powermanagement idle function, if any..
- */
-void (*pm_idle)(void);
-EXPORT_SYMBOL(pm_idle);
-static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
-
-void disable_hlt(void)
-{
-       hlt_counter++;
-}
-
-EXPORT_SYMBOL(disable_hlt);
-
-void enable_hlt(void)
-{
-       hlt_counter--;
-}
-
-EXPORT_SYMBOL(enable_hlt);
-
-/*
- * On SMP it's slightly faster (but much more power-consuming!)
- * to poll the ->work.need_resched flag instead of waiting for the
- * cross-CPU IPI to arrive. Use this option with caution.
- */
-static void poll_idle (void)
-{
-       local_irq_enable();
-
-       asm volatile(
-               "2:"
-               "testl %0, %1;"
-               "rep; nop;"
-               "je 2b;"
-               : : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
-}
-
-static void xen_idle(void)
-{
-       local_irq_disable();
-
-       if (need_resched())
-               local_irq_enable();
-       else {
-               current_thread_info()->status &= ~TS_POLLING;
-               smp_mb__after_clear_bit();
-               safe_halt();
-               current_thread_info()->status |= TS_POLLING;
-       }
-}
-#ifdef CONFIG_APM_MODULE
-EXPORT_SYMBOL(default_idle);
-#endif
-
-#ifdef CONFIG_HOTPLUG_CPU
-extern cpumask_t cpu_initialized;
-static inline void play_dead(void)
-{
-       idle_task_exit();
-       local_irq_disable();
-       cpu_clear(smp_processor_id(), cpu_initialized);
-       preempt_enable_no_resched();
-       HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
-       cpu_bringup();
-}
-#else
-static inline void play_dead(void)
-{
-       BUG();
-}
-#endif /* CONFIG_HOTPLUG_CPU */
-
-/*
- * The idle thread. There's no useful work to be
- * done, so just try to conserve power and have a
- * low exit latency (ie sit in a loop waiting for
- * somebody to say that they'd like to reschedule)
- */
-void cpu_idle(void)
-{
-       int cpu = smp_processor_id();
-
-       current_thread_info()->status |= TS_POLLING;
-
-       /* endless idle loop with no priority at all */
-       while (1) {
-               while (!need_resched()) {
-                       void (*idle)(void);
-
-                       if (__get_cpu_var(cpu_idle_state))
-                               __get_cpu_var(cpu_idle_state) = 0;
-
-                       rmb();
-                       idle = xen_idle; /* no alternatives */
-
-                       if (cpu_is_offline(cpu))
-                               play_dead();
-
-                       __get_cpu_var(irq_stat).idle_timestamp = jiffies;
-                       idle();
-               }
-               preempt_enable_no_resched();
-               schedule();
-               preempt_disable();
-       }
-}
-
-void cpu_idle_wait(void)
-{
-       unsigned int cpu, this_cpu = get_cpu();
-       cpumask_t map;
-
-       set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
-       put_cpu();
-
-       cpus_clear(map);
-       for_each_online_cpu(cpu) {
-               per_cpu(cpu_idle_state, cpu) = 1;
-               cpu_set(cpu, map);
-       }
-
-       __get_cpu_var(cpu_idle_state) = 0;
-
-       wmb();
-       do {
-               ssleep(1);
-               for_each_online_cpu(cpu) {
-                       if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
-                               cpu_clear(cpu, map);
-               }
-               cpus_and(map, map, cpu_online_map);
-       } while (!cpus_empty(map));
-}
-EXPORT_SYMBOL_GPL(cpu_idle_wait);
-
-void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
-{
-}
-
-static int __init idle_setup (char *str)
-{
-       if (!strncmp(str, "poll", 4)) {
-               printk("using polling idle threads.\n");
-               pm_idle = poll_idle;
-       }
-
-       boot_option_idle_override = 1;
-       return 1;
-}
-
-__setup("idle=", idle_setup);
-
-void show_regs(struct pt_regs * regs)
-{
-       unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
-
-       printk("\n");
-       printk("Pid: %d, comm: %20s\n", current->pid, current->comm);
-       printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id());
-       print_symbol("EIP is at %s\n", regs->eip);
-
-       if (user_mode_vm(regs))
-               printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
-       printk(" EFLAGS: %08lx    %s  (%s %.*s)\n",
-              regs->eflags, print_tainted(), system_utsname.release,
-              (int)strcspn(system_utsname.version, " "),
-              system_utsname.version);
-       printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
-               regs->eax,regs->ebx,regs->ecx,regs->edx);
-       printk("ESI: %08lx EDI: %08lx EBP: %08lx",
-               regs->esi, regs->edi, regs->ebp);
-       printk(" DS: %04x ES: %04x\n",
-               0xffff & regs->xds,0xffff & regs->xes);
-
-       cr0 = read_cr0();
-       cr2 = read_cr2();
-       cr3 = read_cr3();
-       cr4 = read_cr4_safe();
-       printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4);
-       show_trace(NULL, regs, &regs->esp);
-}
-
-/*
- * This gets run with %ebx containing the
- * function to call, and %edx containing
- * the "args".
- */
-extern void kernel_thread_helper(void);
-__asm__(".section .text\n"
-       ".align 4\n"
-       "kernel_thread_helper:\n\t"
-       "movl %edx,%eax\n\t"
-       "pushl %edx\n\t"
-       "call *%ebx\n\t"
-       "pushl %eax\n\t"
-       "call do_exit\n"
-       ".previous");
-
-/*
- * Create a kernel thread
- */
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-{
-       struct pt_regs regs;
-
-       memset(&regs, 0, sizeof(regs));
-
-       regs.ebx = (unsigned long) fn;
-       regs.edx = (unsigned long) arg;
-
-       regs.xds = __USER_DS;
-       regs.xes = __USER_DS;
-       regs.orig_eax = -1;
-       regs.eip = (unsigned long) kernel_thread_helper;
-       regs.xcs = GET_KERNEL_CS();
-       regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
-
-       /* Ok, create the new process.. */
-       return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
-}
-EXPORT_SYMBOL(kernel_thread);
-
-/*
- * Free current thread data structures etc..
- */
-void exit_thread(void)
-{
-       /* The process may have allocated an io port bitmap... nuke it. */
-       if (unlikely(test_thread_flag(TIF_IO_BITMAP))) {
-               struct task_struct *tsk = current;
-               struct thread_struct *t = &tsk->thread;
-               struct physdev_set_iobitmap set_iobitmap;
-               memset(&set_iobitmap, 0, sizeof(set_iobitmap));
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
-               kfree(t->io_bitmap_ptr);
-               t->io_bitmap_ptr = NULL;
-               clear_thread_flag(TIF_IO_BITMAP);
-       }
-}
-
-void flush_thread(void)
-{
-       struct task_struct *tsk = current;
-
-       memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
-       memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
-       clear_tsk_thread_flag(tsk, TIF_DEBUG);
-       /*
-        * Forget coprocessor state..
-        */
-       clear_fpu(tsk);
-       clear_used_math();
-}
-
-void release_thread(struct task_struct *dead_task)
-{
-       BUG_ON(dead_task->mm);
-       release_vm86_irqs(dead_task);
-}
-
-/*
- * This gets called before we allocate a new thread and copy
- * the current task into it.
- */
-void prepare_to_copy(struct task_struct *tsk)
-{
-       unlazy_fpu(tsk);
-}
-
-int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
-       unsigned long unused,
-       struct task_struct * p, struct pt_regs * regs)
-{
-       struct pt_regs * childregs;
-       struct task_struct *tsk;
-       int err;
-
-       childregs = task_pt_regs(p);
-       *childregs = *regs;
-       childregs->eax = 0;
-       childregs->esp = esp;
-
-       p->thread.esp = (unsigned long) childregs;
-       p->thread.esp0 = (unsigned long) (childregs+1);
-
-       p->thread.eip = (unsigned long) ret_from_fork;
-
-       savesegment(fs,p->thread.fs);
-       savesegment(gs,p->thread.gs);
-
-       tsk = current;
-       if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
-               p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-               if (!p->thread.io_bitmap_ptr) {
-                       p->thread.io_bitmap_max = 0;
-                       return -ENOMEM;
-               }
-               memcpy(p->thread.io_bitmap_ptr, tsk->thread.io_bitmap_ptr,
-                       IO_BITMAP_BYTES);
-               set_tsk_thread_flag(p, TIF_IO_BITMAP);
-       }
-
-       /*
-        * Set a new TLS for the child thread?
-        */
-       if (clone_flags & CLONE_SETTLS) {
-               struct desc_struct *desc;
-               struct user_desc info;
-               int idx;
-
-               err = -EFAULT;
-               if (copy_from_user(&info, (void __user *)childregs->esi, sizeof(info)))
-                       goto out;
-               err = -EINVAL;
-               if (LDT_empty(&info))
-                       goto out;
-
-               idx = info.entry_number;
-               if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-                       goto out;
-
-               desc = p->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
-               desc->a = LDT_entry_a(&info);
-               desc->b = LDT_entry_b(&info);
-       }
-
-       p->thread.iopl = current->thread.iopl;
-
-       err = 0;
- out:
-       if (err && p->thread.io_bitmap_ptr) {
-               kfree(p->thread.io_bitmap_ptr);
-               p->thread.io_bitmap_max = 0;
-       }
-       return err;
-}
-
-/*
- * fill in the user structure for a core dump..
- */
-void dump_thread(struct pt_regs * regs, struct user * dump)
-{
-       int i;
-
-/* changed the size calculations - should hopefully work better. lbt */
-       dump->magic = CMAGIC;
-       dump->start_code = 0;
-       dump->start_stack = regs->esp & ~(PAGE_SIZE - 1);
-       dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-       dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
-       dump->u_dsize -= dump->u_tsize;
-       dump->u_ssize = 0;
-       for (i = 0; i < 8; i++)
-               dump->u_debugreg[i] = current->thread.debugreg[i];  
-
-       if (dump->start_stack < TASK_SIZE)
-               dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
-
-       dump->regs.ebx = regs->ebx;
-       dump->regs.ecx = regs->ecx;
-       dump->regs.edx = regs->edx;
-       dump->regs.esi = regs->esi;
-       dump->regs.edi = regs->edi;
-       dump->regs.ebp = regs->ebp;
-       dump->regs.eax = regs->eax;
-       dump->regs.ds = regs->xds;
-       dump->regs.es = regs->xes;
-       savesegment(fs,dump->regs.fs);
-       savesegment(gs,dump->regs.gs);
-       dump->regs.orig_eax = regs->orig_eax;
-       dump->regs.eip = regs->eip;
-       dump->regs.cs = regs->xcs;
-       dump->regs.eflags = regs->eflags;
-       dump->regs.esp = regs->esp;
-       dump->regs.ss = regs->xss;
-
-       dump->u_fpvalid = dump_fpu (regs, &dump->i387);
-}
-EXPORT_SYMBOL(dump_thread);
-
-/* 
- * Capture the user space registers if the task is not running (in user space)
- */
-int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
-{
-       struct pt_regs ptregs = *task_pt_regs(tsk);
-       ptregs.xcs &= 0xffff;
-       ptregs.xds &= 0xffff;
-       ptregs.xes &= 0xffff;
-       ptregs.xss &= 0xffff;
-
-       elf_core_copy_regs(regs, &ptregs);
-
-       return 1;
-}
-
-static noinline void __switch_to_xtra(struct task_struct *next_p)
-{
-       struct thread_struct *next;
-
-       next = &next_p->thread;
-
-       if (test_tsk_thread_flag(next_p, TIF_DEBUG)) {
-               set_debugreg(next->debugreg[0], 0);
-               set_debugreg(next->debugreg[1], 1);
-               set_debugreg(next->debugreg[2], 2);
-               set_debugreg(next->debugreg[3], 3);
-               /* no 4 and 5 */
-               set_debugreg(next->debugreg[6], 6);
-               set_debugreg(next->debugreg[7], 7);
-       }
-}
-
-/*
- * This function selects if the context switch from prev to next
- * has to tweak the TSC disable bit in the cr4.
- */
-static inline void disable_tsc(struct task_struct *prev_p,
-                              struct task_struct *next_p)
-{
-       struct thread_info *prev, *next;
-
-       /*
-        * gcc should eliminate the ->thread_info dereference if
-        * has_secure_computing returns 0 at compile time (SECCOMP=n).
-        */
-       prev = task_thread_info(prev_p);
-       next = task_thread_info(next_p);
-
-       if (has_secure_computing(prev) || has_secure_computing(next)) {
-               /* slow path here */
-               if (has_secure_computing(prev) &&
-                   !has_secure_computing(next)) {
-                       write_cr4(read_cr4() & ~X86_CR4_TSD);
-               } else if (!has_secure_computing(prev) &&
-                          has_secure_computing(next))
-                       write_cr4(read_cr4() | X86_CR4_TSD);
-       }
-}
-
-/*
- *     switch_to(x,yn) should switch tasks from x to y.
- *
- * We fsave/fwait so that an exception goes off at the right time
- * (as a call from the fsave or fwait in effect) rather than to
- * the wrong process. Lazy FP saving no longer makes any sense
- * with modern CPU's, and this simplifies a lot of things (SMP
- * and UP become the same).
- *
- * NOTE! We used to use the x86 hardware context switching. The
- * reason for not using it any more becomes apparent when you
- * try to recover gracefully from saved state that is no longer
- * valid (stale segment register values in particular). With the
- * hardware task-switch, there is no way to fix up bad state in
- * a reasonable manner.
- *
- * The fact that Intel documents the hardware task-switching to
- * be slow is a fairly red herring - this code is not noticeably
- * faster. However, there _is_ some room for improvement here,
- * so the performance issues may eventually be a valid point.
- * More important, however, is the fact that this allows us much
- * more flexibility.
- *
- * The return value (in %eax) will be the "prev" task after
- * the task-switch, and shows up in ret_from_fork in entry.S,
- * for example.
- */
-struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
-{
-       struct thread_struct *prev = &prev_p->thread,
-                                *next = &next_p->thread;
-       int cpu = smp_processor_id();
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss = &per_cpu(init_tss, cpu);
-#endif
-       struct physdev_set_iopl iopl_op;
-       struct physdev_set_iobitmap iobmp_op;
-       multicall_entry_t _mcl[8], *mcl = _mcl;
-
-       /* XEN NOTE: FS/GS saved in switch_mm(), not here. */
-
-       /*
-        * This is basically '__unlazy_fpu', except that we queue a
-        * multicall to indicate FPU task switch, rather than
-        * synchronously trapping to Xen.
-        */
-       if (prev_p->thread_info->status & TS_USEDFPU) {
-               __save_init_fpu(prev_p); /* _not_ save_init_fpu() */
-               mcl->op      = __HYPERVISOR_fpu_taskswitch;
-               mcl->args[0] = 1;
-               mcl++;
-       }
-#if 0 /* lazy fpu sanity check */
-       else BUG_ON(!(read_cr0() & 8));
-#endif
-
-       /*
-        * Reload esp0.
-        * This is load_esp0(tss, next) with a multicall.
-        */
-       mcl->op      = __HYPERVISOR_stack_switch;
-       mcl->args[0] = __KERNEL_DS;
-       mcl->args[1] = next->esp0;
-       mcl++;
-
-       /*
-        * Load the per-thread Thread-Local Storage descriptor.
-        * This is load_TLS(next, cpu) with multicalls.
-        */
-#define C(i) do {                                                      \
-       if (unlikely(next->tls_array[i].a != prev->tls_array[i].a ||    \
-                    next->tls_array[i].b != prev->tls_array[i].b)) {   \
-               mcl->op = __HYPERVISOR_update_descriptor;               \
-               *(u64 *)&mcl->args[0] = virt_to_machine(                \
-                       &get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i]);\
-               *(u64 *)&mcl->args[2] = *(u64 *)&next->tls_array[i];    \
-               mcl++;                                                  \
-       }                                                               \
-} while (0)
-       C(0); C(1); C(2);
-#undef C
-
-       if (unlikely(prev->iopl != next->iopl)) {
-               iopl_op.iopl = (next->iopl == 0) ? 1 : (next->iopl >> 12) & 3;
-               mcl->op      = __HYPERVISOR_physdev_op;
-               mcl->args[0] = PHYSDEVOP_set_iopl;
-               mcl->args[1] = (unsigned long)&iopl_op;
-               mcl++;
-       }
-
-       if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) {
-               set_xen_guest_handle(iobmp_op.bitmap,
-                                    (char *)next->io_bitmap_ptr);
-               iobmp_op.nr_ports = next->io_bitmap_ptr ? IO_BITMAP_BITS : 0;
-               mcl->op      = __HYPERVISOR_physdev_op;
-               mcl->args[0] = PHYSDEVOP_set_iobitmap;
-               mcl->args[1] = (unsigned long)&iobmp_op;
-               mcl++;
-       }
-
-       (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
-
-       /*
-        * Restore %fs and %gs if needed.
-        *
-        * Glibc normally makes %fs be zero, and %gs is one of
-        * the TLS segments.
-        */
-       if (unlikely(next->fs))
-               loadsegment(fs, next->fs);
-
-       if (next->gs)
-               loadsegment(gs, next->gs);
-
-       /*
-        * Now maybe handle debug registers
-        */
-       if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
-               __switch_to_xtra(next_p);
-
-       disable_tsc(prev_p, next_p);
-
-       return prev_p;
-}
-
-asmlinkage int sys_fork(struct pt_regs regs)
-{
-       return do_fork(SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
-}
-
-asmlinkage int sys_clone(struct pt_regs regs)
-{
-       unsigned long clone_flags;
-       unsigned long newsp;
-       int __user *parent_tidptr, *child_tidptr;
-
-       clone_flags = regs.ebx;
-       newsp = regs.ecx;
-       parent_tidptr = (int __user *)regs.edx;
-       child_tidptr = (int __user *)regs.edi;
-       if (!newsp)
-               newsp = regs.esp;
-       return do_fork(clone_flags, newsp, &regs, 0, parent_tidptr, child_tidptr);
-}
-
-/*
- * This is trivial, and on the face of it looks like it
- * could equally well be done in user mode.
- *
- * Not so, for quite unobvious reasons - register pressure.
- * In user mode vfork() cannot have a stack frame, and if
- * done by calling the "clone()" system call directly, you
- * do not have enough call-clobbered registers to hold all
- * the information you need.
- */
-asmlinkage int sys_vfork(struct pt_regs regs)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
-}
-
-/*
- * sys_execve() executes a new program.
- */
-asmlinkage int sys_execve(struct pt_regs regs)
-{
-       int error;
-       char * filename;
-
-       filename = getname((char __user *) regs.ebx);
-       error = PTR_ERR(filename);
-       if (IS_ERR(filename))
-               goto out;
-       error = do_execve(filename,
-                       (char __user * __user *) regs.ecx,
-                       (char __user * __user *) regs.edx,
-                       &regs);
-       if (error == 0) {
-               task_lock(current);
-               current->ptrace &= ~PT_DTRACE;
-               task_unlock(current);
-               /* Make sure we don't return using sysenter.. */
-               set_thread_flag(TIF_IRET);
-       }
-       putname(filename);
-out:
-       return error;
-}
-
-#define top_esp                (THREAD_SIZE - sizeof(unsigned long))
-#define top_ebp                (THREAD_SIZE - 2*sizeof(unsigned long))
-
-unsigned long get_wchan(struct task_struct *p)
-{
-       unsigned long ebp, esp, eip;
-       unsigned long stack_page;
-       int count = 0;
-       if (!p || p == current || p->state == TASK_RUNNING)
-               return 0;
-       stack_page = (unsigned long)task_stack_page(p);
-       esp = p->thread.esp;
-       if (!stack_page || esp < stack_page || esp > top_esp+stack_page)
-               return 0;
-       /* include/asm-i386/system.h:switch_to() pushes ebp last. */
-       ebp = *(unsigned long *) esp;
-       do {
-               if (ebp < stack_page || ebp > top_ebp+stack_page)
-                       return 0;
-               eip = *(unsigned long *) (ebp+4);
-               if (!in_sched_functions(eip))
-                       return eip;
-               ebp = *(unsigned long *) ebp;
-       } while (count++ < 16);
-       return 0;
-}
-
-/*
- * sys_alloc_thread_area: get a yet unused TLS descriptor index.
- */
-static int get_free_idx(void)
-{
-       struct thread_struct *t = &current->thread;
-       int idx;
-
-       for (idx = 0; idx < GDT_ENTRY_TLS_ENTRIES; idx++)
-               if (desc_empty(t->tls_array + idx))
-                       return idx + GDT_ENTRY_TLS_MIN;
-       return -ESRCH;
-}
-
-/*
- * Set a given TLS descriptor:
- */
-asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
-{
-       struct thread_struct *t = &current->thread;
-       struct user_desc info;
-       struct desc_struct *desc;
-       int cpu, idx;
-
-       if (copy_from_user(&info, u_info, sizeof(info)))
-               return -EFAULT;
-       idx = info.entry_number;
-
-       /*
-        * index -1 means the kernel should try to find and
-        * allocate an empty descriptor:
-        */
-       if (idx == -1) {
-               idx = get_free_idx();
-               if (idx < 0)
-                       return idx;
-               if (put_user(idx, &u_info->entry_number))
-                       return -EFAULT;
-       }
-
-       if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-               return -EINVAL;
-
-       desc = t->tls_array + idx - GDT_ENTRY_TLS_MIN;
-
-       /*
-        * We must not get preempted while modifying the TLS.
-        */
-       cpu = get_cpu();
-
-       if (LDT_empty(&info)) {
-               desc->a = 0;
-               desc->b = 0;
-       } else {
-               desc->a = LDT_entry_a(&info);
-               desc->b = LDT_entry_b(&info);
-       }
-       load_TLS(t, cpu);
-
-       put_cpu();
-
-       return 0;
-}
-
-/*
- * Get the current Thread-Local Storage area:
- */
-
-#define GET_BASE(desc) ( \
-       (((desc)->a >> 16) & 0x0000ffff) | \
-       (((desc)->b << 16) & 0x00ff0000) | \
-       ( (desc)->b        & 0xff000000)   )
-
-#define GET_LIMIT(desc) ( \
-       ((desc)->a & 0x0ffff) | \
-        ((desc)->b & 0xf0000) )
-       
-#define GET_32BIT(desc)                (((desc)->b >> 22) & 1)
-#define GET_CONTENTS(desc)     (((desc)->b >> 10) & 3)
-#define GET_WRITABLE(desc)     (((desc)->b >>  9) & 1)
-#define GET_LIMIT_PAGES(desc)  (((desc)->b >> 23) & 1)
-#define GET_PRESENT(desc)      (((desc)->b >> 15) & 1)
-#define GET_USEABLE(desc)      (((desc)->b >> 20) & 1)
-
-asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
-{
-       struct user_desc info;
-       struct desc_struct *desc;
-       int idx;
-
-       if (get_user(idx, &u_info->entry_number))
-               return -EFAULT;
-       if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-               return -EINVAL;
-
-       memset(&info, 0, sizeof(info));
-
-       desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
-
-       info.entry_number = idx;
-       info.base_addr = GET_BASE(desc);
-       info.limit = GET_LIMIT(desc);
-       info.seg_32bit = GET_32BIT(desc);
-       info.contents = GET_CONTENTS(desc);
-       info.read_exec_only = !GET_WRITABLE(desc);
-       info.limit_in_pages = GET_LIMIT_PAGES(desc);
-       info.seg_not_present = !GET_PRESENT(desc);
-       info.useable = GET_USEABLE(desc);
-
-       if (copy_to_user(u_info, &info, sizeof(info)))
-               return -EFAULT;
-       return 0;
-}
-
-unsigned long arch_align_stack(unsigned long sp)
-{
-       if (randomize_va_space)
-               sp -= get_random_int() % 8192;
-       return sp & ~0xf;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/quirks-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/quirks-xen.c
deleted file mode 100644 (file)
index 85385ae..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * This file contains work-arounds for x86 and x86_64 platform bugs.
- */
-#include <linux/pci.h>
-#include <linux/irq.h>
-
-#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_SMP) || defined(CONFIG_XEN)) && defined(CONFIG_PCI)
-
-static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
-{
-       u8 config, rev;
-       u32 word;
-
-       /* BIOS may enable hardware IRQ balancing for
-        * E7520/E7320/E7525(revision ID 0x9 and below)
-        * based platforms.
-        * Disable SW irqbalance/affinity on those platforms.
-        */
-       pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
-       if (rev > 0x9)
-               return;
-
-       printk(KERN_INFO "Intel E7520/7320/7525 detected.");
-
-       /* enable access to config space*/
-       pci_read_config_byte(dev, 0xf4, &config);
-       pci_write_config_byte(dev, 0xf4, config|0x2);
-
-       /* read xTPR register */
-       raw_pci_ops->read(0, 0, 0x40, 0x4c, 2, &word);
-
-       if (!(word & (1 << 13))) {
-               struct xen_platform_op op;
-               printk(KERN_INFO "Disabling irq balancing and affinity\n");
-               op.cmd = XENPF_platform_quirk;
-               op.u.platform_quirk.quirk_id = QUIRK_NOIRQBALANCING;
-               (void)HYPERVISOR_platform_op(&op);
-       }
-
-       /* put back the original value for config space*/
-       if (!(config & 0x2))
-               pci_write_config_byte(dev, 0xf4, config);
-}
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_E7320_MCH,  quirk_intel_irqbalance);
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_E7525_MCH,  quirk_intel_irqbalance);
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_E7520_MCH,  quirk_intel_irqbalance);
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
deleted file mode 100644 (file)
index f355f9a..0000000
+++ /dev/null
@@ -1,1898 +0,0 @@
-/*
- *  linux/arch/i386/kernel/setup.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- *
- *  Memory region support
- *     David Parsons <orc@pell.chi.il.us>, July-August 1999
- *
- *  Added E820 sanitization routine (removes overlapping memory regions);
- *  Brian Moyle <bmoyle@mvista.com>, February 2001
- *
- * Moved CPU detection code to cpu/${cpu}.c
- *    Patrick Mochel <mochel@osdl.org>, March 2002
- *
- *  Provisions for empty E820 memory regions (reported by certain BIOSes).
- *  Alex Achenbach <xela@slit.de>, December 2002.
- *
- */
-
-/*
- * This file handles the architecture-dependent parts of initialization
- */
-
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/mmzone.h>
-#include <linux/screen_info.h>
-#include <linux/ioport.h>
-#include <linux/acpi.h>
-#include <linux/apm_bios.h>
-#include <linux/initrd.h>
-#include <linux/bootmem.h>
-#include <linux/seq_file.h>
-#include <linux/platform_device.h>
-#include <linux/console.h>
-#include <linux/mca.h>
-#include <linux/root_dev.h>
-#include <linux/highmem.h>
-#include <linux/module.h>
-#include <linux/efi.h>
-#include <linux/init.h>
-#include <linux/edd.h>
-#include <linux/nodemask.h>
-#include <linux/kernel.h>
-#include <linux/percpu.h>
-#include <linux/notifier.h>
-#include <linux/kexec.h>
-#include <linux/crash_dump.h>
-#include <linux/dmi.h>
-#include <linux/pfn.h>
-
-#include <video/edid.h>
-
-#include <asm/apic.h>
-#include <asm/e820.h>
-#include <asm/mpspec.h>
-#include <asm/setup.h>
-#include <asm/arch_hooks.h>
-#include <asm/sections.h>
-#include <asm/io_apic.h>
-#include <asm/ist.h>
-#include <asm/io.h>
-#include <asm/hypervisor.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/memory.h>
-#include <xen/features.h>
-#include <xen/xencons.h>
-#include <setup_arch.h>
-#include <bios_ebda.h>
-
-#ifdef CONFIG_XEN
-#include <xen/interface/kexec.h>
-#endif
-
-/* Forward Declaration. */
-void __init find_max_pfn(void);
-
-static int xen_panic_event(struct notifier_block *, unsigned long, void *);
-static struct notifier_block xen_panic_block = {
-       xen_panic_event, NULL, 0 /* try to go last */
-};
-
-extern char hypercall_page[PAGE_SIZE];
-EXPORT_SYMBOL(hypercall_page);
-
-int disable_pse __devinitdata = 0;
-
-/*
- * Machine setup..
- */
-
-#ifdef CONFIG_EFI
-int efi_enabled = 0;
-EXPORT_SYMBOL(efi_enabled);
-#endif
-
-/* cpu data as detected by the assembly code in head.S */
-struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
-/* common cpu data for all cpus */
-struct cpuinfo_x86 boot_cpu_data __read_mostly = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
-EXPORT_SYMBOL(boot_cpu_data);
-
-unsigned long mmu_cr4_features;
-
-#ifdef CONFIG_ACPI
-       int acpi_disabled = 0;
-#else
-       int acpi_disabled = 1;
-#endif
-EXPORT_SYMBOL(acpi_disabled);
-
-#ifdef CONFIG_ACPI
-int __initdata acpi_force = 0;
-extern acpi_interrupt_flags    acpi_sci_flags;
-#endif
-
-/* for MCA, but anyone else can use it if they want */
-unsigned int machine_id;
-#ifdef CONFIG_MCA
-EXPORT_SYMBOL(machine_id);
-#endif
-unsigned int machine_submodel_id;
-unsigned int BIOS_revision;
-unsigned int mca_pentium_flag;
-
-/* For PCI or other memory-mapped resources */
-unsigned long pci_mem_start = 0x10000000;
-#ifdef CONFIG_PCI
-EXPORT_SYMBOL(pci_mem_start);
-#endif
-
-/* Boot loader ID as an integer, for the benefit of proc_dointvec */
-int bootloader_type;
-
-/* user-defined highmem size */
-static unsigned int highmem_pages = -1;
-
-/*
- * Setup options
- */
-struct drive_info_struct { char dummy[32]; } drive_info;
-#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || \
-    defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
-EXPORT_SYMBOL(drive_info);
-#endif
-struct screen_info screen_info;
-EXPORT_SYMBOL(screen_info);
-struct apm_info apm_info;
-EXPORT_SYMBOL(apm_info);
-struct sys_desc_table_struct {
-       unsigned short length;
-       unsigned char table[0];
-};
-struct edid_info edid_info;
-EXPORT_SYMBOL_GPL(edid_info);
-struct ist_info ist_info;
-#if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
-       defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
-EXPORT_SYMBOL(ist_info);
-#endif
-struct e820map e820;
-#ifdef CONFIG_XEN
-struct e820map machine_e820;
-#endif
-
-extern void early_cpu_init(void);
-extern void generic_apic_probe(char *);
-extern int root_mountflags;
-
-unsigned long saved_videomode;
-
-#define RAMDISK_IMAGE_START_MASK       0x07FF
-#define RAMDISK_PROMPT_FLAG            0x8000
-#define RAMDISK_LOAD_FLAG              0x4000  
-
-static char command_line[COMMAND_LINE_SIZE];
-
-unsigned char __initdata boot_params[PARAM_SIZE];
-
-static struct resource data_resource = {
-       .name   = "Kernel data",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-
-static struct resource code_resource = {
-       .name   = "Kernel code",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-
-static struct resource system_rom_resource = {
-       .name   = "System ROM",
-       .start  = 0xf0000,
-       .end    = 0xfffff,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-};
-
-static struct resource extension_rom_resource = {
-       .name   = "Extension ROM",
-       .start  = 0xe0000,
-       .end    = 0xeffff,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-};
-
-static struct resource adapter_rom_resources[] = { {
-       .name   = "Adapter ROM",
-       .start  = 0xc8000,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-}, {
-       .name   = "Adapter ROM",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-}, {
-       .name   = "Adapter ROM",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-}, {
-       .name   = "Adapter ROM",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-}, {
-       .name   = "Adapter ROM",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-}, {
-       .name   = "Adapter ROM",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-} };
-
-#define ADAPTER_ROM_RESOURCES \
-       (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
-
-static struct resource video_rom_resource = {
-       .name   = "Video ROM",
-       .start  = 0xc0000,
-       .end    = 0xc7fff,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-};
-
-static struct resource video_ram_resource = {
-       .name   = "Video RAM area",
-       .start  = 0xa0000,
-       .end    = 0xbffff,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-
-static struct resource standard_io_resources[] = { {
-       .name   = "dma1",
-       .start  = 0x0000,
-       .end    = 0x001f,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "pic1",
-       .start  = 0x0020,
-       .end    = 0x0021,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "timer0",
-       .start  = 0x0040,
-       .end    = 0x0043,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "timer1",
-       .start  = 0x0050,
-       .end    = 0x0053,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "keyboard",
-       .start  = 0x0060,
-       .end    = 0x006f,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "dma page reg",
-       .start  = 0x0080,
-       .end    = 0x008f,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "pic2",
-       .start  = 0x00a0,
-       .end    = 0x00a1,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "dma2",
-       .start  = 0x00c0,
-       .end    = 0x00df,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-}, {
-       .name   = "fpu",
-       .start  = 0x00f0,
-       .end    = 0x00ff,
-       .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-} };
-
-#define STANDARD_IO_RESOURCES \
-       (sizeof standard_io_resources / sizeof standard_io_resources[0])
-
-#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-
-static int __init romchecksum(unsigned char *rom, unsigned long length)
-{
-       unsigned char *p, sum = 0;
-
-       for (p = rom; p < rom + length; p++)
-               sum += *p;
-       return sum == 0;
-}
-
-static void __init probe_roms(void)
-{
-       unsigned long start, length, upper;
-       unsigned char *rom;
-       int           i;
-
-#ifdef CONFIG_XEN
-       /* Nothing to do if not running in dom0. */
-       if (!is_initial_xendomain())
-               return;
-#endif
-
-       /* video rom */
-       upper = adapter_rom_resources[0].start;
-       for (start = video_rom_resource.start; start < upper; start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               video_rom_resource.start = start;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* if checksum okay, trust length byte */
-               if (length && romchecksum(rom, length))
-                       video_rom_resource.end = start + length - 1;
-
-               request_resource(&iomem_resource, &video_rom_resource);
-               break;
-       }
-
-       start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
-       if (start < upper)
-               start = upper;
-
-       /* system rom */
-       request_resource(&iomem_resource, &system_rom_resource);
-       upper = system_rom_resource.start;
-
-       /* check for extension rom (ignore length byte!) */
-       rom = isa_bus_to_virt(extension_rom_resource.start);
-       if (romsignature(rom)) {
-               length = extension_rom_resource.end - extension_rom_resource.start + 1;
-               if (romchecksum(rom, length)) {
-                       request_resource(&iomem_resource, &extension_rom_resource);
-                       upper = extension_rom_resource.start;
-               }
-       }
-
-       /* check for adapter roms on 2k boundaries */
-       for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* but accept any length that fits if checksum okay */
-               if (!length || start + length > upper || !romchecksum(rom, length))
-                       continue;
-
-               adapter_rom_resources[i].start = start;
-               adapter_rom_resources[i].end = start + length - 1;
-               request_resource(&iomem_resource, &adapter_rom_resources[i]);
-
-               start = adapter_rom_resources[i++].end & ~2047UL;
-       }
-}
-
-/*
- * Point at the empty zero page to start with. We map the real shared_info
- * page as soon as fixmap is up and running.
- */
-shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-EXPORT_SYMBOL(HYPERVISOR_shared_info);
-
-unsigned long *phys_to_machine_mapping;
-unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[16];
-EXPORT_SYMBOL(phys_to_machine_mapping);
-
-/* Raw start-of-day parameters from the hypervisor. */
-start_info_t *xen_start_info;
-EXPORT_SYMBOL(xen_start_info);
-
-void __init add_memory_region(unsigned long long start,
-                             unsigned long long size, int type)
-{
-       int x;
-
-       if (!efi_enabled) {
-                       x = e820.nr_map;
-
-               if (x == E820MAX) {
-                   printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-                   return;
-               }
-
-               e820.map[x].addr = start;
-               e820.map[x].size = size;
-               e820.map[x].type = type;
-               e820.nr_map++;
-       }
-} /* add_memory_region */
-
-static void __init limit_regions(unsigned long long size)
-{
-       unsigned long long current_addr = 0;
-       int i;
-
-       if (efi_enabled) {
-               efi_memory_desc_t *md;
-               void *p;
-
-               for (p = memmap.map, i = 0; p < memmap.map_end;
-                       p += memmap.desc_size, i++) {
-                       md = p;
-                       current_addr = md->phys_addr + (md->num_pages << 12);
-                       if (md->type == EFI_CONVENTIONAL_MEMORY) {
-                               if (current_addr >= size) {
-                                       md->num_pages -=
-                                               (((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
-                                       memmap.nr_map = i + 1;
-                                       return;
-                               }
-                       }
-               }
-       }
-       for (i = 0; i < e820.nr_map; i++) {
-               current_addr = e820.map[i].addr + e820.map[i].size;
-               if (current_addr < size)
-                       continue;
-
-               if (e820.map[i].type != E820_RAM)
-                       continue;
-
-               if (e820.map[i].addr >= size) {
-                       /*
-                        * This region starts past the end of the
-                        * requested size, skip it completely.
-                        */
-                       e820.nr_map = i;
-               } else {
-                       e820.nr_map = i + 1;
-                       e820.map[i].size -= current_addr - size;
-               }
-               return;
-       }
-#ifdef CONFIG_XEN
-       if (i==e820.nr_map && current_addr < size) {
-               /*
-                 * The e820 map finished before our requested size so
-                 * extend the final entry to the requested address.
-                 */
-               --i;
-               if (e820.map[i].type == E820_RAM)
-                       e820.map[i].size -= current_addr - size;
-               else
-                       add_memory_region(current_addr, size - current_addr, E820_RAM);
-       }
-#endif
-}
-
-#define E820_DEBUG     1
-
-static void __init print_memory_map(char *who)
-{
-       int i;
-
-       for (i = 0; i < e820.nr_map; i++) {
-               printk(" %s: %016Lx - %016Lx ", who,
-                       e820.map[i].addr,
-                       e820.map[i].addr + e820.map[i].size);
-               switch (e820.map[i].type) {
-               case E820_RAM:  printk("(usable)\n");
-                               break;
-               case E820_RESERVED:
-                               printk("(reserved)\n");
-                               break;
-               case E820_ACPI:
-                               printk("(ACPI data)\n");
-                               break;
-               case E820_NVS:
-                               printk("(ACPI NVS)\n");
-                               break;
-               default:        printk("type %lu\n", e820.map[i].type);
-                               break;
-               }
-       }
-}
-
-/*
- * Sanitize the BIOS e820 map.
- *
- * Some e820 responses include overlapping entries.  The following 
- * replaces the original e820 map with a new one, removing overlaps.
- *
- */
-struct change_member {
-       struct e820entry *pbios; /* pointer to original bios entry */
-       unsigned long long addr; /* address for this change point */
-};
-static struct change_member change_point_list[2*E820MAX] __initdata;
-static struct change_member *change_point[2*E820MAX] __initdata;
-static struct e820entry *overlap_list[E820MAX] __initdata;
-static struct e820entry new_bios[E820MAX] __initdata;
-
-int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
-{
-       struct change_member *change_tmp;
-       unsigned long current_type, last_type;
-       unsigned long long last_addr;
-       int chgidx, still_changing;
-       int overlap_entries;
-       int new_bios_entry;
-       int old_nr, new_nr, chg_nr;
-       int i;
-
-       /*
-               Visually we're performing the following (1,2,3,4 = memory types)...
-
-               Sample memory map (w/overlaps):
-                  ____22__________________
-                  ______________________4_
-                  ____1111________________
-                  _44_____________________
-                  11111111________________
-                  ____________________33__
-                  ___________44___________
-                  __________33333_________
-                  ______________22________
-                  ___________________2222_
-                  _________111111111______
-                  _____________________11_
-                  _________________4______
-
-               Sanitized equivalent (no overlap):
-                  1_______________________
-                  _44_____________________
-                  ___1____________________
-                  ____22__________________
-                  ______11________________
-                  _________1______________
-                  __________3_____________
-                  ___________44___________
-                  _____________33_________
-                  _______________2________
-                  ________________1_______
-                  _________________4______
-                  ___________________2____
-                  ____________________33__
-                  ______________________4_
-       */
-
-       /* if there's only one memory region, don't bother */
-       if (*pnr_map < 2)
-               return -1;
-
-       old_nr = *pnr_map;
-
-       /* bail out if we find any unreasonable addresses in bios map */
-       for (i=0; i<old_nr; i++)
-               if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
-                       return -1;
-
-       /* create pointers for initial change-point information (for sorting) */
-       for (i=0; i < 2*old_nr; i++)
-               change_point[i] = &change_point_list[i];
-
-       /* record all known change-points (starting and ending addresses),
-          omitting those that are for empty memory regions */
-       chgidx = 0;
-       for (i=0; i < old_nr; i++)      {
-               if (biosmap[i].size != 0) {
-                       change_point[chgidx]->addr = biosmap[i].addr;
-                       change_point[chgidx++]->pbios = &biosmap[i];
-                       change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
-                       change_point[chgidx++]->pbios = &biosmap[i];
-               }
-       }
-       chg_nr = chgidx;        /* true number of change-points */
-
-       /* sort change-point list by memory addresses (low -> high) */
-       still_changing = 1;
-       while (still_changing)  {
-               still_changing = 0;
-               for (i=1; i < chg_nr; i++)  {
-                       /* if <current_addr> > <last_addr>, swap */
-                       /* or, if current=<start_addr> & last=<end_addr>, swap */
-                       if ((change_point[i]->addr < change_point[i-1]->addr) ||
-                               ((change_point[i]->addr == change_point[i-1]->addr) &&
-                                (change_point[i]->addr == change_point[i]->pbios->addr) &&
-                                (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
-                          )
-                       {
-                               change_tmp = change_point[i];
-                               change_point[i] = change_point[i-1];
-                               change_point[i-1] = change_tmp;
-                               still_changing=1;
-                       }
-               }
-       }
-
-       /* create a new bios memory map, removing overlaps */
-       overlap_entries=0;       /* number of entries in the overlap table */
-       new_bios_entry=0;        /* index for creating new bios map entries */
-       last_type = 0;           /* start with undefined memory type */
-       last_addr = 0;           /* start with 0 as last starting address */
-       /* loop through change-points, determining affect on the new bios map */
-       for (chgidx=0; chgidx < chg_nr; chgidx++)
-       {
-               /* keep track of all overlapping bios entries */
-               if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
-               {
-                       /* add map entry to overlap list (> 1 entry implies an overlap) */
-                       overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
-               }
-               else
-               {
-                       /* remove entry from list (order independent, so swap with last) */
-                       for (i=0; i<overlap_entries; i++)
-                       {
-                               if (overlap_list[i] == change_point[chgidx]->pbios)
-                                       overlap_list[i] = overlap_list[overlap_entries-1];
-                       }
-                       overlap_entries--;
-               }
-               /* if there are overlapping entries, decide which "type" to use */
-               /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
-               current_type = 0;
-               for (i=0; i<overlap_entries; i++)
-                       if (overlap_list[i]->type > current_type)
-                               current_type = overlap_list[i]->type;
-               /* continue building up new bios map based on this information */
-               if (current_type != last_type)  {
-                       if (last_type != 0)      {
-                               new_bios[new_bios_entry].size =
-                                       change_point[chgidx]->addr - last_addr;
-                               /* move forward only if the new size was non-zero */
-                               if (new_bios[new_bios_entry].size != 0)
-                                       if (++new_bios_entry >= E820MAX)
-                                               break;  /* no more space left for new bios entries */
-                       }
-                       if (current_type != 0)  {
-                               new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
-                               new_bios[new_bios_entry].type = current_type;
-                               last_addr=change_point[chgidx]->addr;
-                       }
-                       last_type = current_type;
-               }
-       }
-       new_nr = new_bios_entry;   /* retain count for new bios entries */
-
-       /* copy new bios mapping into original location */
-       memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
-       *pnr_map = new_nr;
-
-       return 0;
-}
-
-/*
- * Copy the BIOS e820 map into a safe place.
- *
- * Sanity-check it while we're at it..
- *
- * If we're lucky and live on a modern system, the setup code
- * will have given us a memory map that we can use to properly
- * set up memory.  If we aren't, we'll fake a memory map.
- *
- * We check to see that the memory map contains at least 2 elements
- * before we'll use it, because the detection code in setup.S may
- * not be perfect and most every PC known to man has two memory
- * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
- * thinkpad 560x, for example, does not cooperate with the memory
- * detection code.)
- */
-int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
-{
-#ifndef CONFIG_XEN
-       /* Only one memory region (or negative)? Ignore it */
-       if (nr_map < 2)
-               return -1;
-#else
-       BUG_ON(nr_map < 1);
-#endif
-
-       do {
-               unsigned long long start = biosmap->addr;
-               unsigned long long size = biosmap->size;
-               unsigned long long end = start + size;
-               unsigned long type = biosmap->type;
-
-               /* Overflow in 64 bits? Ignore the memory map. */
-               if (start > end)
-                       return -1;
-
-#ifndef CONFIG_XEN
-               /*
-                * Some BIOSes claim RAM in the 640k - 1M region.
-                * Not right. Fix it up.
-                */
-               if (type == E820_RAM) {
-                       if (start < 0x100000ULL && end > 0xA0000ULL) {
-                               if (start < 0xA0000ULL)
-                                       add_memory_region(start, 0xA0000ULL-start, type);
-                               if (end <= 0x100000ULL)
-                                       continue;
-                               start = 0x100000ULL;
-                               size = end - start;
-                       }
-               }
-#endif
-               add_memory_region(start, size, type);
-       } while (biosmap++,--nr_map);
-       return 0;
-}
-
-#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-struct edd edd;
-#ifdef CONFIG_EDD_MODULE
-EXPORT_SYMBOL(edd);
-#endif
-/**
- * copy_edd() - Copy the BIOS EDD information
- *              from boot_params into a safe place.
- *
- */
-static inline void copy_edd(void)
-{
-     memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
-     memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
-     edd.mbr_signature_nr = EDD_MBR_SIG_NR;
-     edd.edd_info_nr = EDD_NR;
-}
-#else
-static inline void copy_edd(void)
-{
-}
-#endif
-
-static void __init parse_cmdline_early (char ** cmdline_p)
-{
-       char c = ' ', *to = command_line, *from = saved_command_line;
-       int len = 0, max_cmdline;
-       int userdef = 0;
-
-       if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
-               max_cmdline = COMMAND_LINE_SIZE;
-       memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
-       /* Save unparsed command line copy for /proc/cmdline */
-       saved_command_line[max_cmdline-1] = '\0';
-
-       for (;;) {
-               if (c != ' ')
-                       goto next_char;
-               /*
-                * "mem=nopentium" disables the 4MB page tables.
-                * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
-                * to <mem>, overriding the bios size.
-                * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
-                * <start> to <start>+<mem>, overriding the bios size.
-                *
-                * HPA tells me bootloaders need to parse mem=, so no new
-                * option should be mem=  [also see Documentation/i386/boot.txt]
-                */
-               if (!memcmp(from, "mem=", 4)) {
-                       if (to != command_line)
-                               to--;
-                       if (!memcmp(from+4, "nopentium", 9)) {
-                               from += 9+4;
-                               clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
-                               disable_pse = 1;
-                       } else {
-                               /* If the user specifies memory size, we
-                                * limit the BIOS-provided memory map to
-                                * that size. exactmap can be used to specify
-                                * the exact map. mem=number can be used to
-                                * trim the existing memory map.
-                                */
-                               unsigned long long mem_size;
-                               mem_size = memparse(from+4, &from);
-                               limit_regions(mem_size);
-                               userdef=1;
-                       }
-               }
-
-               else if (!memcmp(from, "memmap=", 7)) {
-                       if (to != command_line)
-                               to--;
-                       if (!memcmp(from+7, "exactmap", 8)) {
-#ifdef CONFIG_CRASH_DUMP
-                               /* If we are doing a crash dump, we
-                                * still need to know the real mem
-                                * size before original memory map is
-                                * reset.
-                                */
-                               find_max_pfn();
-                               saved_max_pfn = max_pfn;
-#endif
-                               from += 8+7;
-                               e820.nr_map = 0;
-                               userdef = 1;
-                       } else {
-                               /* If the user specifies memory size, we
-                                * limit the BIOS-provided memory map to
-                                * that size. exactmap can be used to specify
-                                * the exact map. mem=number can be used to
-                                * trim the existing memory map.
-                                */
-                               unsigned long long start_at, mem_size;
-                               mem_size = memparse(from+7, &from);
-                               if (*from == '@') {
-                                       start_at = memparse(from+1, &from);
-                                       add_memory_region(start_at, mem_size, E820_RAM);
-                               } else if (*from == '#') {
-                                       start_at = memparse(from+1, &from);
-                                       add_memory_region(start_at, mem_size, E820_ACPI);
-                               } else if (*from == '$') {
-                                       start_at = memparse(from+1, &from);
-                                       add_memory_region(start_at, mem_size, E820_RESERVED);
-                               } else {
-                                       limit_regions(mem_size);
-                                       userdef=1;
-                               }
-                       }
-               }
-
-               else if (!memcmp(from, "noexec=", 7))
-                       noexec_setup(from + 7);
-
-
-#ifdef  CONFIG_X86_MPPARSE
-               /*
-                * If the BIOS enumerates physical processors before logical,
-                * maxcpus=N at enumeration-time can be used to disable HT.
-                */
-               else if (!memcmp(from, "maxcpus=", 8)) {
-                       extern unsigned int maxcpus;
-
-                       maxcpus = simple_strtoul(from + 8, NULL, 0);
-               }
-#endif
-
-#ifdef CONFIG_ACPI
-               /* "acpi=off" disables both ACPI table parsing and interpreter */
-               else if (!memcmp(from, "acpi=off", 8)) {
-                       disable_acpi();
-               }
-
-               /* acpi=force to over-ride black-list */
-               else if (!memcmp(from, "acpi=force", 10)) {
-                       acpi_force = 1;
-                       acpi_ht = 1;
-                       acpi_disabled = 0;
-               }
-
-               /* acpi=strict disables out-of-spec workarounds */
-               else if (!memcmp(from, "acpi=strict", 11)) {
-                       acpi_strict = 1;
-               }
-
-               /* Limit ACPI just to boot-time to enable HT */
-               else if (!memcmp(from, "acpi=ht", 7)) {
-                       if (!acpi_force)
-                               disable_acpi();
-                       acpi_ht = 1;
-               }
-               
-               /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */
-               else if (!memcmp(from, "pci=noacpi", 10)) {
-                       acpi_disable_pci();
-               }
-               /* "acpi=noirq" disables ACPI interrupt routing */
-               else if (!memcmp(from, "acpi=noirq", 10)) {
-                       acpi_noirq_set();
-               }
-
-               else if (!memcmp(from, "acpi_sci=edge", 13))
-                       acpi_sci_flags.trigger =  1;
-
-               else if (!memcmp(from, "acpi_sci=level", 14))
-                       acpi_sci_flags.trigger = 3;
-
-               else if (!memcmp(from, "acpi_sci=high", 13))
-                       acpi_sci_flags.polarity = 1;
-
-               else if (!memcmp(from, "acpi_sci=low", 12))
-                       acpi_sci_flags.polarity = 3;
-
-#ifdef CONFIG_X86_IO_APIC
-               else if (!memcmp(from, "acpi_skip_timer_override", 24))
-                       acpi_skip_timer_override = 1;
-
-               if (!memcmp(from, "disable_timer_pin_1", 19))
-                       disable_timer_pin_1 = 1;
-               if (!memcmp(from, "enable_timer_pin_1", 18))
-                       disable_timer_pin_1 = -1;
-
-               /* disable IO-APIC */
-               else if (!memcmp(from, "noapic", 6))
-                       disable_ioapic_setup();
-#endif /* CONFIG_X86_IO_APIC */
-#endif /* CONFIG_ACPI */
-
-#ifdef CONFIG_X86_LOCAL_APIC
-               /* enable local APIC */
-               else if (!memcmp(from, "lapic", 5))
-                       lapic_enable();
-
-               /* disable local APIC */
-               else if (!memcmp(from, "nolapic", 6))
-                       lapic_disable();
-#endif /* CONFIG_X86_LOCAL_APIC */
-
-#ifdef CONFIG_KEXEC
-               /* crashkernel=size@addr specifies the location to reserve for
-                * a crash kernel.  By reserving this memory we guarantee
-                * that linux never set's it up as a DMA target.
-                * Useful for holding code to do something appropriate
-                * after a kernel panic.
-                */
-               else if (!memcmp(from, "crashkernel=", 12)) {
-#ifndef CONFIG_XEN
-                       unsigned long size, base;
-                       size = memparse(from+12, &from);
-                       if (*from == '@') {
-                               base = memparse(from+1, &from);
-                               /* FIXME: Do I want a sanity check
-                                * to validate the memory range?
-                                */
-                               crashk_res.start = base;
-                               crashk_res.end   = base + size - 1;
-                       }
-#else
-                       printk("Ignoring crashkernel command line, "
-                              "parameter will be supplied by xen\n");
-#endif
-               }
-#endif
-#ifdef CONFIG_PROC_VMCORE
-               /* elfcorehdr= specifies the location of elf core header
-                * stored by the crashed kernel.
-                */
-               else if (!memcmp(from, "elfcorehdr=", 11))
-                       elfcorehdr_addr = memparse(from+11, &from);
-#endif
-
-               /*
-                * highmem=size forces highmem to be exactly 'size' bytes.
-                * This works even on boxes that have no highmem otherwise.
-                * This also works to reduce highmem size on bigger boxes.
-                */
-               else if (!memcmp(from, "highmem=", 8))
-                       highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
-       
-               /*
-                * vmalloc=size forces the vmalloc area to be exactly 'size'
-                * bytes. This can be used to increase (or decrease) the
-                * vmalloc area - the default is 128m.
-                */
-               else if (!memcmp(from, "vmalloc=", 8))
-                       __VMALLOC_RESERVE = memparse(from+8, &from);
-
-       next_char:
-               c = *(from++);
-               if (!c)
-                       break;
-               if (COMMAND_LINE_SIZE <= ++len)
-                       break;
-               *(to++) = c;
-       }
-       *to = '\0';
-       *cmdline_p = command_line;
-       if (userdef) {
-               printk(KERN_INFO "user-defined physical RAM map:\n");
-               print_memory_map("user");
-       }
-}
-
-/*
- * Callback for efi_memory_walk.
- */
-static int __init
-efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
-{
-       unsigned long *max_pfn = arg, pfn;
-
-       if (start < end) {
-               pfn = PFN_UP(end -1);
-               if (pfn > *max_pfn)
-                       *max_pfn = pfn;
-       }
-       return 0;
-}
-
-static int __init
-efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
-{
-       memory_present(0, start, end);
-       return 0;
-}
-
- /*
-  * This function checks if the entire range <start,end> is mapped with type.
-  *
-  * Note: this function only works correct if the e820 table is sorted and
-  * not-overlapping, which is the case
-  */
-int __init
-e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
-{
-       u64 start = s;
-       u64 end = e;
-       int i;
-
-#ifndef CONFIG_XEN
-       for (i = 0; i < e820.nr_map; i++) {
-               struct e820entry *ei = &e820.map[i];
-#else
-       if (!is_initial_xendomain())
-               return 0;
-       for (i = 0; i < machine_e820.nr_map; ++i) {
-               const struct e820entry *ei = &machine_e820.map[i];
-#endif
-               if (type && ei->type != type)
-                       continue;
-               /* is the region (part) in overlap with the current region ?*/
-               if (ei->addr >= end || ei->addr + ei->size <= start)
-                       continue;
-               /* if the region is at the beginning of <start,end> we move
-                * start to the end of the region since it's ok until there
-                */
-               if (ei->addr <= start)
-                       start = ei->addr + ei->size;
-               /* if start is now at or beyond end, we're done, full
-                * coverage */
-               if (start >= end)
-                       return 1; /* we're done */
-       }
-       return 0;
-}
-
-/*
- * Find the highest page frame number we have available
- */
-void __init find_max_pfn(void)
-{
-       int i;
-
-       max_pfn = 0;
-       if (efi_enabled) {
-               efi_memmap_walk(efi_find_max_pfn, &max_pfn);
-               efi_memmap_walk(efi_memory_present_wrapper, NULL);
-               return;
-       }
-
-       for (i = 0; i < e820.nr_map; i++) {
-               unsigned long start, end;
-               /* RAM? */
-               if (e820.map[i].type != E820_RAM)
-                       continue;
-               start = PFN_UP(e820.map[i].addr);
-               end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
-               if (start >= end)
-                       continue;
-               if (end > max_pfn)
-                       max_pfn = end;
-               memory_present(0, start, end);
-       }
-}
-
-/*
- * Determine low and high memory ranges:
- */
-unsigned long __init find_max_low_pfn(void)
-{
-       unsigned long max_low_pfn;
-
-       max_low_pfn = max_pfn;
-       if (max_low_pfn > MAXMEM_PFN) {
-               if (highmem_pages == -1)
-                       highmem_pages = max_pfn - MAXMEM_PFN;
-               if (highmem_pages + MAXMEM_PFN < max_pfn)
-                       max_pfn = MAXMEM_PFN + highmem_pages;
-               if (highmem_pages + MAXMEM_PFN > max_pfn) {
-                       printk("only %luMB highmem pages available, ignoring highmem size of %uMB.\n", pages_to_mb(max_pfn - MAXMEM_PFN), pages_to_mb(highmem_pages));
-                       highmem_pages = 0;
-               }
-               max_low_pfn = MAXMEM_PFN;
-#ifndef CONFIG_HIGHMEM
-               /* Maximum memory usable is what is directly addressable */
-               printk(KERN_WARNING "Warning only %ldMB will be used.\n",
-                                       MAXMEM>>20);
-               if (max_pfn > MAX_NONPAE_PFN)
-                       printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-               else
-                       printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
-               max_pfn = MAXMEM_PFN;
-#else /* !CONFIG_HIGHMEM */
-#ifndef CONFIG_X86_PAE
-               if (max_pfn > MAX_NONPAE_PFN) {
-                       max_pfn = MAX_NONPAE_PFN;
-                       printk(KERN_WARNING "Warning only 4GB will be used.\n");
-                       printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-               }
-#endif /* !CONFIG_X86_PAE */
-#endif /* !CONFIG_HIGHMEM */
-       } else {
-               if (highmem_pages == -1)
-                       highmem_pages = 0;
-#ifdef CONFIG_HIGHMEM
-               if (highmem_pages >= max_pfn) {
-                       printk(KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.\n", pages_to_mb(highmem_pages), pages_to_mb(max_pfn));
-                       highmem_pages = 0;
-               }
-               if (highmem_pages) {
-                       if (max_low_pfn-highmem_pages < 64*1024*1024/PAGE_SIZE){
-                               printk(KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.\n", pages_to_mb(highmem_pages));
-                               highmem_pages = 0;
-                       }
-                       max_low_pfn -= highmem_pages;
-               }
-#else
-               if (highmem_pages)
-                       printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n");
-#endif
-       }
-       return max_low_pfn;
-}
-
-/*
- * Free all available memory for boot time allocation.  Used
- * as a callback function by efi_memory_walk()
- */
-
-static int __init
-free_available_memory(unsigned long start, unsigned long end, void *arg)
-{
-       /* check max_low_pfn */
-       if (start >= (max_low_pfn << PAGE_SHIFT))
-               return 0;
-       if (end >= (max_low_pfn << PAGE_SHIFT))
-               end = max_low_pfn << PAGE_SHIFT;
-       if (start < end)
-               free_bootmem(start, end - start);
-
-       return 0;
-}
-/*
- * Register fully available low RAM pages with the bootmem allocator.
- */
-static void __init register_bootmem_low_pages(unsigned long max_low_pfn)
-{
-       int i;
-
-       if (efi_enabled) {
-               efi_memmap_walk(free_available_memory, NULL);
-               return;
-       }
-       for (i = 0; i < e820.nr_map; i++) {
-               unsigned long curr_pfn, last_pfn, size;
-               /*
-                * Reserve usable low memory
-                */
-               if (e820.map[i].type != E820_RAM)
-                       continue;
-               /*
-                * We are rounding up the start address of usable memory:
-                */
-               curr_pfn = PFN_UP(e820.map[i].addr);
-               if (curr_pfn >= max_low_pfn)
-                       continue;
-               /*
-                * ... and at the end of the usable range downwards:
-                */
-               last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
-
-#ifdef CONFIG_XEN
-               /*
-                 * Truncate to the number of actual pages currently
-                 * present.
-                 */
-               if (last_pfn > xen_start_info->nr_pages)
-                       last_pfn = xen_start_info->nr_pages;
-#endif
-
-               if (last_pfn > max_low_pfn)
-                       last_pfn = max_low_pfn;
-
-               /*
-                * .. finally, did all the rounding and playing
-                * around just make the area go away?
-                */
-               if (last_pfn <= curr_pfn)
-                       continue;
-
-               size = last_pfn - curr_pfn;
-               free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
-       }
-}
-
-#ifndef CONFIG_XEN
-/*
- * workaround for Dell systems that neglect to reserve EBDA
- */
-static void __init reserve_ebda_region(void)
-{
-       unsigned int addr;
-       addr = get_bios_ebda();
-       if (addr)
-               reserve_bootmem(addr, PAGE_SIZE);       
-}
-#endif
-
-#ifndef CONFIG_NEED_MULTIPLE_NODES
-void __init setup_bootmem_allocator(void);
-static unsigned long __init setup_memory(void)
-{
-       /*
-        * partially used pages are not usable - thus
-        * we are rounding upwards:
-        */
-       min_low_pfn = PFN_UP(__pa(xen_start_info->pt_base)) +
-               xen_start_info->nr_pt_frames;
-
-       find_max_pfn();
-
-       max_low_pfn = find_max_low_pfn();
-
-#ifdef CONFIG_HIGHMEM
-       highstart_pfn = highend_pfn = max_pfn;
-       if (max_pfn > max_low_pfn) {
-               highstart_pfn = max_low_pfn;
-       }
-       printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
-               pages_to_mb(highend_pfn - highstart_pfn));
-#endif
-       printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
-                       pages_to_mb(max_low_pfn));
-
-       setup_bootmem_allocator();
-
-       return max_low_pfn;
-}
-
-void __init zone_sizes_init(void)
-{
-       unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
-       unsigned int max_dma, low;
-
-       /*
-        * XEN: Our notion of "DMA memory" is fake when running over Xen.
-        * We simply put all RAM in the DMA zone so that those drivers which
-        * needlessly specify GFP_DMA do not get starved of RAM unnecessarily.
-        * Those drivers that *do* require lowmem are screwed anyway when
-        * running over Xen!
-        */
-       max_dma = max_low_pfn;
-       low = max_low_pfn;
-
-       if (low < max_dma)
-               zones_size[ZONE_DMA] = low;
-       else {
-               zones_size[ZONE_DMA] = max_dma;
-               zones_size[ZONE_NORMAL] = low - max_dma;
-#ifdef CONFIG_HIGHMEM
-               zones_size[ZONE_HIGHMEM] = highend_pfn - low;
-#endif
-       }
-       free_area_init(zones_size);
-}
-#else
-extern unsigned long __init setup_memory(void);
-extern void zone_sizes_init(void);
-#endif /* !CONFIG_NEED_MULTIPLE_NODES */
-
-void __init setup_bootmem_allocator(void)
-{
-       unsigned long bootmap_size;
-       /*
-        * Initialize the boot-time allocator (with low memory only):
-        */
-       bootmap_size = init_bootmem(min_low_pfn, max_low_pfn);
-
-       register_bootmem_low_pages(max_low_pfn);
-
-       /*
-        * Reserve the bootmem bitmap itself as well. We do this in two
-        * steps (first step was init_bootmem()) because this catches
-        * the (very unlikely) case of us accidentally initializing the
-        * bootmem allocator with an invalid RAM area.
-        */
-       reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(min_low_pfn) +
-                        bootmap_size + PAGE_SIZE-1) - (__PHYSICAL_START));
-
-#ifndef CONFIG_XEN
-       /*
-        * reserve physical page 0 - it's a special BIOS page on many boxes,
-        * enabling clean reboots, SMP operation, laptop functions.
-        */
-       reserve_bootmem(0, PAGE_SIZE);
-
-       /* reserve EBDA region, it's a 4K region */
-       reserve_ebda_region();
-
-    /* could be an AMD 768MPX chipset. Reserve a page  before VGA to prevent
-       PCI prefetch into it (errata #56). Usually the page is reserved anyways,
-       unless you have no PS/2 mouse plugged in. */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-           boot_cpu_data.x86 == 6)
-            reserve_bootmem(0xa0000 - 4096, 4096);
-
-#ifdef CONFIG_SMP
-       /*
-        * But first pinch a few for the stack/trampoline stuff
-        * FIXME: Don't need the extra page at 4K, but need to fix
-        * trampoline before removing it. (see the GDT stuff)
-        */
-       reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
-#endif
-#ifdef CONFIG_ACPI_SLEEP
-       /*
-        * Reserve low memory region for sleep support.
-        */
-       acpi_reserve_bootmem();
-#endif
-#endif /* !CONFIG_XEN */
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (xen_start_info->mod_start) {
-               if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
-                       /*reserve_bootmem(INITRD_START, INITRD_SIZE);*/
-                       initrd_start = INITRD_START + PAGE_OFFSET;
-                       initrd_end = initrd_start+INITRD_SIZE;
-                       initrd_below_start_ok = 1;
-               }
-               else {
-                       printk(KERN_ERR "initrd extends beyond end of memory "
-                           "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-                           INITRD_START + INITRD_SIZE,
-                           max_low_pfn << PAGE_SHIFT);
-                       initrd_start = 0;
-               }
-       }
-#endif
-#ifdef CONFIG_KEXEC
-#ifdef CONFIG_XEN
-       xen_machine_kexec_setup_resources();
-#else
-       if (crashk_res.start != crashk_res.end)
-               reserve_bootmem(crashk_res.start,
-                       crashk_res.end - crashk_res.start + 1);
-#endif
-#endif
-
-       if (!xen_feature(XENFEAT_auto_translated_physmap))
-               phys_to_machine_mapping =
-                       (unsigned long *)xen_start_info->mfn_list;
-}
-
-/*
- * The node 0 pgdat is initialized before all of these because
- * it's needed for bootmem.  node>0 pgdats have their virtual
- * space allocated before the pagetables are in place to access
- * them, so they can't be cleared then.
- *
- * This should all compile down to nothing when NUMA is off.
- */
-void __init remapped_pgdat_init(void)
-{
-       int nid;
-
-       for_each_online_node(nid) {
-               if (nid != 0)
-                       memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
-       }
-}
-
-/*
- * Request address space for all standard RAM and ROM resources
- * and also for regions reported as reserved by the e820.
- */
-static void __init
-legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
-                           struct resource *code_resource,
-                           struct resource *data_resource)
-{
-       int i;
-
-       probe_roms();
-
-       for (i = 0; i < nr_map; i++) {
-               struct resource *res;
-#ifndef CONFIG_RESOURCES_64BIT
-               if (e820[i].addr + e820[i].size > 0x100000000ULL)
-                       continue;
-#endif
-               res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
-               switch (e820[i].type) {
-               case E820_RAM:  res->name = "System RAM"; break;
-               case E820_ACPI: res->name = "ACPI Tables"; break;
-               case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
-               default:        res->name = "reserved";
-               }
-               res->start = e820[i].addr;
-               res->end = res->start + e820[i].size - 1;
-               res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-               if (request_resource(&iomem_resource, res)) {
-                       kfree(res);
-                       continue;
-               }
-               if (e820[i].type == E820_RAM) {
-                       /*
-                        *  We don't know which RAM region contains kernel data,
-                        *  so we try it repeatedly and let the resource manager
-                        *  test it.
-                        */
-#ifndef CONFIG_XEN
-                       request_resource(res, code_resource);
-                       request_resource(res, data_resource);
-#endif
-#ifdef CONFIG_KEXEC
-                       if (crashk_res.start != crashk_res.end)
-                            request_resource(res, &crashk_res);
-#ifdef CONFIG_XEN
-                       xen_machine_kexec_register_resources(res);
-#endif
-#endif
-               }
-       }
-}
-
-/*
- * Locate a unused range of the physical address space below 4G which
- * can be used for PCI mappings.
- */
-static void __init
-e820_setup_gap(struct e820entry *e820, int nr_map)
-{
-       unsigned long gapstart, gapsize, round;
-       unsigned long long last;
-       int i;
-
-       /*
-        * Search for the bigest gap in the low 32 bits of the e820
-        * memory space.
-        */
-       last = 0x100000000ull;
-       gapstart = 0x10000000;
-       gapsize = 0x400000;
-       i = nr_map;
-       while (--i >= 0) {
-               unsigned long long start = e820[i].addr;
-               unsigned long long end = start + e820[i].size;
-
-               /*
-                * Since "last" is at most 4GB, we know we'll
-                * fit in 32 bits if this condition is true
-                */
-               if (last > end) {
-                       unsigned long gap = last - end;
-
-                       if (gap > gapsize) {
-                               gapsize = gap;
-                               gapstart = end;
-                       }
-               }
-               if (start < last)
-                       last = start;
-       }
-
-       /*
-        * See how much we want to round up: start off with
-        * rounding to the next 1MB area.
-        */
-       round = 0x100000;
-       while ((gapsize >> 4) > round)
-               round += round;
-       /* Fun with two's complement */
-       pci_mem_start = (gapstart + round) & -round;
-
-       printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
-               pci_mem_start, gapstart, gapsize);
-}
-
-/*
- * Request address space for all standard resources
- *
- * This is called just before pcibios_init(), which is also a
- * subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
- */
-static int __init request_standard_resources(void)
-{
-       int           i;
-
-       /* Nothing to do if not running in dom0. */
-       if (!is_initial_xendomain())
-               return 0;
-
-       printk("Setting up standard PCI resources\n");
-#ifdef CONFIG_XEN
-       legacy_init_iomem_resources(machine_e820.map, machine_e820.nr_map,
-                                   &code_resource, &data_resource);
-#else
-       if (efi_enabled)
-               efi_initialize_iomem_resources(&code_resource, &data_resource);
-       else
-               legacy_init_iomem_resources(e820.map, e820.nr_map,
-                                           &code_resource, &data_resource);
-#endif
-
-       /* EFI systems may still have VGA */
-       request_resource(&iomem_resource, &video_ram_resource);
-
-       /* request I/O space for devices used on all i[345]86 PCs */
-       for (i = 0; i < STANDARD_IO_RESOURCES; i++)
-               request_resource(&ioport_resource, &standard_io_resources[i]);
-       return 0;
-}
-
-subsys_initcall(request_standard_resources);
-
-static void __init register_memory(void)
-{
-#ifdef CONFIG_XEN
-       if (is_initial_xendomain()) {
-               struct xen_memory_map memmap;
-
-               memmap.nr_entries = E820MAX;
-               set_xen_guest_handle(memmap.buffer, machine_e820.map);
-
-               if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
-                       BUG();
-
-               machine_e820.nr_map = memmap.nr_entries;
-               e820_setup_gap(machine_e820.map, machine_e820.nr_map);
-       }
-       else
-#endif
-               e820_setup_gap(e820.map, e820.nr_map);
-}
-
-#ifdef CONFIG_MCA
-static void set_mca_bus(int x)
-{
-       MCA_bus = x;
-}
-#else
-static void set_mca_bus(int x) { }
-#endif
-
-/*
- * Determine if we were loaded by an EFI loader.  If so, then we have also been
- * passed the efi memmap, systab, etc., so we should use these data structures
- * for initialization.  Note, the efi init code path is determined by the
- * global efi_enabled. This allows the same kernel image to be used on existing
- * systems (with a traditional BIOS) as well as on EFI systems.
- */
-void __init setup_arch(char **cmdline_p)
-{
-       int i, j, k, fpp;
-       struct physdev_set_iopl set_iopl;
-       unsigned long max_low_pfn;
-       unsigned long p2m_pages;
-
-       /* Force a quick death if the kernel panics (not domain 0). */
-       extern int panic_timeout;
-       if (!panic_timeout && !is_initial_xendomain())
-               panic_timeout = 1;
-
-       /* Register a call for panic conditions. */
-       atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
-
-       HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
-       HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                            VMASST_TYPE_writable_pagetables);
-
-       memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
-       early_cpu_init();
-#ifdef CONFIG_SMP
-       prefill_possible_map();
-#endif
-
-       /*
-        * FIXME: This isn't an official loader_type right
-        * now but does currently work with elilo.
-        * If we were configured as an EFI kernel, check to make
-        * sure that we were loaded correctly from elilo and that
-        * the system table is valid.  If not, then initialize normally.
-        */
-#ifdef CONFIG_EFI
-       if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
-               efi_enabled = 1;
-#endif
-
-       /* This must be initialized to UNNAMED_MAJOR for ipconfig to work
-          properly.  Setting ROOT_DEV to default to /dev/ram0 breaks initrd.
-       */
-       ROOT_DEV = MKDEV(UNNAMED_MAJOR,0);
-       drive_info = DRIVE_INFO;
-       screen_info = SCREEN_INFO;
-       edid_info = EDID_INFO;
-       apm_info.bios = APM_BIOS_INFO;
-       ist_info = IST_INFO;
-       saved_videomode = VIDEO_MODE;
-       if( SYS_DESC_TABLE.length != 0 ) {
-               set_mca_bus(SYS_DESC_TABLE.table[3] & 0x2);
-               machine_id = SYS_DESC_TABLE.table[0];
-               machine_submodel_id = SYS_DESC_TABLE.table[1];
-               BIOS_revision = SYS_DESC_TABLE.table[2];
-       }
-       bootloader_type = LOADER_TYPE;
-
-       if (is_initial_xendomain()) {
-               /* This is drawn from a dump from vgacon:startup in
-                * standard Linux. */
-               screen_info.orig_video_mode = 3; 
-               screen_info.orig_video_isVGA = 1;
-               screen_info.orig_video_lines = 25;
-               screen_info.orig_video_cols = 80;
-               screen_info.orig_video_ega_bx = 3;
-               screen_info.orig_video_points = 16;
-               screen_info.orig_y = screen_info.orig_video_lines - 1;
-               if (xen_start_info->console.dom0.info_size >=
-                   sizeof(struct dom0_vga_console_info)) {
-                       const struct dom0_vga_console_info *info =
-                               (struct dom0_vga_console_info *)(
-                                       (char *)xen_start_info +
-                                       xen_start_info->console.dom0.info_off);
-                       dom0_init_screen_info(info);
-               }
-               xen_start_info->console.domU.mfn = 0;
-               xen_start_info->console.domU.evtchn = 0;
-       } else
-               screen_info.orig_video_isVGA = 0;
-
-#ifdef CONFIG_BLK_DEV_RAM
-       rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
-       rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-       rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
-#endif
-
-       setup_xen_features();
-
-       ARCH_SETUP
-       if (efi_enabled)
-               efi_init();
-       else {
-               printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-               print_memory_map(machine_specific_memory_setup());
-       }
-
-       copy_edd();
-
-       if (!MOUNT_ROOT_RDONLY)
-               root_mountflags &= ~MS_RDONLY;
-       init_mm.start_code = (unsigned long) _text;
-       init_mm.end_code = (unsigned long) _etext;
-       init_mm.end_data = (unsigned long) _edata;
-       init_mm.brk = (PFN_UP(__pa(xen_start_info->pt_base)) +
-                      xen_start_info->nr_pt_frames) << PAGE_SHIFT;
-
-       code_resource.start = virt_to_phys(_text);
-       code_resource.end = virt_to_phys(_etext)-1;
-       data_resource.start = virt_to_phys(_etext);
-       data_resource.end = virt_to_phys(_edata)-1;
-
-       parse_cmdline_early(cmdline_p);
-
-#ifdef CONFIG_EARLY_PRINTK
-       {
-               char *s = strstr(*cmdline_p, "earlyprintk=");
-               if (s) {
-                       setup_early_printk(strchr(s, '=') + 1);
-                       printk("early console enabled\n");
-               }
-       }
-#endif
-
-       max_low_pfn = setup_memory();
-
-       /*
-        * NOTE: before this point _nobody_ is allowed to allocate
-        * any memory using the bootmem allocator.  Although the
-        * alloctor is now initialised only the first 8Mb of the kernel
-        * virtual address space has been mapped.  All allocations before
-        * paging_init() has completed must use the alloc_bootmem_low_pages()
-        * variant (which allocates DMA'able memory) and care must be taken
-        * not to exceed the 8Mb limit.
-        */
-
-#ifdef CONFIG_SMP
-       smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
-#endif
-       paging_init();
-       remapped_pgdat_init();
-       sparse_init();
-       zone_sizes_init();
-
-#ifdef CONFIG_X86_FIND_SMP_CONFIG
-       /*
-        * Find and reserve possible boot-time SMP configuration:
-        */
-       find_smp_config();
-#endif
-
-       p2m_pages = max_pfn;
-       if (xen_start_info->nr_pages > max_pfn) {
-               /*
-                * the max_pfn was shrunk (probably by mem= or highmem=
-                * kernel parameter); shrink reservation with the HV
-                */
-               struct xen_memory_reservation reservation = {
-                       .address_bits = 0,
-                       .extent_order = 0,
-                       .domid = DOMID_SELF
-               };
-               unsigned int difference;
-               int ret;
-
-               difference = xen_start_info->nr_pages - max_pfn;
-
-               set_xen_guest_handle(reservation.extent_start,
-                                    ((unsigned long *)xen_start_info->mfn_list) + max_pfn);
-               reservation.nr_extents = difference;
-               ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                          &reservation);
-               BUG_ON (ret != difference);
-       }
-       else if (max_pfn > xen_start_info->nr_pages)
-               p2m_pages = xen_start_info->nr_pages;
-
-       /* Make sure we have a correctly sized P->M table. */
-       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-               phys_to_machine_mapping = alloc_bootmem_low_pages(
-                    max_pfn * sizeof(unsigned long));
-               memset(phys_to_machine_mapping, ~0,
-                      max_pfn * sizeof(unsigned long));
-               memcpy(phys_to_machine_mapping,
-                      (unsigned long *)xen_start_info->mfn_list,
-                      p2m_pages * sizeof(unsigned long));
-               free_bootmem(
-                    __pa(xen_start_info->mfn_list),
-                    PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
-                                    sizeof(unsigned long))));
-
-               /*
-                * Initialise the list of the frames that specify the list of
-                * frames that make up the p2m table. Used by save/restore
-                */
-               pfn_to_mfn_frame_list_list = alloc_bootmem_low_pages(PAGE_SIZE);
-
-               fpp = PAGE_SIZE/sizeof(unsigned long);
-               for (i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++) {
-                       if ((j % fpp) == 0) {
-                               k++;
-                               BUG_ON(k>=16);
-                               pfn_to_mfn_frame_list[k] =
-                                       alloc_bootmem_low_pages(PAGE_SIZE);
-                               pfn_to_mfn_frame_list_list[k] =
-                                       virt_to_mfn(pfn_to_mfn_frame_list[k]);
-                               j=0;
-                       }
-                       pfn_to_mfn_frame_list[k][j] =
-                               virt_to_mfn(&phys_to_machine_mapping[i]);
-               }
-               HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
-               HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-                    virt_to_mfn(pfn_to_mfn_frame_list_list);
-       }
-
-       /*
-        * NOTE: at this point the bootmem allocator is fully available.
-        */
-
-       if (is_initial_xendomain())
-               dmi_scan_machine();
-
-#ifdef CONFIG_X86_GENERICARCH
-       generic_apic_probe(*cmdline_p);
-#endif 
-       if (efi_enabled)
-               efi_map_memmap();
-
-       set_iopl.iopl = 1;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
-
-#ifdef CONFIG_ACPI
-       if (!is_initial_xendomain()) {
-               printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
-               acpi_disabled = 1;
-               acpi_ht = 0;
-       }
-
-       /*
-        * Parse the ACPI tables for possible boot-time SMP configuration.
-        */
-       acpi_boot_table_init();
-#endif
-
-#ifdef CONFIG_X86_IO_APIC
-       check_acpi_pci();       /* Checks more than just ACPI actually */
-#endif
-
-#ifdef CONFIG_ACPI
-       acpi_boot_init();
-
-#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
-       if (def_to_bigsmp)
-               printk(KERN_WARNING "More than 8 CPUs detected and "
-                       "CONFIG_X86_PC cannot handle it.\nUse "
-                       "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
-#endif
-#endif
-#ifdef CONFIG_X86_LOCAL_APIC
-       if (smp_found_config)
-               get_smp_config();
-#endif
-
-       register_memory();
-
-       if (is_initial_xendomain()) {
-#ifdef CONFIG_VT
-#if defined(CONFIG_VGA_CONSOLE)
-               if (!efi_enabled ||
-                   (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
-                       conswitchp = &vga_con;
-#elif defined(CONFIG_DUMMY_CONSOLE)
-               conswitchp = &dummy_con;
-#endif
-#endif
-       } else {
-#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
-               conswitchp = &dummy_con;
-#endif
-       }
-       tsc_init();
-
-       xencons_early_setup();
-}
-
-static int
-xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-       HYPERVISOR_shutdown(SHUTDOWN_crash);
-       /* we're never actually going to get here... */
-       return NOTIFY_DONE;
-}
-
-static __init int add_pcspkr(void)
-{
-       struct platform_device *pd;
-       int ret;
-
-       if (!is_initial_xendomain())
-               return 0;
-
-       pd = platform_device_alloc("pcspkr", -1);
-       if (!pd)
-               return -ENOMEM;
-
-       ret = platform_device_add(pd);
-       if (ret)
-               platform_device_put(pd);
-
-       return ret;
-}
-device_initcall(add_pcspkr);
-
-/*
- * Local Variables:
- * mode:c
- * c-file-style:"k&r"
- * c-basic-offset:8
- * End:
- */
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/smp-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/smp-xen.c
deleted file mode 100644 (file)
index a56f383..0000000
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- *     Intel SMP support routines.
- *
- *     (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
- *     (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
- *
- *     This code is released under the GNU General Public License version 2 or
- *     later.
- */
-
-#include <linux/init.h>
-
-#include <linux/mm.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel_stat.h>
-#include <linux/mc146818rtc.h>
-#include <linux/cache.h>
-#include <linux/interrupt.h>
-#include <linux/cpu.h>
-#include <linux/module.h>
-
-#include <asm/mtrr.h>
-#include <asm/tlbflush.h>
-#if 0
-#include <mach_apic.h>
-#endif
-#include <xen/evtchn.h>
-
-/*
- *     Some notes on x86 processor bugs affecting SMP operation:
- *
- *     Pentium, Pentium Pro, II, III (and all CPUs) have bugs.
- *     The Linux implications for SMP are handled as follows:
- *
- *     Pentium III / [Xeon]
- *             None of the E1AP-E3AP errata are visible to the user.
- *
- *     E1AP.   see PII A1AP
- *     E2AP.   see PII A2AP
- *     E3AP.   see PII A3AP
- *
- *     Pentium II / [Xeon]
- *             None of the A1AP-A3AP errata are visible to the user.
- *
- *     A1AP.   see PPro 1AP
- *     A2AP.   see PPro 2AP
- *     A3AP.   see PPro 7AP
- *
- *     Pentium Pro
- *             None of 1AP-9AP errata are visible to the normal user,
- *     except occasional delivery of 'spurious interrupt' as trap #15.
- *     This is very rare and a non-problem.
- *
- *     1AP.    Linux maps APIC as non-cacheable
- *     2AP.    worked around in hardware
- *     3AP.    fixed in C0 and above steppings microcode update.
- *             Linux does not use excessive STARTUP_IPIs.
- *     4AP.    worked around in hardware
- *     5AP.    symmetric IO mode (normal Linux operation) not affected.
- *             'noapic' mode has vector 0xf filled out properly.
- *     6AP.    'noapic' mode might be affected - fixed in later steppings
- *     7AP.    We do not assume writes to the LVT deassering IRQs
- *     8AP.    We do not enable low power mode (deep sleep) during MP bootup
- *     9AP.    We do not use mixed mode
- *
- *     Pentium
- *             There is a marginal case where REP MOVS on 100MHz SMP
- *     machines with B stepping processors can fail. XXX should provide
- *     an L1cache=Writethrough or L1cache=off option.
- *
- *             B stepping CPUs may hang. There are hardware work arounds
- *     for this. We warn about it in case your board doesn't have the work
- *     arounds. Basically thats so I can tell anyone with a B stepping
- *     CPU and SMP problems "tough".
- *
- *     Specific items [From Pentium Processor Specification Update]
- *
- *     1AP.    Linux doesn't use remote read
- *     2AP.    Linux doesn't trust APIC errors
- *     3AP.    We work around this
- *     4AP.    Linux never generated 3 interrupts of the same priority
- *             to cause a lost local interrupt.
- *     5AP.    Remote read is never used
- *     6AP.    not affected - worked around in hardware
- *     7AP.    not affected - worked around in hardware
- *     8AP.    worked around in hardware - we get explicit CS errors if not
- *     9AP.    only 'noapic' mode affected. Might generate spurious
- *             interrupts, we log only the first one and count the
- *             rest silently.
- *     10AP.   not affected - worked around in hardware
- *     11AP.   Linux reads the APIC between writes to avoid this, as per
- *             the documentation. Make sure you preserve this as it affects
- *             the C stepping chips too.
- *     12AP.   not affected - worked around in hardware
- *     13AP.   not affected - worked around in hardware
- *     14AP.   we always deassert INIT during bootup
- *     15AP.   not affected - worked around in hardware
- *     16AP.   not affected - worked around in hardware
- *     17AP.   not affected - worked around in hardware
- *     18AP.   not affected - worked around in hardware
- *     19AP.   not affected - worked around in BIOS
- *
- *     If this sounds worrying believe me these bugs are either ___RARE___,
- *     or are signal timing bugs worked around in hardware and there's
- *     about nothing of note with C stepping upwards.
- */
-
-DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) ____cacheline_aligned = { &init_mm, 0, };
-
-/*
- * the following functions deal with sending IPIs between CPUs.
- *
- * We use 'broadcast', CPU->CPU IPIs and self-IPIs too.
- */
-
-static inline int __prepare_ICR (unsigned int shortcut, int vector)
-{
-       unsigned int icr = shortcut | APIC_DEST_LOGICAL;
-
-       switch (vector) {
-       default:
-               icr |= APIC_DM_FIXED | vector;
-               break;
-       case NMI_VECTOR:
-               icr |= APIC_DM_NMI;
-               break;
-       }
-       return icr;
-}
-
-static inline int __prepare_ICR2 (unsigned int mask)
-{
-       return SET_APIC_DEST_FIELD(mask);
-}
-
-DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
-
-static inline void __send_IPI_one(unsigned int cpu, int vector)
-{
-       int irq = per_cpu(ipi_to_irq, cpu)[vector];
-       BUG_ON(irq < 0);
-       notify_remote_via_irq(irq);
-}
-
-void __send_IPI_shortcut(unsigned int shortcut, int vector)
-{
-       int cpu;
-
-       switch (shortcut) {
-       case APIC_DEST_SELF:
-               __send_IPI_one(smp_processor_id(), vector);
-               break;
-       case APIC_DEST_ALLBUT:
-               for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-                       if (cpu == smp_processor_id())
-                               continue;
-                       if (cpu_isset(cpu, cpu_online_map)) {
-                               __send_IPI_one(cpu, vector);
-                       }
-               }
-               break;
-       default:
-               printk("XXXXXX __send_IPI_shortcut %08x vector %d\n", shortcut,
-                      vector);
-               break;
-       }
-}
-
-void fastcall send_IPI_self(int vector)
-{
-       __send_IPI_shortcut(APIC_DEST_SELF, vector);
-}
-
-/*
- * This is only used on smaller machines.
- */
-void send_IPI_mask_bitmask(cpumask_t mask, int vector)
-{
-       unsigned long flags;
-       unsigned int cpu;
-
-       local_irq_save(flags);
-       WARN_ON(cpus_addr(mask)[0] & ~cpus_addr(cpu_online_map)[0]);
-
-       for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-               if (cpu_isset(cpu, mask)) {
-                       __send_IPI_one(cpu, vector);
-               }
-       }
-
-       local_irq_restore(flags);
-}
-
-void send_IPI_mask_sequence(cpumask_t mask, int vector)
-{
-
-       send_IPI_mask_bitmask(mask, vector);
-}
-
-#include <mach_ipi.h> /* must come after the send_IPI functions above for inlining */
-
-#if 0 /* XEN */
-/*
- *     Smarter SMP flushing macros. 
- *             c/o Linus Torvalds.
- *
- *     These mean you can really definitely utterly forget about
- *     writing to user space from interrupts. (Its not allowed anyway).
- *
- *     Optimizations Manfred Spraul <manfred@colorfullife.com>
- */
-
-static cpumask_t flush_cpumask;
-static struct mm_struct * flush_mm;
-static unsigned long flush_va;
-static DEFINE_SPINLOCK(tlbstate_lock);
-#define FLUSH_ALL      0xffffffff
-
-/*
- * We cannot call mmdrop() because we are in interrupt context, 
- * instead update mm->cpu_vm_mask.
- *
- * We need to reload %cr3 since the page tables may be going
- * away from under us..
- */
-static inline void leave_mm (unsigned long cpu)
-{
-       if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK)
-               BUG();
-       cpu_clear(cpu, per_cpu(cpu_tlbstate, cpu).active_mm->cpu_vm_mask);
-       load_cr3(swapper_pg_dir);
-}
-
-/*
- *
- * The flush IPI assumes that a thread switch happens in this order:
- * [cpu0: the cpu that switches]
- * 1) switch_mm() either 1a) or 1b)
- * 1a) thread switch to a different mm
- * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
- *     Stop ipi delivery for the old mm. This is not synchronized with
- *     the other cpus, but smp_invalidate_interrupt ignore flush ipis
- *     for the wrong mm, and in the worst case we perform a superflous
- *     tlb flush.
- * 1a2) set cpu_tlbstate to TLBSTATE_OK
- *     Now the smp_invalidate_interrupt won't call leave_mm if cpu0
- *     was in lazy tlb mode.
- * 1a3) update cpu_tlbstate[].active_mm
- *     Now cpu0 accepts tlb flushes for the new mm.
- * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
- *     Now the other cpus will send tlb flush ipis.
- * 1a4) change cr3.
- * 1b) thread switch without mm change
- *     cpu_tlbstate[].active_mm is correct, cpu0 already handles
- *     flush ipis.
- * 1b1) set cpu_tlbstate to TLBSTATE_OK
- * 1b2) test_and_set the cpu bit in cpu_vm_mask.
- *     Atomically set the bit [other cpus will start sending flush ipis],
- *     and test the bit.
- * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
- * 2) switch %%esp, ie current
- *
- * The interrupt must handle 2 special cases:
- * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
- * - the cpu performs speculative tlb reads, i.e. even if the cpu only
- *   runs in kernel space, the cpu could load tlb entries for user space
- *   pages.
- *
- * The good news is that cpu_tlbstate is local to each cpu, no
- * write/read ordering problems.
- */
-
-/*
- * TLB flush IPI:
- *
- * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
- * 2) Leave the mm if we are in the lazy tlb mode.
- */
-
-irqreturn_t smp_invalidate_interrupt(int irq, void *dev_id,
-                                    struct pt_regs *regs)
-{
-       unsigned long cpu;
-
-       cpu = get_cpu();
-
-       if (!cpu_isset(cpu, flush_cpumask))
-               goto out;
-               /* 
-                * This was a BUG() but until someone can quote me the
-                * line from the intel manual that guarantees an IPI to
-                * multiple CPUs is retried _only_ on the erroring CPUs
-                * its staying as a return
-                *
-                * BUG();
-                */
-                
-       if (flush_mm == per_cpu(cpu_tlbstate, cpu).active_mm) {
-               if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK) {
-                       if (flush_va == FLUSH_ALL)
-                               local_flush_tlb();
-                       else
-                               __flush_tlb_one(flush_va);
-               } else
-                       leave_mm(cpu);
-       }
-       smp_mb__before_clear_bit();
-       cpu_clear(cpu, flush_cpumask);
-       smp_mb__after_clear_bit();
-out:
-       put_cpu_no_resched();
-
-       return IRQ_HANDLED;
-}
-
-static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
-                                               unsigned long va)
-{
-       /*
-        * A couple of (to be removed) sanity checks:
-        *
-        * - current CPU must not be in mask
-        * - mask must exist :)
-        */
-       BUG_ON(cpus_empty(cpumask));
-       BUG_ON(cpu_isset(smp_processor_id(), cpumask));
-       BUG_ON(!mm);
-
-       /* If a CPU which we ran on has gone down, OK. */
-       cpus_and(cpumask, cpumask, cpu_online_map);
-       if (cpus_empty(cpumask))
-               return;
-
-       /*
-        * i'm not happy about this global shared spinlock in the
-        * MM hot path, but we'll see how contended it is.
-        * Temporarily this turns IRQs off, so that lockups are
-        * detected by the NMI watchdog.
-        */
-       spin_lock(&tlbstate_lock);
-       
-       flush_mm = mm;
-       flush_va = va;
-#if NR_CPUS <= BITS_PER_LONG
-       atomic_set_mask(cpumask, &flush_cpumask);
-#else
-       {
-               int k;
-               unsigned long *flush_mask = (unsigned long *)&flush_cpumask;
-               unsigned long *cpu_mask = (unsigned long *)&cpumask;
-               for (k = 0; k < BITS_TO_LONGS(NR_CPUS); ++k)
-                       atomic_set_mask(cpu_mask[k], &flush_mask[k]);
-       }
-#endif
-       /*
-        * We have to send the IPI only to
-        * CPUs affected.
-        */
-       send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
-
-       while (!cpus_empty(flush_cpumask))
-               /* nothing. lockup detection does not belong here */
-               mb();
-
-       flush_mm = NULL;
-       flush_va = 0;
-       spin_unlock(&tlbstate_lock);
-}
-       
-void flush_tlb_current_task(void)
-{
-       struct mm_struct *mm = current->mm;
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       local_flush_tlb();
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-       preempt_enable();
-}
-
-void flush_tlb_mm (struct mm_struct * mm)
-{
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       if (current->active_mm == mm) {
-               if (current->mm)
-                       local_flush_tlb();
-               else
-                       leave_mm(smp_processor_id());
-       }
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-
-       preempt_enable();
-}
-
-void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       if (current->active_mm == mm) {
-               if(current->mm)
-                       __flush_tlb_one(va);
-               else
-                       leave_mm(smp_processor_id());
-       }
-
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, va);
-
-       preempt_enable();
-}
-EXPORT_SYMBOL(flush_tlb_page);
-
-static void do_flush_tlb_all(void* info)
-{
-       unsigned long cpu = smp_processor_id();
-
-       __flush_tlb_all();
-       if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_LAZY)
-               leave_mm(cpu);
-}
-
-void flush_tlb_all(void)
-{
-       on_each_cpu(do_flush_tlb_all, NULL, 1, 1);
-}
-
-#else
-
-irqreturn_t smp_invalidate_interrupt(int irq, void *dev_id,
-                                    struct pt_regs *regs)
-{ return 0; }
-void flush_tlb_current_task(void)
-{ xen_tlb_flush_mask(&current->mm->cpu_vm_mask); }
-void flush_tlb_mm(struct mm_struct * mm)
-{ xen_tlb_flush_mask(&mm->cpu_vm_mask); }
-void flush_tlb_page(struct vm_area_struct *vma, unsigned long va)
-{ xen_invlpg_mask(&vma->vm_mm->cpu_vm_mask, va); }
-EXPORT_SYMBOL(flush_tlb_page);
-void flush_tlb_all(void)
-{ xen_tlb_flush_all(); }
-
-#endif /* XEN */
-
-/*
- * this function sends a 'reschedule' IPI to another CPU.
- * it goes straight through and wastes no time serializing
- * anything. Worst case is that we lose a reschedule ...
- */
-void smp_send_reschedule(int cpu)
-{
-       WARN_ON(cpu_is_offline(cpu));
-       send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
-}
-
-/*
- * Structure and data for smp_call_function(). This is designed to minimise
- * static memory requirements. It also looks cleaner.
- */
-static DEFINE_SPINLOCK(call_lock);
-
-struct call_data_struct {
-       void (*func) (void *info);
-       void *info;
-       atomic_t started;
-       atomic_t finished;
-       int wait;
-};
-
-void lock_ipi_call_lock(void)
-{
-       spin_lock_irq(&call_lock);
-}
-
-void unlock_ipi_call_lock(void)
-{
-       spin_unlock_irq(&call_lock);
-}
-
-static struct call_data_struct *call_data;
-
-/**
- * smp_call_function(): Run a function on all other CPUs.
- * @func: The function to run. This must be fast and non-blocking.
- * @info: An arbitrary pointer to pass to the function.
- * @nonatomic: currently unused.
- * @wait: If true, wait (atomically) until function has completed on other CPUs.
- *
- * Returns 0 on success, else a negative status code. Does not return until
- * remote CPUs are nearly ready to execute <<func>> or are or have executed.
- *
- * You must not call this function with disabled interrupts or from a
- * hardware interrupt handler or from a bottom half handler.
- */
-int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
-                       int wait)
-{
-       struct call_data_struct data;
-       int cpus;
-
-       /* Holding any lock stops cpus from going down. */
-       spin_lock(&call_lock);
-       cpus = num_online_cpus() - 1;
-       if (!cpus) {
-               spin_unlock(&call_lock);
-               return 0;
-       }
-
-       /* Can deadlock when called with interrupts disabled */
-       WARN_ON(irqs_disabled());
-
-       data.func = func;
-       data.info = info;
-       atomic_set(&data.started, 0);
-       data.wait = wait;
-       if (wait)
-               atomic_set(&data.finished, 0);
-
-       call_data = &data;
-       mb();
-       
-       /* Send a message to all other CPUs and wait for them to respond */
-       send_IPI_allbutself(CALL_FUNCTION_VECTOR);
-
-       /* Wait for response */
-       while (atomic_read(&data.started) != cpus)
-               barrier();
-
-       if (wait)
-               while (atomic_read(&data.finished) != cpus)
-                       barrier();
-       spin_unlock(&call_lock);
-
-       return 0;
-}
-EXPORT_SYMBOL(smp_call_function);
-
-static void stop_this_cpu (void * dummy)
-{
-       /*
-        * Remove this CPU:
-        */
-       cpu_clear(smp_processor_id(), cpu_online_map);
-       local_irq_disable();
-#if 0
-       disable_local_APIC();
-#endif
-       if (cpu_data[smp_processor_id()].hlt_works_ok)
-               for(;;) halt();
-       for (;;);
-}
-
-/*
- * this function calls the 'stop' function on all other CPUs in the system.
- */
-
-void smp_send_stop(void)
-{
-       smp_call_function(stop_this_cpu, NULL, 1, 0);
-
-       local_irq_disable();
-#if 0
-       disable_local_APIC();
-#endif
-       local_irq_enable();
-}
-
-/*
- * Reschedule call back. Nothing to do,
- * all the work is done automatically when
- * we return from the interrupt.
- */
-irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id,
-                                    struct pt_regs *regs)
-{
-
-       return IRQ_HANDLED;
-}
-
-#include <linux/kallsyms.h>
-irqreturn_t smp_call_function_interrupt(int irq, void *dev_id,
-                                       struct pt_regs *regs)
-{
-       void (*func) (void *info) = call_data->func;
-       void *info = call_data->info;
-       int wait = call_data->wait;
-
-       /*
-        * Notify initiating CPU that I've grabbed the data and am
-        * about to execute the function
-        */
-       mb();
-       atomic_inc(&call_data->started);
-       /*
-        * At this point the info structure may be out of scope unless wait==1
-        */
-       irq_enter();
-       (*func)(info);
-       irq_exit();
-
-       if (wait) {
-               mb();
-               atomic_inc(&call_data->finished);
-       }
-
-       return IRQ_HANDLED;
-}
-
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c
deleted file mode 100644 (file)
index bac3112..0000000
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- * Dynamic DMA mapping support.
- *
- * This implementation is a fallback for platforms that do not support
- * I/O TLBs (aka DMA address translation hardware).
- * Copyright (C) 2000 Asit Mallick <Asit.K.Mallick@intel.com>
- * Copyright (C) 2000 Goutham Rao <goutham.rao@intel.com>
- * Copyright (C) 2000, 2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 2005 Keir Fraser <keir@xensource.com>
- */
-
-#include <linux/cache.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ctype.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-#include <linux/highmem.h>
-#include <asm/io.h>
-#include <asm/pci.h>
-#include <asm/dma.h>
-#include <asm/uaccess.h>
-#include <xen/gnttab.h>
-#include <xen/interface/memory.h>
-
-int swiotlb;
-EXPORT_SYMBOL(swiotlb);
-
-#define OFFSET(val,align) ((unsigned long)((val) & ( (align) - 1)))
-
-/*
- * Maximum allowable number of contiguous slabs to map,
- * must be a power of 2.  What is the appropriate value ?
- * The complexity of {map,unmap}_single is linearly dependent on this value.
- */
-#define IO_TLB_SEGSIZE 128
-
-/*
- * log of the size of each IO TLB slab.  The number of slabs is command line
- * controllable.
- */
-#define IO_TLB_SHIFT 11
-
-int swiotlb_force;
-
-static char *iotlb_virt_start;
-static unsigned long iotlb_nslabs;
-
-/*
- * Used to do a quick range check in swiotlb_unmap_single and
- * swiotlb_sync_single_*, to see if the memory was in fact allocated by this
- * API.
- */
-static unsigned long iotlb_pfn_start, iotlb_pfn_end;
-
-/* Does the given dma address reside within the swiotlb aperture? */
-static inline int in_swiotlb_aperture(dma_addr_t dev_addr)
-{
-       unsigned long pfn = mfn_to_local_pfn(dev_addr >> PAGE_SHIFT);
-       return (pfn_valid(pfn)
-               && (pfn >= iotlb_pfn_start)
-               && (pfn < iotlb_pfn_end));
-}
-
-/*
- * When the IOMMU overflows we return a fallback buffer. This sets the size.
- */
-static unsigned long io_tlb_overflow = 32*1024;
-
-void *io_tlb_overflow_buffer;
-
-/*
- * This is a free list describing the number of free entries available from
- * each index
- */
-static unsigned int *io_tlb_list;
-static unsigned int io_tlb_index;
-
-/*
- * We need to save away the original address corresponding to a mapped entry
- * for the sync operations.
- */
-static struct phys_addr {
-       struct page *page;
-       unsigned int offset;
-} *io_tlb_orig_addr;
-
-/*
- * Protect the above data structures in the map and unmap calls
- */
-static DEFINE_SPINLOCK(io_tlb_lock);
-
-static unsigned int dma_bits;
-static unsigned int __initdata max_dma_bits = 32;
-static int __init
-setup_dma_bits(char *str)
-{
-       max_dma_bits = simple_strtoul(str, NULL, 0);
-       return 0;
-}
-__setup("dma_bits=", setup_dma_bits);
-
-static int __init
-setup_io_tlb_npages(char *str)
-{
-       /* Unlike ia64, the size is aperture in megabytes, not 'slabs'! */
-       if (isdigit(*str)) {
-               iotlb_nslabs = simple_strtoul(str, &str, 0) <<
-                       (20 - IO_TLB_SHIFT);
-               iotlb_nslabs = ALIGN(iotlb_nslabs, IO_TLB_SEGSIZE);
-               /* Round up to power of two (xen_create_contiguous_region). */
-               while (iotlb_nslabs & (iotlb_nslabs-1))
-                       iotlb_nslabs += iotlb_nslabs & ~(iotlb_nslabs-1);
-       }
-       if (*str == ',')
-               ++str;
-       /*
-         * NB. 'force' enables the swiotlb, but doesn't force its use for
-         * every DMA like it does on native Linux. 'off' forcibly disables
-         * use of the swiotlb.
-         */
-       if (!strcmp(str, "force"))
-               swiotlb_force = 1;
-       else if (!strcmp(str, "off"))
-               swiotlb_force = -1;
-       return 1;
-}
-__setup("swiotlb=", setup_io_tlb_npages);
-/* make io_tlb_overflow tunable too? */
-
-/*
- * Statically reserve bounce buffer space and initialize bounce buffer data
- * structures for the software IO TLB used to implement the PCI DMA API.
- */
-void
-swiotlb_init_with_default_size (size_t default_size)
-{
-       unsigned long i, bytes;
-       int rc;
-
-       if (!iotlb_nslabs) {
-               iotlb_nslabs = (default_size >> IO_TLB_SHIFT);
-               iotlb_nslabs = ALIGN(iotlb_nslabs, IO_TLB_SEGSIZE);
-               /* Round up to power of two (xen_create_contiguous_region). */
-               while (iotlb_nslabs & (iotlb_nslabs-1))
-                       iotlb_nslabs += iotlb_nslabs & ~(iotlb_nslabs-1);
-       }
-
-       bytes = iotlb_nslabs * (1UL << IO_TLB_SHIFT);
-
-       /*
-        * Get IO TLB memory from the low pages
-        */
-       iotlb_virt_start = alloc_bootmem_low_pages(bytes);
-       if (!iotlb_virt_start)
-               panic("Cannot allocate SWIOTLB buffer!\n");
-
-       dma_bits = get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT) + PAGE_SHIFT;
-       for (i = 0; i < iotlb_nslabs; i += IO_TLB_SEGSIZE) {
-               do {
-                       rc = xen_create_contiguous_region(
-                               (unsigned long)iotlb_virt_start + (i << IO_TLB_SHIFT),
-                               get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
-                               dma_bits);
-               } while (rc && dma_bits++ < max_dma_bits);
-               if (rc) {
-                       if (i == 0)
-                               panic("No suitable physical memory available for SWIOTLB buffer!\n"
-                                     "Use dom0_mem Xen boot parameter to reserve\n"
-                                     "some DMA memory (e.g., dom0_mem=-128M).\n");
-                       iotlb_nslabs = i;
-                       i <<= IO_TLB_SHIFT;
-                       free_bootmem(__pa(iotlb_virt_start + i), bytes - i);
-                       bytes = i;
-                       for (dma_bits = 0; i > 0; i -= IO_TLB_SEGSIZE << IO_TLB_SHIFT) {
-                               unsigned int bits = fls64(virt_to_bus(iotlb_virt_start + i - 1));
-
-                               if (bits > dma_bits)
-                                       dma_bits = bits;
-                       }
-                       break;
-               }
-       }
-
-       /*
-        * Allocate and initialize the free list array.  This array is used
-        * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE.
-        */
-       io_tlb_list = alloc_bootmem(iotlb_nslabs * sizeof(int));
-       for (i = 0; i < iotlb_nslabs; i++)
-               io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
-       io_tlb_index = 0;
-       io_tlb_orig_addr = alloc_bootmem(
-               iotlb_nslabs * sizeof(*io_tlb_orig_addr));
-
-       /*
-        * Get the overflow emergency buffer
-        */
-       io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow);
-       if (!io_tlb_overflow_buffer)
-               panic("Cannot allocate SWIOTLB overflow buffer!\n");
-
-       do {
-               rc = xen_create_contiguous_region(
-                       (unsigned long)io_tlb_overflow_buffer,
-                       get_order(io_tlb_overflow),
-                       dma_bits);
-       } while (rc && dma_bits++ < max_dma_bits);
-       if (rc)
-               panic("No suitable physical memory available for SWIOTLB overflow buffer!\n");
-
-       iotlb_pfn_start = __pa(iotlb_virt_start) >> PAGE_SHIFT;
-       iotlb_pfn_end   = iotlb_pfn_start + (bytes >> PAGE_SHIFT);
-
-       printk(KERN_INFO "Software IO TLB enabled: \n"
-              " Aperture:     %lu megabytes\n"
-              " Kernel range: %p - %p\n"
-              " Address size: %u bits\n",
-              bytes >> 20,
-              iotlb_virt_start, iotlb_virt_start + bytes,
-              dma_bits);
-}
-
-void
-swiotlb_init(void)
-{
-       long ram_end;
-       size_t defsz = 64 * (1 << 20); /* 64MB default size */
-
-       if (swiotlb_force == 1) {
-               swiotlb = 1;
-       } else if ((swiotlb_force != -1) &&
-                  is_running_on_xen() &&
-                  is_initial_xendomain()) {
-               /* Domain 0 always has a swiotlb. */
-               ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-               if (ram_end <= 0x7ffff)
-                       defsz = 2 * (1 << 20); /* 2MB on <2GB on systems. */
-               swiotlb = 1;
-       }
-
-       if (swiotlb)
-               swiotlb_init_with_default_size(defsz);
-       else
-               printk(KERN_INFO "Software IO TLB disabled\n");
-}
-
-/*
- * We use __copy_to_user_inatomic to transfer to the host buffer because the
- * buffer may be mapped read-only (e.g, in blkback driver) but lower-level
- * drivers map the buffer for DMA_BIDIRECTIONAL access. This causes an
- * unnecessary copy from the aperture to the host buffer, and a page fault.
- */
-static void
-__sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir)
-{
-       if (PageHighMem(buffer.page)) {
-               size_t len, bytes;
-               char *dev, *host, *kmp;
-               len = size;
-               while (len != 0) {
-                       unsigned long flags;
-
-                       if (((bytes = len) + buffer.offset) > PAGE_SIZE)
-                               bytes = PAGE_SIZE - buffer.offset;
-                       local_irq_save(flags); /* protects KM_BOUNCE_READ */
-                       kmp  = kmap_atomic(buffer.page, KM_BOUNCE_READ);
-                       dev  = dma_addr + size - len;
-                       host = kmp + buffer.offset;
-                       if (dir == DMA_FROM_DEVICE) {
-                               if (__copy_to_user_inatomic(host, dev, bytes))
-                                       /* inaccessible */;
-                       } else
-                               memcpy(dev, host, bytes);
-                       kunmap_atomic(kmp, KM_BOUNCE_READ);
-                       local_irq_restore(flags);
-                       len -= bytes;
-                       buffer.page++;
-                       buffer.offset = 0;
-               }
-       } else {
-               char *host = (char *)phys_to_virt(
-                       page_to_pseudophys(buffer.page)) + buffer.offset;
-               if (dir == DMA_FROM_DEVICE) {
-                       if (__copy_to_user_inatomic(host, dma_addr, size))
-                               /* inaccessible */;
-               } else if (dir == DMA_TO_DEVICE)
-                       memcpy(dma_addr, host, size);
-       }
-}
-
-/*
- * Allocates bounce buffer and returns its kernel virtual address.
- */
-static void *
-map_single(struct device *hwdev, struct phys_addr buffer, size_t size, int dir)
-{
-       unsigned long flags;
-       char *dma_addr;
-       unsigned int nslots, stride, index, wrap;
-       int i;
-
-       /*
-        * For mappings greater than a page, we limit the stride (and
-        * hence alignment) to a page size.
-        */
-       nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-       if (size > PAGE_SIZE)
-               stride = (1 << (PAGE_SHIFT - IO_TLB_SHIFT));
-       else
-               stride = 1;
-
-       BUG_ON(!nslots);
-
-       /*
-        * Find suitable number of IO TLB entries size that will fit this
-        * request and allocate a buffer from that IO TLB pool.
-        */
-       spin_lock_irqsave(&io_tlb_lock, flags);
-       {
-               wrap = index = ALIGN(io_tlb_index, stride);
-
-               if (index >= iotlb_nslabs)
-                       wrap = index = 0;
-
-               do {
-                       /*
-                        * If we find a slot that indicates we have 'nslots'
-                        * number of contiguous buffers, we allocate the
-                        * buffers from that slot and mark the entries as '0'
-                        * indicating unavailable.
-                        */
-                       if (io_tlb_list[index] >= nslots) {
-                               int count = 0;
-
-                               for (i = index; i < (int)(index + nslots); i++)
-                                       io_tlb_list[i] = 0;
-                               for (i = index - 1;
-                                    (OFFSET(i, IO_TLB_SEGSIZE) !=
-                                     IO_TLB_SEGSIZE -1) && io_tlb_list[i];
-                                    i--)
-                                       io_tlb_list[i] = ++count;
-                               dma_addr = iotlb_virt_start +
-                                       (index << IO_TLB_SHIFT);
-
-                               /*
-                                * Update the indices to avoid searching in
-                                * the next round.
-                                */
-                               io_tlb_index = 
-                                       ((index + nslots) < iotlb_nslabs
-                                        ? (index + nslots) : 0);
-
-                               goto found;
-                       }
-                       index += stride;
-                       if (index >= iotlb_nslabs)
-                               index = 0;
-               } while (index != wrap);
-
-               spin_unlock_irqrestore(&io_tlb_lock, flags);
-               return NULL;
-       }
-  found:
-       spin_unlock_irqrestore(&io_tlb_lock, flags);
-
-       /*
-        * Save away the mapping from the original address to the DMA address.
-        * This is needed when we sync the memory.  Then we sync the buffer if
-        * needed.
-        */
-       io_tlb_orig_addr[index] = buffer;
-       if ((dir == DMA_TO_DEVICE) || (dir == DMA_BIDIRECTIONAL))
-               __sync_single(buffer, dma_addr, size, DMA_TO_DEVICE);
-
-       return dma_addr;
-}
-
-/*
- * dma_addr is the kernel virtual address of the bounce buffer to unmap.
- */
-static void
-unmap_single(struct device *hwdev, char *dma_addr, size_t size, int dir)
-{
-       unsigned long flags;
-       int i, count, nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-       int index = (dma_addr - iotlb_virt_start) >> IO_TLB_SHIFT;
-       struct phys_addr buffer = io_tlb_orig_addr[index];
-
-       /*
-        * First, sync the memory before unmapping the entry
-        */
-       if ((dir == DMA_FROM_DEVICE) || (dir == DMA_BIDIRECTIONAL))
-               __sync_single(buffer, dma_addr, size, DMA_FROM_DEVICE);
-
-       /*
-        * Return the buffer to the free list by setting the corresponding
-        * entries to indicate the number of contigous entries available.
-        * While returning the entries to the free list, we merge the entries
-        * with slots below and above the pool being returned.
-        */
-       spin_lock_irqsave(&io_tlb_lock, flags);
-       {
-               count = ((index + nslots) < ALIGN(index + 1, IO_TLB_SEGSIZE) ?
-                        io_tlb_list[index + nslots] : 0);
-               /*
-                * Step 1: return the slots to the free list, merging the
-                * slots with superceeding slots
-                */
-               for (i = index + nslots - 1; i >= index; i--)
-                       io_tlb_list[i] = ++count;
-               /*
-                * Step 2: merge the returned slots with the preceding slots,
-                * if available (non zero)
-                */
-               for (i = index - 1;
-                    (OFFSET(i, IO_TLB_SEGSIZE) !=
-                     IO_TLB_SEGSIZE -1) && io_tlb_list[i];
-                    i--)
-                       io_tlb_list[i] = ++count;
-       }
-       spin_unlock_irqrestore(&io_tlb_lock, flags);
-}
-
-static void
-sync_single(struct device *hwdev, char *dma_addr, size_t size, int dir)
-{
-       int index = (dma_addr - iotlb_virt_start) >> IO_TLB_SHIFT;
-       struct phys_addr buffer = io_tlb_orig_addr[index];
-       BUG_ON((dir != DMA_FROM_DEVICE) && (dir != DMA_TO_DEVICE));
-       __sync_single(buffer, dma_addr, size, dir);
-}
-
-static void
-swiotlb_full(struct device *dev, size_t size, int dir, int do_panic)
-{
-       /*
-        * Ran out of IOMMU space for this operation. This is very bad.
-        * Unfortunately the drivers cannot handle this operation properly.
-        * unless they check for pci_dma_mapping_error (most don't)
-        * When the mapping is small enough return a static buffer to limit
-        * the damage, or panic when the transfer is too big.
-        */
-       printk(KERN_ERR "PCI-DMA: Out of SW-IOMMU space for %lu bytes at "
-              "device %s\n", (unsigned long)size, dev ? dev->bus_id : "?");
-
-       if (size > io_tlb_overflow && do_panic) {
-               if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)
-                       panic("PCI-DMA: Memory would be corrupted\n");
-               if (dir == PCI_DMA_TODEVICE || dir == PCI_DMA_BIDIRECTIONAL)
-                       panic("PCI-DMA: Random memory would be DMAed\n");
-       }
-}
-
-/*
- * Map a single buffer of the indicated size for DMA in streaming mode.  The
- * PCI address to use is returned.
- *
- * Once the device is given the dma address, the device owns this memory until
- * either swiotlb_unmap_single or swiotlb_dma_sync_single is performed.
- */
-dma_addr_t
-swiotlb_map_single(struct device *hwdev, void *ptr, size_t size, int dir)
-{
-       dma_addr_t dev_addr = gnttab_dma_map_page(virt_to_page(ptr)) +
-                             offset_in_page(ptr);
-       void *map;
-       struct phys_addr buffer;
-
-       BUG_ON(dir == DMA_NONE);
-
-       /*
-        * If the pointer passed in happens to be in the device's DMA window,
-        * we can safely return the device addr and not worry about bounce
-        * buffering it.
-        */
-       if (!range_straddles_page_boundary(ptr, size) &&
-           !address_needs_mapping(hwdev, dev_addr))
-               return dev_addr;
-
-       /*
-        * Oh well, have to allocate and map a bounce buffer.
-        */
-       gnttab_dma_unmap_page(dev_addr);
-       buffer.page   = virt_to_page(ptr);
-       buffer.offset = (unsigned long)ptr & ~PAGE_MASK;
-       map = map_single(hwdev, buffer, size, dir);
-       if (!map) {
-               swiotlb_full(hwdev, size, dir, 1);
-               map = io_tlb_overflow_buffer;
-       }
-
-       dev_addr = virt_to_bus(map);
-       return dev_addr;
-}
-
-/*
- * Unmap a single streaming mode DMA translation.  The dma_addr and size must
- * match what was provided for in a previous swiotlb_map_single call.  All
- * other usages are undefined.
- *
- * After this call, reads by the cpu to the buffer are guaranteed to see
- * whatever the device wrote there.
- */
-void
-swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, size_t size,
-                    int dir)
-{
-       BUG_ON(dir == DMA_NONE);
-       if (in_swiotlb_aperture(dev_addr))
-               unmap_single(hwdev, bus_to_virt(dev_addr), size, dir);
-       else
-               gnttab_dma_unmap_page(dev_addr);
-}
-
-/*
- * Make physical memory consistent for a single streaming mode DMA translation
- * after a transfer.
- *
- * If you perform a swiotlb_map_single() but wish to interrogate the buffer
- * using the cpu, yet do not wish to teardown the PCI dma mapping, you must
- * call this function before doing so.  At the next point you give the PCI dma
- * address back to the card, you must first perform a
- * swiotlb_dma_sync_for_device, and then the device again owns the buffer
- */
-void
-swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr,
-                           size_t size, int dir)
-{
-       BUG_ON(dir == DMA_NONE);
-       if (in_swiotlb_aperture(dev_addr))
-               sync_single(hwdev, bus_to_virt(dev_addr), size, dir);
-}
-
-void
-swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr,
-                              size_t size, int dir)
-{
-       BUG_ON(dir == DMA_NONE);
-       if (in_swiotlb_aperture(dev_addr))
-               sync_single(hwdev, bus_to_virt(dev_addr), size, dir);
-}
-
-/*
- * Map a set of buffers described by scatterlist in streaming mode for DMA.
- * This is the scatter-gather version of the above swiotlb_map_single
- * interface.  Here the scatter gather list elements are each tagged with the
- * appropriate dma address and length.  They are obtained via
- * sg_dma_{address,length}(SG).
- *
- * NOTE: An implementation may be able to use a smaller number of
- *       DMA address/length pairs than there are SG table elements.
- *       (for example via virtual mapping capabilities)
- *       The routine returns the number of addr/length pairs actually
- *       used, at most nents.
- *
- * Device ownership issues as mentioned above for swiotlb_map_single are the
- * same here.
- */
-int
-swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-              int dir)
-{
-       struct phys_addr buffer;
-       dma_addr_t dev_addr;
-       char *map;
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++) {
-               dev_addr = gnttab_dma_map_page(sg->page) + sg->offset;
-
-               if (address_needs_mapping(hwdev, dev_addr)) {
-                       gnttab_dma_unmap_page(dev_addr);
-                       buffer.page   = sg->page;
-                       buffer.offset = sg->offset;
-                       map = map_single(hwdev, buffer, sg->length, dir);
-                       if (!map) {
-                               /* Don't panic here, we expect map_sg users
-                                  to do proper error handling. */
-                               swiotlb_full(hwdev, sg->length, dir, 0);
-                               swiotlb_unmap_sg(hwdev, sg - i, i, dir);
-                               sg[0].dma_length = 0;
-                               return 0;
-                       }
-                       sg->dma_address = (dma_addr_t)virt_to_bus(map);
-               } else
-                       sg->dma_address = dev_addr;
-               sg->dma_length = sg->length;
-       }
-       return nelems;
-}
-
-/*
- * Unmap a set of streaming mode DMA translations.  Again, cpu read rules
- * concerning calls here are the same as for swiotlb_unmap_single() above.
- */
-void
-swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-                int dir)
-{
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++)
-               if (in_swiotlb_aperture(sg->dma_address))
-                       unmap_single(hwdev, 
-                                    (void *)bus_to_virt(sg->dma_address),
-                                    sg->dma_length, dir);
-               else
-                       gnttab_dma_unmap_page(sg->dma_address);
-}
-
-/*
- * Make physical memory consistent for a set of streaming mode DMA translations
- * after a transfer.
- *
- * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
- * and usage.
- */
-void
-swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg,
-                       int nelems, int dir)
-{
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++)
-               if (in_swiotlb_aperture(sg->dma_address))
-                       sync_single(hwdev,
-                                   (void *)bus_to_virt(sg->dma_address),
-                                   sg->dma_length, dir);
-}
-
-void
-swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
-                          int nelems, int dir)
-{
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++)
-               if (in_swiotlb_aperture(sg->dma_address))
-                       sync_single(hwdev,
-                                   (void *)bus_to_virt(sg->dma_address),
-                                   sg->dma_length, dir);
-}
-
-#ifdef CONFIG_HIGHMEM
-
-dma_addr_t
-swiotlb_map_page(struct device *hwdev, struct page *page,
-                unsigned long offset, size_t size,
-                enum dma_data_direction direction)
-{
-       struct phys_addr buffer;
-       dma_addr_t dev_addr;
-       char *map;
-
-       dev_addr = gnttab_dma_map_page(page) + offset;
-       if (address_needs_mapping(hwdev, dev_addr)) {
-               gnttab_dma_unmap_page(dev_addr);
-               buffer.page   = page;
-               buffer.offset = offset;
-               map = map_single(hwdev, buffer, size, direction);
-               if (!map) {
-                       swiotlb_full(hwdev, size, direction, 1);
-                       map = io_tlb_overflow_buffer;
-               }
-               dev_addr = (dma_addr_t)virt_to_bus(map);
-       }
-
-       return dev_addr;
-}
-
-void
-swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
-                  size_t size, enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       if (in_swiotlb_aperture(dma_address))
-               unmap_single(hwdev, bus_to_virt(dma_address), size, direction);
-       else
-               gnttab_dma_unmap_page(dma_address);
-}
-
-#endif
-
-int
-swiotlb_dma_mapping_error(dma_addr_t dma_addr)
-{
-       return (dma_addr == virt_to_bus(io_tlb_overflow_buffer));
-}
-
-/*
- * Return whether the given PCI device DMA address mask can be supported
- * properly.  For example, if your device can only drive the low 24-bits
- * during PCI bus mastering, then you would pass 0x00ffffff as the mask to
- * this function.
- */
-int
-swiotlb_dma_supported (struct device *hwdev, u64 mask)
-{
-       return (mask >= ((1UL << dma_bits) - 1));
-}
-
-EXPORT_SYMBOL(swiotlb_init);
-EXPORT_SYMBOL(swiotlb_map_single);
-EXPORT_SYMBOL(swiotlb_unmap_single);
-EXPORT_SYMBOL(swiotlb_map_sg);
-EXPORT_SYMBOL(swiotlb_unmap_sg);
-EXPORT_SYMBOL(swiotlb_sync_single_for_cpu);
-EXPORT_SYMBOL(swiotlb_sync_single_for_device);
-EXPORT_SYMBOL(swiotlb_sync_sg_for_cpu);
-EXPORT_SYMBOL(swiotlb_sync_sg_for_device);
-EXPORT_SYMBOL(swiotlb_dma_mapping_error);
-EXPORT_SYMBOL(swiotlb_dma_supported);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/sysenter.c b/linux-2.6-xen-sparse/arch/i386/kernel/sysenter.c
deleted file mode 100644 (file)
index 4dd50f8..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * linux/arch/i386/kernel/sysenter.c
- *
- * (C) Copyright 2002 Linus Torvalds
- * Portions based on the vdso-randomization code from exec-shield:
- * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar
- *
- * This file contains the needed initializations to support sysenter.
- */
-
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/thread_info.h>
-#include <linux/sched.h>
-#include <linux/gfp.h>
-#include <linux/string.h>
-#include <linux/elf.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-
-#include <asm/cpufeature.h>
-#include <asm/msr.h>
-#include <asm/pgtable.h>
-#include <asm/unistd.h>
-
-#ifdef CONFIG_XEN
-#include <xen/interface/callback.h>
-#endif
-
-/*
- * Should the kernel map a VDSO page into processes and pass its
- * address down to glibc upon exec()?
- */
-unsigned int __read_mostly vdso_enabled = 1;
-
-EXPORT_SYMBOL_GPL(vdso_enabled);
-
-static int __init vdso_setup(char *s)
-{
-       vdso_enabled = simple_strtoul(s, NULL, 0);
-
-       return 1;
-}
-
-__setup("vdso=", vdso_setup);
-
-extern asmlinkage void sysenter_entry(void);
-
-void enable_sep_cpu(void)
-{
-#ifndef CONFIG_X86_NO_TSS
-       int cpu = get_cpu();
-       struct tss_struct *tss = &per_cpu(init_tss, cpu);
-
-       if (!boot_cpu_has(X86_FEATURE_SEP)) {
-               put_cpu();
-               return;
-       }
-
-       tss->ss1 = __KERNEL_CS;
-       tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;
-       wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
-       wrmsr(MSR_IA32_SYSENTER_ESP, tss->esp1, 0);
-       wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) sysenter_entry, 0);
-       put_cpu();      
-#endif
-}
-
-/*
- * These symbols are defined by vsyscall.o to mark the bounds
- * of the ELF DSO images included therein.
- */
-extern const char vsyscall_int80_start, vsyscall_int80_end;
-extern const char vsyscall_sysenter_start, vsyscall_sysenter_end;
-static void *syscall_page;
-
-int __init sysenter_setup(void)
-{
-       syscall_page = (void *)get_zeroed_page(GFP_ATOMIC);
-
-#ifdef CONFIG_XEN
-       if (boot_cpu_has(X86_FEATURE_SEP)) {
-               static struct callback_register __initdata sysenter = {
-                       .type = CALLBACKTYPE_sysenter,
-                       .address = { __KERNEL_CS, (unsigned long)sysenter_entry },
-               };
-
-               if (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) < 0)
-                       clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability);
-       }
-#endif
-
-#ifdef CONFIG_COMPAT_VDSO
-       __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
-       printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
-#else
-       /*
-        * In the non-compat case the ELF coredumping code needs the fixmap:
-        */
-       __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_KERNEL_RO);
-#endif
-
-       if (!boot_cpu_has(X86_FEATURE_SEP)) {
-               memcpy(syscall_page,
-                      &vsyscall_int80_start,
-                      &vsyscall_int80_end - &vsyscall_int80_start);
-               return 0;
-       }
-
-       memcpy(syscall_page,
-              &vsyscall_sysenter_start,
-              &vsyscall_sysenter_end - &vsyscall_sysenter_start);
-
-       return 0;
-}
-
-static struct page *syscall_nopage(struct vm_area_struct *vma,
-                               unsigned long adr, int *type)
-{
-       struct page *p = virt_to_page(adr - vma->vm_start + syscall_page);
-       get_page(p);
-       return p;
-}
-
-/* Prevent VMA merging */
-static void syscall_vma_close(struct vm_area_struct *vma)
-{
-}
-
-static struct vm_operations_struct syscall_vm_ops = {
-       .close = syscall_vma_close,
-       .nopage = syscall_nopage,
-};
-
-/* Defined in vsyscall-sysenter.S */
-extern void SYSENTER_RETURN;
-
-/* Setup a VMA at program startup for the vsyscall page */
-int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
-{
-       struct vm_area_struct *vma;
-       struct mm_struct *mm = current->mm;
-       unsigned long addr;
-       int ret;
-
-       down_write(&mm->mmap_sem);
-       addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
-       if (IS_ERR_VALUE(addr)) {
-               ret = addr;
-               goto up_fail;
-       }
-
-       vma = kmem_cache_zalloc(vm_area_cachep, SLAB_KERNEL);
-       if (!vma) {
-               ret = -ENOMEM;
-               goto up_fail;
-       }
-
-       vma->vm_start = addr;
-       vma->vm_end = addr + PAGE_SIZE;
-       /* MAYWRITE to allow gdb to COW and set breakpoints */
-       vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
-       vma->vm_flags |= mm->def_flags;
-       vma->vm_page_prot = protection_map[vma->vm_flags & 7];
-       vma->vm_ops = &syscall_vm_ops;
-       vma->vm_mm = mm;
-
-       ret = insert_vm_struct(mm, vma);
-       if (unlikely(ret)) {
-               kmem_cache_free(vm_area_cachep, vma);
-               goto up_fail;
-       }
-
-       current->mm->context.vdso = (void *)addr;
-       current_thread_info()->sysenter_return =
-                                   (void *)VDSO_SYM(&SYSENTER_RETURN);
-       mm->total_vm++;
-up_fail:
-       up_write(&mm->mmap_sem);
-       return ret;
-}
-
-const char *arch_vma_name(struct vm_area_struct *vma)
-{
-       if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso)
-               return "[vdso]";
-       return NULL;
-}
-
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
-{
-       return NULL;
-}
-
-int in_gate_area(struct task_struct *task, unsigned long addr)
-{
-       return 0;
-}
-
-int in_gate_area_no_task(unsigned long addr)
-{
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
deleted file mode 100644 (file)
index b2ffaa9..0000000
+++ /dev/null
@@ -1,1143 +0,0 @@
-/*
- *  linux/arch/i386/kernel/time.c
- *
- *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
- *
- * This file contains the PC-specific time handling details:
- * reading the RTC at bootup, etc..
- * 1994-07-02    Alan Modra
- *     fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
- * 1995-03-26    Markus Kuhn
- *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
- *      precision CMOS clock update
- * 1996-05-03    Ingo Molnar
- *      fixed time warps in do_[slow|fast]_gettimeoffset()
- * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
- *             "A Kernel Model for Precision Timekeeping" by Dave Mills
- * 1998-09-05    (Various)
- *     More robust do_fast_gettimeoffset() algorithm implemented
- *     (works with APM, Cyrix 6x86MX and Centaur C6),
- *     monotonic gettimeofday() with fast_get_timeoffset(),
- *     drift-proof precision TSC calibration on boot
- *     (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
- *     Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
- *     ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
- * 1998-12-16    Andrea Arcangeli
- *     Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
- *     because was not accounting lost_ticks.
- * 1998-12-24 Copyright (C) 1998  Andrea Arcangeli
- *     Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
- *     serialize accesses to xtime/lost_ticks).
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/module.h>
-#include <linux/sysdev.h>
-#include <linux/bcd.h>
-#include <linux/efi.h>
-#include <linux/mca.h>
-#include <linux/sysctl.h>
-#include <linux/percpu.h>
-#include <linux/kernel_stat.h>
-#include <linux/posix-timers.h>
-
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/irq.h>
-#include <asm/msr.h>
-#include <asm/delay.h>
-#include <asm/mpspec.h>
-#include <asm/uaccess.h>
-#include <asm/processor.h>
-#include <asm/timer.h>
-#include <asm/sections.h>
-
-#include "mach_time.h"
-
-#include <linux/timex.h>
-
-#include <asm/hpet.h>
-
-#include <asm/arch_hooks.h>
-
-#include <xen/evtchn.h>
-#include <xen/interface/vcpu.h>
-
-#if defined (__i386__)
-#include <asm/i8259.h>
-#endif
-
-int pit_latch_buggy;              /* extern */
-
-#if defined(__x86_64__)
-unsigned long vxtime_hz = PIT_TICK_RATE;
-struct vxtime_data __vxtime __section_vxtime;   /* for vsyscalls */
-volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
-unsigned long __wall_jiffies __section_wall_jiffies = INITIAL_JIFFIES;
-struct timespec __xtime __section_xtime;
-struct timezone __sys_tz __section_sys_tz;
-#endif
-
-unsigned int cpu_khz;  /* Detected as we calibrate the TSC */
-EXPORT_SYMBOL(cpu_khz);
-
-extern unsigned long wall_jiffies;
-
-DEFINE_SPINLOCK(rtc_lock);
-EXPORT_SYMBOL(rtc_lock);
-
-extern struct init_timer_opts timer_tsc_init;
-extern struct timer_opts timer_tsc;
-#define timer_none timer_tsc
-
-/* These are peridically updated in shared_info, and then copied here. */
-struct shadow_time_info {
-       u64 tsc_timestamp;     /* TSC at last update of time vals.  */
-       u64 system_timestamp;  /* Time, in nanosecs, since boot.    */
-       u32 tsc_to_nsec_mul;
-       u32 tsc_to_usec_mul;
-       int tsc_shift;
-       u32 version;
-};
-static DEFINE_PER_CPU(struct shadow_time_info, shadow_time);
-static struct timespec shadow_tv;
-static u32 shadow_tv_version;
-
-/* Keep track of last time we did processing/updating of jiffies and xtime. */
-static u64 processed_system_time;   /* System time (ns) at last processing. */
-static DEFINE_PER_CPU(u64, processed_system_time);
-
-/* How much CPU time was spent blocked and how much was 'stolen'? */
-static DEFINE_PER_CPU(u64, processed_stolen_time);
-static DEFINE_PER_CPU(u64, processed_blocked_time);
-
-/* Current runstate of each CPU (updated automatically by the hypervisor). */
-static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
-
-/* Must be signed, as it's compared with s64 quantities which can be -ve. */
-#define NS_PER_TICK (1000000000LL/HZ)
-
-static inline void __normalize_time(time_t *sec, s64 *nsec)
-{
-       while (*nsec >= NSEC_PER_SEC) {
-               (*nsec) -= NSEC_PER_SEC;
-               (*sec)++;
-       }
-       while (*nsec < 0) {
-               (*nsec) += NSEC_PER_SEC;
-               (*sec)--;
-       }
-}
-
-/* Does this guest OS track Xen time, or set its wall clock independently? */
-static int independent_wallclock = 0;
-static int __init __independent_wallclock(char *str)
-{
-       independent_wallclock = 1;
-       return 1;
-}
-__setup("independent_wallclock", __independent_wallclock);
-
-/* Permitted clock jitter, in nsecs, beyond which a warning will be printed. */
-static unsigned long permitted_clock_jitter = 10000000UL; /* 10ms */
-static int __init __permitted_clock_jitter(char *str)
-{
-       permitted_clock_jitter = simple_strtoul(str, NULL, 0);
-       return 1;
-}
-__setup("permitted_clock_jitter=", __permitted_clock_jitter);
-
-#if 0
-static void delay_tsc(unsigned long loops)
-{
-       unsigned long bclock, now;
-
-       rdtscl(bclock);
-       do {
-               rep_nop();
-               rdtscl(now);
-       } while ((now - bclock) < loops);
-}
-
-struct timer_opts timer_tsc = {
-       .name = "tsc",
-       .delay = delay_tsc,
-};
-#endif
-
-/*
- * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
- * yielding a 64-bit result.
- */
-static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
-{
-       u64 product;
-#ifdef __i386__
-       u32 tmp1, tmp2;
-#endif
-
-       if (shift < 0)
-               delta >>= -shift;
-       else
-               delta <<= shift;
-
-#ifdef __i386__
-       __asm__ (
-               "mul  %5       ; "
-               "mov  %4,%%eax ; "
-               "mov  %%edx,%4 ; "
-               "mul  %5       ; "
-               "xor  %5,%5    ; "
-               "add  %4,%%eax ; "
-               "adc  %5,%%edx ; "
-               : "=A" (product), "=r" (tmp1), "=r" (tmp2)
-               : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
-#else
-       __asm__ (
-               "mul %%rdx ; shrd $32,%%rdx,%%rax"
-               : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
-#endif
-
-       return product;
-}
-
-#if 0 /* defined (__i386__) */
-int read_current_timer(unsigned long *timer_val)
-{
-       rdtscl(*timer_val);
-       return 0;
-}
-#endif
-
-void init_cpu_khz(void)
-{
-       u64 __cpu_khz = 1000000ULL << 32;
-       struct vcpu_time_info *info = &vcpu_info(0)->time;
-       do_div(__cpu_khz, info->tsc_to_system_mul);
-       if (info->tsc_shift < 0)
-               cpu_khz = __cpu_khz << -info->tsc_shift;
-       else
-               cpu_khz = __cpu_khz >> info->tsc_shift;
-}
-
-static u64 get_nsec_offset(struct shadow_time_info *shadow)
-{
-       u64 now, delta;
-       rdtscll(now);
-       delta = now - shadow->tsc_timestamp;
-       return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
-}
-
-static unsigned long get_usec_offset(struct shadow_time_info *shadow)
-{
-       u64 now, delta;
-       rdtscll(now);
-       delta = now - shadow->tsc_timestamp;
-       return scale_delta(delta, shadow->tsc_to_usec_mul, shadow->tsc_shift);
-}
-
-static void __update_wallclock(time_t sec, long nsec)
-{
-       long wtm_nsec, xtime_nsec;
-       time_t wtm_sec, xtime_sec;
-       u64 tmp, wc_nsec;
-
-       /* Adjust wall-clock time base based on wall_jiffies ticks. */
-       wc_nsec = processed_system_time;
-       wc_nsec += sec * (u64)NSEC_PER_SEC;
-       wc_nsec += nsec;
-       wc_nsec -= (jiffies - wall_jiffies) * (u64)NS_PER_TICK;
-
-       /* Split wallclock base into seconds and nanoseconds. */
-       tmp = wc_nsec;
-       xtime_nsec = do_div(tmp, 1000000000);
-       xtime_sec  = (time_t)tmp;
-
-       wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - xtime_sec);
-       wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - xtime_nsec);
-
-       set_normalized_timespec(&xtime, xtime_sec, xtime_nsec);
-       set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-       ntp_clear();
-}
-
-static void update_wallclock(void)
-{
-       shared_info_t *s = HYPERVISOR_shared_info;
-
-       do {
-               shadow_tv_version = s->wc_version;
-               rmb();
-               shadow_tv.tv_sec  = s->wc_sec;
-               shadow_tv.tv_nsec = s->wc_nsec;
-               rmb();
-       } while ((s->wc_version & 1) | (shadow_tv_version ^ s->wc_version));
-
-       if (!independent_wallclock)
-               __update_wallclock(shadow_tv.tv_sec, shadow_tv.tv_nsec);
-}
-
-/*
- * Reads a consistent set of time-base values from Xen, into a shadow data
- * area.
- */
-static void get_time_values_from_xen(int cpu)
-{
-       struct vcpu_time_info   *src;
-       struct shadow_time_info *dst;
-
-       src = &vcpu_info(cpu)->time;
-       dst = &per_cpu(shadow_time, cpu);
-
-       do {
-               dst->version = src->version;
-               rmb();
-               dst->tsc_timestamp     = src->tsc_timestamp;
-               dst->system_timestamp  = src->system_time;
-               dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
-               dst->tsc_shift         = src->tsc_shift;
-               rmb();
-       } while ((src->version & 1) | (dst->version ^ src->version));
-
-       dst->tsc_to_usec_mul = dst->tsc_to_nsec_mul / 1000;
-}
-
-static inline int time_values_up_to_date(int cpu)
-{
-       struct vcpu_time_info   *src;
-       struct shadow_time_info *dst;
-
-       src = &vcpu_info(cpu)->time;
-       dst = &per_cpu(shadow_time, cpu);
-
-       rmb();
-       return (dst->version == src->version);
-}
-
-/*
- * This is a special lock that is owned by the CPU and holds the index
- * register we are working with.  It is required for NMI access to the
- * CMOS/RTC registers.  See include/asm-i386/mc146818rtc.h for details.
- */
-volatile unsigned long cmos_lock = 0;
-EXPORT_SYMBOL(cmos_lock);
-
-/* Routines for accessing the CMOS RAM/RTC. */
-unsigned char rtc_cmos_read(unsigned char addr)
-{
-       unsigned char val;
-       lock_cmos_prefix(addr);
-       outb_p(addr, RTC_PORT(0));
-       val = inb_p(RTC_PORT(1));
-       lock_cmos_suffix(addr);
-       return val;
-}
-EXPORT_SYMBOL(rtc_cmos_read);
-
-void rtc_cmos_write(unsigned char val, unsigned char addr)
-{
-       lock_cmos_prefix(addr);
-       outb_p(addr, RTC_PORT(0));
-       outb_p(val, RTC_PORT(1));
-       lock_cmos_suffix(addr);
-}
-EXPORT_SYMBOL(rtc_cmos_write);
-
-/*
- * This version of gettimeofday has microsecond resolution
- * and better than microsecond precision on fast x86 machines with TSC.
- */
-void do_gettimeofday(struct timeval *tv)
-{
-       unsigned long seq;
-       unsigned long usec, sec;
-       unsigned long max_ntp_tick;
-       s64 nsec;
-       unsigned int cpu;
-       struct shadow_time_info *shadow;
-       u32 local_time_version;
-
-       cpu = get_cpu();
-       shadow = &per_cpu(shadow_time, cpu);
-
-       do {
-               unsigned long lost;
-
-               local_time_version = shadow->version;
-               seq = read_seqbegin(&xtime_lock);
-
-               usec = get_usec_offset(shadow);
-               lost = jiffies - wall_jiffies;
-
-               /*
-                * If time_adjust is negative then NTP is slowing the clock
-                * so make sure not to go into next possible interval.
-                * Better to lose some accuracy than have time go backwards..
-                */
-               if (unlikely(time_adjust < 0)) {
-                       max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
-                       usec = min(usec, max_ntp_tick);
-
-                       if (lost)
-                               usec += lost * max_ntp_tick;
-               }
-               else if (unlikely(lost))
-                       usec += lost * (USEC_PER_SEC / HZ);
-
-               sec = xtime.tv_sec;
-               usec += (xtime.tv_nsec / NSEC_PER_USEC);
-
-               nsec = shadow->system_timestamp - processed_system_time;
-               __normalize_time(&sec, &nsec);
-               usec += (long)nsec / NSEC_PER_USEC;
-
-               if (unlikely(!time_values_up_to_date(cpu))) {
-                       /*
-                        * We may have blocked for a long time,
-                        * rendering our calculations invalid
-                        * (e.g. the time delta may have
-                        * overflowed). Detect that and recalculate
-                        * with fresh values.
-                        */
-                       get_time_values_from_xen(cpu);
-                       continue;
-               }
-       } while (read_seqretry(&xtime_lock, seq) ||
-                (local_time_version != shadow->version));
-
-       put_cpu();
-
-       while (usec >= USEC_PER_SEC) {
-               usec -= USEC_PER_SEC;
-               sec++;
-       }
-
-       tv->tv_sec = sec;
-       tv->tv_usec = usec;
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
-
-int do_settimeofday(struct timespec *tv)
-{
-       time_t sec;
-       s64 nsec;
-       unsigned int cpu;
-       struct shadow_time_info *shadow;
-       struct xen_platform_op op;
-
-       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-               return -EINVAL;
-
-       cpu = get_cpu();
-       shadow = &per_cpu(shadow_time, cpu);
-
-       write_seqlock_irq(&xtime_lock);
-
-       /*
-        * Ensure we don't get blocked for a long time so that our time delta
-        * overflows. If that were to happen then our shadow time values would
-        * be stale, so we can retry with fresh ones.
-        */
-       for (;;) {
-               nsec = tv->tv_nsec - get_nsec_offset(shadow);
-               if (time_values_up_to_date(cpu))
-                       break;
-               get_time_values_from_xen(cpu);
-       }
-       sec = tv->tv_sec;
-       __normalize_time(&sec, &nsec);
-
-       if (is_initial_xendomain() && !independent_wallclock) {
-               op.cmd = XENPF_settime;
-               op.u.settime.secs        = sec;
-               op.u.settime.nsecs       = nsec;
-               op.u.settime.system_time = shadow->system_timestamp;
-               HYPERVISOR_platform_op(&op);
-               update_wallclock();
-       } else if (independent_wallclock) {
-               nsec -= shadow->system_timestamp;
-               __normalize_time(&sec, &nsec);
-               __update_wallclock(sec, nsec);
-       }
-
-       write_sequnlock_irq(&xtime_lock);
-
-       put_cpu();
-
-       clock_was_set();
-       return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
-
-static void sync_xen_wallclock(unsigned long dummy);
-static DEFINE_TIMER(sync_xen_wallclock_timer, sync_xen_wallclock, 0, 0);
-static void sync_xen_wallclock(unsigned long dummy)
-{
-       time_t sec;
-       s64 nsec;
-       struct xen_platform_op op;
-
-       if (!ntp_synced() || independent_wallclock || !is_initial_xendomain())
-               return;
-
-       write_seqlock_irq(&xtime_lock);
-
-       sec  = xtime.tv_sec;
-       nsec = xtime.tv_nsec + ((jiffies - wall_jiffies) * (u64)NS_PER_TICK);
-       __normalize_time(&sec, &nsec);
-
-       op.cmd = XENPF_settime;
-       op.u.settime.secs        = sec;
-       op.u.settime.nsecs       = nsec;
-       op.u.settime.system_time = processed_system_time;
-       HYPERVISOR_platform_op(&op);
-
-       update_wallclock();
-
-       write_sequnlock_irq(&xtime_lock);
-
-       /* Once per minute. */
-       mod_timer(&sync_xen_wallclock_timer, jiffies + 60*HZ);
-}
-
-static int set_rtc_mmss(unsigned long nowtime)
-{
-       int retval;
-       unsigned long flags;
-
-       if (independent_wallclock || !is_initial_xendomain())
-               return 0;
-
-       /* gets recalled with irq locally disabled */
-       /* XXX - does irqsave resolve this? -johnstul */
-       spin_lock_irqsave(&rtc_lock, flags);
-       if (efi_enabled)
-               retval = efi_set_rtc_mmss(nowtime);
-       else
-               retval = mach_set_rtc_mmss(nowtime);
-       spin_unlock_irqrestore(&rtc_lock, flags);
-
-       return retval;
-}
-
-/* monotonic_clock(): returns # of nanoseconds passed since time_init()
- *             Note: This function is required to return accurate
- *             time even in the absence of multiple timer ticks.
- */
-unsigned long long monotonic_clock(void)
-{
-       int cpu = get_cpu();
-       struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
-       u64 time;
-       u32 local_time_version;
-
-       do {
-               local_time_version = shadow->version;
-               barrier();
-               time = shadow->system_timestamp + get_nsec_offset(shadow);
-               if (!time_values_up_to_date(cpu))
-                       get_time_values_from_xen(cpu);
-               barrier();
-       } while (local_time_version != shadow->version);
-
-       put_cpu();
-
-       return time;
-}
-EXPORT_SYMBOL(monotonic_clock);
-
-#ifdef __x86_64__
-unsigned long long sched_clock(void)
-{
-       return monotonic_clock();
-}
-#endif
-
-#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
-unsigned long profile_pc(struct pt_regs *regs)
-{
-       unsigned long pc = instruction_pointer(regs);
-
-#ifdef __x86_64__
-       /* Assume the lock function has either no stack frame or only a single word.
-          This checks if the address on the stack looks like a kernel text address.
-          There is a small window for false hits, but in that case the tick
-          is just accounted to the spinlock function.
-          Better would be to write these functions in assembler again
-          and check exactly. */
-       if (!user_mode_vm(regs) && in_lock_functions(pc)) {
-               char *v = *(char **)regs->rsp;
-               if ((v >= _stext && v <= _etext) ||
-                       (v >= _sinittext && v <= _einittext) ||
-                       (v >= (char *)MODULES_VADDR  && v <= (char *)MODULES_END))
-                       return (unsigned long)v;
-               return ((unsigned long *)regs->rsp)[1];
-       }
-#else
-       if (!user_mode_vm(regs) && in_lock_functions(pc))
-               return *(unsigned long *)(regs->ebp + 4);
-#endif
-
-       return pc;
-}
-EXPORT_SYMBOL(profile_pc);
-#endif
-
-/*
- * This is the same as the above, except we _also_ save the current
- * Time Stamp Counter value at the time of the timer interrupt, so that
- * we later on can estimate the time of day more exactly.
- */
-irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-       s64 delta, delta_cpu, stolen, blocked;
-       u64 sched_time;
-       int i, cpu = smp_processor_id();
-       struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
-       struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
-
-       /*
-        * Here we are in the timer irq handler. We just have irqs locally
-        * disabled but we don't know if the timer_bh is running on the other
-        * CPU. We need to avoid to SMP race with it. NOTE: we don' t need
-        * the irq version of write_lock because as just said we have irq
-        * locally disabled. -arca
-        */
-       write_seqlock(&xtime_lock);
-
-       do {
-               get_time_values_from_xen(cpu);
-
-               /* Obtain a consistent snapshot of elapsed wallclock cycles. */
-               delta = delta_cpu =
-                       shadow->system_timestamp + get_nsec_offset(shadow);
-               delta     -= processed_system_time;
-               delta_cpu -= per_cpu(processed_system_time, cpu);
-
-               /*
-                * Obtain a consistent snapshot of stolen/blocked cycles. We
-                * can use state_entry_time to detect if we get preempted here.
-                */
-               do {
-                       sched_time = runstate->state_entry_time;
-                       barrier();
-                       stolen = runstate->time[RUNSTATE_runnable] +
-                               runstate->time[RUNSTATE_offline] -
-                               per_cpu(processed_stolen_time, cpu);
-                       blocked = runstate->time[RUNSTATE_blocked] -
-                               per_cpu(processed_blocked_time, cpu);
-                       barrier();
-               } while (sched_time != runstate->state_entry_time);
-       } while (!time_values_up_to_date(cpu));
-
-       if ((unlikely(delta < -(s64)permitted_clock_jitter) ||
-            unlikely(delta_cpu < -(s64)permitted_clock_jitter))
-           && printk_ratelimit()) {
-               printk("Timer ISR/%d: Time went backwards: "
-                      "delta=%lld delta_cpu=%lld shadow=%lld "
-                      "off=%lld processed=%lld cpu_processed=%lld\n",
-                      cpu, delta, delta_cpu, shadow->system_timestamp,
-                      (s64)get_nsec_offset(shadow),
-                      processed_system_time,
-                      per_cpu(processed_system_time, cpu));
-               for (i = 0; i < num_online_cpus(); i++)
-                       printk(" %d: %lld\n", i,
-                              per_cpu(processed_system_time, i));
-       }
-
-       /* System-wide jiffy work. */
-       while (delta >= NS_PER_TICK) {
-               delta -= NS_PER_TICK;
-               processed_system_time += NS_PER_TICK;
-               do_timer(regs);
-       }
-
-       if (shadow_tv_version != HYPERVISOR_shared_info->wc_version) {
-               update_wallclock();
-               clock_was_set();
-       }
-
-       write_sequnlock(&xtime_lock);
-
-       /*
-        * Account stolen ticks.
-        * HACK: Passing NULL to account_steal_time()
-        * ensures that the ticks are accounted as stolen.
-        */
-       if ((stolen > 0) && (delta_cpu > 0)) {
-               delta_cpu -= stolen;
-               if (unlikely(delta_cpu < 0))
-                       stolen += delta_cpu; /* clamp local-time progress */
-               do_div(stolen, NS_PER_TICK);
-               per_cpu(processed_stolen_time, cpu) += stolen * NS_PER_TICK;
-               per_cpu(processed_system_time, cpu) += stolen * NS_PER_TICK;
-               account_steal_time(NULL, (cputime_t)stolen);
-       }
-
-       /*
-        * Account blocked ticks.
-        * HACK: Passing idle_task to account_steal_time()
-        * ensures that the ticks are accounted as idle/wait.
-        */
-       if ((blocked > 0) && (delta_cpu > 0)) {
-               delta_cpu -= blocked;
-               if (unlikely(delta_cpu < 0))
-                       blocked += delta_cpu; /* clamp local-time progress */
-               do_div(blocked, NS_PER_TICK);
-               per_cpu(processed_blocked_time, cpu) += blocked * NS_PER_TICK;
-               per_cpu(processed_system_time, cpu)  += blocked * NS_PER_TICK;
-               account_steal_time(idle_task(cpu), (cputime_t)blocked);
-       }
-
-       /* Account user/system ticks. */
-       if (delta_cpu > 0) {
-               do_div(delta_cpu, NS_PER_TICK);
-               per_cpu(processed_system_time, cpu) += delta_cpu * NS_PER_TICK;
-               if (user_mode_vm(regs))
-                       account_user_time(current, (cputime_t)delta_cpu);
-               else
-                       account_system_time(current, HARDIRQ_OFFSET,
-                                           (cputime_t)delta_cpu);
-       }
-
-       /* Offlined for more than a few seconds? Avoid lockup warnings. */
-       if (stolen > 5*HZ)
-               touch_softlockup_watchdog();
-
-       /* Local timer processing (see update_process_times()). */
-       run_local_timers();
-       if (rcu_pending(cpu))
-               rcu_check_callbacks(cpu, user_mode_vm(regs));
-       scheduler_tick();
-       run_posix_cpu_timers(current);
-       profile_tick(CPU_PROFILING, regs);
-
-       return IRQ_HANDLED;
-}
-
-static void init_missing_ticks_accounting(int cpu)
-{
-       struct vcpu_register_runstate_memory_area area;
-       struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
-       int rc;
-
-       memset(runstate, 0, sizeof(*runstate));
-
-       area.addr.v = runstate;
-       rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area);
-       WARN_ON(rc && rc != -ENOSYS);
-
-       per_cpu(processed_blocked_time, cpu) =
-               runstate->time[RUNSTATE_blocked];
-       per_cpu(processed_stolen_time, cpu) =
-               runstate->time[RUNSTATE_runnable] +
-               runstate->time[RUNSTATE_offline];
-}
-
-/* not static: needed by APM */
-unsigned long get_cmos_time(void)
-{
-       unsigned long retval;
-       unsigned long flags;
-
-       spin_lock_irqsave(&rtc_lock, flags);
-
-       if (efi_enabled)
-               retval = efi_get_time();
-       else
-               retval = mach_get_cmos_time();
-
-       spin_unlock_irqrestore(&rtc_lock, flags);
-
-       return retval;
-}
-EXPORT_SYMBOL(get_cmos_time);
-
-static void sync_cmos_clock(unsigned long dummy);
-
-static DEFINE_TIMER(sync_cmos_timer, sync_cmos_clock, 0, 0);
-
-static void sync_cmos_clock(unsigned long dummy)
-{
-       struct timeval now, next;
-       int fail = 1;
-
-       /*
-        * If we have an externally synchronized Linux clock, then update
-        * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-        * called as close as possible to 500 ms before the new second starts.
-        * This code is run on a timer.  If the clock is set, that timer
-        * may not expire at the correct time.  Thus, we adjust...
-        */
-       if (!ntp_synced())
-               /*
-                * Not synced, exit, do not restart a timer (if one is
-                * running, let it run out).
-                */
-               return;
-
-       do_gettimeofday(&now);
-       if (now.tv_usec >= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
-           now.tv_usec <= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2)
-               fail = set_rtc_mmss(now.tv_sec);
-
-       next.tv_usec = USEC_AFTER - now.tv_usec;
-       if (next.tv_usec <= 0)
-               next.tv_usec += USEC_PER_SEC;
-
-       if (!fail)
-               next.tv_sec = 659;
-       else
-               next.tv_sec = 0;
-
-       if (next.tv_usec >= USEC_PER_SEC) {
-               next.tv_sec++;
-               next.tv_usec -= USEC_PER_SEC;
-       }
-       mod_timer(&sync_cmos_timer, jiffies + timeval_to_jiffies(&next));
-}
-
-void notify_arch_cmos_timer(void)
-{
-       mod_timer(&sync_cmos_timer, jiffies + 1);
-       mod_timer(&sync_xen_wallclock_timer, jiffies + 1);
-}
-
-static long clock_cmos_diff, sleep_start;
-
-static int timer_suspend(struct sys_device *dev, pm_message_t state)
-{
-       /*
-        * Estimate time zone so that set_time can update the clock
-        */
-       clock_cmos_diff = -get_cmos_time();
-       clock_cmos_diff += get_seconds();
-       sleep_start = get_cmos_time();
-       return 0;
-}
-
-static int timer_resume(struct sys_device *dev)
-{
-       unsigned long flags;
-       unsigned long sec;
-       unsigned long sleep_length;
-
-#ifdef CONFIG_HPET_TIMER
-       if (is_hpet_enabled())
-               hpet_reenable();
-#endif
-       sec = get_cmos_time() + clock_cmos_diff;
-       sleep_length = (get_cmos_time() - sleep_start) * HZ;
-       write_seqlock_irqsave(&xtime_lock, flags);
-       xtime.tv_sec = sec;
-       xtime.tv_nsec = 0;
-       jiffies_64 += sleep_length;
-       wall_jiffies += sleep_length;
-       write_sequnlock_irqrestore(&xtime_lock, flags);
-       touch_softlockup_watchdog();
-       return 0;
-}
-
-static struct sysdev_class timer_sysclass = {
-       .resume = timer_resume,
-       .suspend = timer_suspend,
-       set_kset_name("timer"),
-};
-
-
-/* XXX this driverfs stuff should probably go elsewhere later -john */
-static struct sys_device device_timer = {
-       .id     = 0,
-       .cls    = &timer_sysclass,
-};
-
-static int time_init_device(void)
-{
-       int error = sysdev_class_register(&timer_sysclass);
-       if (!error)
-               error = sysdev_register(&device_timer);
-       return error;
-}
-
-device_initcall(time_init_device);
-
-#ifdef CONFIG_HPET_TIMER
-extern void (*late_time_init)(void);
-/* Duplicate of time_init() below, with hpet_enable part added */
-static void __init hpet_time_init(void)
-{
-       xtime.tv_sec = get_cmos_time();
-       xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-       set_normalized_timespec(&wall_to_monotonic,
-               -xtime.tv_sec, -xtime.tv_nsec);
-
-       if ((hpet_enable() >= 0) && hpet_use_timer) {
-               printk("Using HPET for base-timer\n");
-       }
-
-       time_init_hook();
-}
-#endif
-
-/* Dynamically-mapped IRQ. */
-DEFINE_PER_CPU(int, timer_irq);
-
-extern void (*late_time_init)(void);
-static void setup_cpu0_timer_irq(void)
-{
-       per_cpu(timer_irq, 0) =
-               bind_virq_to_irqhandler(
-                       VIRQ_TIMER,
-                       0,
-                       timer_interrupt,
-                       SA_INTERRUPT,
-                       "timer0",
-                       NULL);
-       BUG_ON(per_cpu(timer_irq, 0) < 0);
-}
-
-static struct vcpu_set_periodic_timer xen_set_periodic_tick = {
-       .period_ns = NS_PER_TICK
-};
-
-void __init time_init(void)
-{
-#ifdef CONFIG_HPET_TIMER
-       if (is_hpet_capable()) {
-               /*
-                * HPET initialization needs to do memory-mapped io. So, let
-                * us do a late initialization after mem_init().
-                */
-               late_time_init = hpet_time_init;
-               return;
-       }
-#endif
-
-       HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
-                          &xen_set_periodic_tick);
-
-       get_time_values_from_xen(0);
-
-       processed_system_time = per_cpu(shadow_time, 0).system_timestamp;
-       per_cpu(processed_system_time, 0) = processed_system_time;
-       init_missing_ticks_accounting(0);
-
-       update_wallclock();
-
-       init_cpu_khz();
-       printk(KERN_INFO "Xen reported: %u.%03u MHz processor.\n",
-              cpu_khz / 1000, cpu_khz % 1000);
-
-#if defined(__x86_64__)
-       vxtime.mode = VXTIME_TSC;
-       vxtime.quot = (1000000L << 32) / vxtime_hz;
-       vxtime.tsc_quot = (1000L << 32) / cpu_khz;
-       sync_core();
-       rdtscll(vxtime.last_tsc);
-#endif
-
-       /* Cannot request_irq() until kmem is initialised. */
-       late_time_init = setup_cpu0_timer_irq;
-}
-
-/* Convert jiffies to system time. */
-u64 jiffies_to_st(unsigned long j)
-{
-       unsigned long seq;
-       long delta;
-       u64 st;
-
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               delta = j - jiffies;
-               if (delta < 1) {
-                       /* Triggers in some wrap-around cases, but that's okay:
-                        * we just end up with a shorter timeout. */
-                       st = processed_system_time + NS_PER_TICK;
-               } else if (((unsigned long)delta >> (BITS_PER_LONG-3)) != 0) {
-                       /* Very long timeout means there is no pending timer.
-                        * We indicate this to Xen by passing zero timeout. */
-                       st = 0;
-               } else {
-                       st = processed_system_time + delta * (u64)NS_PER_TICK;
-               }
-       } while (read_seqretry(&xtime_lock, seq));
-
-       return st;
-}
-EXPORT_SYMBOL(jiffies_to_st);
-
-/*
- * stop_hz_timer / start_hz_timer - enter/exit 'tickless mode' on an idle cpu
- * These functions are based on implementations from arch/s390/kernel/time.c
- */
-static void stop_hz_timer(void)
-{
-       struct vcpu_set_singleshot_timer singleshot;
-       unsigned int cpu = smp_processor_id();
-       unsigned long j;
-       int rc;
-
-       cpu_set(cpu, nohz_cpu_mask);
-
-       /* See matching smp_mb in rcu_start_batch in rcupdate.c.  These mbs  */
-       /* ensure that if __rcu_pending (nested in rcu_needs_cpu) fetches a  */
-       /* value of rcp->cur that matches rdp->quiescbatch and allows us to  */
-       /* stop the hz timer then the cpumasks created for subsequent values */
-       /* of cur in rcu_start_batch are guaranteed to pick up the updated   */
-       /* nohz_cpu_mask and so will not depend on this cpu.                 */
-
-       smp_mb();
-
-       /* Leave ourselves in tick mode if rcu or softirq or timer pending. */
-       if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
-           (j = next_timer_interrupt(), time_before_eq(j, jiffies))) {
-               cpu_clear(cpu, nohz_cpu_mask);
-               j = jiffies + 1;
-       }
-
-       singleshot.timeout_abs_ns = jiffies_to_st(j);
-       singleshot.flags = 0;
-       rc = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &singleshot);
-#if CONFIG_XEN_COMPAT <= 0x030004
-       if (rc) {
-               BUG_ON(rc != -ENOSYS);
-               rc = HYPERVISOR_set_timer_op(singleshot.timeout_abs_ns);
-       }
-#endif
-       BUG_ON(rc);
-}
-
-static void start_hz_timer(void)
-{
-       cpu_clear(smp_processor_id(), nohz_cpu_mask);
-}
-
-void raw_safe_halt(void)
-{
-       stop_hz_timer();
-       /* Blocking includes an implicit local_irq_enable(). */
-       HYPERVISOR_block();
-       start_hz_timer();
-}
-EXPORT_SYMBOL(raw_safe_halt);
-
-void halt(void)
-{
-       if (irqs_disabled())
-               HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
-}
-EXPORT_SYMBOL(halt);
-
-/* No locking required. Interrupts are disabled on all CPUs. */
-void time_resume(void)
-{
-       unsigned int cpu;
-
-       init_cpu_khz();
-
-       for_each_online_cpu(cpu) {
-               HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-                                  &xen_set_periodic_tick);
-               get_time_values_from_xen(cpu);
-               per_cpu(processed_system_time, cpu) =
-                       per_cpu(shadow_time, 0).system_timestamp;
-               init_missing_ticks_accounting(cpu);
-       }
-
-       processed_system_time = per_cpu(shadow_time, 0).system_timestamp;
-
-       update_wallclock();
-}
-
-#ifdef CONFIG_SMP
-static char timer_name[NR_CPUS][15];
-
-int local_setup_timer(unsigned int cpu)
-{
-       int seq, irq;
-
-       BUG_ON(cpu == 0);
-
-       HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-                          &xen_set_periodic_tick);
-
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               /* Use cpu0 timestamp: cpu's shadow is not initialised yet. */
-               per_cpu(processed_system_time, cpu) =
-                       per_cpu(shadow_time, 0).system_timestamp;
-               init_missing_ticks_accounting(cpu);
-       } while (read_seqretry(&xtime_lock, seq));
-
-       sprintf(timer_name[cpu], "timer%d", cpu);
-       irq = bind_virq_to_irqhandler(VIRQ_TIMER,
-                                     cpu,
-                                     timer_interrupt,
-                                     SA_INTERRUPT,
-                                     timer_name[cpu],
-                                     NULL);
-       if (irq < 0)
-               return irq;
-       per_cpu(timer_irq, cpu) = irq;
-
-       return 0;
-}
-
-void local_teardown_timer(unsigned int cpu)
-{
-       BUG_ON(cpu == 0);
-       unbind_from_irqhandler(per_cpu(timer_irq, cpu), NULL);
-}
-#endif
-
-/*
- * /proc/sys/xen: This really belongs in another file. It can stay here for
- * now however.
- */
-static ctl_table xen_subtable[] = {
-       {
-               .ctl_name       = 1,
-               .procname       = "independent_wallclock",
-               .data           = &independent_wallclock,
-               .maxlen         = sizeof(independent_wallclock),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec
-       },
-       {
-               .ctl_name       = 2,
-               .procname       = "permitted_clock_jitter",
-               .data           = &permitted_clock_jitter,
-               .maxlen         = sizeof(permitted_clock_jitter),
-               .mode           = 0644,
-               .proc_handler   = proc_doulongvec_minmax
-       },
-       { 0 }
-};
-static ctl_table xen_table[] = {
-       {
-               .ctl_name       = 123,
-               .procname       = "xen",
-               .mode           = 0555,
-               .child          = xen_subtable},
-       { 0 }
-};
-static int __init xen_sysctl_init(void)
-{
-       (void)register_sysctl_table(xen_table, 0);
-       return 0;
-}
-__initcall(xen_sysctl_init);
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/traps-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/traps-xen.c
deleted file mode 100644 (file)
index 2d69b40..0000000
+++ /dev/null
@@ -1,1186 +0,0 @@
-/*
- *  linux/arch/i386/traps.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * 'Traps.c' handles hardware traps and faults after we have saved some
- * state in 'asm.s'.
- */
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/highmem.h>
-#include <linux/kallsyms.h>
-#include <linux/ptrace.h>
-#include <linux/utsname.h>
-#include <linux/kprobes.h>
-#include <linux/kexec.h>
-#include <linux/unwind.h>
-
-#ifdef CONFIG_EISA
-#include <linux/ioport.h>
-#include <linux/eisa.h>
-#endif
-
-#ifdef CONFIG_MCA
-#include <linux/mca.h>
-#endif
-
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#include <asm/debugreg.h>
-#include <asm/desc.h>
-#include <asm/i387.h>
-#include <asm/nmi.h>
-#include <asm/unwind.h>
-#include <asm/smp.h>
-#include <asm/arch_hooks.h>
-#include <asm/kdebug.h>
-
-#include <linux/module.h>
-
-#include "mach_traps.h"
-
-asmlinkage int system_call(void);
-
-struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
-               { 0, 0 }, { 0, 0 } };
-
-/* Do we ignore FPU interrupts ? */
-char ignore_fpu_irq = 0;
-
-#ifndef CONFIG_X86_NO_IDT
-/*
- * The IDT has to be page-aligned to simplify the Pentium
- * F0 0F bug workaround.. We have a special link segment
- * for this.
- */
-struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };
-#endif
-
-asmlinkage void divide_error(void);
-asmlinkage void debug(void);
-asmlinkage void nmi(void);
-asmlinkage void int3(void);
-asmlinkage void overflow(void);
-asmlinkage void bounds(void);
-asmlinkage void invalid_op(void);
-asmlinkage void device_not_available(void);
-asmlinkage void coprocessor_segment_overrun(void);
-asmlinkage void invalid_TSS(void);
-asmlinkage void segment_not_present(void);
-asmlinkage void stack_segment(void);
-asmlinkage void general_protection(void);
-asmlinkage void page_fault(void);
-asmlinkage void coprocessor_error(void);
-asmlinkage void simd_coprocessor_error(void);
-asmlinkage void alignment_check(void);
-#ifndef CONFIG_XEN
-asmlinkage void spurious_interrupt_bug(void);
-#else
-asmlinkage void fixup_4gb_segment(void);
-#endif
-asmlinkage void machine_check(void);
-
-static int kstack_depth_to_print = 24;
-#ifdef CONFIG_STACK_UNWIND
-static int call_trace = 1;
-#else
-#define call_trace (-1)
-#endif
-ATOMIC_NOTIFIER_HEAD(i386die_chain);
-
-int register_die_notifier(struct notifier_block *nb)
-{
-       vmalloc_sync_all();
-       return atomic_notifier_chain_register(&i386die_chain, nb);
-}
-EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
-
-int unregister_die_notifier(struct notifier_block *nb)
-{
-       return atomic_notifier_chain_unregister(&i386die_chain, nb);
-}
-EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
-
-static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
-{
-       return  p > (void *)tinfo &&
-               p < (void *)tinfo + THREAD_SIZE - 3;
-}
-
-/*
- * Print one address/symbol entries per line.
- */
-static inline void print_addr_and_symbol(unsigned long addr, char *log_lvl)
-{
-       printk(" [<%08lx>] ", addr);
-
-       print_symbol("%s\n", addr);
-}
-
-static inline unsigned long print_context_stack(struct thread_info *tinfo,
-                               unsigned long *stack, unsigned long ebp,
-                               char *log_lvl)
-{
-       unsigned long addr;
-
-#ifdef CONFIG_FRAME_POINTER
-       while (valid_stack_ptr(tinfo, (void *)ebp)) {
-               addr = *(unsigned long *)(ebp + 4);
-               print_addr_and_symbol(addr, log_lvl);
-               /*
-                * break out of recursive entries (such as
-                * end_of_stack_stop_unwind_function):
-                */
-               if (ebp == *(unsigned long *)ebp)
-                       break;
-               ebp = *(unsigned long *)ebp;
-       }
-#else
-       while (valid_stack_ptr(tinfo, stack)) {
-               addr = *stack++;
-               if (__kernel_text_address(addr))
-                       print_addr_and_symbol(addr, log_lvl);
-       }
-#endif
-       return ebp;
-}
-
-static asmlinkage int
-show_trace_unwind(struct unwind_frame_info *info, void *log_lvl)
-{
-       int n = 0;
-
-       while (unwind(info) == 0 && UNW_PC(info)) {
-               n++;
-               print_addr_and_symbol(UNW_PC(info), log_lvl);
-               if (arch_unw_user_mode(info))
-                       break;
-       }
-       return n;
-}
-
-static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
-                              unsigned long *stack, char *log_lvl)
-{
-       unsigned long ebp;
-
-       if (!task)
-               task = current;
-
-       if (call_trace >= 0) {
-               int unw_ret = 0;
-               struct unwind_frame_info info;
-
-               if (regs) {
-                       if (unwind_init_frame_info(&info, task, regs) == 0)
-                               unw_ret = show_trace_unwind(&info, log_lvl);
-               } else if (task == current)
-                       unw_ret = unwind_init_running(&info, show_trace_unwind, log_lvl);
-               else {
-                       if (unwind_init_blocked(&info, task) == 0)
-                               unw_ret = show_trace_unwind(&info, log_lvl);
-               }
-               if (unw_ret > 0) {
-                       if (call_trace == 1 && !arch_unw_user_mode(&info)) {
-                               print_symbol("DWARF2 unwinder stuck at %s\n",
-                                            UNW_PC(&info));
-                               if (UNW_SP(&info) >= PAGE_OFFSET) {
-                                       printk("Leftover inexact backtrace:\n");
-                                       stack = (void *)UNW_SP(&info);
-                               } else
-                                       printk("Full inexact backtrace again:\n");
-                       } else if (call_trace >= 1)
-                               return;
-                       else
-                               printk("Full inexact backtrace again:\n");
-               } else
-                       printk("Inexact backtrace:\n");
-       }
-
-       if (task == current) {
-               /* Grab ebp right from our regs */
-               asm ("movl %%ebp, %0" : "=r" (ebp) : );
-       } else {
-               /* ebp is the last reg pushed by switch_to */
-               ebp = *(unsigned long *) task->thread.esp;
-       }
-
-       while (1) {
-               struct thread_info *context;
-               context = (struct thread_info *)
-                       ((unsigned long)stack & (~(THREAD_SIZE - 1)));
-               ebp = print_context_stack(context, stack, ebp, log_lvl);
-               stack = (unsigned long*)context->previous_esp;
-               if (!stack)
-                       break;
-               printk("%s =======================\n", log_lvl);
-       }
-}
-
-void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long * stack)
-{
-       show_trace_log_lvl(task, regs, stack, "");
-}
-
-static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
-                              unsigned long *esp, char *log_lvl)
-{
-       unsigned long *stack;
-       int i;
-
-       if (esp == NULL) {
-               if (task)
-                       esp = (unsigned long*)task->thread.esp;
-               else
-                       esp = (unsigned long *)&esp;
-       }
-
-       stack = esp;
-       for(i = 0; i < kstack_depth_to_print; i++) {
-               if (kstack_end(stack))
-                       break;
-               if (i && ((i % 8) == 0))
-                       printk("\n%s       ", log_lvl);
-               printk("%08lx ", *stack++);
-       }
-       printk("\n%sCall Trace:\n", log_lvl);
-       show_trace_log_lvl(task, regs, esp, log_lvl);
-}
-
-void show_stack(struct task_struct *task, unsigned long *esp)
-{
-       printk("       ");
-       show_stack_log_lvl(task, NULL, esp, "");
-}
-
-/*
- * The architecture-independent dump_stack generator
- */
-void dump_stack(void)
-{
-       unsigned long stack;
-
-       show_trace(current, NULL, &stack);
-}
-
-EXPORT_SYMBOL(dump_stack);
-
-void show_registers(struct pt_regs *regs)
-{
-       int i;
-       int in_kernel = 1;
-       unsigned long esp;
-       unsigned short ss;
-
-       esp = (unsigned long) (&regs->esp);
-       savesegment(ss, ss);
-       if (user_mode_vm(regs)) {
-               in_kernel = 0;
-               esp = regs->esp;
-               ss = regs->xss & 0xffff;
-       }
-       print_modules();
-       printk(KERN_EMERG "CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\n"
-                       "EFLAGS: %08lx   (%s %.*s) \n",
-               smp_processor_id(), 0xffff & regs->xcs, regs->eip,
-               print_tainted(), regs->eflags, system_utsname.release,
-               (int)strcspn(system_utsname.version, " "),
-               system_utsname.version);
-       print_symbol(KERN_EMERG "EIP is at %s\n", regs->eip);
-       printk(KERN_EMERG "eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
-               regs->eax, regs->ebx, regs->ecx, regs->edx);
-       printk(KERN_EMERG "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
-               regs->esi, regs->edi, regs->ebp, esp);
-       printk(KERN_EMERG "ds: %04x   es: %04x   ss: %04x\n",
-               regs->xds & 0xffff, regs->xes & 0xffff, ss);
-       printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)",
-               TASK_COMM_LEN, current->comm, current->pid,
-               current_thread_info(), current, current->thread_info);
-       /*
-        * When in-kernel, we also print out the stack and code at the
-        * time of the fault..
-        */
-       if (in_kernel) {
-               u8 __user *eip;
-
-               printk("\n" KERN_EMERG "Stack: ");
-               show_stack_log_lvl(NULL, regs, (unsigned long *)esp, KERN_EMERG);
-
-               printk(KERN_EMERG "Code: ");
-
-               eip = (u8 __user *)regs->eip - 43;
-               for (i = 0; i < 64; i++, eip++) {
-                       unsigned char c;
-
-                       if (eip < (u8 __user *)PAGE_OFFSET || __get_user(c, eip)) {
-                               printk(" Bad EIP value.");
-                               break;
-                       }
-                       if (eip == (u8 __user *)regs->eip)
-                               printk("<%02x> ", c);
-                       else
-                               printk("%02x ", c);
-               }
-       }
-       printk("\n");
-}      
-
-static void handle_BUG(struct pt_regs *regs)
-{
-       unsigned long eip = regs->eip;
-       unsigned short ud2;
-
-       if (eip < PAGE_OFFSET)
-               return;
-       if (__get_user(ud2, (unsigned short __user *)eip))
-               return;
-       if (ud2 != 0x0b0f)
-               return;
-
-       printk(KERN_EMERG "------------[ cut here ]------------\n");
-
-#ifdef CONFIG_DEBUG_BUGVERBOSE
-       do {
-               unsigned short line;
-               char *file;
-               char c;
-
-               if (__get_user(line, (unsigned short __user *)(eip + 2)))
-                       break;
-               if (__get_user(file, (char * __user *)(eip + 4)) ||
-                   (unsigned long)file < PAGE_OFFSET || __get_user(c, file))
-                       file = "<bad filename>";
-
-               printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
-               return;
-       } while (0);
-#endif
-       printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n");
-}
-
-/* This is gone through when something in the kernel
- * has done something bad and is about to be terminated.
-*/
-void die(const char * str, struct pt_regs * regs, long err)
-{
-       static struct {
-               spinlock_t lock;
-               u32 lock_owner;
-               int lock_owner_depth;
-       } die = {
-               .lock =                 SPIN_LOCK_UNLOCKED,
-               .lock_owner =           -1,
-               .lock_owner_depth =     0
-       };
-       static int die_counter;
-       unsigned long flags;
-
-       oops_enter();
-
-       if (die.lock_owner != raw_smp_processor_id()) {
-               console_verbose();
-               spin_lock_irqsave(&die.lock, flags);
-               die.lock_owner = smp_processor_id();
-               die.lock_owner_depth = 0;
-               bust_spinlocks(1);
-       }
-       else
-               local_save_flags(flags);
-
-       if (++die.lock_owner_depth < 3) {
-               int nl = 0;
-               unsigned long esp;
-               unsigned short ss;
-
-               handle_BUG(regs);
-               printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
-#ifdef CONFIG_PREEMPT
-               printk(KERN_EMERG "PREEMPT ");
-               nl = 1;
-#endif
-#ifdef CONFIG_SMP
-               if (!nl)
-                       printk(KERN_EMERG);
-               printk("SMP ");
-               nl = 1;
-#endif
-#ifdef CONFIG_DEBUG_PAGEALLOC
-               if (!nl)
-                       printk(KERN_EMERG);
-               printk("DEBUG_PAGEALLOC");
-               nl = 1;
-#endif
-               if (nl)
-                       printk("\n");
-               if (notify_die(DIE_OOPS, str, regs, err,
-                                       current->thread.trap_no, SIGSEGV) !=
-                               NOTIFY_STOP) {
-                       show_registers(regs);
-                       /* Executive summary in case the oops scrolled away */
-                       esp = (unsigned long) (&regs->esp);
-                       savesegment(ss, ss);
-                       if (user_mode(regs)) {
-                               esp = regs->esp;
-                               ss = regs->xss & 0xffff;
-                       }
-                       printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
-                       print_symbol("%s", regs->eip);
-                       printk(" SS:ESP %04x:%08lx\n", ss, esp);
-               }
-               else
-                       regs = NULL;
-       } else
-               printk(KERN_EMERG "Recursive die() failure, output suppressed\n");
-
-       bust_spinlocks(0);
-       die.lock_owner = -1;
-       spin_unlock_irqrestore(&die.lock, flags);
-
-       if (!regs)
-               return;
-
-       if (kexec_should_crash(current))
-               crash_kexec(regs);
-
-       if (in_interrupt())
-               panic("Fatal exception in interrupt");
-
-       if (panic_on_oops)
-               panic("Fatal exception");
-
-       oops_exit();
-       do_exit(SIGSEGV);
-}
-
-static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err)
-{
-       if (!user_mode_vm(regs))
-               die(str, regs, err);
-}
-
-static void __kprobes do_trap(int trapnr, int signr, char *str, int vm86,
-                             struct pt_regs * regs, long error_code,
-                             siginfo_t *info)
-{
-       struct task_struct *tsk = current;
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = trapnr;
-
-       if (regs->eflags & VM_MASK) {
-               if (vm86)
-                       goto vm86_trap;
-               goto trap_signal;
-       }
-
-       if (!user_mode(regs))
-               goto kernel_trap;
-
-       trap_signal: {
-               if (info)
-                       force_sig_info(signr, info, tsk);
-               else
-                       force_sig(signr, tsk);
-               return;
-       }
-
-       kernel_trap: {
-               if (!fixup_exception(regs))
-                       die(str, regs, error_code);
-               return;
-       }
-
-       vm86_trap: {
-               int ret = handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, trapnr);
-               if (ret) goto trap_signal;
-               return;
-       }
-}
-
-#define DO_ERROR(trapnr, signr, str, name) \
-fastcall void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                               == NOTIFY_STOP) \
-               return; \
-       do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
-}
-
-#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-fastcall void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       siginfo_t info; \
-       info.si_signo = signr; \
-       info.si_errno = 0; \
-       info.si_code = sicode; \
-       info.si_addr = (void __user *)siaddr; \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                               == NOTIFY_STOP) \
-               return; \
-       do_trap(trapnr, signr, str, 0, regs, error_code, &info); \
-}
-
-#define DO_VM86_ERROR(trapnr, signr, str, name) \
-fastcall void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                               == NOTIFY_STOP) \
-               return; \
-       do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
-}
-
-#define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-fastcall void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       siginfo_t info; \
-       info.si_signo = signr; \
-       info.si_errno = 0; \
-       info.si_code = sicode; \
-       info.si_addr = (void __user *)siaddr; \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                               == NOTIFY_STOP) \
-               return; \
-       do_trap(trapnr, signr, str, 1, regs, error_code, &info); \
-}
-
-DO_VM86_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
-#ifndef CONFIG_KPROBES
-DO_VM86_ERROR( 3, SIGTRAP, "int3", int3)
-#endif
-DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow)
-DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds)
-DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip)
-DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
-DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
-DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
-DO_ERROR(12, SIGBUS,  "stack segment", stack_segment)
-DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
-DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0)
-
-fastcall void __kprobes do_general_protection(struct pt_regs * regs,
-                                             long error_code)
-{
-       current->thread.error_code = error_code;
-       current->thread.trap_no = 13;
-
-       if (regs->eflags & VM_MASK)
-               goto gp_in_vm86;
-
-       if (!user_mode(regs))
-               goto gp_in_kernel;
-
-       current->thread.error_code = error_code;
-       current->thread.trap_no = 13;
-       force_sig(SIGSEGV, current);
-       return;
-
-gp_in_vm86:
-       local_irq_enable();
-       handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
-       return;
-
-gp_in_kernel:
-       if (!fixup_exception(regs)) {
-               if (notify_die(DIE_GPF, "general protection fault", regs,
-                               error_code, 13, SIGSEGV) == NOTIFY_STOP)
-                       return;
-               die("general protection fault", regs, error_code);
-       }
-}
-
-static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
-{
-       printk(KERN_EMERG "Uhhuh. NMI received. Dazed and confused, but trying "
-                       "to continue\n");
-       printk(KERN_EMERG "You probably have a hardware problem with your RAM "
-                       "chips\n");
-
-       /* Clear and disable the memory parity error line. */
-       clear_mem_error(reason);
-}
-
-static void io_check_error(unsigned char reason, struct pt_regs * regs)
-{
-       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-
-       /* Re-enable the IOCK line, wait for a few seconds */
-       clear_io_check_error(reason);
-}
-
-static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-{
-#ifdef CONFIG_MCA
-       /* Might actually be able to figure out what the guilty party
-       * is. */
-       if( MCA_bus ) {
-               mca_handle_nmi();
-               return;
-       }
-#endif
-       printk("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
-               reason, smp_processor_id());
-       printk("Dazed and confused, but trying to continue\n");
-       printk("Do you have a strange power saving mode enabled?\n");
-}
-
-static DEFINE_SPINLOCK(nmi_print_lock);
-
-void die_nmi (struct pt_regs *regs, const char *msg)
-{
-       if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) ==
-           NOTIFY_STOP)
-               return;
-
-       spin_lock(&nmi_print_lock);
-       /*
-       * We are in trouble anyway, lets at least try
-       * to get a message out.
-       */
-       bust_spinlocks(1);
-       printk(KERN_EMERG "%s", msg);
-       printk(" on CPU%d, eip %08lx, registers:\n",
-               smp_processor_id(), regs->eip);
-       show_registers(regs);
-       printk(KERN_EMERG "console shuts up ...\n");
-       console_silent();
-       spin_unlock(&nmi_print_lock);
-       bust_spinlocks(0);
-
-       /* If we are in kernel we are probably nested up pretty bad
-        * and might aswell get out now while we still can.
-       */
-       if (!user_mode_vm(regs)) {
-               current->thread.trap_no = 2;
-               crash_kexec(regs);
-       }
-
-       do_exit(SIGSEGV);
-}
-
-static void default_do_nmi(struct pt_regs * regs)
-{
-       unsigned char reason = 0;
-
-       /* Only the BSP gets external NMIs from the system.  */
-       if (!smp_processor_id())
-               reason = get_nmi_reason();
-       if (!(reason & 0xc0)) {
-               if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
-                                                       == NOTIFY_STOP)
-                       return;
-#ifdef CONFIG_X86_LOCAL_APIC
-               /*
-                * Ok, so this is none of the documented NMI sources,
-                * so it must be the NMI watchdog.
-                */
-               if (nmi_watchdog) {
-                       nmi_watchdog_tick(regs);
-                       return;
-               }
-#endif
-               unknown_nmi_error(reason, regs);
-               return;
-       }
-       if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
-               return;
-       if (reason & 0x80)
-               mem_parity_error(reason, regs);
-       if (reason & 0x40)
-               io_check_error(reason, regs);
-       /*
-        * Reassert NMI in case it became active meanwhile
-        * as it's edge-triggered.
-        */
-       reassert_nmi();
-}
-
-static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
-{
-       return 0;
-}
-static nmi_callback_t nmi_callback = dummy_nmi_callback;
-fastcall void do_nmi(struct pt_regs * regs, long error_code)
-{
-       int cpu;
-
-       nmi_enter();
-
-       cpu = smp_processor_id();
-
-       ++nmi_count(cpu);
-
-       if (!rcu_dereference(nmi_callback)(regs, cpu))
-               default_do_nmi(regs);
-
-       nmi_exit();
-}
-
-void set_nmi_callback(nmi_callback_t callback)
-{
-       vmalloc_sync_all();
-       rcu_assign_pointer(nmi_callback, callback);
-}
-EXPORT_SYMBOL_GPL(set_nmi_callback);
-
-void unset_nmi_callback(void)
-{
-       nmi_callback = dummy_nmi_callback;
-}
-EXPORT_SYMBOL_GPL(unset_nmi_callback);
-
-#ifdef CONFIG_KPROBES
-fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
-{
-       if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
-                       == NOTIFY_STOP)
-               return;
-       /* This is an interrupt gate, because kprobes wants interrupts
-       disabled.  Normal trap handlers don't. */
-       restore_interrupts(regs);
-       do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
-}
-#endif
-
-/*
- * Our handling of the processor debug registers is non-trivial.
- * We do not clear them on entry and exit from the kernel. Therefore
- * it is possible to get a watchpoint trap here from inside the kernel.
- * However, the code in ./ptrace.c has ensured that the user can
- * only set watchpoints on userspace addresses. Therefore the in-kernel
- * watchpoint trap can only occur in code which is reading/writing
- * from user space. Such code must not hold kernel locks (since it
- * can equally take a page fault), therefore it is safe to call
- * force_sig_info even though that claims and releases locks.
- * 
- * Code in ./signal.c ensures that the debug control register
- * is restored before we deliver any signal, and therefore that
- * user code runs with the correct debug control register even though
- * we clear it here.
- *
- * Being careful here means that we don't have to be as careful in a
- * lot of more complicated places (task switching can be a bit lazy
- * about restoring all the debug state, and ptrace doesn't have to
- * find every occurrence of the TF bit that could be saved away even
- * by user code)
- */
-fastcall void __kprobes do_debug(struct pt_regs * regs, long error_code)
-{
-       unsigned int condition;
-       struct task_struct *tsk = current;
-
-       get_debugreg(condition, 6);
-
-       if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
-                                       SIGTRAP) == NOTIFY_STOP)
-               return;
-       /* It's safe to allow irq's after DR6 has been saved */
-       if (regs->eflags & X86_EFLAGS_IF)
-               local_irq_enable();
-
-       /* Mask out spurious debug traps due to lazy DR7 setting */
-       if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
-               if (!tsk->thread.debugreg[7])
-                       goto clear_dr7;
-       }
-
-       if (regs->eflags & VM_MASK)
-               goto debug_vm86;
-
-       /* Save debug status register where ptrace can see it */
-       tsk->thread.debugreg[6] = condition;
-
-       /*
-        * Single-stepping through TF: make sure we ignore any events in
-        * kernel space (but re-enable TF when returning to user mode).
-        */
-       if (condition & DR_STEP) {
-               /*
-                * We already checked v86 mode above, so we can
-                * check for kernel mode by just checking the CPL
-                * of CS.
-                */
-               if (!user_mode(regs))
-                       goto clear_TF_reenable;
-       }
-
-       /* Ok, finally something we can handle */
-       send_sigtrap(tsk, regs, error_code);
-
-       /* Disable additional traps. They'll be re-enabled when
-        * the signal is delivered.
-        */
-clear_dr7:
-       set_debugreg(0, 7);
-       return;
-
-debug_vm86:
-       handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
-       return;
-
-clear_TF_reenable:
-       set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
-       regs->eflags &= ~TF_MASK;
-       return;
-}
-
-/*
- * Note that we play around with the 'TS' bit in an attempt to get
- * the correct behaviour even in the presence of the asynchronous
- * IRQ13 behaviour
- */
-void math_error(void __user *eip)
-{
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short cwd, swd;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 16;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = eip;
-       /*
-        * (~cwd & swd) will mask out exceptions that are not set to unmasked
-        * status.  0x3f is the exception bits in these regs, 0x200 is the
-        * C1 reg you need in case of a stack fault, 0x040 is the stack
-        * fault bit.  We should only be taking one exception at a time,
-        * so if this combination doesn't produce any single exception,
-        * then we have a bad program that isn't syncronizing its FPU usage
-        * and it will suffer the consequences since we won't be able to
-        * fully reproduce the context of the exception
-        */
-       cwd = get_fpu_cwd(task);
-       swd = get_fpu_swd(task);
-       switch (swd & ~cwd & 0x3f) {
-               case 0x000: /* No unmasked exception */
-                       return;
-               default:    /* Multiple exceptions */
-                       break;
-               case 0x001: /* Invalid Op */
-                       /*
-                        * swd & 0x240 == 0x040: Stack Underflow
-                        * swd & 0x240 == 0x240: Stack Overflow
-                        * User must clear the SF bit (0x40) if set
-                        */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-fastcall void do_coprocessor_error(struct pt_regs * regs, long error_code)
-{
-       ignore_fpu_irq = 1;
-       math_error((void __user *)regs->eip);
-}
-
-static void simd_math_error(void __user *eip)
-{
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short mxcsr;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 19;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = eip;
-       /*
-        * The SIMD FPU exceptions are handled a little differently, as there
-        * is only a single status/control register.  Thus, to determine which
-        * unmasked exception was caught we must mask the exception mask bits
-        * at 0x1f80, and then use these to mask the exception bits at 0x3f.
-        */
-       mxcsr = get_fpu_mxcsr(task);
-       switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
-               case 0x000:
-               default:
-                       break;
-               case 0x001: /* Invalid Op */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-fastcall void do_simd_coprocessor_error(struct pt_regs * regs,
-                                         long error_code)
-{
-       if (cpu_has_xmm) {
-               /* Handle SIMD FPU exceptions on PIII+ processors. */
-               ignore_fpu_irq = 1;
-               simd_math_error((void __user *)regs->eip);
-       } else {
-               /*
-                * Handle strange cache flush from user space exception
-                * in all other cases.  This is undocumented behaviour.
-                */
-               if (regs->eflags & VM_MASK) {
-                       handle_vm86_fault((struct kernel_vm86_regs *)regs,
-                                         error_code);
-                       return;
-               }
-               current->thread.trap_no = 19;
-               current->thread.error_code = error_code;
-               die_if_kernel("cache flush denied", regs, error_code);
-               force_sig(SIGSEGV, current);
-       }
-}
-
-#ifndef CONFIG_XEN
-fastcall void do_spurious_interrupt_bug(struct pt_regs * regs,
-                                         long error_code)
-{
-#if 0
-       /* No need to warn about this any longer. */
-       printk("Ignoring P6 Local APIC Spurious Interrupt Bug...\n");
-#endif
-}
-
-fastcall void setup_x86_bogus_stack(unsigned char * stk)
-{
-       unsigned long *switch16_ptr, *switch32_ptr;
-       struct pt_regs *regs;
-       unsigned long stack_top, stack_bot;
-       unsigned short iret_frame16_off;
-       int cpu = smp_processor_id();
-       /* reserve the space on 32bit stack for the magic switch16 pointer */
-       memmove(stk, stk + 8, sizeof(struct pt_regs));
-       switch16_ptr = (unsigned long *)(stk + sizeof(struct pt_regs));
-       regs = (struct pt_regs *)stk;
-       /* now the switch32 on 16bit stack */
-       stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
-       stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
-       switch32_ptr = (unsigned long *)(stack_top - 8);
-       iret_frame16_off = CPU_16BIT_STACK_SIZE - 8 - 20;
-       /* copy iret frame on 16bit stack */
-       memcpy((void *)(stack_bot + iret_frame16_off), &regs->eip, 20);
-       /* fill in the switch pointers */
-       switch16_ptr[0] = (regs->esp & 0xffff0000) | iret_frame16_off;
-       switch16_ptr[1] = __ESPFIX_SS;
-       switch32_ptr[0] = (unsigned long)stk + sizeof(struct pt_regs) +
-               8 - CPU_16BIT_STACK_SIZE;
-       switch32_ptr[1] = __KERNEL_DS;
-}
-
-fastcall unsigned char * fixup_x86_bogus_stack(unsigned short sp)
-{
-       unsigned long *switch32_ptr;
-       unsigned char *stack16, *stack32;
-       unsigned long stack_top, stack_bot;
-       int len;
-       int cpu = smp_processor_id();
-       stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
-       stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
-       switch32_ptr = (unsigned long *)(stack_top - 8);
-       /* copy the data from 16bit stack to 32bit stack */
-       len = CPU_16BIT_STACK_SIZE - 8 - sp;
-       stack16 = (unsigned char *)(stack_bot + sp);
-       stack32 = (unsigned char *)
-               (switch32_ptr[0] + CPU_16BIT_STACK_SIZE - 8 - len);
-       memcpy(stack32, stack16, len);
-       return stack32;
-}
-#endif
-
-/*
- *  'math_state_restore()' saves the current math information in the
- * old math state array, and gets the new ones from the current task
- *
- * Careful.. There are problems with IBM-designed IRQ13 behaviour.
- * Don't touch unless you *really* know how it works.
- *
- * Must be called with kernel preemption disabled (in this case,
- * local interrupts are disabled at the call-site in entry.S).
- */
-asmlinkage void math_state_restore(struct pt_regs regs)
-{
-       struct thread_info *thread = current_thread_info();
-       struct task_struct *tsk = thread->task;
-
-       /* NB. 'clts' is done for us by Xen during virtual trap. */
-       if (!tsk_used_math(tsk))
-               init_fpu(tsk);
-       restore_fpu(tsk);
-       thread->status |= TS_USEDFPU;   /* So we fnsave on switch_to() */
-}
-
-#ifndef CONFIG_MATH_EMULATION
-
-asmlinkage void math_emulate(long arg)
-{
-       printk(KERN_EMERG "math-emulation not enabled and no coprocessor found.\n");
-       printk(KERN_EMERG "killing %s.\n",current->comm);
-       force_sig(SIGFPE,current);
-       schedule();
-}
-
-#endif /* CONFIG_MATH_EMULATION */
-
-#ifdef CONFIG_X86_F00F_BUG
-void __init trap_init_f00f_bug(void)
-{
-       __set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
-
-       /*
-        * Update the IDT descriptor and reload the IDT so that
-        * it uses the read-only mapped virtual address.
-        */
-       idt_descr.address = fix_to_virt(FIX_F00F_IDT);
-       load_idt(&idt_descr);
-}
-#endif
-
-
-/*
- * NB. All these are "trap gates" (i.e. events_mask isn't set) except
- * for those that specify <dpl>|4 in the second field.
- */
-static trap_info_t trap_table[] = {
-       {  0, 0, __KERNEL_CS, (unsigned long)divide_error               },
-       {  1, 0|4, __KERNEL_CS, (unsigned long)debug                    },
-       {  3, 3|4, __KERNEL_CS, (unsigned long)int3                     },
-       {  4, 3, __KERNEL_CS, (unsigned long)overflow                   },
-       {  5, 0, __KERNEL_CS, (unsigned long)bounds                     },
-       {  6, 0, __KERNEL_CS, (unsigned long)invalid_op                 },
-       {  7, 0|4, __KERNEL_CS, (unsigned long)device_not_available     },
-       {  9, 0, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun },
-       { 10, 0, __KERNEL_CS, (unsigned long)invalid_TSS                },
-       { 11, 0, __KERNEL_CS, (unsigned long)segment_not_present        },
-       { 12, 0, __KERNEL_CS, (unsigned long)stack_segment              },
-       { 13, 0, __KERNEL_CS, (unsigned long)general_protection         },
-       { 14, 0|4, __KERNEL_CS, (unsigned long)page_fault               },
-       { 15, 0, __KERNEL_CS, (unsigned long)fixup_4gb_segment          },
-       { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error          },
-       { 17, 0, __KERNEL_CS, (unsigned long)alignment_check            },
-#ifdef CONFIG_X86_MCE
-       { 18, 0, __KERNEL_CS, (unsigned long)machine_check              },
-#endif
-       { 19, 0, __KERNEL_CS, (unsigned long)simd_coprocessor_error     },
-       { SYSCALL_VECTOR,  3, __KERNEL_CS, (unsigned long)system_call   },
-       {  0, 0,           0, 0                                         }
-};
-
-void __init trap_init(void)
-{
-       HYPERVISOR_set_trap_table(trap_table);
-
-       if (cpu_has_fxsr) {
-               /*
-                * Verify that the FXSAVE/FXRSTOR data will be 16-byte aligned.
-                * Generates a compile-time "error: zero width for bit-field" if
-                * the alignment is wrong.
-                */
-               struct fxsrAlignAssert {
-                       int _:!(offsetof(struct task_struct,
-                                       thread.i387.fxsave) & 15);
-               };
-
-               printk(KERN_INFO "Enabling fast FPU save and restore... ");
-               set_in_cr4(X86_CR4_OSFXSR);
-               printk("done.\n");
-       }
-       if (cpu_has_xmm) {
-               printk(KERN_INFO "Enabling unmasked SIMD FPU exception "
-                               "support... ");
-               set_in_cr4(X86_CR4_OSXMMEXCPT);
-               printk("done.\n");
-       }
-
-       /*
-        * Should be a barrier for any external CPU state.
-        */
-       cpu_init();
-}
-
-void smp_trap_init(trap_info_t *trap_ctxt)
-{
-       trap_info_t *t = trap_table;
-
-       for (t = trap_table; t->address; t++) {
-               trap_ctxt[t->vector].flags = t->flags;
-               trap_ctxt[t->vector].cs = t->cs;
-               trap_ctxt[t->vector].address = t->address;
-       }
-}
-
-static int __init kstack_setup(char *s)
-{
-       kstack_depth_to_print = simple_strtoul(s, NULL, 0);
-       return 1;
-}
-__setup("kstack=", kstack_setup);
-
-#ifdef CONFIG_STACK_UNWIND
-static int __init call_trace_setup(char *s)
-{
-       if (strcmp(s, "old") == 0)
-               call_trace = -1;
-       else if (strcmp(s, "both") == 0)
-               call_trace = 0;
-       else if (strcmp(s, "newfallback") == 0)
-               call_trace = 1;
-       else if (strcmp(s, "new") == 2)
-               call_trace = 2;
-       return 1;
-}
-__setup("call_trace=", call_trace_setup);
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/vm86.c b/linux-2.6-xen-sparse/arch/i386/kernel/vm86.c
deleted file mode 100644 (file)
index 76ed780..0000000
+++ /dev/null
@@ -1,828 +0,0 @@
-/*
- *  linux/kernel/vm86.c
- *
- *  Copyright (C) 1994  Linus Torvalds
- *
- *  29 dec 2001 - Fixed oopses caused by unchecked access to the vm86
- *                stack - Manfred Spraul <manfred@colorfullife.com>
- *
- *  22 mar 2002 - Manfred detected the stackfaults, but didn't handle
- *                them correctly. Now the emulation will be in a
- *                consistent state after stackfaults - Kasper Dupont
- *                <kasperd@daimi.au.dk>
- *
- *  22 mar 2002 - Added missing clear_IF in set_vflags_* Kasper Dupont
- *                <kasperd@daimi.au.dk>
- *
- *  ?? ??? 2002 - Fixed premature returns from handle_vm86_fault
- *                caused by Kasper Dupont's changes - Stas Sergeev
- *
- *   4 apr 2002 - Fixed CHECK_IF_IN_TRAP broken by Stas' changes.
- *                Kasper Dupont <kasperd@daimi.au.dk>
- *
- *   9 apr 2002 - Changed syntax of macros in handle_vm86_fault.
- *                Kasper Dupont <kasperd@daimi.au.dk>
- *
- *   9 apr 2002 - Changed stack access macros to jump to a label
- *                instead of returning to userspace. This simplifies
- *                do_int, and is needed by handle_vm6_fault. Kasper
- *                Dupont <kasperd@daimi.au.dk>
- *
- */
-
-#include <linux/capability.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/highmem.h>
-#include <linux/ptrace.h>
-#include <linux/audit.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/tlbflush.h>
-#include <asm/irq.h>
-
-/*
- * Known problems:
- *
- * Interrupt handling is not guaranteed:
- * - a real x86 will disable all interrupts for one instruction
- *   after a "mov ss,xx" to make stack handling atomic even without
- *   the 'lss' instruction. We can't guarantee this in v86 mode,
- *   as the next instruction might result in a page fault or similar.
- * - a real x86 will have interrupts disabled for one instruction
- *   past the 'sti' that enables them. We don't bother with all the
- *   details yet.
- *
- * Let's hope these problems do not actually matter for anything.
- */
-
-
-#define KVM86  ((struct kernel_vm86_struct *)regs)
-#define VMPI   KVM86->vm86plus
-
-
-/*
- * 8- and 16-bit register defines..
- */
-#define AL(regs)       (((unsigned char *)&((regs)->eax))[0])
-#define AH(regs)       (((unsigned char *)&((regs)->eax))[1])
-#define IP(regs)       (*(unsigned short *)&((regs)->eip))
-#define SP(regs)       (*(unsigned short *)&((regs)->esp))
-
-/*
- * virtual flags (16 and 32-bit versions)
- */
-#define VFLAGS (*(unsigned short *)&(current->thread.v86flags))
-#define VEFLAGS        (current->thread.v86flags)
-
-#define set_flags(X,new,mask) \
-((X) = ((X) & ~(mask)) | ((new) & (mask)))
-
-#define SAFE_MASK      (0xDD5)
-#define RETURN_MASK    (0xDFF)
-
-#define VM86_REGS_PART2 orig_eax
-#define VM86_REGS_SIZE1 \
-        ( (unsigned)( & (((struct kernel_vm86_regs *)0)->VM86_REGS_PART2) ) )
-#define VM86_REGS_SIZE2 (sizeof(struct kernel_vm86_regs) - VM86_REGS_SIZE1)
-
-struct pt_regs * FASTCALL(save_v86_state(struct kernel_vm86_regs * regs));
-struct pt_regs * fastcall save_v86_state(struct kernel_vm86_regs * regs)
-{
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss;
-#endif
-       struct pt_regs *ret;
-       unsigned long tmp;
-
-       /*
-        * This gets called from entry.S with interrupts disabled, but
-        * from process context. Enable interrupts here, before trying
-        * to access user space.
-        */
-       local_irq_enable();
-
-       if (!current->thread.vm86_info) {
-               printk("no vm86_info: BAD\n");
-               do_exit(SIGSEGV);
-       }
-       set_flags(regs->eflags, VEFLAGS, VIF_MASK | current->thread.v86mask);
-       tmp = copy_to_user(&current->thread.vm86_info->regs,regs, VM86_REGS_SIZE1);
-       tmp += copy_to_user(&current->thread.vm86_info->regs.VM86_REGS_PART2,
-               &regs->VM86_REGS_PART2, VM86_REGS_SIZE2);
-       tmp += put_user(current->thread.screen_bitmap,&current->thread.vm86_info->screen_bitmap);
-       if (tmp) {
-               printk("vm86: could not access userspace vm86_info\n");
-               do_exit(SIGSEGV);
-       }
-
-#ifndef CONFIG_X86_NO_TSS
-       tss = &per_cpu(init_tss, get_cpu());
-#endif
-       current->thread.esp0 = current->thread.saved_esp0;
-       current->thread.sysenter_cs = __KERNEL_CS;
-       load_esp0(tss, &current->thread);
-       current->thread.saved_esp0 = 0;
-#ifndef CONFIG_X86_NO_TSS
-       put_cpu();
-#endif
-
-       loadsegment(fs, current->thread.saved_fs);
-       loadsegment(gs, current->thread.saved_gs);
-       ret = KVM86->regs32;
-       return ret;
-}
-
-static void mark_screen_rdonly(struct mm_struct *mm)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-       spinlock_t *ptl;
-       int i;
-
-       pgd = pgd_offset(mm, 0xA0000);
-       if (pgd_none_or_clear_bad(pgd))
-               goto out;
-       pud = pud_offset(pgd, 0xA0000);
-       if (pud_none_or_clear_bad(pud))
-               goto out;
-       pmd = pmd_offset(pud, 0xA0000);
-       if (pmd_none_or_clear_bad(pmd))
-               goto out;
-       pte = pte_offset_map_lock(mm, pmd, 0xA0000, &ptl);
-       for (i = 0; i < 32; i++) {
-               if (pte_present(*pte))
-                       set_pte(pte, pte_wrprotect(*pte));
-               pte++;
-       }
-       pte_unmap_unlock(pte, ptl);
-out:
-       flush_tlb();
-}
-
-
-
-static int do_vm86_irq_handling(int subfunction, int irqnumber);
-static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk);
-
-asmlinkage int sys_vm86old(struct pt_regs regs)
-{
-       struct vm86_struct __user *v86 = (struct vm86_struct __user *)regs.ebx;
-       struct kernel_vm86_struct info; /* declare this _on top_,
-                                        * this avoids wasting of stack space.
-                                        * This remains on the stack until we
-                                        * return to 32 bit user space.
-                                        */
-       struct task_struct *tsk;
-       int tmp, ret = -EPERM;
-
-       tsk = current;
-       if (tsk->thread.saved_esp0)
-               goto out;
-       tmp  = copy_from_user(&info, v86, VM86_REGS_SIZE1);
-       tmp += copy_from_user(&info.regs.VM86_REGS_PART2, &v86->regs.VM86_REGS_PART2,
-               (long)&info.vm86plus - (long)&info.regs.VM86_REGS_PART2);
-       ret = -EFAULT;
-       if (tmp)
-               goto out;
-       memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus);
-       info.regs32 = &regs;
-       tsk->thread.vm86_info = v86;
-       do_sys_vm86(&info, tsk);
-       ret = 0;        /* we never return here */
-out:
-       return ret;
-}
-
-
-asmlinkage int sys_vm86(struct pt_regs regs)
-{
-       struct kernel_vm86_struct info; /* declare this _on top_,
-                                        * this avoids wasting of stack space.
-                                        * This remains on the stack until we
-                                        * return to 32 bit user space.
-                                        */
-       struct task_struct *tsk;
-       int tmp, ret;
-       struct vm86plus_struct __user *v86;
-
-       tsk = current;
-       switch (regs.ebx) {
-               case VM86_REQUEST_IRQ:
-               case VM86_FREE_IRQ:
-               case VM86_GET_IRQ_BITS:
-               case VM86_GET_AND_RESET_IRQ:
-                       ret = do_vm86_irq_handling(regs.ebx, (int)regs.ecx);
-                       goto out;
-               case VM86_PLUS_INSTALL_CHECK:
-                       /* NOTE: on old vm86 stuff this will return the error
-                          from access_ok(), because the subfunction is
-                          interpreted as (invalid) address to vm86_struct.
-                          So the installation check works.
-                        */
-                       ret = 0;
-                       goto out;
-       }
-
-       /* we come here only for functions VM86_ENTER, VM86_ENTER_NO_BYPASS */
-       ret = -EPERM;
-       if (tsk->thread.saved_esp0)
-               goto out;
-       v86 = (struct vm86plus_struct __user *)regs.ecx;
-       tmp  = copy_from_user(&info, v86, VM86_REGS_SIZE1);
-       tmp += copy_from_user(&info.regs.VM86_REGS_PART2, &v86->regs.VM86_REGS_PART2,
-               (long)&info.regs32 - (long)&info.regs.VM86_REGS_PART2);
-       ret = -EFAULT;
-       if (tmp)
-               goto out;
-       info.regs32 = &regs;
-       info.vm86plus.is_vm86pus = 1;
-       tsk->thread.vm86_info = (struct vm86_struct __user *)v86;
-       do_sys_vm86(&info, tsk);
-       ret = 0;        /* we never return here */
-out:
-       return ret;
-}
-
-
-static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk)
-{
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss;
-#endif
-       long eax;
-/*
- * make sure the vm86() system call doesn't try to do anything silly
- */
-       info->regs.__null_ds = 0;
-       info->regs.__null_es = 0;
-
-/* we are clearing fs,gs later just before "jmp resume_userspace",
- * because starting with Linux 2.1.x they aren't no longer saved/restored
- */
-
-/*
- * The eflags register is also special: we cannot trust that the user
- * has set it up safely, so this makes sure interrupt etc flags are
- * inherited from protected mode.
- */
-       VEFLAGS = info->regs.eflags;
-       info->regs.eflags &= SAFE_MASK;
-       info->regs.eflags |= info->regs32->eflags & ~SAFE_MASK;
-       info->regs.eflags |= VM_MASK;
-
-       switch (info->cpu_type) {
-               case CPU_286:
-                       tsk->thread.v86mask = 0;
-                       break;
-               case CPU_386:
-                       tsk->thread.v86mask = NT_MASK | IOPL_MASK;
-                       break;
-               case CPU_486:
-                       tsk->thread.v86mask = AC_MASK | NT_MASK | IOPL_MASK;
-                       break;
-               default:
-                       tsk->thread.v86mask = ID_MASK | AC_MASK | NT_MASK | IOPL_MASK;
-                       break;
-       }
-
-/*
- * Save old state, set default return value (%eax) to 0
- */
-       info->regs32->eax = 0;
-       tsk->thread.saved_esp0 = tsk->thread.esp0;
-       savesegment(fs, tsk->thread.saved_fs);
-       savesegment(gs, tsk->thread.saved_gs);
-
-#ifndef CONFIG_X86_NO_TSS
-       tss = &per_cpu(init_tss, get_cpu());
-#endif
-       tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
-       if (cpu_has_sep)
-               tsk->thread.sysenter_cs = 0;
-       load_esp0(tss, &tsk->thread);
-#ifndef CONFIG_X86_NO_TSS
-       put_cpu();
-#endif
-
-       tsk->thread.screen_bitmap = info->screen_bitmap;
-       if (info->flags & VM86_SCREEN_BITMAP)
-               mark_screen_rdonly(tsk->mm);
-       __asm__ __volatile__("xorl %eax,%eax; movl %eax,%fs; movl %eax,%gs\n\t");
-       __asm__ __volatile__("movl %%eax, %0\n" :"=r"(eax));
-
-       /*call audit_syscall_exit since we do not exit via the normal paths */
-       if (unlikely(current->audit_context))
-               audit_syscall_exit(AUDITSC_RESULT(eax), eax);
-
-       __asm__ __volatile__(
-               "movl %0,%%esp\n\t"
-               "movl %1,%%ebp\n\t"
-               "jmp resume_userspace"
-               : /* no outputs */
-               :"r" (&info->regs), "r" (task_thread_info(tsk)));
-       /* we never return here */
-}
-
-static inline void return_to_32bit(struct kernel_vm86_regs * regs16, int retval)
-{
-       struct pt_regs * regs32;
-
-       regs32 = save_v86_state(regs16);
-       regs32->eax = retval;
-       __asm__ __volatile__("movl %0,%%esp\n\t"
-               "movl %1,%%ebp\n\t"
-               "jmp resume_userspace"
-               : : "r" (regs32), "r" (current_thread_info()));
-}
-
-static inline void set_IF(struct kernel_vm86_regs * regs)
-{
-       VEFLAGS |= VIF_MASK;
-       if (VEFLAGS & VIP_MASK)
-               return_to_32bit(regs, VM86_STI);
-}
-
-static inline void clear_IF(struct kernel_vm86_regs * regs)
-{
-       VEFLAGS &= ~VIF_MASK;
-}
-
-static inline void clear_TF(struct kernel_vm86_regs * regs)
-{
-       regs->eflags &= ~TF_MASK;
-}
-
-static inline void clear_AC(struct kernel_vm86_regs * regs)
-{
-       regs->eflags &= ~AC_MASK;
-}
-
-/* It is correct to call set_IF(regs) from the set_vflags_*
- * functions. However someone forgot to call clear_IF(regs)
- * in the opposite case.
- * After the command sequence CLI PUSHF STI POPF you should
- * end up with interrups disabled, but you ended up with
- * interrupts enabled.
- *  ( I was testing my own changes, but the only bug I
- *    could find was in a function I had not changed. )
- * [KD]
- */
-
-static inline void set_vflags_long(unsigned long eflags, struct kernel_vm86_regs * regs)
-{
-       set_flags(VEFLAGS, eflags, current->thread.v86mask);
-       set_flags(regs->eflags, eflags, SAFE_MASK);
-       if (eflags & IF_MASK)
-               set_IF(regs);
-       else
-               clear_IF(regs);
-}
-
-static inline void set_vflags_short(unsigned short flags, struct kernel_vm86_regs * regs)
-{
-       set_flags(VFLAGS, flags, current->thread.v86mask);
-       set_flags(regs->eflags, flags, SAFE_MASK);
-       if (flags & IF_MASK)
-               set_IF(regs);
-       else
-               clear_IF(regs);
-}
-
-static inline unsigned long get_vflags(struct kernel_vm86_regs * regs)
-{
-       unsigned long flags = regs->eflags & RETURN_MASK;
-
-       if (VEFLAGS & VIF_MASK)
-               flags |= IF_MASK;
-       flags |= IOPL_MASK;
-       return flags | (VEFLAGS & current->thread.v86mask);
-}
-
-static inline int is_revectored(int nr, struct revectored_struct * bitmap)
-{
-       __asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
-               :"=r" (nr)
-               :"m" (*bitmap),"r" (nr));
-       return nr;
-}
-
-#define val_byte(val, n) (((__u8 *)&val)[n])
-
-#define pushb(base, ptr, val, err_label) \
-       do { \
-               __u8 __val = val; \
-               ptr--; \
-               if (put_user(__val, base + ptr) < 0) \
-                       goto err_label; \
-       } while(0)
-
-#define pushw(base, ptr, val, err_label) \
-       do { \
-               __u16 __val = val; \
-               ptr--; \
-               if (put_user(val_byte(__val, 1), base + ptr) < 0) \
-                       goto err_label; \
-               ptr--; \
-               if (put_user(val_byte(__val, 0), base + ptr) < 0) \
-                       goto err_label; \
-       } while(0)
-
-#define pushl(base, ptr, val, err_label) \
-       do { \
-               __u32 __val = val; \
-               ptr--; \
-               if (put_user(val_byte(__val, 3), base + ptr) < 0) \
-                       goto err_label; \
-               ptr--; \
-               if (put_user(val_byte(__val, 2), base + ptr) < 0) \
-                       goto err_label; \
-               ptr--; \
-               if (put_user(val_byte(__val, 1), base + ptr) < 0) \
-                       goto err_label; \
-               ptr--; \
-               if (put_user(val_byte(__val, 0), base + ptr) < 0) \
-                       goto err_label; \
-       } while(0)
-
-#define popb(base, ptr, err_label) \
-       ({ \
-               __u8 __res; \
-               if (get_user(__res, base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               __res; \
-       })
-
-#define popw(base, ptr, err_label) \
-       ({ \
-               __u16 __res; \
-               if (get_user(val_byte(__res, 0), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               if (get_user(val_byte(__res, 1), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               __res; \
-       })
-
-#define popl(base, ptr, err_label) \
-       ({ \
-               __u32 __res; \
-               if (get_user(val_byte(__res, 0), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               if (get_user(val_byte(__res, 1), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               if (get_user(val_byte(__res, 2), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               if (get_user(val_byte(__res, 3), base + ptr) < 0) \
-                       goto err_label; \
-               ptr++; \
-               __res; \
-       })
-
-/* There are so many possible reasons for this function to return
- * VM86_INTx, so adding another doesn't bother me. We can expect
- * userspace programs to be able to handle it. (Getting a problem
- * in userspace is always better than an Oops anyway.) [KD]
- */
-static void do_int(struct kernel_vm86_regs *regs, int i,
-    unsigned char __user * ssp, unsigned short sp)
-{
-       unsigned long __user *intr_ptr;
-       unsigned long segoffs;
-
-       if (regs->cs == BIOSSEG)
-               goto cannot_handle;
-       if (is_revectored(i, &KVM86->int_revectored))
-               goto cannot_handle;
-       if (i==0x21 && is_revectored(AH(regs),&KVM86->int21_revectored))
-               goto cannot_handle;
-       intr_ptr = (unsigned long __user *) (i << 2);
-       if (get_user(segoffs, intr_ptr))
-               goto cannot_handle;
-       if ((segoffs >> 16) == BIOSSEG)
-               goto cannot_handle;
-       pushw(ssp, sp, get_vflags(regs), cannot_handle);
-       pushw(ssp, sp, regs->cs, cannot_handle);
-       pushw(ssp, sp, IP(regs), cannot_handle);
-       regs->cs = segoffs >> 16;
-       SP(regs) -= 6;
-       IP(regs) = segoffs & 0xffff;
-       clear_TF(regs);
-       clear_IF(regs);
-       clear_AC(regs);
-       return;
-
-cannot_handle:
-       return_to_32bit(regs, VM86_INTx + (i << 8));
-}
-
-int handle_vm86_trap(struct kernel_vm86_regs * regs, long error_code, int trapno)
-{
-       if (VMPI.is_vm86pus) {
-               if ( (trapno==3) || (trapno==1) )
-                       return_to_32bit(regs, VM86_TRAP + (trapno << 8));
-               do_int(regs, trapno, (unsigned char __user *) (regs->ss << 4), SP(regs));
-               return 0;
-       }
-       if (trapno !=1)
-               return 1; /* we let this handle by the calling routine */
-       if (current->ptrace & PT_PTRACED) {
-               unsigned long flags;
-               spin_lock_irqsave(&current->sighand->siglock, flags);
-               sigdelset(&current->blocked, SIGTRAP);
-               recalc_sigpending();
-               spin_unlock_irqrestore(&current->sighand->siglock, flags);
-       }
-       send_sig(SIGTRAP, current, 1);
-       current->thread.trap_no = trapno;
-       current->thread.error_code = error_code;
-       return 0;
-}
-
-void handle_vm86_fault(struct kernel_vm86_regs * regs, long error_code)
-{
-       unsigned char opcode;
-       unsigned char __user *csp;
-       unsigned char __user *ssp;
-       unsigned short ip, sp, orig_flags;
-       int data32, pref_done;
-
-#define CHECK_IF_IN_TRAP \
-       if (VMPI.vm86dbg_active && VMPI.vm86dbg_TFpendig) \
-               newflags |= TF_MASK
-#define VM86_FAULT_RETURN do { \
-       if (VMPI.force_return_for_pic  && (VEFLAGS & (IF_MASK | VIF_MASK))) \
-               return_to_32bit(regs, VM86_PICRETURN); \
-       if (orig_flags & TF_MASK) \
-               handle_vm86_trap(regs, 0, 1); \
-       return; } while (0)
-
-       orig_flags = *(unsigned short *)&regs->eflags;
-
-       csp = (unsigned char __user *) (regs->cs << 4);
-       ssp = (unsigned char __user *) (regs->ss << 4);
-       sp = SP(regs);
-       ip = IP(regs);
-
-       data32 = 0;
-       pref_done = 0;
-       do {
-               switch (opcode = popb(csp, ip, simulate_sigsegv)) {
-                       case 0x66:      /* 32-bit data */     data32=1; break;
-                       case 0x67:      /* 32-bit address */  break;
-                       case 0x2e:      /* CS */              break;
-                       case 0x3e:      /* DS */              break;
-                       case 0x26:      /* ES */              break;
-                       case 0x36:      /* SS */              break;
-                       case 0x65:      /* GS */              break;
-                       case 0x64:      /* FS */              break;
-                       case 0xf2:      /* repnz */       break;
-                       case 0xf3:      /* rep */             break;
-                       default: pref_done = 1;
-               }
-       } while (!pref_done);
-
-       switch (opcode) {
-
-       /* pushf */
-       case 0x9c:
-               if (data32) {
-                       pushl(ssp, sp, get_vflags(regs), simulate_sigsegv);
-                       SP(regs) -= 4;
-               } else {
-                       pushw(ssp, sp, get_vflags(regs), simulate_sigsegv);
-                       SP(regs) -= 2;
-               }
-               IP(regs) = ip;
-               VM86_FAULT_RETURN;
-
-       /* popf */
-       case 0x9d:
-               {
-               unsigned long newflags;
-               if (data32) {
-                       newflags=popl(ssp, sp, simulate_sigsegv);
-                       SP(regs) += 4;
-               } else {
-                       newflags = popw(ssp, sp, simulate_sigsegv);
-                       SP(regs) += 2;
-               }
-               IP(regs) = ip;
-               CHECK_IF_IN_TRAP;
-               if (data32) {
-                       set_vflags_long(newflags, regs);
-               } else {
-                       set_vflags_short(newflags, regs);
-               }
-               VM86_FAULT_RETURN;
-               }
-
-       /* int xx */
-       case 0xcd: {
-               int intno=popb(csp, ip, simulate_sigsegv);
-               IP(regs) = ip;
-               if (VMPI.vm86dbg_active) {
-                       if ( (1 << (intno &7)) & VMPI.vm86dbg_intxxtab[intno >> 3] )
-                               return_to_32bit(regs, VM86_INTx + (intno << 8));
-               }
-               do_int(regs, intno, ssp, sp);
-               return;
-       }
-
-       /* iret */
-       case 0xcf:
-               {
-               unsigned long newip;
-               unsigned long newcs;
-               unsigned long newflags;
-               if (data32) {
-                       newip=popl(ssp, sp, simulate_sigsegv);
-                       newcs=popl(ssp, sp, simulate_sigsegv);
-                       newflags=popl(ssp, sp, simulate_sigsegv);
-                       SP(regs) += 12;
-               } else {
-                       newip = popw(ssp, sp, simulate_sigsegv);
-                       newcs = popw(ssp, sp, simulate_sigsegv);
-                       newflags = popw(ssp, sp, simulate_sigsegv);
-                       SP(regs) += 6;
-               }
-               IP(regs) = newip;
-               regs->cs = newcs;
-               CHECK_IF_IN_TRAP;
-               if (data32) {
-                       set_vflags_long(newflags, regs);
-               } else {
-                       set_vflags_short(newflags, regs);
-               }
-               VM86_FAULT_RETURN;
-               }
-
-       /* cli */
-       case 0xfa:
-               IP(regs) = ip;
-               clear_IF(regs);
-               VM86_FAULT_RETURN;
-
-       /* sti */
-       /*
-        * Damn. This is incorrect: the 'sti' instruction should actually
-        * enable interrupts after the /next/ instruction. Not good.
-        *
-        * Probably needs some horsing around with the TF flag. Aiee..
-        */
-       case 0xfb:
-               IP(regs) = ip;
-               set_IF(regs);
-               VM86_FAULT_RETURN;
-
-       default:
-               return_to_32bit(regs, VM86_UNKNOWN);
-       }
-
-       return;
-
-simulate_sigsegv:
-       /* FIXME: After a long discussion with Stas we finally
-        *        agreed, that this is wrong. Here we should
-        *        really send a SIGSEGV to the user program.
-        *        But how do we create the correct context? We
-        *        are inside a general protection fault handler
-        *        and has just returned from a page fault handler.
-        *        The correct context for the signal handler
-        *        should be a mixture of the two, but how do we
-        *        get the information? [KD]
-        */
-       return_to_32bit(regs, VM86_UNKNOWN);
-}
-
-/* ---------------- vm86 special IRQ passing stuff ----------------- */
-
-#define VM86_IRQNAME           "vm86irq"
-
-static struct vm86_irqs {
-       struct task_struct *tsk;
-       int sig;
-} vm86_irqs[16];
-
-static DEFINE_SPINLOCK(irqbits_lock);
-static int irqbits;
-
-#define ALLOWED_SIGS ( 1 /* 0 = don't send a signal */ \
-       | (1 << SIGUSR1) | (1 << SIGUSR2) | (1 << SIGIO)  | (1 << SIGURG) \
-       | (1 << SIGUNUSED) )
-       
-static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs)
-{
-       int irq_bit;
-       unsigned long flags;
-
-       spin_lock_irqsave(&irqbits_lock, flags);        
-       irq_bit = 1 << intno;
-       if ((irqbits & irq_bit) || ! vm86_irqs[intno].tsk)
-               goto out;
-       irqbits |= irq_bit;
-       if (vm86_irqs[intno].sig)
-               send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
-       /*
-        * IRQ will be re-enabled when user asks for the irq (whether
-        * polling or as a result of the signal)
-        */
-       disable_irq_nosync(intno);
-       spin_unlock_irqrestore(&irqbits_lock, flags);
-       return IRQ_HANDLED;
-
-out:
-       spin_unlock_irqrestore(&irqbits_lock, flags);   
-       return IRQ_NONE;
-}
-
-static inline void free_vm86_irq(int irqnumber)
-{
-       unsigned long flags;
-
-       free_irq(irqnumber, NULL);
-       vm86_irqs[irqnumber].tsk = NULL;
-
-       spin_lock_irqsave(&irqbits_lock, flags);        
-       irqbits &= ~(1 << irqnumber);
-       spin_unlock_irqrestore(&irqbits_lock, flags);   
-}
-
-void release_vm86_irqs(struct task_struct *task)
-{
-       int i;
-       for (i = FIRST_VM86_IRQ ; i <= LAST_VM86_IRQ; i++)
-           if (vm86_irqs[i].tsk == task)
-               free_vm86_irq(i);
-}
-
-static inline int get_and_reset_irq(int irqnumber)
-{
-       int bit;
-       unsigned long flags;
-       int ret = 0;
-       
-       if (invalid_vm86_irq(irqnumber)) return 0;
-       if (vm86_irqs[irqnumber].tsk != current) return 0;
-       spin_lock_irqsave(&irqbits_lock, flags);        
-       bit = irqbits & (1 << irqnumber);
-       irqbits &= ~bit;
-       if (bit) {
-               enable_irq(irqnumber);
-               ret = 1;
-       }
-
-       spin_unlock_irqrestore(&irqbits_lock, flags);   
-       return ret;
-}
-
-
-static int do_vm86_irq_handling(int subfunction, int irqnumber)
-{
-       int ret;
-       switch (subfunction) {
-               case VM86_GET_AND_RESET_IRQ: {
-                       return get_and_reset_irq(irqnumber);
-               }
-               case VM86_GET_IRQ_BITS: {
-                       return irqbits;
-               }
-               case VM86_REQUEST_IRQ: {
-                       int sig = irqnumber >> 8;
-                       int irq = irqnumber & 255;
-                       if (!capable(CAP_SYS_ADMIN)) return -EPERM;
-                       if (!((1 << sig) & ALLOWED_SIGS)) return -EPERM;
-                       if (invalid_vm86_irq(irq)) return -EPERM;
-                       if (vm86_irqs[irq].tsk) return -EPERM;
-                       ret = request_irq(irq, &irq_handler, 0, VM86_IRQNAME, NULL);
-                       if (ret) return ret;
-                       vm86_irqs[irq].sig = sig;
-                       vm86_irqs[irq].tsk = current;
-                       return irq;
-               }
-               case  VM86_FREE_IRQ: {
-                       if (invalid_vm86_irq(irqnumber)) return -EPERM;
-                       if (!vm86_irqs[irqnumber].tsk) return 0;
-                       if (vm86_irqs[irqnumber].tsk != current) return -EPERM;
-                       free_vm86_irq(irqnumber);
-                       return 0;
-               }
-       }
-       return -EINVAL;
-}
-
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S b/linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S
deleted file mode 100644 (file)
index 2153fc7..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ld script to make i386 Linux kernel
- * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
- */
-
-#define LOAD_OFFSET __PAGE_OFFSET
-
-#include <asm-generic/vmlinux.lds.h>
-#include <asm/thread_info.h>
-#include <asm/page.h>
-#include <asm/cache.h>
-
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(phys_startup_32)
-jiffies = jiffies_64;
-
-PHDRS {
-       text PT_LOAD FLAGS(5);  /* R_E */
-       data PT_LOAD FLAGS(7);  /* RWE */
-       note PT_NOTE FLAGS(4);  /* R__ */
-}
-SECTIONS
-{
-  . = __KERNEL_START;
-  phys_startup_32 = startup_32 - LOAD_OFFSET;
-  /* read-only */
-  _text = .;                   /* Text and read-only data */
-  .text : AT(ADDR(.text) - LOAD_OFFSET) {
-       *(.text)
-       SCHED_TEXT
-       LOCK_TEXT
-       KPROBES_TEXT
-       *(.fixup)
-       *(.gnu.warning)
-       } :text = 0x9090
-
-  _etext = .;                  /* End of text section */
-
-  . = ALIGN(16);               /* Exception table */
-  __start___ex_table = .;
-  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
-  __stop___ex_table = .;
-
-  RODATA
-
-  . = ALIGN(4);
-  __tracedata_start = .;
-  .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
-       *(.tracedata)
-  }
-  __tracedata_end = .;
-
-  /* writeable */
-  . = ALIGN(4096);
-  .data : AT(ADDR(.data) - LOAD_OFFSET) {      /* Data */
-       *(.data)
-       CONSTRUCTORS
-       } :data
-
-  . = ALIGN(4096);
-  __nosave_begin = .;
-  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
-  . = ALIGN(4096);
-  __nosave_end = .;
-
-  . = ALIGN(4096);
-  .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
-       *(.data.idt)
-  }
-
-  . = ALIGN(32);
-  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
-       *(.data.cacheline_aligned)
-  }
-
-  /* rarely changed data like cpu maps */
-  . = ALIGN(32);
-  .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) }
-  _edata = .;                  /* End of data section */
-
-#ifdef CONFIG_STACK_UNWIND
-  . = ALIGN(4);
-  .eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) {
-       __start_unwind = .;
-       *(.eh_frame)
-       __end_unwind = .;
-  }
-#endif
-
-  . = ALIGN(THREAD_SIZE);      /* init_task */
-  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
-       *(.data.init_task)
-  }
-
-  /* might get freed after init */
-  . = ALIGN(4096);
-  __smp_alt_begin = .;
-  __smp_alt_instructions = .;
-  .smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) {
-       *(.smp_altinstructions)
-  }
-  __smp_alt_instructions_end = .;
-  . = ALIGN(4);
-  __smp_locks = .;
-  .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
-       *(.smp_locks)
-  }
-  __smp_locks_end = .;
-  .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) {
-       *(.smp_altinstr_replacement)
-  }
-  . = ALIGN(4096);
-  __smp_alt_end = .;
-
-  /* will be freed after init */
-  . = ALIGN(4096);             /* Init code and data */
-  __init_begin = .;
-  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
-       _sinittext = .;
-       *(.init.text)
-       _einittext = .;
-  }
-  .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
-  . = ALIGN(16);
-  __setup_start = .;
-  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) }
-  __setup_end = .;
-  __initcall_start = .;
-  .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
-       *(.initcall1.init) 
-       *(.initcall2.init) 
-       *(.initcall3.init) 
-       *(.initcall4.init) 
-       *(.initcall5.init) 
-       *(.initcall6.init) 
-       *(.initcall7.init)
-  }
-  __initcall_end = .;
-  __con_initcall_start = .;
-  .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
-       *(.con_initcall.init)
-  }
-  __con_initcall_end = .;
-  SECURITY_INIT
-  . = ALIGN(4);
-  __alt_instructions = .;
-  .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
-       *(.altinstructions)
-  }
-  __alt_instructions_end = .; 
-  .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
-       *(.altinstr_replacement)
-  }
-  /* .exit.text is discard at runtime, not link time, to deal with references
-     from .altinstructions and .eh_frame */
-  .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
-  .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
-  . = ALIGN(4096);
-  __initramfs_start = .;
-  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
-  __initramfs_end = .;
-  . = ALIGN(L1_CACHE_BYTES);
-  __per_cpu_start = .;
-  .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
-  __per_cpu_end = .;
-  . = ALIGN(4096);
-  __init_end = .;
-  /* freed after init ends here */
-       
-  __bss_start = .;             /* BSS */
-  .bss.page_aligned : AT(ADDR(.bss.page_aligned) - LOAD_OFFSET) {
-       *(.bss.page_aligned)
-  }
-  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
-       *(.bss)
-  }
-  . = ALIGN(4);
-  __bss_stop = .; 
-
-  _end = . ;
-
-  /* This is where the kernel creates the early boot page tables */
-  . = ALIGN(4096);
-  pg0 = .;
-
-  /* Sections to be discarded */
-  /DISCARD/ : {
-       *(.exitcall.exit)
-       }
-
-  STABS_DEBUG
-
-  DWARF_DEBUG
-
-  NOTES
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/vsyscall-note-xen.S b/linux-2.6-xen-sparse/arch/i386/kernel/vsyscall-note-xen.S
deleted file mode 100644 (file)
index 019d9af..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * This supplies .note.* sections to go into the PT_NOTE inside the vDSO text.
- * Here we can supply some information useful to userland.
- * First we get the vanilla i386 note that supplies the kernel version info.
- */
-
-#include "vsyscall-note.S"
-
-/*
- * Now we add a special note telling glibc's dynamic linker a fake hardware
- * flavor that it will use to choose the search path for libraries in the
- * same way it uses real hardware capabilities like "mmx".
- * We supply "nosegneg" as the fake capability, to indicate that we
- * do not like negative offsets in instructions using segment overrides,
- * since we implement those inefficiently.  This makes it possible to
- * install libraries optimized to avoid those access patterns in someplace
- * like /lib/i686/tls/nosegneg.  Note that an /etc/ld.so.conf.d/file
- * corresponding to the bits here is needed to make ldconfig work right.
- * It should contain:
- *     hwcap 0 nosegneg
- * to match the mapping of bit to name that we give here.
- */
-#define NOTE_KERNELCAP_BEGIN(ncaps, mask) \
-       ASM_ELF_NOTE_BEGIN(".note.kernelcap", "a", "GNU", 2) \
-       .long ncaps, mask
-#define NOTE_KERNELCAP(bit, name) \
-       .byte bit; .asciz name
-#define NOTE_KERNELCAP_END ASM_ELF_NOTE_END
-
-NOTE_KERNELCAP_BEGIN(1, 1)
-NOTE_KERNELCAP(0, "nosegneg")
-NOTE_KERNELCAP_END
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/vsyscall.S b/linux-2.6-xen-sparse/arch/i386/kernel/vsyscall.S
deleted file mode 100644 (file)
index b403890..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <linux/init.h>
-
-__INITDATA
-
-       .globl vsyscall_int80_start, vsyscall_int80_end
-vsyscall_int80_start:
-       .incbin "arch/i386/kernel/vsyscall-int80.so"
-vsyscall_int80_end:
-
-       .globl vsyscall_sysenter_start, vsyscall_sysenter_end
-vsyscall_sysenter_start:
-       .incbin "arch/i386/kernel/vsyscall-sysenter.so"
-vsyscall_sysenter_end:
-
-__FINIT
diff --git a/linux-2.6-xen-sparse/arch/i386/mach-xen/Makefile b/linux-2.6-xen-sparse/arch/i386/mach-xen/Makefile
deleted file mode 100644 (file)
index 012fe34..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-obj-y                          := setup.o
diff --git a/linux-2.6-xen-sparse/arch/i386/mach-xen/setup.c b/linux-2.6-xen-sparse/arch/i386/mach-xen/setup.c
deleted file mode 100644 (file)
index 360d261..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *     Machine specific setup for generic
- */
-
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <asm/acpi.h>
-#include <asm/arch_hooks.h>
-#include <asm/e820.h>
-#include <asm/setup.h>
-#include <asm/fixmap.h>
-
-#include <xen/interface/callback.h>
-#include <xen/interface/memory.h>
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define DEFAULT_SEND_IPI       (1)
-#else
-#define DEFAULT_SEND_IPI       (0)
-#endif
-
-int no_broadcast=DEFAULT_SEND_IPI;
-
-static __init int no_ipi_broadcast(char *str)
-{
-       get_option(&str, &no_broadcast);
-       printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
-                                                                                       "IPI Broadcast");
-       return 1;
-}
-
-__setup("no_ipi_broadcast", no_ipi_broadcast);
-
-static int __init print_ipi_mode(void)
-{
-       printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
-                                                                                       "Shortcut");
-       return 0;
-}
-
-late_initcall(print_ipi_mode);
-
-/**
- * machine_specific_memory_setup - Hook for machine specific memory setup.
- *
- * Description:
- *     This is included late in kernel/setup.c so that it can make
- *     use of all of the static functions.
- **/
-
-char * __init machine_specific_memory_setup(void)
-{
-       int rc;
-       struct xen_memory_map memmap;
-       /*
-        * This is rather large for a stack variable but this early in
-        * the boot process we know we have plenty slack space.
-        */
-       struct e820entry map[E820MAX];
-
-       memmap.nr_entries = E820MAX;
-       set_xen_guest_handle(memmap.buffer, map);
-
-       rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
-       if ( rc == -ENOSYS ) {
-               memmap.nr_entries = 1;
-               map[0].addr = 0ULL;
-               map[0].size = PFN_PHYS((unsigned long long)xen_start_info->nr_pages);
-               /* 8MB slack (to balance backend allocations). */
-               map[0].size += 8ULL << 20;
-               map[0].type = E820_RAM;
-               rc = 0;
-       }
-       BUG_ON(rc);
-
-       sanitize_e820_map(map, (char *)&memmap.nr_entries);
-
-       BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
-
-       return "Xen";
-}
-
-
-extern void hypervisor_callback(void);
-extern void failsafe_callback(void);
-extern void nmi(void);
-
-unsigned long *machine_to_phys_mapping;
-EXPORT_SYMBOL(machine_to_phys_mapping);
-unsigned int machine_to_phys_order;
-EXPORT_SYMBOL(machine_to_phys_order);
-
-void __init machine_specific_arch_setup(void)
-{
-       int ret;
-       struct xen_machphys_mapping mapping;
-       unsigned long machine_to_phys_nr_ents;
-       struct xen_platform_parameters pp;
-       static struct callback_register __initdata event = {
-               .type = CALLBACKTYPE_event,
-               .address = { __KERNEL_CS, (unsigned long)hypervisor_callback },
-       };
-       static struct callback_register __initdata failsafe = {
-               .type = CALLBACKTYPE_failsafe,
-               .address = { __KERNEL_CS, (unsigned long)failsafe_callback },
-       };
-       static struct callback_register __initdata nmi_cb = {
-               .type = CALLBACKTYPE_nmi,
-               .address = { __KERNEL_CS, (unsigned long)nmi },
-       };
-
-       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-       if (ret == 0)
-               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret == -ENOSYS)
-               ret = HYPERVISOR_set_callbacks(
-                       event.address.cs, event.address.eip,
-                       failsafe.address.cs, failsafe.address.eip);
-#endif
-       BUG_ON(ret);
-
-       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret == -ENOSYS) {
-               static struct xennmi_callback __initdata cb = {
-                       .handler_address = (unsigned long)nmi
-               };
-
-               HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
-       }
-#endif
-
-       if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0)
-               set_fixaddr_top(pp.virt_start);
-
-       machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START;
-       machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES;
-       if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
-               machine_to_phys_mapping = (unsigned long *)mapping.v_start;
-               machine_to_phys_nr_ents = mapping.max_mfn + 1;
-       }
-       while ((1UL << machine_to_phys_order) < machine_to_phys_nr_ents )
-               machine_to_phys_order++;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/Makefile b/linux-2.6-xen-sparse/arch/i386/mm/Makefile
deleted file mode 100644 (file)
index 2b33b20..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Makefile for the linux i386-specific parts of the memory manager.
-#
-
-obj-y  := init.o pgtable.o fault.o ioremap.o extable.o pageattr.o mmap.o
-
-obj-$(CONFIG_NUMA) += discontig.o
-obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
-obj-$(CONFIG_HIGHMEM) += highmem.o
-obj-$(CONFIG_BOOT_IOREMAP) += boot_ioremap.o
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-
-obj-y          += hypervisor.o
-
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/fault-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/fault-xen.c
deleted file mode 100644 (file)
index 7863920..0000000
+++ /dev/null
@@ -1,769 +0,0 @@
-/*
- *  linux/arch/i386/mm/fault.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- */
-
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/tty.h>
-#include <linux/vt_kern.h>             /* For unblank_screen() */
-#include <linux/highmem.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/desc.h>
-#include <asm/kdebug.h>
-
-extern void die(const char *,struct pt_regs *,long);
-
-#ifdef CONFIG_KPROBES
-ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
-int register_page_fault_notifier(struct notifier_block *nb)
-{
-       vmalloc_sync_all();
-       return atomic_notifier_chain_register(&notify_page_fault_chain, nb);
-}
-
-int unregister_page_fault_notifier(struct notifier_block *nb)
-{
-       return atomic_notifier_chain_unregister(&notify_page_fault_chain, nb);
-}
-
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
-{
-       struct die_args args = {
-               .regs = regs,
-               .str = str,
-               .err = err,
-               .trapnr = trap,
-               .signr = sig
-       };
-       return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-}
-#else
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
-{
-       return NOTIFY_DONE;
-}
-#endif
-
-
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out 
- */
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-
-       if (yes) {
-               oops_in_progress = 1;
-               return;
-       }
-#ifdef CONFIG_VT
-       unblank_screen();
-#endif
-       oops_in_progress = 0;
-       /*
-        * OK, the message is on the console.  Now we call printk()
-        * without oops_in_progress set so that printk will give klogd
-        * a poke.  Hold onto your hats...
-        */
-       console_loglevel = 15;          /* NMI oopser may have shut the console up */
-       printk(" ");
-       console_loglevel = loglevel_save;
-}
-
-/*
- * Return EIP plus the CS segment base.  The segment limit is also
- * adjusted, clamped to the kernel/user address space (whichever is
- * appropriate), and returned in *eip_limit.
- *
- * The segment is checked, because it might have been changed by another
- * task between the original faulting instruction and here.
- *
- * If CS is no longer a valid code segment, or if EIP is beyond the
- * limit, or if it is a kernel address when CS is not a kernel segment,
- * then the returned value will be greater than *eip_limit.
- * 
- * This is slow, but is very rarely executed.
- */
-static inline unsigned long get_segment_eip(struct pt_regs *regs,
-                                           unsigned long *eip_limit)
-{
-       unsigned long eip = regs->eip;
-       unsigned seg = regs->xcs & 0xffff;
-       u32 seg_ar, seg_limit, base, *desc;
-
-       /* Unlikely, but must come before segment checks. */
-       if (unlikely(regs->eflags & VM_MASK)) {
-               base = seg << 4;
-               *eip_limit = base + 0xffff;
-               return base + (eip & 0xffff);
-       }
-
-       /* The standard kernel/user address space limit. */
-       *eip_limit = (seg & 2) ? USER_DS.seg : KERNEL_DS.seg;
-       
-       /* By far the most common cases. */
-       if (likely(seg == __USER_CS || seg == GET_KERNEL_CS()))
-               return eip;
-
-       /* Check the segment exists, is within the current LDT/GDT size,
-          that kernel/user (ring 0..3) has the appropriate privilege,
-          that it's a code segment, and get the limit. */
-       __asm__ ("larl %3,%0; lsll %3,%1"
-                : "=&r" (seg_ar), "=r" (seg_limit) : "0" (0), "rm" (seg));
-       if ((~seg_ar & 0x9800) || eip > seg_limit) {
-               *eip_limit = 0;
-               return 1;        /* So that returned eip > *eip_limit. */
-       }
-
-       /* Get the GDT/LDT descriptor base. 
-          When you look for races in this code remember that
-          LDT and other horrors are only used in user space. */
-       if (seg & (1<<2)) {
-               /* Must lock the LDT while reading it. */
-               down(&current->mm->context.sem);
-               desc = current->mm->context.ldt;
-               desc = (void *)desc + (seg & ~7);
-       } else {
-               /* Must disable preemption while reading the GDT. */
-               desc = (u32 *)get_cpu_gdt_table(get_cpu());
-               desc = (void *)desc + (seg & ~7);
-       }
-
-       /* Decode the code segment base from the descriptor */
-       base = get_desc_base((unsigned long *)desc);
-
-       if (seg & (1<<2)) { 
-               up(&current->mm->context.sem);
-       } else
-               put_cpu();
-
-       /* Adjust EIP and segment limit, and clamp at the kernel limit.
-          It's legitimate for segments to wrap at 0xffffffff. */
-       seg_limit += base;
-       if (seg_limit < *eip_limit && seg_limit >= base)
-               *eip_limit = seg_limit;
-       return eip + base;
-}
-
-/* 
- * Sometimes AMD Athlon/Opteron CPUs report invalid exceptions on prefetch.
- * Check that here and ignore it.
- */
-static int __is_prefetch(struct pt_regs *regs, unsigned long addr)
-{ 
-       unsigned long limit;
-       unsigned long instr = get_segment_eip (regs, &limit);
-       int scan_more = 1;
-       int prefetch = 0; 
-       int i;
-
-       for (i = 0; scan_more && i < 15; i++) { 
-               unsigned char opcode;
-               unsigned char instr_hi;
-               unsigned char instr_lo;
-
-               if (instr > limit)
-                       break;
-               if (__get_user(opcode, (unsigned char __user *) instr))
-                       break; 
-
-               instr_hi = opcode & 0xf0; 
-               instr_lo = opcode & 0x0f; 
-               instr++;
-
-               switch (instr_hi) { 
-               case 0x20:
-               case 0x30:
-                       /* Values 0x26,0x2E,0x36,0x3E are valid x86 prefixes. */
-                       scan_more = ((instr_lo & 7) == 0x6);
-                       break;
-                       
-               case 0x60:
-                       /* 0x64 thru 0x67 are valid prefixes in all modes. */
-                       scan_more = (instr_lo & 0xC) == 0x4;
-                       break;          
-               case 0xF0:
-                       /* 0xF0, 0xF2, and 0xF3 are valid prefixes */
-                       scan_more = !instr_lo || (instr_lo>>1) == 1;
-                       break;                  
-               case 0x00:
-                       /* Prefetch instruction is 0x0F0D or 0x0F18 */
-                       scan_more = 0;
-                       if (instr > limit)
-                               break;
-                       if (__get_user(opcode, (unsigned char __user *) instr))
-                               break;
-                       prefetch = (instr_lo == 0xF) &&
-                               (opcode == 0x0D || opcode == 0x18);
-                       break;                  
-               default:
-                       scan_more = 0;
-                       break;
-               } 
-       }
-       return prefetch;
-}
-
-static inline int is_prefetch(struct pt_regs *regs, unsigned long addr,
-                             unsigned long error_code)
-{
-       if (unlikely(boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-                    boot_cpu_data.x86 >= 6)) {
-               /* Catch an obscure case of prefetch inside an NX page. */
-               if (nx_enabled && (error_code & 16))
-                       return 0;
-               return __is_prefetch(regs, addr);
-       }
-       return 0;
-} 
-
-static noinline void force_sig_info_fault(int si_signo, int si_code,
-       unsigned long address, struct task_struct *tsk)
-{
-       siginfo_t info;
-
-       info.si_signo = si_signo;
-       info.si_errno = 0;
-       info.si_code = si_code;
-       info.si_addr = (void __user *)address;
-       force_sig_info(si_signo, &info, tsk);
-}
-
-fastcall void do_invalid_op(struct pt_regs *, unsigned long);
-
-#ifdef CONFIG_X86_PAE
-static void dump_fault_path(unsigned long address)
-{
-       unsigned long *p, page;
-       unsigned long mfn; 
-
-       page = read_cr3();
-       p  = (unsigned long *)__va(page);
-       p += (address >> 30) * 2;
-       printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]);
-       if (p[0] & 1) {
-               mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
-               page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
-               p  = (unsigned long *)__va(page);
-               address &= 0x3fffffff;
-               p += (address >> 21) * 2;
-               printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", 
-                      page, p[1], p[0]);
-               mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
-#ifdef CONFIG_HIGHPTE
-               if (mfn_to_pfn(mfn) >= highstart_pfn)
-                       return;
-#endif
-               if (p[0] & 1) {
-                       page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
-                       p  = (unsigned long *) __va(page);
-                       address &= 0x001fffff;
-                       p += (address >> 12) * 2;
-                       printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n",
-                              page, p[1], p[0]);
-               }
-       }
-}
-#else
-static void dump_fault_path(unsigned long address)
-{
-       unsigned long page;
-
-       page = read_cr3();
-       page = ((unsigned long *) __va(page))[address >> 22];
-       if (oops_may_print())
-               printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
-                      machine_to_phys(page));
-       /*
-        * We must not directly access the pte in the highpte
-        * case if the page table is located in highmem.
-        * And lets rather not kmap-atomic the pte, just in case
-        * it's allocated already.
-        */
-#ifdef CONFIG_HIGHPTE
-       if ((page >> PAGE_SHIFT) >= highstart_pfn)
-               return;
-#endif
-       if ((page & 1) && oops_may_print()) {
-               page &= PAGE_MASK;
-               address &= 0x003ff000;
-               page = machine_to_phys(page);
-               page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-               printk(KERN_ALERT "*pte = ma %08lx pa %08lx\n", page,
-                      machine_to_phys(page));
-       }
-}
-#endif
-
-static int spurious_fault(struct pt_regs *regs,
-                         unsigned long address,
-                         unsigned long error_code)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       /* Reserved-bit violation or user access to kernel space? */
-       if (error_code & 0x0c)
-               return 0;
-
-       pgd = init_mm.pgd + pgd_index(address);
-       if (!pgd_present(*pgd))
-               return 0;
-
-       pud = pud_offset(pgd, address);
-       if (!pud_present(*pud))
-               return 0;
-
-       pmd = pmd_offset(pud, address);
-       if (!pmd_present(*pmd))
-               return 0;
-
-       pte = pte_offset_kernel(pmd, address);
-       if (!pte_present(*pte))
-               return 0;
-       if ((error_code & 0x02) && !pte_write(*pte))
-               return 0;
-#ifdef CONFIG_X86_PAE
-       if ((error_code & 0x10) && (pte_val(*pte) & _PAGE_NX))
-               return 0;
-#endif
-
-       return 1;
-}
-
-static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
-{
-       unsigned index = pgd_index(address);
-       pgd_t *pgd_k;
-       pud_t *pud, *pud_k;
-       pmd_t *pmd, *pmd_k;
-
-       pgd += index;
-       pgd_k = init_mm.pgd + index;
-
-       if (!pgd_present(*pgd_k))
-               return NULL;
-
-       /*
-        * set_pgd(pgd, *pgd_k); here would be useless on PAE
-        * and redundant with the set_pmd() on non-PAE. As would
-        * set_pud.
-        */
-
-       pud = pud_offset(pgd, address);
-       pud_k = pud_offset(pgd_k, address);
-       if (!pud_present(*pud_k))
-               return NULL;
-
-       pmd = pmd_offset(pud, address);
-       pmd_k = pmd_offset(pud_k, address);
-       if (!pmd_present(*pmd_k))
-               return NULL;
-       if (!pmd_present(*pmd))
-#ifndef CONFIG_XEN
-               set_pmd(pmd, *pmd_k);
-#else
-               /*
-                * When running on Xen we must launder *pmd_k through
-                * pmd_val() to ensure that _PAGE_PRESENT is correctly set.
-                */
-               set_pmd(pmd, __pmd(pmd_val(*pmd_k)));
-#endif
-       else
-               BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
-       return pmd_k;
-}
-
-/*
- * Handle a fault on the vmalloc or module mapping area
- *
- * This assumes no large pages in there.
- */
-static inline int vmalloc_fault(unsigned long address)
-{
-       unsigned long pgd_paddr;
-       pmd_t *pmd_k;
-       pte_t *pte_k;
-       /*
-        * Synchronize this task's top level page-table
-        * with the 'reference' page table.
-        *
-        * Do _not_ use "current" here. We might be inside
-        * an interrupt in the middle of a task switch..
-        */
-       pgd_paddr = read_cr3();
-       pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
-       if (!pmd_k)
-               return -1;
-       pte_k = pte_offset_kernel(pmd_k, address);
-       if (!pte_present(*pte_k))
-               return -1;
-       return 0;
-}
-
-/*
- * This routine handles page faults.  It determines the address,
- * and the problem, and then passes it off to one of the appropriate
- * routines.
- *
- * error_code:
- *     bit 0 == 0 means no page found, 1 means protection fault
- *     bit 1 == 0 means read, 1 means write
- *     bit 2 == 0 means kernel, 1 means user-mode
- *     bit 3 == 1 means use of reserved bit detected
- *     bit 4 == 1 means fault was an instruction fetch
- */
-fastcall void __kprobes do_page_fault(struct pt_regs *regs,
-                                     unsigned long error_code)
-{
-       struct task_struct *tsk;
-       struct mm_struct *mm;
-       struct vm_area_struct * vma;
-       unsigned long address;
-       int write, si_code;
-
-       /* get the address */
-        address = read_cr2();
-
-       /* Set the "privileged fault" bit to something sane. */
-       error_code &= ~4;
-       error_code |= (regs->xcs & 2) << 1;
-       if (regs->eflags & X86_EFLAGS_VM)
-               error_code |= 4;
-
-       tsk = current;
-
-       si_code = SEGV_MAPERR;
-
-       /*
-        * We fault-in kernel-space virtual memory on-demand. The
-        * 'reference' page table is init_mm.pgd.
-        *
-        * NOTE! We MUST NOT take any locks for this case. We may
-        * be in an interrupt or a critical region, and should
-        * only copy the information from the master page table,
-        * nothing more.
-        *
-        * This verifies that the fault happens in kernel space
-        * (error_code & 4) == 0, and that the fault was not a
-        * protection error (error_code & 9) == 0.
-        */
-       if (unlikely(address >= TASK_SIZE)) {
-#ifdef CONFIG_XEN
-               /* Faults in hypervisor area can never be patched up. */
-               if (address >= hypervisor_virt_start)
-                       goto bad_area_nosemaphore;
-#endif
-               if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0)
-                       return;
-               /* Can take a spurious fault if mapping changes R/O -> R/W. */
-               if (spurious_fault(regs, address, error_code))
-                       return;
-               if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                               SIGSEGV) == NOTIFY_STOP)
-                       return;
-               /* 
-                * Don't take the mm semaphore here. If we fixup a prefetch
-                * fault we could otherwise deadlock.
-                */
-               goto bad_area_nosemaphore;
-       }
-
-       if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                       SIGSEGV) == NOTIFY_STOP)
-               return;
-
-       /* It's safe to allow irq's after cr2 has been saved and the vmalloc
-          fault has been handled. */
-       if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
-               local_irq_enable();
-
-       mm = tsk->mm;
-
-       /*
-        * If we're in an interrupt, have no user context or are running in an
-        * atomic region then we must not take the fault..
-        */
-       if (in_atomic() || !mm)
-               goto bad_area_nosemaphore;
-
-       /* When running in the kernel we expect faults to occur only to
-        * addresses in user space.  All other faults represent errors in the
-        * kernel and should generate an OOPS.  Unfortunatly, in the case of an
-        * erroneous fault occurring in a code path which already holds mmap_sem
-        * we will deadlock attempting to validate the fault against the
-        * address space.  Luckily the kernel only validly references user
-        * space from well defined areas of code, which are listed in the
-        * exceptions table.
-        *
-        * As the vast majority of faults will be valid we will only perform
-        * the source reference check when there is a possibilty of a deadlock.
-        * Attempt to lock the address space, if we cannot we then validate the
-        * source.  If this is invalid we can skip the address space check,
-        * thus avoiding the deadlock.
-        */
-       if (!down_read_trylock(&mm->mmap_sem)) {
-               if ((error_code & 4) == 0 &&
-                   !search_exception_tables(regs->eip))
-                       goto bad_area_nosemaphore;
-               down_read(&mm->mmap_sem);
-       }
-
-       vma = find_vma(mm, address);
-       if (!vma)
-               goto bad_area;
-       if (vma->vm_start <= address)
-               goto good_area;
-       if (!(vma->vm_flags & VM_GROWSDOWN))
-               goto bad_area;
-       if (error_code & 4) {
-               /*
-                * Accessing the stack below %esp is always a bug.
-                * The large cushion allows instructions like enter
-                * and pusha to work.  ("enter $65535,$31" pushes
-                * 32 pointers and then decrements %esp by 65535.)
-                */
-               if (address + 65536 + 32 * sizeof(unsigned long) < regs->esp)
-                       goto bad_area;
-       }
-       if (expand_stack(vma, address))
-               goto bad_area;
-/*
- * Ok, we have a good vm_area for this memory access, so
- * we can handle it..
- */
-good_area:
-       si_code = SEGV_ACCERR;
-       write = 0;
-       switch (error_code & 3) {
-               default:        /* 3: write, present */
-#ifdef TEST_VERIFY_AREA
-                       if (regs->cs == GET_KERNEL_CS())
-                               printk("WP fault at %08lx\n", regs->eip);
-#endif
-                       /* fall through */
-               case 2:         /* write, not present */
-                       if (!(vma->vm_flags & VM_WRITE))
-                               goto bad_area;
-                       write++;
-                       break;
-               case 1:         /* read, present */
-                       goto bad_area;
-               case 0:         /* read, not present */
-                       if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-                               goto bad_area;
-       }
-
- survive:
-       /*
-        * If for any reason at all we couldn't handle the fault,
-        * make sure we exit gracefully rather than endlessly redo
-        * the fault.
-        */
-       switch (handle_mm_fault(mm, vma, address, write)) {
-               case VM_FAULT_MINOR:
-                       tsk->min_flt++;
-                       break;
-               case VM_FAULT_MAJOR:
-                       tsk->maj_flt++;
-                       break;
-               case VM_FAULT_SIGBUS:
-                       goto do_sigbus;
-               case VM_FAULT_OOM:
-                       goto out_of_memory;
-               default:
-                       BUG();
-       }
-
-       /*
-        * Did it hit the DOS screen memory VA from vm86 mode?
-        */
-       if (regs->eflags & VM_MASK) {
-               unsigned long bit = (address - 0xA0000) >> PAGE_SHIFT;
-               if (bit < 32)
-                       tsk->thread.screen_bitmap |= 1 << bit;
-       }
-       up_read(&mm->mmap_sem);
-       return;
-
-/*
- * Something tried to access memory that isn't in our memory map..
- * Fix it, but check if it's kernel or user first..
- */
-bad_area:
-       up_read(&mm->mmap_sem);
-
-bad_area_nosemaphore:
-       /* User mode accesses just cause a SIGSEGV */
-       if (error_code & 4) {
-               /* 
-                * Valid to do another page fault here because this one came 
-                * from user space.
-                */
-               if (is_prefetch(regs, address, error_code))
-                       return;
-
-               tsk->thread.cr2 = address;
-               /* Kernel addresses are always protection faults */
-               tsk->thread.error_code = error_code | (address >= TASK_SIZE);
-               tsk->thread.trap_no = 14;
-               force_sig_info_fault(SIGSEGV, si_code, address, tsk);
-               return;
-       }
-
-#ifdef CONFIG_X86_F00F_BUG
-       /*
-        * Pentium F0 0F C7 C8 bug workaround.
-        */
-       if (boot_cpu_data.f00f_bug) {
-               unsigned long nr;
-               
-               nr = (address - idt_descr.address) >> 3;
-
-               if (nr == 6) {
-                       do_invalid_op(regs, 0);
-                       return;
-               }
-       }
-#endif
-
-no_context:
-       /* Are we prepared to handle this kernel fault?  */
-       if (fixup_exception(regs))
-               return;
-
-       /* 
-        * Valid to do another page fault here, because if this fault
-        * had been triggered by is_prefetch fixup_exception would have 
-        * handled it.
-        */
-       if (is_prefetch(regs, address, error_code))
-               return;
-
-/*
- * Oops. The kernel tried to access some bad page. We'll have to
- * terminate things with extreme prejudice.
- */
-
-       bust_spinlocks(1);
-
-       if (oops_may_print()) {
-       #ifdef CONFIG_X86_PAE
-               if (error_code & 16) {
-                       pte_t *pte = lookup_address(address);
-
-                       if (pte && pte_present(*pte) && !pte_exec_kernel(*pte))
-                               printk(KERN_CRIT "kernel tried to execute "
-                                       "NX-protected page - exploit attempt? "
-                                       "(uid: %d)\n", current->uid);
-               }
-       #endif
-               if (address < PAGE_SIZE)
-                       printk(KERN_ALERT "BUG: unable to handle kernel NULL "
-                                       "pointer dereference");
-               else
-                       printk(KERN_ALERT "BUG: unable to handle kernel paging"
-                                       " request");
-               printk(" at virtual address %08lx\n",address);
-               printk(KERN_ALERT " printing eip:\n");
-               printk("%08lx\n", regs->eip);
-       }
-       dump_fault_path(address);
-       tsk->thread.cr2 = address;
-       tsk->thread.trap_no = 14;
-       tsk->thread.error_code = error_code;
-       die("Oops", regs, error_code);
-       bust_spinlocks(0);
-       do_exit(SIGKILL);
-
-/*
- * We ran out of memory, or some other thing happened to us that made
- * us unable to handle the page fault gracefully.
- */
-out_of_memory:
-       up_read(&mm->mmap_sem);
-       if (tsk->pid == 1) {
-               yield();
-               down_read(&mm->mmap_sem);
-               goto survive;
-       }
-       printk("VM: killing process %s\n", tsk->comm);
-       if (error_code & 4)
-               do_exit(SIGKILL);
-       goto no_context;
-
-do_sigbus:
-       up_read(&mm->mmap_sem);
-
-       /* Kernel mode? Handle exceptions or die */
-       if (!(error_code & 4))
-               goto no_context;
-
-       /* User space => ok to do another page fault */
-       if (is_prefetch(regs, address, error_code))
-               return;
-
-       tsk->thread.cr2 = address;
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = 14;
-       force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk);
-}
-
-#if !HAVE_SHARED_KERNEL_PMD
-void vmalloc_sync_all(void)
-{
-       /*
-        * Note that races in the updates of insync and start aren't
-        * problematic: insync can only get set bits added, and updates to
-        * start are only improving performance (without affecting correctness
-        * if undone).
-        */
-       static DECLARE_BITMAP(insync, PTRS_PER_PGD);
-       static unsigned long start = TASK_SIZE;
-       unsigned long address;
-
-       BUILD_BUG_ON(TASK_SIZE & ~PGDIR_MASK);
-       for (address = start; address >= TASK_SIZE; address += PGDIR_SIZE) {
-               if (!test_bit(pgd_index(address), insync)) {
-                       unsigned long flags;
-                       struct page *page;
-
-                       spin_lock_irqsave(&pgd_lock, flags);
-                       for (page = pgd_list; page; page =
-                                       (struct page *)page->index)
-                               if (!vmalloc_sync_one(page_address(page),
-                                                               address)) {
-                                       BUG_ON(page != pgd_list);
-                                       break;
-                               }
-                       spin_unlock_irqrestore(&pgd_lock, flags);
-                       if (!page)
-                               set_bit(pgd_index(address), insync);
-               }
-               if (address == start && test_bit(pgd_index(address), insync))
-                       start = address + PGDIR_SIZE;
-       }
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c
deleted file mode 100644 (file)
index 20838cc..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#include <linux/highmem.h>
-#include <linux/module.h>
-
-void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-
-void kunmap(struct page *page)
-{
-       if (in_interrupt())
-               BUG();
-       if (!PageHighMem(page))
-               return;
-       kunmap_high(page);
-}
-
-/*
- * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because
- * no global lock is needed and because the kmap code must perform a global TLB
- * invalidation when the kmap pool wraps.
- *
- * However when holding an atomic kmap is is not legal to sleep, so atomic
- * kmaps are appropriate for short, tight code paths only.
- */
-static void *__kmap_atomic(struct page *page, enum km_type type, pgprot_t prot)
-{
-       enum fixed_addresses idx;
-       unsigned long vaddr;
-
-       /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
-       inc_preempt_count();
-       if (!PageHighMem(page))
-               return page_address(page);
-
-       idx = type + KM_TYPE_NR*smp_processor_id();
-       vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-#ifdef CONFIG_DEBUG_HIGHMEM
-       if (!pte_none(*(kmap_pte-idx)))
-               BUG();
-#endif
-       set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
-
-       return (void*) vaddr;
-}
-
-void *kmap_atomic(struct page *page, enum km_type type)
-{
-       return __kmap_atomic(page, type, kmap_prot);
-}
-
-/* Same as kmap_atomic but with PAGE_KERNEL_RO page protection. */
-void *kmap_atomic_pte(struct page *page, enum km_type type)
-{
-       return __kmap_atomic(page, type,
-                            test_bit(PG_pinned, &page->flags)
-                            ? PAGE_KERNEL_RO : kmap_prot);
-}
-
-void kunmap_atomic(void *kvaddr, enum km_type type)
-{
-#if defined(CONFIG_DEBUG_HIGHMEM) || defined(CONFIG_XEN)
-       unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-       enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
-
-       if (vaddr < FIXADDR_START) { // FIXME
-               dec_preempt_count();
-               preempt_check_resched();
-               return;
-       }
-#endif
-
-#if defined(CONFIG_DEBUG_HIGHMEM)
-       if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx))
-               BUG();
-
-       /*
-        * force other mappings to Oops if they'll try to access
-        * this pte without first remap it
-        */
-       pte_clear(&init_mm, vaddr, kmap_pte-idx);
-       __flush_tlb_one(vaddr);
-#elif defined(CONFIG_XEN)
-       /*
-        * We must ensure there are no dangling pagetable references when
-        * returning memory to Xen (decrease_reservation).
-        * XXX TODO: We could make this faster by only zapping when
-        * kmap_flush_unused is called but that is trickier and more invasive.
-        */
-       pte_clear(&init_mm, vaddr, kmap_pte-idx);
-#endif
-
-       dec_preempt_count();
-       preempt_check_resched();
-}
-
-/* This is the same as kmap_atomic() but can map memory that doesn't
- * have a struct page associated with it.
- */
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
-{
-       enum fixed_addresses idx;
-       unsigned long vaddr;
-
-       inc_preempt_count();
-
-       idx = type + KM_TYPE_NR*smp_processor_id();
-       vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-       set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
-       __flush_tlb_one(vaddr);
-
-       return (void*) vaddr;
-}
-
-struct page *kmap_atomic_to_page(void *ptr)
-{
-       unsigned long idx, vaddr = (unsigned long)ptr;
-       pte_t *pte;
-
-       if (vaddr < FIXADDR_START)
-               return virt_to_page(ptr);
-
-       idx = virt_to_fix(vaddr);
-       pte = kmap_pte - (idx - FIX_KMAP_BEGIN);
-       return pte_page(*pte);
-}
-
-EXPORT_SYMBOL(kmap);
-EXPORT_SYMBOL(kunmap);
-EXPORT_SYMBOL(kmap_atomic);
-EXPORT_SYMBOL(kmap_atomic_pte);
-EXPORT_SYMBOL(kunmap_atomic);
-EXPORT_SYMBOL(kmap_atomic_to_page);
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c
deleted file mode 100644 (file)
index 3222b9d..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/******************************************************************************
- * mm/hypervisor.c
- * 
- * Update page tables via the hypervisor.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/vmalloc.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/hypervisor.h>
-#include <xen/balloon.h>
-#include <xen/features.h>
-#include <xen/interface/memory.h>
-#include <linux/module.h>
-#include <linux/percpu.h>
-#include <asm/tlbflush.h>
-
-void xen_l1_entry_update(pte_t *ptr, pte_t val)
-{
-       mmu_update_t u;
-       u.ptr = virt_to_machine(ptr);
-       u.val = __pte_val(val);
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_l2_entry_update(pmd_t *ptr, pmd_t val)
-{
-       mmu_update_t u;
-       u.ptr = virt_to_machine(ptr);
-       u.val = __pmd_val(val);
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-
-#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
-void xen_l3_entry_update(pud_t *ptr, pud_t val)
-{
-       mmu_update_t u;
-       u.ptr = virt_to_machine(ptr);
-       u.val = __pud_val(val);
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-#endif
-
-#ifdef CONFIG_X86_64
-void xen_l4_entry_update(pgd_t *ptr, pgd_t val)
-{
-       mmu_update_t u;
-       u.ptr = virt_to_machine(ptr);
-       u.val = __pgd_val(val);
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-#endif /* CONFIG_X86_64 */
-
-void xen_pt_switch(unsigned long ptr)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_NEW_BASEPTR;
-       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_new_user_pt(unsigned long ptr)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_NEW_USER_BASEPTR;
-       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_tlb_flush(void)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_TLB_FLUSH_LOCAL;
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-EXPORT_SYMBOL(xen_tlb_flush);
-
-void xen_invlpg(unsigned long ptr)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_INVLPG_LOCAL;
-       op.arg1.linear_addr = ptr & PAGE_MASK;
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-EXPORT_SYMBOL(xen_invlpg);
-
-#ifdef CONFIG_SMP
-
-void xen_tlb_flush_all(void)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_TLB_FLUSH_ALL;
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_tlb_flush_mask(cpumask_t *mask)
-{
-       struct mmuext_op op;
-       if ( cpus_empty(*mask) )
-               return;
-       op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-       set_xen_guest_handle(op.arg2.vcpumask, mask->bits);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_invlpg_all(unsigned long ptr)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_INVLPG_ALL;
-       op.arg1.linear_addr = ptr & PAGE_MASK;
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr)
-{
-       struct mmuext_op op;
-       if ( cpus_empty(*mask) )
-               return;
-       op.cmd = MMUEXT_INVLPG_MULTI;
-       op.arg1.linear_addr = ptr & PAGE_MASK;
-       set_xen_guest_handle(op.arg2.vcpumask, mask->bits);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-#endif /* CONFIG_SMP */
-
-void xen_pgd_pin(unsigned long ptr)
-{
-       struct mmuext_op op;
-#ifdef CONFIG_X86_64
-       op.cmd = MMUEXT_PIN_L4_TABLE;
-#elif defined(CONFIG_X86_PAE)
-       op.cmd = MMUEXT_PIN_L3_TABLE;
-#else
-       op.cmd = MMUEXT_PIN_L2_TABLE;
-#endif
-       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_pgd_unpin(unsigned long ptr)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_UNPIN_TABLE;
-       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_set_ldt(unsigned long ptr, unsigned long len)
-{
-       struct mmuext_op op;
-       op.cmd = MMUEXT_SET_LDT;
-       op.arg1.linear_addr = ptr;
-       op.arg2.nr_ents     = len;
-       BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-/*
- * Bitmap is indexed by page number. If bit is set, the page is part of a
- * xen_create_contiguous_region() area of memory.
- */
-unsigned long *contiguous_bitmap;
-
-static void contiguous_bitmap_set(
-       unsigned long first_page, unsigned long nr_pages)
-{
-       unsigned long start_off, end_off, curr_idx, end_idx;
-
-       curr_idx  = first_page / BITS_PER_LONG;
-       start_off = first_page & (BITS_PER_LONG-1);
-       end_idx   = (first_page + nr_pages) / BITS_PER_LONG;
-       end_off   = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
-       if (curr_idx == end_idx) {
-               contiguous_bitmap[curr_idx] |=
-                       ((1UL<<end_off)-1) & -(1UL<<start_off);
-       } else {
-               contiguous_bitmap[curr_idx] |= -(1UL<<start_off);
-               while ( ++curr_idx < end_idx )
-                       contiguous_bitmap[curr_idx] = ~0UL;
-               contiguous_bitmap[curr_idx] |= (1UL<<end_off)-1;
-       }
-}
-
-static void contiguous_bitmap_clear(
-       unsigned long first_page, unsigned long nr_pages)
-{
-       unsigned long start_off, end_off, curr_idx, end_idx;
-
-       curr_idx  = first_page / BITS_PER_LONG;
-       start_off = first_page & (BITS_PER_LONG-1);
-       end_idx   = (first_page + nr_pages) / BITS_PER_LONG;
-       end_off   = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
-       if (curr_idx == end_idx) {
-               contiguous_bitmap[curr_idx] &=
-                       -(1UL<<end_off) | ((1UL<<start_off)-1);
-       } else {
-               contiguous_bitmap[curr_idx] &= (1UL<<start_off)-1;
-               while ( ++curr_idx != end_idx )
-                       contiguous_bitmap[curr_idx] = 0;
-               contiguous_bitmap[curr_idx] &= -(1UL<<end_off);
-       }
-}
-
-/* Protected by balloon_lock. */
-#define MAX_CONTIG_ORDER 9 /* 2MB */
-static unsigned long discontig_frames[1<<MAX_CONTIG_ORDER];
-static multicall_entry_t cr_mcl[1<<MAX_CONTIG_ORDER];
-
-/* Ensure multi-page extents are contiguous in machine memory. */
-int xen_create_contiguous_region(
-       unsigned long vstart, unsigned int order, unsigned int address_bits)
-{
-       unsigned long *in_frames = discontig_frames, out_frame;
-       unsigned long  frame, i, flags;
-       long           rc;
-       int            success;
-       struct xen_memory_exchange exchange = {
-               .in = {
-                       .nr_extents   = 1UL << order,
-                       .extent_order = 0,
-                       .domid        = DOMID_SELF
-               },
-               .out = {
-                       .nr_extents   = 1,
-                       .extent_order = order,
-                       .address_bits = address_bits,
-                       .domid        = DOMID_SELF
-               }
-       };
-
-       /*
-        * Currently an auto-translated guest will not perform I/O, nor will
-        * it require PAE page directories below 4GB. Therefore any calls to
-        * this function are redundant and can be ignored.
-        */
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return 0;
-
-       if (unlikely(order > MAX_CONTIG_ORDER))
-               return -ENOMEM;
-
-       set_xen_guest_handle(exchange.in.extent_start, in_frames);
-       set_xen_guest_handle(exchange.out.extent_start, &out_frame);
-
-       scrub_pages(vstart, 1 << order);
-
-       balloon_lock(flags);
-
-       /* 1. Zap current PTEs, remembering MFNs. */
-       for (i = 0; i < (1UL<<order); i++) {
-               in_frames[i] = pfn_to_mfn((__pa(vstart) >> PAGE_SHIFT) + i);
-               MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-                                       __pte_ma(0), 0);
-               set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
-                       INVALID_P2M_ENTRY);
-       }
-       if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-               BUG();
-
-       /* 2. Get a new contiguous memory extent. */
-       out_frame = __pa(vstart) >> PAGE_SHIFT;
-       rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-       success = (exchange.nr_exchanged == (1UL << order));
-       BUG_ON(!success && ((exchange.nr_exchanged != 0) || (rc == 0)));
-       BUG_ON(success && (rc != 0));
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               /* Compatibility when XENMEM_exchange is unsupported. */
-               if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                        &exchange.in) != (1UL << order))
-                       BUG();
-               success = (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                               &exchange.out) == 1);
-               if (!success) {
-                       /* Couldn't get special memory: fall back to normal. */
-                       for (i = 0; i < (1UL<<order); i++)
-                               in_frames[i] = (__pa(vstart)>>PAGE_SHIFT) + i;
-                       if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                                &exchange.in) != (1UL<<order))
-                               BUG();
-               }
-       }
-#endif
-
-       /* 3. Map the new extent in place of old pages. */
-       for (i = 0; i < (1UL<<order); i++) {
-               frame = success ? (out_frame + i) : in_frames[i];
-               MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-                                       pfn_pte_ma(frame, PAGE_KERNEL), 0);
-               set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
-       }
-
-       cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
-                                                  ? UVMF_TLB_FLUSH|UVMF_ALL
-                                                  : UVMF_INVLPG|UVMF_ALL;
-       if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-               BUG();
-
-       if (success)
-               contiguous_bitmap_set(__pa(vstart) >> PAGE_SHIFT,
-                                     1UL << order);
-
-       balloon_unlock(flags);
-
-       return success ? 0 : -ENOMEM;
-}
-EXPORT_SYMBOL_GPL(xen_create_contiguous_region);
-
-void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
-{
-       unsigned long *out_frames = discontig_frames, in_frame;
-       unsigned long  frame, i, flags;
-       long           rc;
-       int            success;
-       struct xen_memory_exchange exchange = {
-               .in = {
-                       .nr_extents   = 1,
-                       .extent_order = order,
-                       .domid        = DOMID_SELF
-               },
-               .out = {
-                       .nr_extents   = 1UL << order,
-                       .extent_order = 0,
-                       .domid        = DOMID_SELF
-               }
-       };
-
-       if (xen_feature(XENFEAT_auto_translated_physmap) ||
-           !test_bit(__pa(vstart) >> PAGE_SHIFT, contiguous_bitmap))
-               return;
-
-       if (unlikely(order > MAX_CONTIG_ORDER))
-               return;
-
-       set_xen_guest_handle(exchange.in.extent_start, &in_frame);
-       set_xen_guest_handle(exchange.out.extent_start, out_frames);
-
-       scrub_pages(vstart, 1 << order);
-
-       balloon_lock(flags);
-
-       contiguous_bitmap_clear(__pa(vstart) >> PAGE_SHIFT, 1UL << order);
-
-       /* 1. Find start MFN of contiguous extent. */
-       in_frame = pfn_to_mfn(__pa(vstart) >> PAGE_SHIFT);
-
-       /* 2. Zap current PTEs. */
-       for (i = 0; i < (1UL<<order); i++) {
-               MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-                                       __pte_ma(0), 0);
-               set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
-                       INVALID_P2M_ENTRY);
-               out_frames[i] = (__pa(vstart) >> PAGE_SHIFT) + i;
-       }
-       if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-               BUG();
-
-       /* 3. Do the exchange for non-contiguous MFNs. */
-       rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-       success = (exchange.nr_exchanged == 1);
-       BUG_ON(!success && ((exchange.nr_exchanged != 0) || (rc == 0)));
-       BUG_ON(success && (rc != 0));
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               /* Compatibility when XENMEM_exchange is unsupported. */
-               if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                        &exchange.in) != 1)
-                       BUG();
-               if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                        &exchange.out) != (1UL << order))
-                       BUG();
-               success = 1;
-       }
-#endif
-
-       /* 4. Map new pages in place of old pages. */
-       for (i = 0; i < (1UL<<order); i++) {
-               frame = success ? out_frames[i] : (in_frame + i);
-               MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-                                       pfn_pte_ma(frame, PAGE_KERNEL), 0);
-               set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
-       }
-
-       cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
-                                                  ? UVMF_TLB_FLUSH|UVMF_ALL
-                                                  : UVMF_INVLPG|UVMF_ALL;
-       if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-               BUG();
-
-       balloon_unlock(flags);
-}
-EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
-
-#ifdef __i386__
-int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b)
-{
-       __u32 *lp = (__u32 *)((char *)ldt + entry * 8);
-       maddr_t mach_lp = arbitrary_virt_to_machine(lp);
-       return HYPERVISOR_update_descriptor(
-               mach_lp, (u64)entry_a | ((u64)entry_b<<32));
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c
deleted file mode 100644 (file)
index 9a04cb6..0000000
+++ /dev/null
@@ -1,850 +0,0 @@
-/*
- *  linux/arch/i386/mm/init.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- */
-
-#include <linux/module.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/hugetlb.h>
-#include <linux/swap.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/poison.h>
-#include <linux/bootmem.h>
-#include <linux/slab.h>
-#include <linux/proc_fs.h>
-#include <linux/efi.h>
-#include <linux/memory_hotplug.h>
-#include <linux/initrd.h>
-#include <linux/cpumask.h>
-#include <linux/dma-mapping.h>
-#include <linux/scatterlist.h>
-
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/dma.h>
-#include <asm/fixmap.h>
-#include <asm/e820.h>
-#include <asm/apic.h>
-#include <asm/tlb.h>
-#include <asm/tlbflush.h>
-#include <asm/sections.h>
-#include <asm/hypervisor.h>
-#include <asm/swiotlb.h>
-
-extern unsigned long *contiguous_bitmap;
-
-unsigned int __VMALLOC_RESERVE = 128 << 20;
-
-DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
-unsigned long highstart_pfn, highend_pfn;
-
-static int noinline do_test_wp_bit(void);
-
-/*
- * Creates a middle page table and puts a pointer to it in the
- * given global directory entry. This only returns the gd entry
- * in non-PAE compilation mode, since the middle layer is folded.
- */
-static pmd_t * __init one_md_table_init(pgd_t *pgd)
-{
-       pud_t *pud;
-       pmd_t *pmd_table;
-               
-#ifdef CONFIG_X86_PAE
-       pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-       make_lowmem_page_readonly(pmd_table, XENFEAT_writable_page_tables);
-       set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
-       pud = pud_offset(pgd, 0);
-       if (pmd_table != pmd_offset(pud, 0)) 
-               BUG();
-#else
-       pud = pud_offset(pgd, 0);
-       pmd_table = pmd_offset(pud, 0);
-#endif
-
-       return pmd_table;
-}
-
-/*
- * Create a page table and place a pointer to it in a middle page
- * directory entry.
- */
-static pte_t * __init one_page_table_init(pmd_t *pmd)
-{
-       if (pmd_none(*pmd)) {
-               pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-               make_lowmem_page_readonly(page_table,
-                                         XENFEAT_writable_page_tables);
-               set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
-               if (page_table != pte_offset_kernel(pmd, 0))
-                       BUG();  
-
-               return page_table;
-       }
-       
-       return pte_offset_kernel(pmd, 0);
-}
-
-/*
- * This function initializes a certain range of kernel virtual memory 
- * with new bootmem page tables, everywhere page tables are missing in
- * the given range.
- */
-
-/*
- * NOTE: The pagetables are allocated contiguous on the physical space 
- * so we can cache the place of the first one and move around without 
- * checking the pgd every time.
- */
-static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       int pgd_idx, pmd_idx;
-       unsigned long vaddr;
-
-       vaddr = start;
-       pgd_idx = pgd_index(vaddr);
-       pmd_idx = pmd_index(vaddr);
-       pgd = pgd_base + pgd_idx;
-
-       for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
-               if (pgd_none(*pgd)) 
-                       one_md_table_init(pgd);
-               pud = pud_offset(pgd, vaddr);
-               pmd = pmd_offset(pud, vaddr);
-               for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
-                       if (vaddr < hypervisor_virt_start && pmd_none(*pmd))
-                               one_page_table_init(pmd);
-
-                       vaddr += PMD_SIZE;
-               }
-               pmd_idx = 0;
-       }
-}
-
-static inline int is_kernel_text(unsigned long addr)
-{
-       if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end)
-               return 1;
-       return 0;
-}
-
-/*
- * This maps the physical memory to kernel virtual address space, a total 
- * of max_low_pfn pages, by creating page tables starting from address 
- * PAGE_OFFSET.
- */
-static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
-{
-       unsigned long pfn;
-       pgd_t *pgd;
-       pmd_t *pmd;
-       pte_t *pte;
-       int pgd_idx, pmd_idx, pte_ofs;
-
-       unsigned long max_ram_pfn = xen_start_info->nr_pages;
-       if (max_ram_pfn > max_low_pfn)
-               max_ram_pfn = max_low_pfn;
-
-       pgd_idx = pgd_index(PAGE_OFFSET);
-       pgd = pgd_base + pgd_idx;
-       pfn = 0;
-       pmd_idx = pmd_index(PAGE_OFFSET);
-       pte_ofs = pte_index(PAGE_OFFSET);
-
-       for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
-#ifdef CONFIG_XEN
-               /*
-                * Native linux hasn't PAE-paging enabled yet at this
-                * point.  When running as xen domain we are in PAE
-                * mode already, thus we can't simply hook a empty
-                * pmd.  That would kill the mappings we are currently
-                * using ...
-                */
-               pmd = pmd_offset(pud_offset(pgd, PAGE_OFFSET), PAGE_OFFSET);
-#else
-               pmd = one_md_table_init(pgd);
-#endif
-               if (pfn >= max_low_pfn)
-                       continue;
-               pmd += pmd_idx;
-               for (; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
-                       unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET;
-                       if (address >= hypervisor_virt_start)
-                               continue;
-
-                       /* Map with big pages if possible, otherwise create normal page tables. */
-                       if (cpu_has_pse) {
-                               unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1;
-
-                               if (is_kernel_text(address) || is_kernel_text(address2))
-                                       set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC));
-                               else
-                                       set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
-                               pfn += PTRS_PER_PTE;
-                       } else {
-                               pte = one_page_table_init(pmd);
-
-                               pte += pte_ofs;
-                               for (; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++) {
-                                               /* XEN: Only map initial RAM allocation. */
-                                               if ((pfn >= max_ram_pfn) || pte_present(*pte))
-                                                       continue;
-                                               if (is_kernel_text(address))
-                                                       set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
-                                               else
-                                                       set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
-                               }
-                               pte_ofs = 0;
-                       }
-               }
-               pmd_idx = 0;
-       }
-}
-
-#ifndef CONFIG_XEN
-
-static inline int page_kills_ppro(unsigned long pagenr)
-{
-       if (pagenr >= 0x70000 && pagenr <= 0x7003F)
-               return 1;
-       return 0;
-}
-
-#else
-
-#define page_kills_ppro(p)     0
-
-#endif
-
-extern int is_available_memory(efi_memory_desc_t *);
-
-int page_is_ram(unsigned long pagenr)
-{
-       int i;
-       unsigned long addr, end;
-
-       if (efi_enabled) {
-               efi_memory_desc_t *md;
-               void *p;
-
-               for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
-                       md = p;
-                       if (!is_available_memory(md))
-                               continue;
-                       addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-                       end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
-
-                       if ((pagenr >= addr) && (pagenr < end))
-                               return 1;
-               }
-               return 0;
-       }
-
-       for (i = 0; i < e820.nr_map; i++) {
-
-               if (e820.map[i].type != E820_RAM)       /* not usable memory */
-                       continue;
-               /*
-                *      !!!FIXME!!! Some BIOSen report areas as RAM that
-                *      are not. Notably the 640->1Mb area. We need a sanity
-                *      check here.
-                */
-               addr = (e820.map[i].addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-               end = (e820.map[i].addr+e820.map[i].size) >> PAGE_SHIFT;
-               if  ((pagenr >= addr) && (pagenr < end))
-                       return 1;
-       }
-       return 0;
-}
-
-#ifdef CONFIG_HIGHMEM
-pte_t *kmap_pte;
-pgprot_t kmap_prot;
-
-#define kmap_get_fixmap_pte(vaddr)                                     \
-       pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), vaddr), (vaddr)), (vaddr))
-
-static void __init kmap_init(void)
-{
-       unsigned long kmap_vstart;
-
-       /* cache the first kmap pte */
-       kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
-       kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
-
-       kmap_prot = PAGE_KERNEL;
-}
-
-static void __init permanent_kmaps_init(pgd_t *pgd_base)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-       unsigned long vaddr;
-
-       vaddr = PKMAP_BASE;
-       page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
-
-       pgd = swapper_pg_dir + pgd_index(vaddr);
-       pud = pud_offset(pgd, vaddr);
-       pmd = pmd_offset(pud, vaddr);
-       pte = pte_offset_kernel(pmd, vaddr);
-       pkmap_page_table = pte; 
-}
-
-static void __meminit free_new_highpage(struct page *page, int pfn)
-{
-       init_page_count(page);
-       if (pfn < xen_start_info->nr_pages)
-               __free_page(page);
-       totalhigh_pages++;
-}
-
-void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro)
-{
-       if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) {
-               ClearPageReserved(page);
-               free_new_highpage(page, pfn);
-       } else
-               SetPageReserved(page);
-}
-
-static int add_one_highpage_hotplug(struct page *page, unsigned long pfn)
-{
-       free_new_highpage(page, pfn);
-       totalram_pages++;
-#ifdef CONFIG_FLATMEM
-       max_mapnr = max(pfn, max_mapnr);
-#endif
-       num_physpages++;
-       return 0;
-}
-
-/*
- * Not currently handling the NUMA case.
- * Assuming single node and all memory that
- * has been added dynamically that would be
- * onlined here is in HIGHMEM
- */
-void online_page(struct page *page)
-{
-       ClearPageReserved(page);
-       add_one_highpage_hotplug(page, page_to_pfn(page));
-}
-
-
-#ifdef CONFIG_NUMA
-extern void set_highmem_pages_init(int);
-#else
-static void __init set_highmem_pages_init(int bad_ppro)
-{
-       int pfn;
-       for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
-               add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
-       totalram_pages += totalhigh_pages;
-}
-#endif /* CONFIG_FLATMEM */
-
-#else
-#define kmap_init() do { } while (0)
-#define permanent_kmaps_init(pgd_base) do { } while (0)
-#define set_highmem_pages_init(bad_ppro) do { } while (0)
-#endif /* CONFIG_HIGHMEM */
-
-unsigned long long __PAGE_KERNEL = _PAGE_KERNEL;
-EXPORT_SYMBOL(__PAGE_KERNEL);
-unsigned long long __PAGE_KERNEL_EXEC = _PAGE_KERNEL_EXEC;
-
-#ifdef CONFIG_NUMA
-extern void __init remap_numa_kva(void);
-#else
-#define remap_numa_kva() do {} while (0)
-#endif
-
-pgd_t *swapper_pg_dir;
-
-static void __init pagetable_init (void)
-{
-       unsigned long vaddr;
-       pgd_t *pgd_base = (pgd_t *)xen_start_info->pt_base;
-
-       swapper_pg_dir = pgd_base;
-       init_mm.pgd    = pgd_base;
-
-       /* Enable PSE if available */
-       if (cpu_has_pse) {
-               set_in_cr4(X86_CR4_PSE);
-       }
-
-       /* Enable PGE if available */
-       if (cpu_has_pge) {
-               set_in_cr4(X86_CR4_PGE);
-               __PAGE_KERNEL |= _PAGE_GLOBAL;
-               __PAGE_KERNEL_EXEC |= _PAGE_GLOBAL;
-       }
-
-       kernel_physical_mapping_init(pgd_base);
-       remap_numa_kva();
-
-       /*
-        * Fixed mappings, only the page table structure has to be
-        * created - mappings will be set by set_fixmap():
-        */
-       vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-       page_table_range_init(vaddr, hypervisor_virt_start, pgd_base);
-
-       permanent_kmaps_init(pgd_base);
-}
-
-#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_ACPI_SLEEP)
-/*
- * Swap suspend & friends need this for resume because things like the intel-agp
- * driver might have split up a kernel 4MB mapping.
- */
-char __nosavedata swsusp_pg_dir[PAGE_SIZE]
-       __attribute__ ((aligned (PAGE_SIZE)));
-
-static inline void save_pg_dir(void)
-{
-       memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE);
-}
-#else
-static inline void save_pg_dir(void)
-{
-}
-#endif
-
-void zap_low_mappings (void)
-{
-       int i;
-
-       save_pg_dir();
-
-       /*
-        * Zap initial low-memory mappings.
-        *
-        * Note that "pgd_clear()" doesn't do it for
-        * us, because pgd_clear() is a no-op on i386.
-        */
-       for (i = 0; i < USER_PTRS_PER_PGD; i++)
-#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
-               set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
-#else
-               set_pgd(swapper_pg_dir+i, __pgd(0));
-#endif
-       flush_tlb_all();
-}
-
-static int disable_nx __initdata = 0;
-u64 __supported_pte_mask __read_mostly = ~_PAGE_NX;
-EXPORT_SYMBOL(__supported_pte_mask);
-
-/*
- * noexec = on|off
- *
- * Control non executable mappings.
- *
- * on      Enable
- * off     Disable
- */
-void __init noexec_setup(const char *str)
-{
-       if (!strncmp(str, "on",2) && cpu_has_nx) {
-               __supported_pte_mask |= _PAGE_NX;
-               disable_nx = 0;
-       } else if (!strncmp(str,"off",3)) {
-               disable_nx = 1;
-               __supported_pte_mask &= ~_PAGE_NX;
-       }
-}
-
-int nx_enabled = 0;
-#ifdef CONFIG_X86_PAE
-
-static void __init set_nx(void)
-{
-       unsigned int v[4], l, h;
-
-       if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) {
-               cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]);
-               if ((v[3] & (1 << 20)) && !disable_nx) {
-                       rdmsr(MSR_EFER, l, h);
-                       l |= EFER_NX;
-                       wrmsr(MSR_EFER, l, h);
-                       nx_enabled = 1;
-                       __supported_pte_mask |= _PAGE_NX;
-               }
-       }
-}
-
-/*
- * Enables/disables executability of a given kernel page and
- * returns the previous setting.
- */
-int __init set_kernel_exec(unsigned long vaddr, int enable)
-{
-       pte_t *pte;
-       int ret = 1;
-
-       if (!nx_enabled)
-               goto out;
-
-       pte = lookup_address(vaddr);
-       BUG_ON(!pte);
-
-       if (!pte_exec_kernel(*pte))
-               ret = 0;
-
-       if (enable)
-               pte->pte_high &= ~(1 << (_PAGE_BIT_NX - 32));
-       else
-               pte->pte_high |= 1 << (_PAGE_BIT_NX - 32);
-       __flush_tlb_all();
-out:
-       return ret;
-}
-
-#endif
-
-/*
- * paging_init() sets up the page tables - note that the first 8MB are
- * already mapped by head.S.
- *
- * This routines also unmaps the page at virtual kernel address 0, so
- * that we can trap those pesky NULL-reference errors in the kernel.
- */
-void __init paging_init(void)
-{
-       int i;
-
-#ifdef CONFIG_X86_PAE
-       set_nx();
-       if (nx_enabled)
-               printk("NX (Execute Disable) protection: active\n");
-#endif
-
-       pagetable_init();
-
-#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
-       /*
-        * We will bail out later - printk doesn't work right now so
-        * the user would just see a hanging kernel.
-        * when running as xen domain we are already in PAE mode at
-        * this point.
-        */
-       if (cpu_has_pae)
-               set_in_cr4(X86_CR4_PAE);
-#endif
-       __flush_tlb_all();
-
-       kmap_init();
-
-       /* Switch to the real shared_info page, and clear the
-        * dummy page. */
-       set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
-       HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-       memset(empty_zero_page, 0, sizeof(empty_zero_page));
-
-       /* Setup mapping of lower 1st MB */
-       for (i = 0; i < NR_FIX_ISAMAPS; i++)
-               if (is_initial_xendomain())
-                       set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
-               else
-                       __set_fixmap(FIX_ISAMAP_BEGIN - i,
-                                    virt_to_machine(empty_zero_page),
-                                    PAGE_KERNEL_RO);
-}
-
-/*
- * Test if the WP bit works in supervisor mode. It isn't supported on 386's
- * and also on some strange 486's (NexGen etc.). All 586+'s are OK. This
- * used to involve black magic jumps to work around some nasty CPU bugs,
- * but fortunately the switch to using exceptions got rid of all that.
- */
-
-static void __init test_wp_bit(void)
-{
-       printk("Checking if this processor honours the WP bit even in supervisor mode... ");
-
-       /* Any page-aligned address will do, the test is non-destructive */
-       __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY);
-       boot_cpu_data.wp_works_ok = do_test_wp_bit();
-       clear_fixmap(FIX_WP_TEST);
-
-       if (!boot_cpu_data.wp_works_ok) {
-               printk("No.\n");
-#ifdef CONFIG_X86_WP_WORKS_OK
-               panic("This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
-#endif
-       } else {
-               printk("Ok.\n");
-       }
-}
-
-static void __init set_max_mapnr_init(void)
-{
-#ifdef CONFIG_HIGHMEM
-       num_physpages = highend_pfn;
-#else
-       num_physpages = max_low_pfn;
-#endif
-#ifdef CONFIG_FLATMEM
-       max_mapnr = num_physpages;
-#endif
-}
-
-static struct kcore_list kcore_mem, kcore_vmalloc; 
-
-void __init mem_init(void)
-{
-       extern int ppro_with_ram_bug(void);
-       int codesize, reservedpages, datasize, initsize;
-       int tmp;
-       int bad_ppro;
-       unsigned long pfn;
-
-       contiguous_bitmap = alloc_bootmem_low_pages(
-               (max_low_pfn + 2*BITS_PER_LONG) >> 3);
-       BUG_ON(!contiguous_bitmap);
-       memset(contiguous_bitmap, 0, (max_low_pfn + 2*BITS_PER_LONG) >> 3);
-
-#if defined(CONFIG_SWIOTLB)
-       swiotlb_init(); 
-#endif
-
-#ifdef CONFIG_FLATMEM
-       if (!mem_map)
-               BUG();
-#endif
-       
-       bad_ppro = ppro_with_ram_bug();
-
-#ifdef CONFIG_HIGHMEM
-       /* check that fixmap and pkmap do not overlap */
-       if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
-               printk(KERN_ERR "fixmap and kmap areas overlap - this will crash\n");
-               printk(KERN_ERR "pkstart: %lxh pkend: %lxh fixstart %lxh\n",
-                               PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, FIXADDR_START);
-               BUG();
-       }
-#endif
-       set_max_mapnr_init();
-
-#ifdef CONFIG_HIGHMEM
-       high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
-#else
-       high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
-#endif
-       printk("vmalloc area: %lx-%lx, maxmem %lx\n",
-              VMALLOC_START,VMALLOC_END,MAXMEM);
-       BUG_ON(VMALLOC_START > VMALLOC_END);
-       
-       /* this will put all low memory onto the freelists */
-       totalram_pages += free_all_bootmem();
-       /* XEN: init and count low-mem pages outside initial allocation. */
-       for (pfn = xen_start_info->nr_pages; pfn < max_low_pfn; pfn++) {
-               ClearPageReserved(pfn_to_page(pfn));
-               init_page_count(pfn_to_page(pfn));
-               totalram_pages++;
-       }
-
-       reservedpages = 0;
-       for (tmp = 0; tmp < max_low_pfn; tmp++)
-               /*
-                * Only count reserved RAM pages
-                */
-               if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
-                       reservedpages++;
-
-       set_highmem_pages_init(bad_ppro);
-
-       codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-       datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-       initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-
-       kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 
-       kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 
-                  VMALLOC_END-VMALLOC_START);
-
-       printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
-               (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-               num_physpages << (PAGE_SHIFT-10),
-               codesize >> 10,
-               reservedpages << (PAGE_SHIFT-10),
-               datasize >> 10,
-               initsize >> 10,
-               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
-              );
-
-#ifdef CONFIG_X86_PAE
-       if (!cpu_has_pae)
-               panic("cannot execute a PAE-enabled kernel on a PAE-less CPU!");
-#endif
-       if (boot_cpu_data.wp_works_ok < 0)
-               test_wp_bit();
-
-       /*
-        * Subtle. SMP is doing it's boot stuff late (because it has to
-        * fork idle threads) - but it also needs low mappings for the
-        * protected-mode entry to work. We zap these entries only after
-        * the WP-bit has been tested.
-        */
-#ifndef CONFIG_SMP
-       zap_low_mappings();
-#endif
-
-       set_bit(PG_pinned, &virt_to_page(init_mm.pgd)->flags);
-}
-
-/*
- * this is for the non-NUMA, single node SMP system case.
- * Specifically, in the case of x86, we will always add
- * memory to the highmem for now.
- */
-#ifdef CONFIG_MEMORY_HOTPLUG
-#ifndef CONFIG_NEED_MULTIPLE_NODES
-int arch_add_memory(int nid, u64 start, u64 size)
-{
-       struct pglist_data *pgdata = &contig_page_data;
-       struct zone *zone = pgdata->node_zones + MAX_NR_ZONES-1;
-       unsigned long start_pfn = start >> PAGE_SHIFT;
-       unsigned long nr_pages = size >> PAGE_SHIFT;
-
-       return __add_pages(zone, start_pfn, nr_pages);
-}
-
-int remove_memory(u64 start, u64 size)
-{
-       return -EINVAL;
-}
-#endif
-#endif
-
-kmem_cache_t *pgd_cache;
-kmem_cache_t *pmd_cache;
-
-void __init pgtable_cache_init(void)
-{
-       if (PTRS_PER_PMD > 1) {
-               pmd_cache = kmem_cache_create("pmd",
-                                       PTRS_PER_PMD*sizeof(pmd_t),
-                                       PTRS_PER_PMD*sizeof(pmd_t),
-                                       0,
-                                       pmd_ctor,
-                                       NULL);
-               if (!pmd_cache)
-                       panic("pgtable_cache_init(): cannot create pmd cache");
-       }
-       pgd_cache = kmem_cache_create("pgd",
-#ifndef CONFIG_XEN
-                               PTRS_PER_PGD*sizeof(pgd_t),
-                               PTRS_PER_PGD*sizeof(pgd_t),
-#else
-                               PAGE_SIZE,
-                               PAGE_SIZE,
-#endif
-                               0,
-                               pgd_ctor,
-                               PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
-       if (!pgd_cache)
-               panic("pgtable_cache_init(): Cannot create pgd cache");
-}
-
-/*
- * This function cannot be __init, since exceptions don't work in that
- * section.  Put this after the callers, so that it cannot be inlined.
- */
-static int noinline do_test_wp_bit(void)
-{
-       char tmp_reg;
-       int flag;
-
-       __asm__ __volatile__(
-               "       movb %0,%1      \n"
-               "1:     movb %1,%0      \n"
-               "       xorl %2,%2      \n"
-               "2:                     \n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 4        \n"
-               "       .long 1b,2b     \n"
-               ".previous              \n"
-               :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)),
-                "=q" (tmp_reg),
-                "=r" (flag)
-               :"2" (1)
-               :"memory");
-       
-       return flag;
-}
-
-#ifdef CONFIG_DEBUG_RODATA
-
-void mark_rodata_ro(void)
-{
-       unsigned long addr = (unsigned long)__start_rodata;
-
-       for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
-               change_page_attr(virt_to_page(addr), 1, PAGE_KERNEL_RO);
-
-       printk("Write protecting the kernel read-only data: %uk\n",
-                       (__end_rodata - __start_rodata) >> 10);
-
-       /*
-        * change_page_attr() requires a global_flush_tlb() call after it.
-        * We do this after the printk so that if something went wrong in the
-        * change, the printk gets out at least to give a better debug hint
-        * of who is the culprit.
-        */
-       global_flush_tlb();
-}
-#endif
-
-void free_init_pages(char *what, unsigned long begin, unsigned long end)
-{
-       unsigned long addr;
-
-       for (addr = begin; addr < end; addr += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(addr));
-               init_page_count(virt_to_page(addr));
-               memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
-               free_page(addr);
-               totalram_pages++;
-       }
-       printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
-}
-
-void free_initmem(void)
-{
-       free_init_pages("unused kernel memory",
-                       (unsigned long)(&__init_begin),
-                       (unsigned long)(&__init_end));
-}
-
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-       free_init_pages("initrd memory", start, end);
-}
-#endif
-
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c
deleted file mode 100644 (file)
index 6d6edd2..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * arch/i386/mm/ioremap.c
- *
- * Re-map IO memory to kernel address space so that we can access it.
- * This is needed for high PCI addresses that aren't mapped in the
- * 640k-1MB IO memory area on PC's
- *
- * (C) Copyright 1995 1996 Linus Torvalds
- */
-
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <asm/io.h>
-#include <asm/fixmap.h>
-#include <asm/cacheflush.h>
-#include <asm/tlbflush.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-
-#define ISA_START_ADDRESS      0x0
-#define ISA_END_ADDRESS                0x100000
-
-static int direct_remap_area_pte_fn(pte_t *pte, 
-                                   struct page *pmd_page,
-                                   unsigned long address, 
-                                   void *data)
-{
-       mmu_update_t **v = (mmu_update_t **)data;
-
-       BUG_ON(!pte_none(*pte));
-
-       (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pmd_page)) <<
-                    PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
-       (*v)++;
-
-       return 0;
-}
-
-static int __direct_remap_pfn_range(struct mm_struct *mm,
-                                   unsigned long address, 
-                                   unsigned long mfn,
-                                   unsigned long size, 
-                                   pgprot_t prot,
-                                   domid_t  domid)
-{
-       int rc;
-       unsigned long i, start_address;
-       mmu_update_t *u, *v, *w;
-
-       u = v = w = (mmu_update_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
-       if (u == NULL)
-               return -ENOMEM;
-
-       start_address = address;
-
-       flush_cache_all();
-
-       for (i = 0; i < size; i += PAGE_SIZE) {
-               if ((v - u) == (PAGE_SIZE / sizeof(mmu_update_t))) {
-                       /* Flush a full batch after filling in the PTE ptrs. */
-                       rc = apply_to_page_range(mm, start_address, 
-                                                address - start_address,
-                                                direct_remap_area_pte_fn, &w);
-                       if (rc)
-                               goto out;
-                       rc = -EFAULT;
-                       if (HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0)
-                               goto out;
-                       v = w = u;
-                       start_address = address;
-               }
-
-               /*
-                * Fill in the machine address: PTE ptr is done later by
-                * __direct_remap_area_pages(). 
-                */
-               v->val = __pte_val(pfn_pte_ma(mfn, prot));
-
-               mfn++;
-               address += PAGE_SIZE; 
-               v++;
-       }
-
-       if (v != u) {
-               /* Final batch. */
-               rc = apply_to_page_range(mm, start_address,
-                                        address - start_address,
-                                        direct_remap_area_pte_fn, &w);
-               if (rc)
-                       goto out;
-               rc = -EFAULT;
-               if (unlikely(HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0))
-                       goto out;
-       }
-
-       rc = 0;
-
- out:
-       flush_tlb_all();
-
-       free_page((unsigned long)u);
-
-       return rc;
-}
-
-int direct_remap_pfn_range(struct vm_area_struct *vma,
-                          unsigned long address, 
-                          unsigned long mfn,
-                          unsigned long size, 
-                          pgprot_t prot,
-                          domid_t  domid)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return remap_pfn_range(vma, address, mfn, size, prot);
-
-       if (domid == DOMID_SELF)
-               return -EINVAL;
-
-       vma->vm_flags |= VM_IO | VM_RESERVED;
-
-       vma->vm_mm->context.has_foreign_mappings = 1;
-
-       return __direct_remap_pfn_range(
-               vma->vm_mm, address, mfn, size, prot, domid);
-}
-EXPORT_SYMBOL(direct_remap_pfn_range);
-
-int direct_kernel_remap_pfn_range(unsigned long address, 
-                                 unsigned long mfn,
-                                 unsigned long size, 
-                                 pgprot_t prot,
-                                 domid_t  domid)
-{
-       return __direct_remap_pfn_range(
-               &init_mm, address, mfn, size, prot, domid);
-}
-EXPORT_SYMBOL(direct_kernel_remap_pfn_range);
-
-static int lookup_pte_fn(
-       pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-{
-       uint64_t *ptep = (uint64_t *)data;
-       if (ptep)
-               *ptep = ((uint64_t)pfn_to_mfn(page_to_pfn(pmd_page)) <<
-                        PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
-       return 0;
-}
-
-int create_lookup_pte_addr(struct mm_struct *mm, 
-                          unsigned long address,
-                          uint64_t *ptep)
-{
-       return apply_to_page_range(mm, address, PAGE_SIZE,
-                                  lookup_pte_fn, ptep);
-}
-
-EXPORT_SYMBOL(create_lookup_pte_addr);
-
-static int noop_fn(
-       pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-{
-       return 0;
-}
-
-int touch_pte_range(struct mm_struct *mm,
-                   unsigned long address,
-                   unsigned long size)
-{
-       return apply_to_page_range(mm, address, size, noop_fn, NULL);
-} 
-
-EXPORT_SYMBOL(touch_pte_range);
-
-/*
- * Does @address reside within a non-highmem page that is local to this virtual
- * machine (i.e., not an I/O page, nor a memory page belonging to another VM).
- * See the comment that accompanies mfn_to_local_pfn() in page.h to understand
- * why this works.
- */
-static inline int is_local_lowmem(unsigned long address)
-{
-       extern unsigned long max_low_pfn;
-       return (mfn_to_local_pfn(address >> PAGE_SHIFT) < max_low_pfn);
-}
-
-/*
- * Generic mapping function (not visible outside):
- */
-
-/*
- * Remap an arbitrary physical address space into the kernel virtual
- * address space. Needed when the kernel wants to access high addresses
- * directly.
- *
- * NOTE! We need to allow non-page-aligned mappings too: we will obviously
- * have to convert them into an offset in a page-aligned mapping, but the
- * caller shouldn't need to know that small detail.
- */
-void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
-{
-       void __iomem * addr;
-       struct vm_struct * area;
-       unsigned long offset, last_addr;
-       domid_t domid = DOMID_IO;
-
-       /* Don't allow wraparound or zero size */
-       last_addr = phys_addr + size - 1;
-       if (!size || last_addr < phys_addr)
-               return NULL;
-
-       /*
-        * Don't remap the low PCI/ISA area, it's always mapped..
-        */
-       if (is_initial_xendomain() &&
-           phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
-               return (void __iomem *) isa_bus_to_virt(phys_addr);
-
-       /*
-        * Don't allow anybody to remap normal RAM that we're using..
-        */
-       if (is_local_lowmem(phys_addr)) {
-               char *t_addr, *t_end;
-               struct page *page;
-
-               t_addr = bus_to_virt(phys_addr);
-               t_end = t_addr + (size - 1);
-          
-               for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
-                       if(!PageReserved(page))
-                               return NULL;
-
-               domid = DOMID_SELF;
-       }
-
-       /*
-        * Mappings have to be page-aligned
-        */
-       offset = phys_addr & ~PAGE_MASK;
-       phys_addr &= PAGE_MASK;
-       size = PAGE_ALIGN(last_addr+1) - phys_addr;
-
-       /*
-        * Ok, go for it..
-        */
-       area = get_vm_area(size, VM_IOREMAP | (flags << 20));
-       if (!area)
-               return NULL;
-       area->phys_addr = phys_addr;
-       addr = (void __iomem *) area->addr;
-       flags |= _KERNPG_TABLE;
-       if (__direct_remap_pfn_range(&init_mm, (unsigned long)addr,
-                                    phys_addr>>PAGE_SHIFT,
-                                    size, __pgprot(flags), domid)) {
-               vunmap((void __force *) addr);
-               return NULL;
-       }
-       return (void __iomem *) (offset + (char __iomem *)addr);
-}
-EXPORT_SYMBOL(__ioremap);
-
-/**
- * ioremap_nocache     -   map bus memory into CPU space
- * @offset:    bus address of the memory
- * @size:      size of the resource to map
- *
- * ioremap_nocache performs a platform specific sequence of operations to
- * make bus memory CPU accessible via the readb/readw/readl/writeb/
- * writew/writel functions and the other mmio helpers. The returned
- * address is not guaranteed to be usable directly as a virtual
- * address. 
- *
- * This version of ioremap ensures that the memory is marked uncachable
- * on the CPU as well as honouring existing caching rules from things like
- * the PCI bus. Note that there are other caches and buffers on many 
- * busses. In particular driver authors should read up on PCI writes
- *
- * It's useful if some control registers are in such an area and
- * write combining or read caching is not desirable:
- * 
- * Must be freed with iounmap.
- */
-
-void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
-{
-       unsigned long last_addr;
-       void __iomem *p = __ioremap(phys_addr, size, _PAGE_PCD);
-       if (!p) 
-               return p; 
-
-       /* Guaranteed to be > phys_addr, as per __ioremap() */
-       last_addr = phys_addr + size - 1;
-
-       if (is_local_lowmem(last_addr)) { 
-               struct page *ppage = virt_to_page(bus_to_virt(phys_addr));
-               unsigned long npages;
-
-               phys_addr &= PAGE_MASK;
-
-               /* This might overflow and become zero.. */
-               last_addr = PAGE_ALIGN(last_addr);
-
-               /* .. but that's ok, because modulo-2**n arithmetic will make
-               * the page-aligned "last - first" come out right.
-               */
-               npages = (last_addr - phys_addr) >> PAGE_SHIFT;
-
-               if (change_page_attr(ppage, npages, PAGE_KERNEL_NOCACHE) < 0) { 
-                       iounmap(p); 
-                       p = NULL;
-               }
-               global_flush_tlb();
-       }
-
-       return p;                                       
-}
-EXPORT_SYMBOL(ioremap_nocache);
-
-/**
- * iounmap - Free a IO remapping
- * @addr: virtual address from ioremap_*
- *
- * Caller must ensure there is only one unmapping for the same pointer.
- */
-void iounmap(volatile void __iomem *addr)
-{
-       struct vm_struct *p, *o;
-
-       if ((void __force *)addr <= high_memory)
-               return;
-
-       /*
-        * __ioremap special-cases the PCI/ISA range by not instantiating a
-        * vm_area and by simply returning an address into the kernel mapping
-        * of ISA space.   So handle that here.
-        */
-       if ((unsigned long) addr >= fix_to_virt(FIX_ISAMAP_BEGIN))
-               return;
-
-       addr = (volatile void __iomem *)(PAGE_MASK & (unsigned long __force)addr);
-
-       /* Use the vm area unlocked, assuming the caller
-          ensures there isn't another iounmap for the same address
-          in parallel. Reuse of the virtual address is prevented by
-          leaving it in the global lists until we're done with it.
-          cpa takes care of the direct mappings. */
-       read_lock(&vmlist_lock);
-       for (p = vmlist; p; p = p->next) {
-               if (p->addr == addr)
-                       break;
-       }
-       read_unlock(&vmlist_lock);
-
-       if (!p) {
-               printk("iounmap: bad address %p\n", addr);
-               dump_stack();
-               return;
-       }
-
-       /* Reset the direct mapping. Can block */
-       if ((p->flags >> 20) && is_local_lowmem(p->phys_addr)) {
-               /* p->size includes the guard page, but cpa doesn't like that */
-               change_page_attr(virt_to_page(bus_to_virt(p->phys_addr)),
-                                (p->size - PAGE_SIZE) >> PAGE_SHIFT,
-                                PAGE_KERNEL);
-               global_flush_tlb();
-       } 
-
-       /* Finally remove it */
-       o = remove_vm_area((void *)addr);
-       BUG_ON(p != o || o == NULL);
-       kfree(p); 
-}
-EXPORT_SYMBOL(iounmap);
-
-void __init *bt_ioremap(unsigned long phys_addr, unsigned long size)
-{
-       unsigned long offset, last_addr;
-       unsigned int nrpages;
-       enum fixed_addresses idx;
-
-       /* Don't allow wraparound or zero size */
-       last_addr = phys_addr + size - 1;
-       if (!size || last_addr < phys_addr)
-               return NULL;
-
-       /*
-        * Don't remap the low PCI/ISA area, it's always mapped..
-        */
-       if (is_initial_xendomain() &&
-           phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
-               return isa_bus_to_virt(phys_addr);
-
-       /*
-        * Mappings have to be page-aligned
-        */
-       offset = phys_addr & ~PAGE_MASK;
-       phys_addr &= PAGE_MASK;
-       size = PAGE_ALIGN(last_addr) - phys_addr;
-
-       /*
-        * Mappings have to fit in the FIX_BTMAP area.
-        */
-       nrpages = size >> PAGE_SHIFT;
-       if (nrpages > NR_FIX_BTMAPS)
-               return NULL;
-
-       /*
-        * Ok, go for it..
-        */
-       idx = FIX_BTMAP_BEGIN;
-       while (nrpages > 0) {
-               set_fixmap(idx, phys_addr);
-               phys_addr += PAGE_SIZE;
-               --idx;
-               --nrpages;
-       }
-       return (void*) (offset + fix_to_virt(FIX_BTMAP_BEGIN));
-}
-
-void __init bt_iounmap(void *addr, unsigned long size)
-{
-       unsigned long virt_addr;
-       unsigned long offset;
-       unsigned int nrpages;
-       enum fixed_addresses idx;
-
-       virt_addr = (unsigned long)addr;
-       if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN))
-               return;
-       if (virt_addr >= fix_to_virt(FIX_ISAMAP_BEGIN))
-               return;
-       offset = virt_addr & ~PAGE_MASK;
-       nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
-
-       idx = FIX_BTMAP_BEGIN;
-       while (nrpages > 0) {
-               clear_fixmap(idx);
-               --idx;
-               --nrpages;
-       }
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c
deleted file mode 100644 (file)
index df20e59..0000000
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- *  linux/arch/i386/mm/pgtable.c
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/smp.h>
-#include <linux/highmem.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
-#include <linux/spinlock.h>
-#include <linux/module.h>
-
-#include <asm/system.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/fixmap.h>
-#include <asm/e820.h>
-#include <asm/tlb.h>
-#include <asm/tlbflush.h>
-#include <asm/io.h>
-#include <asm/mmu_context.h>
-
-#include <xen/features.h>
-#include <asm/hypervisor.h>
-
-static void pgd_test_and_unpin(pgd_t *pgd);
-
-void show_mem(void)
-{
-       int total = 0, reserved = 0;
-       int shared = 0, cached = 0;
-       int highmem = 0;
-       struct page *page;
-       pg_data_t *pgdat;
-       unsigned long i;
-       unsigned long flags;
-
-       printk(KERN_INFO "Mem-info:\n");
-       show_free_areas();
-       printk(KERN_INFO "Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-       for_each_online_pgdat(pgdat) {
-               pgdat_resize_lock(pgdat, &flags);
-               for (i = 0; i < pgdat->node_spanned_pages; ++i) {
-                       page = pgdat_page_nr(pgdat, i);
-                       total++;
-                       if (PageHighMem(page))
-                               highmem++;
-                       if (PageReserved(page))
-                               reserved++;
-                       else if (PageSwapCache(page))
-                               cached++;
-                       else if (page_count(page))
-                               shared += page_count(page) - 1;
-               }
-               pgdat_resize_unlock(pgdat, &flags);
-       }
-       printk(KERN_INFO "%d pages of RAM\n", total);
-       printk(KERN_INFO "%d pages of HIGHMEM\n", highmem);
-       printk(KERN_INFO "%d reserved pages\n", reserved);
-       printk(KERN_INFO "%d pages shared\n", shared);
-       printk(KERN_INFO "%d pages swap cached\n", cached);
-
-       printk(KERN_INFO "%lu pages dirty\n", global_page_state(NR_FILE_DIRTY));
-       printk(KERN_INFO "%lu pages writeback\n",
-                                       global_page_state(NR_WRITEBACK));
-       printk(KERN_INFO "%lu pages mapped\n", global_page_state(NR_FILE_MAPPED));
-       printk(KERN_INFO "%lu pages slab\n", global_page_state(NR_SLAB));
-       printk(KERN_INFO "%lu pages pagetables\n",
-                                       global_page_state(NR_PAGETABLE));
-}
-
-/*
- * Associate a virtual page frame with a given physical page frame 
- * and protection flags for that frame.
- */ 
-static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       pgd = swapper_pg_dir + pgd_index(vaddr);
-       if (pgd_none(*pgd)) {
-               BUG();
-               return;
-       }
-       pud = pud_offset(pgd, vaddr);
-       if (pud_none(*pud)) {
-               BUG();
-               return;
-       }
-       pmd = pmd_offset(pud, vaddr);
-       if (pmd_none(*pmd)) {
-               BUG();
-               return;
-       }
-       pte = pte_offset_kernel(pmd, vaddr);
-       if (pgprot_val(flags))
-               /* <pfn,flags> stored as-is, to permit clearing entries */
-               set_pte(pte, pfn_pte(pfn, flags));
-       else
-               pte_clear(&init_mm, vaddr, pte);
-
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-/*
- * Associate a virtual page frame with a given physical page frame 
- * and protection flags for that frame.
- */ 
-static void set_pte_pfn_ma(unsigned long vaddr, unsigned long pfn,
-                          pgprot_t flags)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       pgd = swapper_pg_dir + pgd_index(vaddr);
-       if (pgd_none(*pgd)) {
-               BUG();
-               return;
-       }
-       pud = pud_offset(pgd, vaddr);
-       if (pud_none(*pud)) {
-               BUG();
-               return;
-       }
-       pmd = pmd_offset(pud, vaddr);
-       if (pmd_none(*pmd)) {
-               BUG();
-               return;
-       }
-       pte = pte_offset_kernel(pmd, vaddr);
-       if (pgprot_val(flags))
-               /* <pfn,flags> stored as-is, to permit clearing entries */
-               set_pte(pte, pfn_pte_ma(pfn, flags));
-       else
-               pte_clear(&init_mm, vaddr, pte);
-
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-/*
- * Associate a large virtual page frame with a given physical page frame 
- * and protection flags for that frame. pfn is for the base of the page,
- * vaddr is what the page gets mapped to - both must be properly aligned. 
- * The pmd must already be instantiated. Assumes PAE mode.
- */ 
-void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-
-       if (vaddr & (PMD_SIZE-1)) {             /* vaddr is misaligned */
-               printk(KERN_WARNING "set_pmd_pfn: vaddr misaligned\n");
-               return; /* BUG(); */
-       }
-       if (pfn & (PTRS_PER_PTE-1)) {           /* pfn is misaligned */
-               printk(KERN_WARNING "set_pmd_pfn: pfn misaligned\n");
-               return; /* BUG(); */
-       }
-       pgd = swapper_pg_dir + pgd_index(vaddr);
-       if (pgd_none(*pgd)) {
-               printk(KERN_WARNING "set_pmd_pfn: pgd_none\n");
-               return; /* BUG(); */
-       }
-       pud = pud_offset(pgd, vaddr);
-       pmd = pmd_offset(pud, vaddr);
-       set_pmd(pmd, pfn_pmd(pfn, flags));
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-static int nr_fixmaps = 0;
-unsigned long hypervisor_virt_start = HYPERVISOR_VIRT_START;
-unsigned long __FIXADDR_TOP = (HYPERVISOR_VIRT_START - 2 * PAGE_SIZE);
-EXPORT_SYMBOL(__FIXADDR_TOP);
-
-void __init set_fixaddr_top(unsigned long top)
-{
-       BUG_ON(nr_fixmaps > 0);
-       hypervisor_virt_start = top;
-       __FIXADDR_TOP = hypervisor_virt_start - 2 * PAGE_SIZE;
-}
-
-void __set_fixmap (enum fixed_addresses idx, maddr_t phys, pgprot_t flags)
-{
-       unsigned long address = __fix_to_virt(idx);
-
-       if (idx >= __end_of_fixed_addresses) {
-               BUG();
-               return;
-       }
-       switch (idx) {
-       case FIX_WP_TEST:
-#ifdef CONFIG_X86_F00F_BUG
-       case FIX_F00F_IDT:
-#endif
-       case FIX_VDSO:
-               set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
-               break;
-       default:
-               set_pte_pfn_ma(address, phys >> PAGE_SHIFT, flags);
-               break;
-       }
-       nr_fixmaps++;
-}
-
-pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
-{
-       pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
-       if (pte)
-               make_lowmem_page_readonly(pte, XENFEAT_writable_page_tables);
-       return pte;
-}
-
-struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-{
-       struct page *pte;
-
-#ifdef CONFIG_HIGHPTE
-       pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0);
-#else
-       pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
-#endif
-       if (pte) {
-               SetPageForeign(pte, pte_free);
-               init_page_count(pte);
-       }
-       return pte;
-}
-
-void pte_free(struct page *pte)
-{
-       unsigned long pfn = page_to_pfn(pte);
-
-       if (!PageHighMem(pte)) {
-               unsigned long va = (unsigned long)__va(pfn << PAGE_SHIFT);
-
-               if (!pte_write(*virt_to_ptep(va)))
-                       if (HYPERVISOR_update_va_mapping(
-                               va, pfn_pte(pfn, PAGE_KERNEL), 0))
-                               BUG();
-       } else
-               clear_bit(PG_pinned, &pte->flags);
-
-       ClearPageForeign(pte);
-       init_page_count(pte);
-
-       __free_page(pte);
-}
-
-void pmd_ctor(void *pmd, kmem_cache_t *cache, unsigned long flags)
-{
-       memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-}
-
-/*
- * List of all pgd's needed for non-PAE so it can invalidate entries
- * in both cached and uncached pgd's; not needed for PAE since the
- * kernel pmd is shared. If PAE were not to share the pmd a similar
- * tactic would be needed. This is essentially codepath-based locking
- * against pageattr.c; it is the unique case in which a valid change
- * of kernel pagetables can't be lazily synchronized by vmalloc faults.
- * vmalloc faults work because attached pagetables are never freed.
- * The locking scheme was chosen on the basis of manfred's
- * recommendations and having no core impact whatsoever.
- * -- wli
- */
-DEFINE_SPINLOCK(pgd_lock);
-struct page *pgd_list;
-
-static inline void pgd_list_add(pgd_t *pgd)
-{
-       struct page *page = virt_to_page(pgd);
-       page->index = (unsigned long)pgd_list;
-       if (pgd_list)
-               set_page_private(pgd_list, (unsigned long)&page->index);
-       pgd_list = page;
-       set_page_private(page, (unsigned long)&pgd_list);
-}
-
-static inline void pgd_list_del(pgd_t *pgd)
-{
-       struct page *next, **pprev, *page = virt_to_page(pgd);
-       next = (struct page *)page->index;
-       pprev = (struct page **)page_private(page);
-       *pprev = next;
-       if (next)
-               set_page_private(next, (unsigned long)pprev);
-}
-
-void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
-{
-       unsigned long flags;
-
-       if (PTRS_PER_PMD > 1) {
-               if (HAVE_SHARED_KERNEL_PMD)
-                       clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-                                       swapper_pg_dir + USER_PTRS_PER_PGD,
-                                       KERNEL_PGD_PTRS);
-       } else {
-               spin_lock_irqsave(&pgd_lock, flags);
-               clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-                               swapper_pg_dir + USER_PTRS_PER_PGD,
-                               KERNEL_PGD_PTRS);
-               memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
-               pgd_list_add(pgd);
-               spin_unlock_irqrestore(&pgd_lock, flags);
-       }
-}
-
-/* never called when PTRS_PER_PMD > 1 */
-void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
-{
-       unsigned long flags; /* can be called from interrupt context */
-
-       spin_lock_irqsave(&pgd_lock, flags);
-       pgd_list_del(pgd);
-       spin_unlock_irqrestore(&pgd_lock, flags);
-
-       pgd_test_and_unpin(pgd);
-}
-
-pgd_t *pgd_alloc(struct mm_struct *mm)
-{
-       int i;
-       pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
-       pmd_t **pmd;
-       unsigned long flags;
-
-       pgd_test_and_unpin(pgd);
-
-       if (PTRS_PER_PMD == 1 || !pgd)
-               return pgd;
-
-       if (HAVE_SHARED_KERNEL_PMD) {
-               for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-                       pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-                       if (!pmd)
-                               goto out_oom;
-                       set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
-               }
-               return pgd;
-       }
-
-       /*
-        * We can race save/restore (if we sleep during a GFP_KERNEL memory
-        * allocation). We therefore store virtual addresses of pmds as they
-        * do not change across save/restore, and poke the machine addresses
-        * into the pgdir under the pgd_lock.
-        */
-       pmd = kmalloc(PTRS_PER_PGD * sizeof(pmd_t *), GFP_KERNEL);
-       if (!pmd) {
-               kmem_cache_free(pgd_cache, pgd);
-               return NULL;
-       }
-
-       /* Allocate pmds, remember virtual addresses. */
-       for (i = 0; i < PTRS_PER_PGD; ++i) {
-               pmd[i] = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-               if (!pmd[i])
-                       goto out_oom;
-       }
-
-       spin_lock_irqsave(&pgd_lock, flags);
-
-       /* Protect against save/restore: move below 4GB under pgd_lock. */
-       if (!xen_feature(XENFEAT_pae_pgdir_above_4gb)) {
-               int rc = xen_create_contiguous_region(
-                       (unsigned long)pgd, 0, 32);
-               if (rc) {
-                       spin_unlock_irqrestore(&pgd_lock, flags);
-                       goto out_oom;
-               }
-       }
-
-       /* Copy kernel pmd contents and write-protect the new pmds. */
-       for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-               unsigned long v = (unsigned long)i << PGDIR_SHIFT;
-               pgd_t *kpgd = pgd_offset_k(v);
-               pud_t *kpud = pud_offset(kpgd, v);
-               pmd_t *kpmd = pmd_offset(kpud, v);
-               memcpy(pmd[i], kpmd, PAGE_SIZE);
-               make_lowmem_page_readonly(
-                       pmd[i], XENFEAT_writable_page_tables);
-       }
-
-       /* It is safe to poke machine addresses of pmds under the pmd_lock. */
-       for (i = 0; i < PTRS_PER_PGD; i++)
-               set_pgd(&pgd[i], __pgd(1 + __pa(pmd[i])));
-
-       /* Ensure this pgd gets picked up and pinned on save/restore. */
-       pgd_list_add(pgd);
-
-       spin_unlock_irqrestore(&pgd_lock, flags);
-
-       kfree(pmd);
-
-       return pgd;
-
-out_oom:
-       if (HAVE_SHARED_KERNEL_PMD) {
-               for (i--; i >= 0; i--)
-                       kmem_cache_free(pmd_cache,
-                                       (void *)__va(pgd_val(pgd[i])-1));
-       } else {
-               for (i--; i >= 0; i--)
-                       kmem_cache_free(pmd_cache, pmd[i]);
-               kfree(pmd);
-       }
-       kmem_cache_free(pgd_cache, pgd);
-       return NULL;
-}
-
-void pgd_free(pgd_t *pgd)
-{
-       int i;
-
-       /*
-        * After this the pgd should not be pinned for the duration of this
-        * function's execution. We should never sleep and thus never race:
-        *  1. User pmds will not become write-protected under our feet due
-        *     to a concurrent mm_pin_all().
-        *  2. The machine addresses in PGD entries will not become invalid
-        *     due to a concurrent save/restore.
-        */
-       pgd_test_and_unpin(pgd);
-
-       /* in the PAE case user pgd entries are overwritten before usage */
-       if (PTRS_PER_PMD > 1) {
-               for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-                       pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-                       kmem_cache_free(pmd_cache, pmd);
-               }
-
-               if (!HAVE_SHARED_KERNEL_PMD) {
-                       unsigned long flags;
-                       spin_lock_irqsave(&pgd_lock, flags);
-                       pgd_list_del(pgd);
-                       spin_unlock_irqrestore(&pgd_lock, flags);
-
-                       for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-                               pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-                               make_lowmem_page_writable(
-                                       pmd, XENFEAT_writable_page_tables);
-                               memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-                               kmem_cache_free(pmd_cache, pmd);
-                       }
-
-                       if (!xen_feature(XENFEAT_pae_pgdir_above_4gb))
-                               xen_destroy_contiguous_region(
-                                       (unsigned long)pgd, 0);
-               }
-       }
-
-       /* in the non-PAE case, free_pgtables() clears user pgd entries */
-       kmem_cache_free(pgd_cache, pgd);
-}
-
-void make_lowmem_page_readonly(void *va, unsigned int feature)
-{
-       pte_t *pte;
-       int rc;
-
-       if (xen_feature(feature))
-               return;
-
-       pte = virt_to_ptep(va);
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)va, pte_wrprotect(*pte), 0);
-       BUG_ON(rc);
-}
-
-void make_lowmem_page_writable(void *va, unsigned int feature)
-{
-       pte_t *pte;
-       int rc;
-
-       if (xen_feature(feature))
-               return;
-
-       pte = virt_to_ptep(va);
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)va, pte_mkwrite(*pte), 0);
-       BUG_ON(rc);
-}
-
-void make_page_readonly(void *va, unsigned int feature)
-{
-       pte_t *pte;
-       int rc;
-
-       if (xen_feature(feature))
-               return;
-
-       pte = virt_to_ptep(va);
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)va, pte_wrprotect(*pte), 0);
-       if (rc) /* fallback? */
-               xen_l1_entry_update(pte, pte_wrprotect(*pte));
-       if ((unsigned long)va >= (unsigned long)high_memory) {
-               unsigned long pfn = pte_pfn(*pte);
-#ifdef CONFIG_HIGHMEM
-               if (pfn >= highstart_pfn)
-                       kmap_flush_unused(); /* flush stale writable kmaps */
-               else
-#endif
-                       make_lowmem_page_readonly(
-                               phys_to_virt(pfn << PAGE_SHIFT), feature); 
-       }
-}
-
-void make_page_writable(void *va, unsigned int feature)
-{
-       pte_t *pte;
-       int rc;
-
-       if (xen_feature(feature))
-               return;
-
-       pte = virt_to_ptep(va);
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)va, pte_mkwrite(*pte), 0);
-       if (rc) /* fallback? */
-               xen_l1_entry_update(pte, pte_mkwrite(*pte));
-       if ((unsigned long)va >= (unsigned long)high_memory) {
-               unsigned long pfn = pte_pfn(*pte); 
-#ifdef CONFIG_HIGHMEM
-               if (pfn < highstart_pfn)
-#endif
-                       make_lowmem_page_writable(
-                               phys_to_virt(pfn << PAGE_SHIFT), feature);
-       }
-}
-
-void make_pages_readonly(void *va, unsigned int nr, unsigned int feature)
-{
-       if (xen_feature(feature))
-               return;
-
-       while (nr-- != 0) {
-               make_page_readonly(va, feature);
-               va = (void *)((unsigned long)va + PAGE_SIZE);
-       }
-}
-
-void make_pages_writable(void *va, unsigned int nr, unsigned int feature)
-{
-       if (xen_feature(feature))
-               return;
-
-       while (nr-- != 0) {
-               make_page_writable(va, feature);
-               va = (void *)((unsigned long)va + PAGE_SIZE);
-       }
-}
-
-static inline void pgd_walk_set_prot(struct page *page, pgprot_t flags)
-{
-       unsigned long pfn = page_to_pfn(page);
-       int rc;
-
-       if (PageHighMem(page)) {
-               if (pgprot_val(flags) & _PAGE_RW)
-                       clear_bit(PG_pinned, &page->flags);
-               else
-                       set_bit(PG_pinned, &page->flags);
-       } else {
-               rc = HYPERVISOR_update_va_mapping(
-                       (unsigned long)__va(pfn << PAGE_SHIFT),
-                       pfn_pte(pfn, flags), 0);
-               if (rc)
-                       BUG();
-       }
-}
-
-static void pgd_walk(pgd_t *pgd_base, pgprot_t flags)
-{
-       pgd_t *pgd = pgd_base;
-       pud_t *pud;
-       pmd_t *pmd;
-       int    g, u, m, rc;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return;
-
-       for (g = 0; g < USER_PTRS_PER_PGD; g++, pgd++) {
-               if (pgd_none(*pgd))
-                       continue;
-               pud = pud_offset(pgd, 0);
-               if (PTRS_PER_PUD > 1) /* not folded */
-                       pgd_walk_set_prot(virt_to_page(pud),flags);
-               for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-                       if (pud_none(*pud))
-                               continue;
-                       pmd = pmd_offset(pud, 0);
-                       if (PTRS_PER_PMD > 1) /* not folded */
-                               pgd_walk_set_prot(virt_to_page(pmd),flags);
-                       for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-                               if (pmd_none(*pmd))
-                                       continue;
-                               pgd_walk_set_prot(pmd_page(*pmd),flags);
-                       }
-               }
-       }
-
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)pgd_base,
-               pfn_pte(virt_to_phys(pgd_base)>>PAGE_SHIFT, flags),
-               UVMF_TLB_FLUSH);
-       if (rc)
-               BUG();
-}
-
-static void __pgd_pin(pgd_t *pgd)
-{
-       pgd_walk(pgd, PAGE_KERNEL_RO);
-       kmap_flush_unused();
-       xen_pgd_pin(__pa(pgd));
-       set_bit(PG_pinned, &virt_to_page(pgd)->flags);
-}
-
-static void __pgd_unpin(pgd_t *pgd)
-{
-       xen_pgd_unpin(__pa(pgd));
-       pgd_walk(pgd, PAGE_KERNEL);
-       clear_bit(PG_pinned, &virt_to_page(pgd)->flags);
-}
-
-static void pgd_test_and_unpin(pgd_t *pgd)
-{
-       if (test_bit(PG_pinned, &virt_to_page(pgd)->flags))
-               __pgd_unpin(pgd);
-}
-
-void mm_pin(struct mm_struct *mm)
-{
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-       spin_lock(&mm->page_table_lock);
-       __pgd_pin(mm->pgd);
-       spin_unlock(&mm->page_table_lock);
-}
-
-void mm_unpin(struct mm_struct *mm)
-{
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-       spin_lock(&mm->page_table_lock);
-       __pgd_unpin(mm->pgd);
-       spin_unlock(&mm->page_table_lock);
-}
-
-void mm_pin_all(void)
-{
-       struct page *page;
-       unsigned long flags;
-
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-
-       /*
-        * Allow uninterrupted access to the pgd_list. Also protects
-        * __pgd_pin() by disabling preemption.
-        * All other CPUs must be at a safe point (e.g., in stop_machine
-        * or offlined entirely).
-        */
-       spin_lock_irqsave(&pgd_lock, flags);
-       for (page = pgd_list; page; page = (struct page *)page->index) {
-               if (!test_bit(PG_pinned, &page->flags))
-                       __pgd_pin((pgd_t *)page_address(page));
-       }
-       spin_unlock_irqrestore(&pgd_lock, flags);
-}
-
-void _arch_dup_mmap(struct mm_struct *mm)
-{
-       if (!test_bit(PG_pinned, &virt_to_page(mm->pgd)->flags))
-               mm_pin(mm);
-}
-
-void _arch_exit_mmap(struct mm_struct *mm)
-{
-       struct task_struct *tsk = current;
-
-       task_lock(tsk);
-
-       /*
-        * We aggressively remove defunct pgd from cr3. We execute unmap_vmas()
-        * *much* faster this way, as no tlb flushes means bigger wrpt batches.
-        */
-       if (tsk->active_mm == mm) {
-               tsk->active_mm = &init_mm;
-               atomic_inc(&init_mm.mm_count);
-
-               switch_mm(mm, &init_mm, tsk);
-
-               atomic_dec(&mm->mm_count);
-               BUG_ON(atomic_read(&mm->mm_count) == 0);
-       }
-
-       task_unlock(tsk);
-
-       if (test_bit(PG_pinned, &virt_to_page(mm->pgd)->flags) &&
-           (atomic_read(&mm->mm_count) == 1) &&
-           !mm->context.has_foreign_mappings)
-               mm_unpin(mm);
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/oprofile/Makefile b/linux-2.6-xen-sparse/arch/i386/oprofile/Makefile
deleted file mode 100644 (file)
index caaff10..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-obj-$(CONFIG_OPROFILE) += oprofile.o
-
-DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \
-               oprof.o cpu_buffer.o buffer_sync.o \
-               event_buffer.o oprofile_files.o \
-               oprofilefs.o oprofile_stats.o  \
-               timer_int.o )
-
-ifdef CONFIG_XEN
-XENOPROF_COMMON_OBJS = $(addprefix ../../../drivers/xen/xenoprof/, \
-                        xenoprofile.o)
-oprofile-y                             := $(DRIVER_OBJS) \
-                                          $(XENOPROF_COMMON_OBJS) xenoprof.o
-else 
-oprofile-y                             := $(DRIVER_OBJS) init.o backtrace.o
-oprofile-$(CONFIG_X86_LOCAL_APIC)      += nmi_int.o op_model_athlon.o \
-                                          op_model_ppro.o op_model_p4.o
-oprofile-$(CONFIG_X86_IO_APIC)         += nmi_timer_int.o
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c b/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c
deleted file mode 100644 (file)
index cf6d463..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * @file xenoprof.c
- *
- * @remark Copyright 2002 OProfile authors
- * @remark Read the file COPYING
- *
- * @author John Levon <levon@movementarian.org>
- *
- * Modified by Aravind Menon and Jose Renato Santos for Xen
- * These modifications are:
- * Copyright (C) 2005 Hewlett-Packard Co.
- *
- * x86-specific part
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- */
-
-#include <linux/init.h>
-#include <linux/oprofile.h>
-#include <linux/sched.h>
-#include <asm/pgtable.h>
-
-#include <xen/driver_util.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/xenoprof.h>
-#include <xen/xenoprof.h>
-#include "op_counter.h"
-
-static unsigned int num_events = 0;
-
-void __init xenoprof_arch_init_counter(struct xenoprof_init *init)
-{
-       num_events = init->num_events;
-       /* just in case - make sure we do not overflow event list 
-          (i.e. counter_config list) */
-       if (num_events > OP_MAX_COUNTER) {
-               num_events = OP_MAX_COUNTER;
-               init->num_events = num_events;
-       }
-}
-
-void xenoprof_arch_counter(void)
-{
-       int i;
-       struct xenoprof_counter counter;
-
-       for (i=0; i<num_events; i++) {
-               counter.ind       = i;
-               counter.count     = (uint64_t)counter_config[i].count;
-               counter.enabled   = (uint32_t)counter_config[i].enabled;
-               counter.event     = (uint32_t)counter_config[i].event;
-               counter.kernel    = (uint32_t)counter_config[i].kernel;
-               counter.user      = (uint32_t)counter_config[i].user;
-               counter.unit_mask = (uint64_t)counter_config[i].unit_mask;
-               HYPERVISOR_xenoprof_op(XENOPROF_counter, 
-                                      &counter);
-       }
-}
-
-void xenoprof_arch_start(void) 
-{
-       /* nothing */
-}
-
-void xenoprof_arch_stop(void)
-{
-       /* nothing */
-}
-
-void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer * sbuf)
-{
-       if (sbuf->buffer) {
-               vunmap(sbuf->buffer);
-               sbuf->buffer = NULL;
-       }
-}
-
-int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer * get_buffer,
-                                   struct xenoprof_shared_buffer * sbuf)
-{
-       int npages, ret;
-       struct vm_struct *area;
-
-       sbuf->buffer = NULL;
-       if ( (ret = HYPERVISOR_xenoprof_op(XENOPROF_get_buffer, get_buffer)) )
-               return ret;
-
-       npages = (get_buffer->bufsize * get_buffer->nbuf - 1) / PAGE_SIZE + 1;
-
-       area = alloc_vm_area(npages * PAGE_SIZE);
-       if (area == NULL)
-               return -ENOMEM;
-
-       if ( (ret = direct_kernel_remap_pfn_range(
-                     (unsigned long)area->addr,
-                     get_buffer->buf_gmaddr >> PAGE_SHIFT,
-                     npages * PAGE_SIZE, __pgprot(_KERNPG_TABLE),
-                     DOMID_SELF)) ) {
-               vunmap(area->addr);
-               return ret;
-       }
-
-       sbuf->buffer = area->addr;
-       return ret;
-}
-
-int xenoprof_arch_set_passive(struct xenoprof_passive * pdomain,
-                             struct xenoprof_shared_buffer * sbuf)
-{
-       int ret;
-       int npages;
-       struct vm_struct *area;
-       pgprot_t prot = __pgprot(_KERNPG_TABLE);
-
-       sbuf->buffer = NULL;
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_set_passive, pdomain);
-       if (ret)
-               goto out;
-
-       npages = (pdomain->bufsize * pdomain->nbuf - 1) / PAGE_SIZE + 1;
-
-       area = alloc_vm_area(npages * PAGE_SIZE);
-       if (area == NULL) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       ret = direct_kernel_remap_pfn_range(
-               (unsigned long)area->addr,
-               pdomain->buf_gmaddr >> PAGE_SHIFT,
-               npages * PAGE_SIZE, prot, DOMID_SELF);
-       if (ret) {
-               vunmap(area->addr);
-               goto out;
-       }
-       sbuf->buffer = area->addr;
-
-out:
-       return ret;
-}
-
-struct op_counter_config counter_config[OP_MAX_COUNTER];
-
-int xenoprof_create_files(struct super_block * sb, struct dentry * root)
-{
-       unsigned int i;
-
-       for (i = 0; i < num_events; ++i) {
-               struct dentry * dir;
-               char buf[2];
-               snprintf(buf, 2, "%d", i);
-               dir = oprofilefs_mkdir(sb, root, buf);
-               oprofilefs_create_ulong(sb, dir, "enabled",
-                                       &counter_config[i].enabled);
-               oprofilefs_create_ulong(sb, dir, "event",
-                                       &counter_config[i].event);
-               oprofilefs_create_ulong(sb, dir, "count",
-                                       &counter_config[i].count);
-               oprofilefs_create_ulong(sb, dir, "unit_mask",
-                                       &counter_config[i].unit_mask);
-               oprofilefs_create_ulong(sb, dir, "kernel",
-                                       &counter_config[i].kernel);
-               oprofilefs_create_ulong(sb, dir, "user",
-                                       &counter_config[i].user);
-       }
-
-       return 0;
-}
-
-int __init oprofile_arch_init(struct oprofile_operations * ops)
-{
-       return xenoprofile_init(ops);
-}
-
-void oprofile_arch_exit(void)
-{
-       xenoprofile_exit();
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/pci/Makefile b/linux-2.6-xen-sparse/arch/i386/pci/Makefile
deleted file mode 100644 (file)
index 4447f39..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-obj-y                          := i386.o init.o
-
-obj-$(CONFIG_PCI_BIOS)         += pcbios.o
-obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig.o direct.o
-obj-$(CONFIG_PCI_DIRECT)       += direct.o
-
-# pcifront should be after pcbios.o, mmconfig.o, and direct.o as it should only
-# take over if direct access to the PCI bus is unavailable
-obj-$(CONFIG_XEN_PCIDEV_FRONTEND)      += pcifront.o
-
-pci-y                          := fixup.o
-pci-$(CONFIG_ACPI)             += acpi.o
-pci-y                          += legacy.o irq.o
-
-pci-$(CONFIG_X86_VISWS)                := visws.o fixup.o
-pci-$(CONFIG_X86_NUMAQ)                := numa.o irq.o
-
-obj-y                          += $(pci-y) common.o
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c b/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c
deleted file mode 100644 (file)
index 96db124..0000000
+++ /dev/null
@@ -1,1205 +0,0 @@
-/*
- *     Low-Level PCI Support for PC -- Routing of Interrupts
- *
- *     (c) 1999--2000 Martin Mares <mj@ucw.cz>
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/dmi.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/io_apic.h>
-#include <linux/irq.h>
-#include <linux/acpi.h>
-
-#include "pci.h"
-
-#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
-#define PIRQ_VERSION 0x0100
-
-static int broken_hp_bios_irq9;
-static int acer_tm360_irqrouting;
-
-static struct irq_routing_table *pirq_table;
-
-static int pirq_enable_irq(struct pci_dev *dev);
-
-/*
- * Never use: 0, 1, 2 (timer, keyboard, and cascade)
- * Avoid using: 13, 14 and 15 (FP error and IDE).
- * Penalize: 3, 4, 6, 7, 12 (known ISA uses: serial, floppy, parallel and mouse)
- */
-unsigned int pcibios_irq_mask = 0xfff8;
-
-static int pirq_penalty[16] = {
-       1000000, 1000000, 1000000, 1000, 1000, 0, 1000, 1000,
-       0, 0, 0, 0, 1000, 100000, 100000, 100000
-};
-
-struct irq_router {
-       char *name;
-       u16 vendor, device;
-       int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq);
-       int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new);
-};
-
-struct irq_router_handler {
-       u16 vendor;
-       int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device);
-};
-
-int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL;
-void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL;
-
-/*
- *  Check passed address for the PCI IRQ Routing Table signature
- *  and perform checksum verification.
- */
-
-static inline struct irq_routing_table * pirq_check_routing_table(u8 *addr)
-{
-       struct irq_routing_table *rt;
-       int i;
-       u8 sum;
-
-       rt = (struct irq_routing_table *) addr;
-       if (rt->signature != PIRQ_SIGNATURE ||
-           rt->version != PIRQ_VERSION ||
-           rt->size % 16 ||
-           rt->size < sizeof(struct irq_routing_table))
-               return NULL;
-       sum = 0;
-       for (i=0; i < rt->size; i++)
-               sum += addr[i];
-       if (!sum) {
-               DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", rt);
-               return rt;
-       }
-       return NULL;
-}
-
-
-
-/*
- *  Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table.
- */
-
-static struct irq_routing_table * __init pirq_find_routing_table(void)
-{
-       u8 *addr;
-       struct irq_routing_table *rt;
-
-#ifdef CONFIG_XEN
-       if (!is_initial_xendomain())
-               return NULL;
-#endif
-       if (pirq_table_addr) {
-               rt = pirq_check_routing_table((u8 *) isa_bus_to_virt(pirq_table_addr));
-               if (rt)
-                       return rt;
-               printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
-       }
-       for(addr = (u8 *) isa_bus_to_virt(0xf0000); addr < (u8 *) isa_bus_to_virt(0x100000); addr += 16) {
-               rt = pirq_check_routing_table(addr);
-               if (rt)
-                       return rt;
-       }
-       return NULL;
-}
-
-/*
- *  If we have a IRQ routing table, use it to search for peer host
- *  bridges.  It's a gross hack, but since there are no other known
- *  ways how to get a list of buses, we have to go this way.
- */
-
-static void __init pirq_peer_trick(void)
-{
-       struct irq_routing_table *rt = pirq_table;
-       u8 busmap[256];
-       int i;
-       struct irq_info *e;
-
-       memset(busmap, 0, sizeof(busmap));
-       for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
-               e = &rt->slots[i];
-#ifdef DEBUG
-               {
-                       int j;
-                       DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot);
-                       for(j=0; j<4; j++)
-                               DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap);
-                       DBG("\n");
-               }
-#endif
-               busmap[e->bus] = 1;
-       }
-       for(i = 1; i < 256; i++) {
-               if (!busmap[i] || pci_find_bus(0, i))
-                       continue;
-               if (pci_scan_bus(i, &pci_root_ops, NULL))
-                       printk(KERN_INFO "PCI: Discovered primary peer bus %02x [IRQ]\n", i);
-       }
-       pcibios_last_bus = -1;
-}
-
-/*
- *  Code for querying and setting of IRQ routes on various interrupt routers.
- */
-
-void eisa_set_level_irq(unsigned int irq)
-{
-       unsigned char mask = 1 << (irq & 7);
-       unsigned int port = 0x4d0 + (irq >> 3);
-       unsigned char val;
-       static u16 eisa_irq_mask;
-
-       if (irq >= 16 || (1 << irq) & eisa_irq_mask)
-               return;
-
-       eisa_irq_mask |= (1 << irq);
-       printk(KERN_DEBUG "PCI: setting IRQ %u as level-triggered\n", irq);
-       val = inb(port);
-       if (!(val & mask)) {
-               DBG(KERN_DEBUG " -> edge");
-               outb(val | mask, port);
-       }
-}
-
-/*
- * Common IRQ routing practice: nybbles in config space,
- * offset by some magic constant.
- */
-static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
-{
-       u8 x;
-       unsigned reg = offset + (nr >> 1);
-
-       pci_read_config_byte(router, reg, &x);
-       return (nr & 1) ? (x >> 4) : (x & 0xf);
-}
-
-static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val)
-{
-       u8 x;
-       unsigned reg = offset + (nr >> 1);
-
-       pci_read_config_byte(router, reg, &x);
-       x = (nr & 1) ? ((x & 0x0f) | (val << 4)) : ((x & 0xf0) | val);
-       pci_write_config_byte(router, reg, x);
-}
-
-/*
- * ALI pirq entries are damn ugly, and completely undocumented.
- * This has been figured out from pirq tables, and it's not a pretty
- * picture.
- */
-static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
-
-       return irqmap[read_config_nybble(router, 0x48, pirq-1)];
-}
-
-static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
-       unsigned int val = irqmap[irq];
-               
-       if (val) {
-               write_config_nybble(router, 0x48, pirq-1, val);
-               return 1;
-       }
-       return 0;
-}
-
-/*
- * The Intel PIIX4 pirq rules are fairly simple: "pirq" is
- * just a pointer to the config space.
- */
-static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       u8 x;
-
-       pci_read_config_byte(router, pirq, &x);
-       return (x < 16) ? x : 0;
-}
-
-static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       pci_write_config_byte(router, pirq, irq);
-       return 1;
-}
-
-/*
- * The VIA pirq rules are nibble-based, like ALI,
- * but without the ugly irq number munging.
- * However, PIRQD is in the upper instead of lower 4 bits.
- */
-static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
-}
-
-static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
-       return 1;
-}
-
-/*
- * The VIA pirq rules are nibble-based, like ALI,
- * but without the ugly irq number munging.
- * However, for 82C586, nibble map is different .
- */
-static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       static const unsigned int pirqmap[4] = { 3, 2, 5, 1 };
-       return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
-}
-
-static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       static const unsigned int pirqmap[4] = { 3, 2, 5, 1 };
-       write_config_nybble(router, 0x55, pirqmap[pirq-1], irq);
-       return 1;
-}
-
-/*
- * ITE 8330G pirq rules are nibble-based
- * FIXME: pirqmap may be { 1, 0, 3, 2 },
- *       2+3 are both mapped to irq 9 on my system
- */
-static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
-       return read_config_nybble(router,0x43, pirqmap[pirq-1]);
-}
-
-static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
-       write_config_nybble(router, 0x43, pirqmap[pirq-1], irq);
-       return 1;
-}
-
-/*
- * OPTI: high four bits are nibble pointer..
- * I wonder what the low bits do?
- */
-static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       return read_config_nybble(router, 0xb8, pirq >> 4);
-}
-
-static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       write_config_nybble(router, 0xb8, pirq >> 4, irq);
-       return 1;
-}
-
-/*
- * Cyrix: nibble offset 0x5C
- * 0x5C bits 7:4 is INTB bits 3:0 is INTA 
- * 0x5D bits 7:4 is INTD bits 3:0 is INTC
- */
-static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       return read_config_nybble(router, 0x5C, (pirq-1)^1);
-}
-
-static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
-       return 1;
-}
-
-/*
- *     PIRQ routing for SiS 85C503 router used in several SiS chipsets.
- *     We have to deal with the following issues here:
- *     - vendors have different ideas about the meaning of link values
- *     - some onboard devices (integrated in the chipset) have special
- *       links and are thus routed differently (i.e. not via PCI INTA-INTD)
- *     - different revision of the router have a different layout for
- *       the routing registers, particularly for the onchip devices
- *
- *     For all routing registers the common thing is we have one byte
- *     per routeable link which is defined as:
- *              bit 7      IRQ mapping enabled (0) or disabled (1)
- *              bits [6:4] reserved (sometimes used for onchip devices)
- *              bits [3:0] IRQ to map to
- *                  allowed: 3-7, 9-12, 14-15
- *                  reserved: 0, 1, 2, 8, 13
- *
- *     The config-space registers located at 0x41/0x42/0x43/0x44 are
- *     always used to route the normal PCI INT A/B/C/D respectively.
- *     Apparently there are systems implementing PCI routing table using
- *     link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D.
- *     We try our best to handle both link mappings.
- *     
- *     Currently (2003-05-21) it appears most SiS chipsets follow the
- *     definition of routing registers from the SiS-5595 southbridge.
- *     According to the SiS 5595 datasheets the revision id's of the
- *     router (ISA-bridge) should be 0x01 or 0xb0.
- *
- *     Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1.
- *     Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets.
- *     They seem to work with the current routing code. However there is
- *     some concern because of the two USB-OHCI HCs (original SiS 5595
- *     had only one). YMMV.
- *
- *     Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1:
- *
- *     0x61:   IDEIRQ:
- *             bits [6:5] must be written 01
- *             bit 4 channel-select primary (0), secondary (1)
- *
- *     0x62:   USBIRQ:
- *             bit 6 OHCI function disabled (0), enabled (1)
- *     
- *     0x6a:   ACPI/SCI IRQ: bits 4-6 reserved
- *
- *     0x7e:   Data Acq. Module IRQ - bits 4-6 reserved
- *
- *     We support USBIRQ (in addition to INTA-INTD) and keep the
- *     IDE, ACPI and DAQ routing untouched as set by the BIOS.
- *
- *     Currently the only reported exception is the new SiS 65x chipset
- *     which includes the SiS 69x southbridge. Here we have the 85C503
- *     router revision 0x04 and there are changes in the register layout
- *     mostly related to the different USB HCs with USB 2.0 support.
- *
- *     Onchip routing for router rev-id 0x04 (try-and-error observation)
- *
- *     0x60/0x61/0x62/0x63:    1xEHCI and 3xOHCI (companion) USB-HCs
- *                             bit 6-4 are probably unused, not like 5595
- */
-
-#define PIRQ_SIS_IRQ_MASK      0x0f
-#define PIRQ_SIS_IRQ_DISABLE   0x80
-#define PIRQ_SIS_USB_ENABLE    0x40
-
-static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       u8 x;
-       int reg;
-
-       reg = pirq;
-       if (reg >= 0x01 && reg <= 0x04)
-               reg += 0x40;
-       pci_read_config_byte(router, reg, &x);
-       return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK);
-}
-
-static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       u8 x;
-       int reg;
-
-       reg = pirq;
-       if (reg >= 0x01 && reg <= 0x04)
-               reg += 0x40;
-       pci_read_config_byte(router, reg, &x);
-       x &= ~(PIRQ_SIS_IRQ_MASK | PIRQ_SIS_IRQ_DISABLE);
-       x |= irq ? irq: PIRQ_SIS_IRQ_DISABLE;
-       pci_write_config_byte(router, reg, x);
-       return 1;
-}
-
-
-/*
- * VLSI: nibble offset 0x74 - educated guess due to routing table and
- *       config space of VLSI 82C534 PCI-bridge/router (1004:0102)
- *       Tested on HP OmniBook 800 covering PIRQ 1, 2, 4, 8 for onboard
- *       devices, PIRQ 3 for non-pci(!) soundchip and (untested) PIRQ 6
- *       for the busbridge to the docking station.
- */
-
-static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       if (pirq > 8) {
-               printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq);
-               return 0;
-       }
-       return read_config_nybble(router, 0x74, pirq-1);
-}
-
-static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       if (pirq > 8) {
-               printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq);
-               return 0;
-       }
-       write_config_nybble(router, 0x74, pirq-1, irq);
-       return 1;
-}
-
-/*
- * ServerWorks: PCI interrupts mapped to system IRQ lines through Index
- * and Redirect I/O registers (0x0c00 and 0x0c01).  The Index register
- * format is (PCIIRQ## | 0x10), e.g.: PCIIRQ10=0x1a.  The Redirect
- * register is a straight binary coding of desired PIC IRQ (low nibble).
- *
- * The 'link' value in the PIRQ table is already in the correct format
- * for the Index register.  There are some special index values:
- * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1,
- * and 0x03 for SMBus.
- */
-static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       outb_p(pirq, 0xc00);
-       return inb(0xc01) & 0xf;
-}
-
-static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       outb_p(pirq, 0xc00);
-       outb_p(irq, 0xc01);
-       return 1;
-}
-
-/* Support for AMD756 PCI IRQ Routing
- * Jhon H. Caicedo <jhcaiced@osso.org.co>
- * Jun/21/2001 0.2.0 Release, fixed to use "nybble" functions... (jhcaiced)
- * Jun/19/2001 Alpha Release 0.1.0 (jhcaiced)
- * The AMD756 pirq rules are nibble-based
- * offset 0x56 0-3 PIRQA  4-7  PIRQB
- * offset 0x57 0-3 PIRQC  4-7  PIRQD
- */
-static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-{
-       u8 irq;
-       irq = 0;
-       if (pirq <= 4)
-       {
-               irq = read_config_nybble(router, 0x56, pirq - 1);
-       }
-       printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
-               dev->vendor, dev->device, pirq, irq);
-       return irq;
-}
-
-static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", 
-               dev->vendor, dev->device, pirq, irq);
-       if (pirq <= 4)
-       {
-               write_config_nybble(router, 0x56, pirq - 1, irq);
-       }
-       return 1;
-}
-
-#ifdef CONFIG_PCI_BIOS
-
-static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-{
-       struct pci_dev *bridge;
-       int pin = pci_get_interrupt_pin(dev, &bridge);
-       return pcibios_set_irq_routing(bridge, pin, irq);
-}
-
-#endif
-
-static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       static struct pci_device_id __initdata pirq_440gx[] = {
-               { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
-               { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
-               { },
-       };
-
-       /* 440GX has a proprietary PIRQ router -- don't use it */
-       if (pci_dev_present(pirq_440gx))
-               return 0;
-
-       switch(device)
-       {
-               case PCI_DEVICE_ID_INTEL_82371FB_0:
-               case PCI_DEVICE_ID_INTEL_82371SB_0:
-               case PCI_DEVICE_ID_INTEL_82371AB_0:
-               case PCI_DEVICE_ID_INTEL_82371MX:
-               case PCI_DEVICE_ID_INTEL_82443MX_0:
-               case PCI_DEVICE_ID_INTEL_82801AA_0:
-               case PCI_DEVICE_ID_INTEL_82801AB_0:
-               case PCI_DEVICE_ID_INTEL_82801BA_0:
-               case PCI_DEVICE_ID_INTEL_82801BA_10:
-               case PCI_DEVICE_ID_INTEL_82801CA_0:
-               case PCI_DEVICE_ID_INTEL_82801CA_12:
-               case PCI_DEVICE_ID_INTEL_82801DB_0:
-               case PCI_DEVICE_ID_INTEL_82801E_0:
-               case PCI_DEVICE_ID_INTEL_82801EB_0:
-               case PCI_DEVICE_ID_INTEL_ESB_1:
-               case PCI_DEVICE_ID_INTEL_ICH6_0:
-               case PCI_DEVICE_ID_INTEL_ICH6_1:
-               case PCI_DEVICE_ID_INTEL_ICH7_0:
-               case PCI_DEVICE_ID_INTEL_ICH7_1:
-               case PCI_DEVICE_ID_INTEL_ICH7_30:
-               case PCI_DEVICE_ID_INTEL_ICH7_31:
-               case PCI_DEVICE_ID_INTEL_ESB2_0:
-               case PCI_DEVICE_ID_INTEL_ICH8_0:
-               case PCI_DEVICE_ID_INTEL_ICH8_1:
-               case PCI_DEVICE_ID_INTEL_ICH8_2:
-               case PCI_DEVICE_ID_INTEL_ICH8_3:
-               case PCI_DEVICE_ID_INTEL_ICH8_4:
-                       r->name = "PIIX/ICH";
-                       r->get = pirq_piix_get;
-                       r->set = pirq_piix_set;
-                       return 1;
-       }
-       return 0;
-}
-
-static __init int via_router_probe(struct irq_router *r,
-                               struct pci_dev *router, u16 device)
-{
-       /* FIXME: We should move some of the quirk fixup stuff here */
-
-       /*
-        * work arounds for some buggy BIOSes
-        */
-       if (device == PCI_DEVICE_ID_VIA_82C586_0) {
-               switch(router->device) {
-               case PCI_DEVICE_ID_VIA_82C686:
-                       /*
-                        * Asus k7m bios wrongly reports 82C686A
-                        * as 586-compatible
-                        */
-                       device = PCI_DEVICE_ID_VIA_82C686;
-                       break;
-               case PCI_DEVICE_ID_VIA_8235:
-                       /**
-                        * Asus a7v-x bios wrongly reports 8235
-                        * as 586-compatible
-                        */
-                       device = PCI_DEVICE_ID_VIA_8235;
-                       break;
-               }
-       }
-
-       switch(device) {
-       case PCI_DEVICE_ID_VIA_82C586_0:
-               r->name = "VIA";
-               r->get = pirq_via586_get;
-               r->set = pirq_via586_set;
-               return 1;
-       case PCI_DEVICE_ID_VIA_82C596:
-       case PCI_DEVICE_ID_VIA_82C686:
-       case PCI_DEVICE_ID_VIA_8231:
-       case PCI_DEVICE_ID_VIA_8233A:
-       case PCI_DEVICE_ID_VIA_8235:
-       case PCI_DEVICE_ID_VIA_8237:
-               /* FIXME: add new ones for 8233/5 */
-               r->name = "VIA";
-               r->get = pirq_via_get;
-               r->set = pirq_via_set;
-               return 1;
-       }
-       return 0;
-}
-
-static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_VLSI_82C534:
-                       r->name = "VLSI 82C534";
-                       r->get = pirq_vlsi_get;
-                       r->set = pirq_vlsi_set;
-                       return 1;
-       }
-       return 0;
-}
-
-
-static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_SERVERWORKS_OSB4:
-               case PCI_DEVICE_ID_SERVERWORKS_CSB5:
-                       r->name = "ServerWorks";
-                       r->get = pirq_serverworks_get;
-                       r->set = pirq_serverworks_set;
-                       return 1;
-       }
-       return 0;
-}
-
-static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       if (device != PCI_DEVICE_ID_SI_503)
-               return 0;
-               
-       r->name = "SIS";
-       r->get = pirq_sis_get;
-       r->set = pirq_sis_set;
-       return 1;
-}
-
-static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_CYRIX_5520:
-                       r->name = "NatSemi";
-                       r->get = pirq_cyrix_get;
-                       r->set = pirq_cyrix_set;
-                       return 1;
-       }
-       return 0;
-}
-
-static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_OPTI_82C700:
-                       r->name = "OPTI";
-                       r->get = pirq_opti_get;
-                       r->set = pirq_opti_set;
-                       return 1;
-       }
-       return 0;
-}
-
-static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_ITE_IT8330G_0:
-                       r->name = "ITE";
-                       r->get = pirq_ite_get;
-                       r->set = pirq_ite_set;
-                       return 1;
-       }
-       return 0;
-}
-
-static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-       case PCI_DEVICE_ID_AL_M1533:
-       case PCI_DEVICE_ID_AL_M1563:
-               printk(KERN_DEBUG "PCI: Using ALI IRQ Router\n");
-               r->name = "ALI";
-               r->get = pirq_ali_get;
-               r->set = pirq_ali_set;
-               return 1;
-       }
-       return 0;
-}
-
-static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-{
-       switch(device)
-       {
-               case PCI_DEVICE_ID_AMD_VIPER_740B:
-                       r->name = "AMD756";
-                       break;
-               case PCI_DEVICE_ID_AMD_VIPER_7413:
-                       r->name = "AMD766";
-                       break;
-               case PCI_DEVICE_ID_AMD_VIPER_7443:
-                       r->name = "AMD768";
-                       break;
-               default:
-                       return 0;
-       }
-       r->get = pirq_amd756_get;
-       r->set = pirq_amd756_set;
-       return 1;
-}
-               
-static __initdata struct irq_router_handler pirq_routers[] = {
-       { PCI_VENDOR_ID_INTEL, intel_router_probe },
-       { PCI_VENDOR_ID_AL, ali_router_probe },
-       { PCI_VENDOR_ID_ITE, ite_router_probe },
-       { PCI_VENDOR_ID_VIA, via_router_probe },
-       { PCI_VENDOR_ID_OPTI, opti_router_probe },
-       { PCI_VENDOR_ID_SI, sis_router_probe },
-       { PCI_VENDOR_ID_CYRIX, cyrix_router_probe },
-       { PCI_VENDOR_ID_VLSI, vlsi_router_probe },
-       { PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe },
-       { PCI_VENDOR_ID_AMD, amd_router_probe },
-       /* Someone with docs needs to add the ATI Radeon IGP */
-       { 0, NULL }
-};
-static struct irq_router pirq_router;
-static struct pci_dev *pirq_router_dev;
-
-
-/*
- *     FIXME: should we have an option to say "generic for
- *     chipset" ?
- */
-static void __init pirq_find_router(struct irq_router *r)
-{
-       struct irq_routing_table *rt = pirq_table;
-       struct irq_router_handler *h;
-
-#ifdef CONFIG_PCI_BIOS
-       if (!rt->signature) {
-               printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n");
-               r->set = pirq_bios_set;
-               r->name = "BIOS";
-               return;
-       }
-#endif
-
-       /* Default unless a driver reloads it */
-       r->name = "default";
-       r->get = NULL;
-       r->set = NULL;
-       
-       DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n",
-           rt->rtr_vendor, rt->rtr_device);
-
-       pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn);
-       if (!pirq_router_dev) {
-               DBG(KERN_DEBUG "PCI: Interrupt router not found at "
-                       "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn);
-               return;
-       }
-
-       for( h = pirq_routers; h->vendor; h++) {
-               /* First look for a router match */
-               if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device))
-                       break;
-               /* Fall back to a device match */
-               if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device))
-                       break;
-       }
-       printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n",
-               pirq_router.name,
-               pirq_router_dev->vendor,
-               pirq_router_dev->device,
-               pci_name(pirq_router_dev));
-}
-
-static struct irq_info *pirq_get_info(struct pci_dev *dev)
-{
-       struct irq_routing_table *rt = pirq_table;
-       int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info);
-       struct irq_info *info;
-
-       for (info = rt->slots; entries--; info++)
-               if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn))
-                       return info;
-       return NULL;
-}
-
-static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
-{
-       u8 pin;
-       struct irq_info *info;
-       int i, pirq, newirq;
-       int irq = 0;
-       u32 mask;
-       struct irq_router *r = &pirq_router;
-       struct pci_dev *dev2 = NULL;
-       char *msg = NULL;
-
-       /* Find IRQ pin */
-       pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-       if (!pin) {
-               DBG(KERN_DEBUG " -> no interrupt pin\n");
-               return 0;
-       }
-       pin = pin - 1;
-
-       /* Find IRQ routing entry */
-
-       if (!pirq_table)
-               return 0;
-       
-       DBG(KERN_DEBUG "IRQ for %s[%c]", pci_name(dev), 'A' + pin);
-       info = pirq_get_info(dev);
-       if (!info) {
-               DBG(" -> not found in routing table\n" KERN_DEBUG);
-               return 0;
-       }
-       pirq = info->irq[pin].link;
-       mask = info->irq[pin].bitmap;
-       if (!pirq) {
-               DBG(" -> not routed\n" KERN_DEBUG);
-               return 0;
-       }
-       DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs);
-       mask &= pcibios_irq_mask;
-
-       /* Work around broken HP Pavilion Notebooks which assign USB to
-          IRQ 9 even though it is actually wired to IRQ 11 */
-
-       if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) {
-               dev->irq = 11;
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
-               r->set(pirq_router_dev, dev, pirq, 11);
-       }
-
-       /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */
-       if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) {
-               pirq = 0x68;
-               mask = 0x400;
-               dev->irq = r->get(pirq_router_dev, dev, pirq);
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
-       }
-
-       /*
-        * Find the best IRQ to assign: use the one
-        * reported by the device if possible.
-        */
-       newirq = dev->irq;
-       if (newirq && !((1 << newirq) & mask)) {
-               if ( pci_probe & PCI_USE_PIRQ_MASK) newirq = 0;
-               else printk("\n" KERN_WARNING
-                       "PCI: IRQ %i for device %s doesn't match PIRQ mask "
-                       "- try pci=usepirqmask\n" KERN_DEBUG, newirq,
-                       pci_name(dev));
-       }
-       if (!newirq && assign) {
-               for (i = 0; i < 16; i++) {
-                       if (!(mask & (1 << i)))
-                               continue;
-                       if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED))
-                               newirq = i;
-               }
-       }
-       DBG(" -> newirq=%d", newirq);
-
-       /* Check if it is hardcoded */
-       if ((pirq & 0xf0) == 0xf0) {
-               irq = pirq & 0xf;
-               DBG(" -> hardcoded IRQ %d\n", irq);
-               msg = "Hardcoded";
-       } else if ( r->get && (irq = r->get(pirq_router_dev, dev, pirq)) && \
-       ((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask)) ) {
-               DBG(" -> got IRQ %d\n", irq);
-               msg = "Found";
-               eisa_set_level_irq(irq);
-       } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
-               DBG(" -> assigning IRQ %d", newirq);
-               if (r->set(pirq_router_dev, dev, pirq, newirq)) {
-                       eisa_set_level_irq(newirq);
-                       DBG(" ... OK\n");
-                       msg = "Assigned";
-                       irq = newirq;
-               }
-       }
-
-       if (!irq) {
-               DBG(" ... failed\n");
-               if (newirq && mask == (1 << newirq)) {
-                       msg = "Guessed";
-                       irq = newirq;
-               } else
-                       return 0;
-       }
-       printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev));
-
-       /* Update IRQ for all devices with the same pirq value */
-       while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) {
-               pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin);
-               if (!pin)
-                       continue;
-               pin--;
-               info = pirq_get_info(dev2);
-               if (!info)
-                       continue;
-               if (info->irq[pin].link == pirq) {
-                       /* We refuse to override the dev->irq information. Give a warning! */
-                       if ( dev2->irq && dev2->irq != irq && \
-                       (!(pci_probe & PCI_USE_PIRQ_MASK) || \
-                       ((1 << dev2->irq) & mask)) ) {
-#ifndef CONFIG_PCI_MSI
-                               printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
-                                      pci_name(dev2), dev2->irq, irq);
-#endif
-                               continue;
-                       }
-                       dev2->irq = irq;
-                       pirq_penalty[irq]++;
-                       if (dev != dev2)
-                               printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2));
-               }
-       }
-       return 1;
-}
-
-static void __init pcibios_fixup_irqs(void)
-{
-       struct pci_dev *dev = NULL;
-       u8 pin;
-
-       DBG(KERN_DEBUG "PCI: IRQ fixup\n");
-       while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-               /*
-                * If the BIOS has set an out of range IRQ number, just ignore it.
-                * Also keep track of which IRQ's are already in use.
-                */
-               if (dev->irq >= 16) {
-                       DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq);
-                       dev->irq = 0;
-               }
-               /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */
-               if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000)
-                       pirq_penalty[dev->irq] = 0;
-               pirq_penalty[dev->irq]++;
-       }
-
-       dev = NULL;
-       while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-               pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-#ifdef CONFIG_X86_IO_APIC
-               /*
-                * Recalculate IRQ numbers if we use the I/O APIC.
-                */
-               if (io_apic_assign_pci_irqs)
-               {
-                       int irq;
-
-                       if (pin) {
-                               pin--;          /* interrupt pins are numbered starting from 1 */
-                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-       /*
-        * Busses behind bridges are typically not listed in the MP-table.
-        * In this case we have to look up the IRQ based on the parent bus,
-        * parent slot, and pin number. The SMP code detects such bridged
-        * busses itself so we should get into this branch reliably.
-        */
-                               if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-                                       struct pci_dev * bridge = dev->bus->self;
-
-                                       pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-                                       irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-                                                       PCI_SLOT(bridge->devfn), pin);
-                                       if (irq >= 0)
-                                               printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
-                                                       pci_name(bridge), 'A' + pin, irq);
-                               }
-                               if (irq >= 0) {
-                                       if (use_pci_vector() &&
-                                               !platform_legacy_irq(irq))
-                                               irq = IO_APIC_VECTOR(irq);
-
-                                       printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
-                                               pci_name(dev), 'A' + pin, irq);
-                                       dev->irq = irq;
-                               }
-                       }
-               }
-#endif
-               /*
-                * Still no IRQ? Try to lookup one...
-                */
-               if (pin && !dev->irq)
-                       pcibios_lookup_irq(dev, 0);
-       }
-}
-
-/*
- * Work around broken HP Pavilion Notebooks which assign USB to
- * IRQ 9 even though it is actually wired to IRQ 11
- */
-static int __init fix_broken_hp_bios_irq9(struct dmi_system_id *d)
-{
-       if (!broken_hp_bios_irq9) {
-               broken_hp_bios_irq9 = 1;
-               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
-       }
-       return 0;
-}
-
-/*
- * Work around broken Acer TravelMate 360 Notebooks which assign
- * Cardbus to IRQ 11 even though it is actually wired to IRQ 10
- */
-static int __init fix_acer_tm360_irqrouting(struct dmi_system_id *d)
-{
-       if (!acer_tm360_irqrouting) {
-               acer_tm360_irqrouting = 1;
-               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
-       }
-       return 0;
-}
-
-static struct dmi_system_id __initdata pciirq_dmi_table[] = {
-       {
-               .callback = fix_broken_hp_bios_irq9,
-               .ident = "HP Pavilion N5400 Series Laptop",
-               .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-                       DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"),
-                       DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),
-                       DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
-               },
-       },
-       {
-               .callback = fix_acer_tm360_irqrouting,
-               .ident = "Acer TravelMate 36x Laptop",
-               .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
-               },
-       },
-       { }
-};
-
-static int __init pcibios_irq_init(void)
-{
-       DBG(KERN_DEBUG "PCI: IRQ init\n");
-
-       if (pcibios_enable_irq || raw_pci_ops == NULL)
-               return 0;
-
-       dmi_check_system(pciirq_dmi_table);
-
-       pirq_table = pirq_find_routing_table();
-
-#ifdef CONFIG_PCI_BIOS
-       if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN))
-               pirq_table = pcibios_get_irq_routing_table();
-#endif
-       if (pirq_table) {
-               pirq_peer_trick();
-               pirq_find_router(&pirq_router);
-               if (pirq_table->exclusive_irqs) {
-                       int i;
-                       for (i=0; i<16; i++)
-                               if (!(pirq_table->exclusive_irqs & (1 << i)))
-                                       pirq_penalty[i] += 100;
-               }
-               /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */
-               if (io_apic_assign_pci_irqs)
-                       pirq_table = NULL;
-       }
-
-       pcibios_enable_irq = pirq_enable_irq;
-
-       pcibios_fixup_irqs();
-       return 0;
-}
-
-subsys_initcall(pcibios_irq_init);
-
-
-static void pirq_penalize_isa_irq(int irq, int active)
-{
-       /*
-        *  If any ISAPnP device reports an IRQ in its list of possible
-        *  IRQ's, we try to avoid assigning it to PCI devices.
-        */
-       if (irq < 16) {
-               if (active)
-                       pirq_penalty[irq] += 1000;
-               else
-                       pirq_penalty[irq] += 100;
-       }
-}
-
-void pcibios_penalize_isa_irq(int irq, int active)
-{
-#ifdef CONFIG_ACPI
-       if (!acpi_noirq)
-               acpi_penalize_isa_irq(irq, active);
-       else
-#endif
-               pirq_penalize_isa_irq(irq, active);
-}
-
-static int pirq_enable_irq(struct pci_dev *dev)
-{
-       u8 pin;
-       struct pci_dev *temp_dev;
-
-       pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-       if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
-               char *msg = "";
-
-               pin--;          /* interrupt pins are numbered starting from 1 */
-
-               if (io_apic_assign_pci_irqs) {
-                       int irq;
-
-                       irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-                       /*
-                        * Busses behind bridges are typically not listed in the MP-table.
-                        * In this case we have to look up the IRQ based on the parent bus,
-                        * parent slot, and pin number. The SMP code detects such bridged
-                        * busses itself so we should get into this branch reliably.
-                        */
-                       temp_dev = dev;
-                       while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-                               struct pci_dev * bridge = dev->bus->self;
-
-                               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-                               irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-                                               PCI_SLOT(bridge->devfn), pin);
-                               if (irq >= 0)
-                                       printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
-                                               pci_name(bridge), 'A' + pin, irq);
-                               dev = bridge;
-                       }
-                       dev = temp_dev;
-                       if (irq >= 0) {
-#ifdef CONFIG_PCI_MSI
-                               if (!platform_legacy_irq(irq))
-                                       irq = IO_APIC_VECTOR(irq);
-#endif
-                               printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
-                                       pci_name(dev), 'A' + pin, irq);
-                               dev->irq = irq;
-                               return 0;
-                       } else
-                               msg = " Probably buggy MP table.";
-               } else if (pci_probe & PCI_BIOS_IRQ_SCAN)
-                       msg = "";
-               else
-                       msg = " Please try using pci=biosirq.";
-
-               /* With IDE legacy devices the IRQ lookup failure is not a problem.. */
-               if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5))
-                       return 0;
-
-               printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
-                      'A' + pin, pci_name(dev), msg);
-       }
-       return 0;
-}
-
-int pci_vector_resources(int last, int nr_released)
-{
-       int count = nr_released;
-
-       int next = last;
-       int offset = (last % 8);
-
-       while (next < FIRST_SYSTEM_VECTOR) {
-               next += 8;
-#ifdef CONFIG_X86_64
-               if (next == IA32_SYSCALL_VECTOR)
-                       continue;
-#else
-               if (next == SYSCALL_VECTOR)
-                       continue;
-#endif
-               count++;
-               if (next >= FIRST_SYSTEM_VECTOR) {
-                       if (offset%8) {
-                               next = FIRST_DEVICE_VECTOR + offset;
-                               offset++;
-                               continue;
-                       }
-                       count--;
-               }
-       }
-
-       return count;
-}
diff --git a/linux-2.6-xen-sparse/arch/i386/pci/pcifront.c b/linux-2.6-xen-sparse/arch/i386/pci/pcifront.c
deleted file mode 100644 (file)
index 7009115..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * PCI Frontend Stub - puts some "dummy" functions in to the Linux x86 PCI core
- *                     to support the Xen PCI Frontend's operation
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <asm/acpi.h>
-#include "pci.h"
-
-static int pcifront_enable_irq(struct pci_dev *dev)
-{
-       u8 irq;
-       pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
-       dev->irq = irq;
-
-       return 0;
-}
-
-extern u8 pci_cache_line_size;
-
-static int __init pcifront_x86_stub_init(void)
-{
-       struct cpuinfo_x86 *c = &boot_cpu_data;
-
-       /* Only install our method if we haven't found real hardware already */
-       if (raw_pci_ops)
-               return 0;
-
-       printk(KERN_INFO "PCI: setting up Xen PCI frontend stub\n");
-
-       /* Copied from arch/i386/pci/common.c */
-       pci_cache_line_size = 32 >> 2;
-       if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD)
-               pci_cache_line_size = 64 >> 2;  /* K7 & K8 */
-       else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL)
-               pci_cache_line_size = 128 >> 2; /* P4 */
-
-       /* On x86, we need to disable the normal IRQ routing table and
-        * just ask the backend
-        */
-       pcibios_enable_irq = pcifront_enable_irq;
-       pcibios_disable_irq = NULL;
-
-#ifdef CONFIG_ACPI
-       /* Keep ACPI out of the picture */
-       acpi_noirq = 1;
-#endif
-
-       return 0;
-}
-
-arch_initcall(pcifront_x86_stub_init);
diff --git a/linux-2.6-xen-sparse/arch/i386/power/Makefile b/linux-2.6-xen-sparse/arch/i386/power/Makefile
deleted file mode 100644 (file)
index e74fee6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-obj-$(CONFIG_PM_LEGACY)                += cpu.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += cpu.o
-obj-$(CONFIG_ACPI_SLEEP)       += cpu.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o
diff --git a/linux-2.6-xen-sparse/arch/ia64/Kconfig b/linux-2.6-xen-sparse/arch/ia64/Kconfig
deleted file mode 100644 (file)
index 4991dd4..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-
-mainmenu "IA-64 Linux Kernel Configuration"
-
-source "init/Kconfig"
-
-menu "Processor type and features"
-
-config IA64
-       bool
-       default y
-       help
-         The Itanium Processor Family is Intel's 64-bit successor to
-         the 32-bit X86 line.  The IA-64 Linux project has a home
-         page at <http://www.linuxia64.org/> and a mailing list at
-         <linux-ia64@vger.kernel.org>.
-
-config 64BIT
-       bool
-       default y
-
-config MMU
-       bool
-       default y
-
-config SWIOTLB
-       bool
-       default y
-
-config RWSEM_XCHGADD_ALGORITHM
-       bool
-       default y
-
-config GENERIC_FIND_NEXT_BIT
-       bool
-       default y
-
-config GENERIC_CALIBRATE_DELAY
-       bool
-       default y
-
-config TIME_INTERPOLATION
-       bool
-       default y
-
-config DMI
-       bool
-       default y
-
-config EFI
-       bool
-       default y
-
-config GENERIC_IOMAP
-       bool
-       default y
-
-config XEN
-       bool "Xen hypervisor support"
-       default y
-       help
-         Enable Xen hypervisor support.  Resulting kernel runs
-         both as a guest OS on Xen and natively on hardware.
-
-config XEN_IA64_VDSO_PARAVIRT
-       bool
-       depends on XEN && !ITANIUM
-       default y
-       help
-         vDSO paravirtualization
-
-config XEN_IA64_EXPOSE_P2M
-       bool "Xen/IA64 exposure p2m table"
-       depends on XEN
-       default y
-       help
-         expose p2m from xen
-
-config XEN_IA64_EXPOSE_P2M_USE_DTR
-       bool "Xen/IA64 map p2m table with dtr"
-       depends on XEN_IA64_EXPOSE_P2M
-       default y
-       help
-         use dtr to map the exposed p2m table
-
-config SCHED_NO_NO_OMIT_FRAME_POINTER
-       bool
-       default y
-
-config IA64_UNCACHED_ALLOCATOR
-       bool
-       select GENERIC_ALLOCATOR
-
-config DMA_IS_DMA32
-       bool
-       default y
-
-config DMA_IS_NORMAL
-       bool
-       depends on IA64_SGI_SN2
-       default y
-
-config AUDIT_ARCH
-       bool
-       default y
-
-choice
-       prompt "System type"
-       default IA64_GENERIC
-
-config IA64_GENERIC
-       bool "generic"
-       select ACPI
-       select PCI
-       select NUMA
-       select ACPI_NUMA
-       help
-         This selects the system type of your hardware.  A "generic" kernel
-         will run on any supported IA-64 system.  However, if you configure
-         a kernel for your specific system, it will be faster and smaller.
-
-         generic               For any supported IA-64 system
-         DIG-compliant         For DIG ("Developer's Interface Guide") compliant systems
-         HP-zx1/sx1000         For HP systems
-         HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices.
-         SGI-SN2               For SGI Altix systems
-         Ski-simulator         For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>
-
-         If you don't know what to do, choose "generic".
-
-config IA64_DIG
-       bool "DIG-compliant"
-
-config IA64_HP_ZX1
-       bool "HP-zx1/sx1000"
-       help
-         Build a kernel that runs on HP zx1 and sx1000 systems.  This adds
-         support for the HP I/O MMU.
-
-config IA64_HP_ZX1_SWIOTLB
-       bool "HP-zx1/sx1000 with software I/O TLB"
-       help
-         Build a kernel that runs on HP zx1 and sx1000 systems even when they
-         have broken PCI devices which cannot DMA to full 32 bits.  Apart
-         from support for the HP I/O MMU, this includes support for the software
-         I/O TLB, which allows supporting the broken devices at the expense of
-         wasting some kernel memory (about 2MB by default).
-
-config IA64_SGI_SN2
-       bool "SGI-SN2"
-       help
-         Selecting this option will optimize the kernel for use on sn2 based
-         systems, but the resulting kernel binary will not run on other
-         types of ia64 systems.  If you have an SGI Altix system, it's safe
-         to select this option.  If in doubt, select ia64 generic support
-         instead.
-
-config IA64_HP_SIM
-       bool "Ski-simulator"
-
-config IA64_XEN
-       bool "Xen guest"
-       depends on XEN
-
-endchoice
-
-choice
-       prompt "Processor type"
-       default ITANIUM
-
-config ITANIUM
-       bool "Itanium"
-       help
-         Select your IA-64 processor type.  The default is Itanium.
-         This choice is safe for all IA-64 systems, but may not perform
-         optimally on systems with, say, Itanium 2 or newer processors.
-
-config MCKINLEY
-       bool "Itanium 2"
-       help
-         Select this to configure for an Itanium 2 (McKinley) processor.
-
-endchoice
-
-choice
-       prompt "Kernel page size"
-       default IA64_PAGE_SIZE_16KB
-
-config IA64_PAGE_SIZE_4KB
-       bool "4KB"
-       help
-         This lets you select the page size of the kernel.  For best IA-64
-         performance, a page size of 8KB or 16KB is recommended.  For best
-         IA-32 compatibility, a page size of 4KB should be selected (the vast
-         majority of IA-32 binaries work perfectly fine with a larger page
-         size).  For Itanium 2 or newer systems, a page size of 64KB can also
-         be selected.
-
-         4KB                For best IA-32 compatibility
-         8KB                For best IA-64 performance
-         16KB               For best IA-64 performance
-         64KB               Requires Itanium 2 or newer processor.
-
-         If you don't know what to do, choose 16KB.
-
-config IA64_PAGE_SIZE_8KB
-       bool "8KB"
-
-config IA64_PAGE_SIZE_16KB
-       bool "16KB"
-
-config IA64_PAGE_SIZE_64KB
-       depends on !ITANIUM
-       bool "64KB"
-
-endchoice
-
-choice
-       prompt "Page Table Levels"
-       default PGTABLE_3
-
-config PGTABLE_3
-       bool "3 Levels"
-
-config PGTABLE_4
-       depends on !IA64_PAGE_SIZE_64KB
-       bool "4 Levels"
-
-endchoice
-
-source kernel/Kconfig.hz
-
-config IA64_BRL_EMU
-       bool
-       depends on ITANIUM
-       default y
-
-# align cache-sensitive data to 128 bytes
-config IA64_L1_CACHE_SHIFT
-       int
-       default "7" if MCKINLEY
-       default "6" if ITANIUM
-
-config IA64_CYCLONE
-       bool "Cyclone (EXA) Time Source support"
-       help
-         Say Y here to enable support for IBM EXA Cyclone time source.
-         If you're unsure, answer N.
-
-config IOSAPIC
-       bool
-       depends on !IA64_HP_SIM
-       default y
-
-config IA64_SGI_SN_XP
-       tristate "Support communication between SGI SSIs"
-       depends on IA64_GENERIC || IA64_SGI_SN2
-       select IA64_UNCACHED_ALLOCATOR
-       help
-         An SGI machine can be divided into multiple Single System
-         Images which act independently of each other and have
-         hardware based memory protection from the others.  Enabling
-         this feature will allow for direct communication between SSIs
-         based on a network adapter and DMA messaging.
-
-config FORCE_MAX_ZONEORDER
-       int "MAX_ORDER (11 - 17)"  if !HUGETLB_PAGE
-       range 11 17  if !HUGETLB_PAGE
-       default "17" if HUGETLB_PAGE
-       default "11"
-
-config SMP
-       bool "Symmetric multi-processing support"
-       help
-         This enables support for systems with more than one CPU. If you have
-         a system with only one CPU, say N.  If you have a system with more
-         than one CPU, say Y.
-
-         If you say N here, the kernel will run on single and multiprocessor
-         systems, but will use only one CPU of a multiprocessor system.  If
-         you say Y here, the kernel will run on many, but not all,
-         single processor systems.  On a single processor system, the kernel
-         will run faster if you say N here.
-
-         See also the <file:Documentation/smp.txt> and the SMP-HOWTO
-         available at <http://www.tldp.org/docs.html#howto>.
-
-         If you don't know what to do here, say N.
-
-config NR_CPUS
-       int "Maximum number of CPUs (2-1024)"
-       range 2 1024
-       depends on SMP
-       default "1024"
-       help
-         You should set this to the number of CPUs in your system, but
-         keep in mind that a kernel compiled for, e.g., 2 CPUs will boot but
-         only use 2 CPUs on a >2 CPU system.  Setting this to a value larger
-         than 64 will cause the use of a CPU mask array, causing a small
-         performance hit.
-
-config HOTPLUG_CPU
-       bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
-       depends on SMP && EXPERIMENTAL
-       select HOTPLUG
-       default n
-       ---help---
-         Say Y here to experiment with turning CPUs off and on.  CPUs
-         can be controlled through /sys/devices/system/cpu/cpu#.
-         Say N if you want to disable CPU hotplug.
-
-config ARCH_ENABLE_MEMORY_HOTPLUG
-       def_bool y
-
-config SCHED_SMT
-       bool "SMT scheduler support"
-       depends on SMP
-       help
-         Improves the CPU scheduler's decision making when dealing with
-         Intel IA64 chips with MultiThreading at a cost of slightly increased
-         overhead in some places. If unsure say N here.
-
-config PERMIT_BSP_REMOVE
-       bool "Support removal of Bootstrap Processor"
-       depends on HOTPLUG_CPU
-       default n
-       ---help---
-       Say Y here if your platform SAL will support removal of BSP with HOTPLUG_CPU
-       support. 
-
-config FORCE_CPEI_RETARGET
-       bool "Force assumption that CPEI can be re-targetted"
-       depends on PERMIT_BSP_REMOVE
-       default n
-       ---help---
-       Say Y if you need to force the assumption that CPEI can be re-targetted to
-       any cpu in the system. This hint is available via ACPI 3.0 specifications.
-       Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP.
-       This option it useful to enable this feature on older BIOS's as well.
-       You can also enable this by using boot command line option force_cpei=1.
-
-config PREEMPT
-       bool "Preemptible Kernel"
-        help
-          This option reduces the latency of the kernel when reacting to
-          real-time or interactive events by allowing a low priority process to
-          be preempted even if it is in kernel mode executing a system call.
-          This allows applications to run more reliably even when the system is
-          under load.
-
-          Say Y here if you are building a kernel for a desktop, embedded
-          or real-time system.  Say N if you are unsure.
-
-source "mm/Kconfig"
-
-config ARCH_SELECT_MEMORY_MODEL
-       def_bool y
-
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       help
-         Say Y to support efficient handling of discontiguous physical memory,
-         for architectures which are either NUMA (Non-Uniform Memory Access)
-         or have huge holes in the physical address space for other reasons.
-         See <file:Documentation/vm/numa> for more.
-
-config ARCH_FLATMEM_ENABLE
-       def_bool y
-
-config ARCH_SPARSEMEM_ENABLE
-       def_bool y
-       depends on ARCH_DISCONTIGMEM_ENABLE
-
-config ARCH_DISCONTIGMEM_DEFAULT
-       def_bool y if (IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB)
-       depends on ARCH_DISCONTIGMEM_ENABLE
-
-config NUMA
-       bool "NUMA support"
-       depends on !IA64_HP_SIM && !FLATMEM
-       default y if IA64_SGI_SN2
-       help
-         Say Y to compile the kernel to support NUMA (Non-Uniform Memory
-         Access).  This option is for configuring high-end multiprocessor
-         server systems.  If in doubt, say N.
-
-config NODES_SHIFT
-       int "Max num nodes shift(3-10)"
-       range 3 10
-       default "10"
-       depends on NEED_MULTIPLE_NODES
-       help
-         This option specifies the maximum number of nodes in your SSI system.
-         MAX_NUMNODES will be 2^(This value).
-         If in doubt, use the default.
-
-# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
-# VIRTUAL_MEM_MAP has been retained for historical reasons.
-config VIRTUAL_MEM_MAP
-       bool "Virtual mem map"
-       depends on !SPARSEMEM
-       default y if !IA64_HP_SIM
-       help
-         Say Y to compile the kernel with support for a virtual mem map.
-         This code also only takes effect if a memory hole of greater than
-         1 Gb is found during boot.  You must turn this option on if you
-         require the DISCONTIGMEM option for your machine. If you are
-         unsure, say Y.
-
-config HOLES_IN_ZONE
-       bool
-       default y if VIRTUAL_MEM_MAP
-
-config HAVE_ARCH_EARLY_PFN_TO_NID
-       def_bool y
-       depends on NEED_MULTIPLE_NODES
-
-config HAVE_ARCH_NODEDATA_EXTENSION
-       def_bool y
-       depends on NUMA
-
-config IA32_SUPPORT
-       bool "Support for Linux/x86 binaries"
-       help
-         IA-64 processors can execute IA-32 (X86) instructions.  By
-         saying Y here, the kernel will include IA-32 system call
-         emulation support which makes it possible to transparently
-         run IA-32 Linux binaries on an IA-64 Linux system.
-         If in doubt, say Y.
-
-config COMPAT
-       bool
-       depends on IA32_SUPPORT
-       default y
-
-config IA64_MCA_RECOVERY
-       tristate "MCA recovery from errors other than TLB."
-
-config PERFMON
-       bool "Performance monitor support"
-       help
-         Selects whether support for the IA-64 performance monitor hardware
-         is included in the kernel.  This makes some kernel data-structures a
-         little bigger and slows down execution a bit, but it is generally
-         a good idea to turn this on.  If you're unsure, say Y.
-
-config IA64_PALINFO
-       tristate "/proc/pal support"
-       help
-         If you say Y here, you are able to get PAL (Processor Abstraction
-         Layer) information in /proc/pal.  This contains useful information
-         about the processors in your systems, such as cache and TLB sizes
-         and the PAL firmware version in use.
-
-         To use this option, you have to ensure that the "/proc file system
-         support" (CONFIG_PROC_FS) is enabled, too.
-
-config SGI_SN
-       def_bool y if (IA64_SGI_SN2 || IA64_GENERIC)
-
-source "drivers/sn/Kconfig"
-
-source "drivers/firmware/Kconfig"
-
-source "fs/Kconfig.binfmt"
-
-endmenu
-
-menu "Power management and ACPI"
-
-source "kernel/power/Kconfig"
-
-source "drivers/acpi/Kconfig"
-
-if PM
-
-source "arch/ia64/kernel/cpufreq/Kconfig"
-
-endif
-
-endmenu
-
-if !IA64_HP_SIM
-
-menu "Bus options (PCI, PCMCIA)"
-
-config PCI
-       bool "PCI support"
-       help
-         Real IA-64 machines all have PCI/PCI-X/PCI Express busses.  Say Y
-         here unless you are using a simulator without PCI support.
-
-config PCI_DOMAINS
-       bool
-       default PCI
-
-config XEN_PCIDEV_FRONTEND
-       bool "Xen PCI Frontend"
-       depends on PCI && XEN
-       default y
-       help
-         The PCI device frontend driver allows the kernel to import arbitrary
-         PCI devices from a PCI backend to support PCI driver domains.
-
-config XEN_PCIDEV_FE_DEBUG
-       bool "Xen PCI Frontend Debugging"
-       depends on XEN_PCIDEV_FRONTEND
-       default n
-       help
-         Enables some debug statements within the PCI Frontend.
-
-source "drivers/pci/pcie/Kconfig"
-
-source "drivers/pci/Kconfig"
-
-source "drivers/pci/hotplug/Kconfig"
-
-source "drivers/pcmcia/Kconfig"
-
-endmenu
-
-endif
-
-source "net/Kconfig"
-
-source "drivers/Kconfig"
-
-source "fs/Kconfig"
-
-source "lib/Kconfig"
-
-#
-# Use the generic interrupt handling code in kernel/irq/:
-#
-config GENERIC_HARDIRQS
-       bool
-       default y
-
-config GENERIC_IRQ_PROBE
-       bool
-       default y
-
-config GENERIC_PENDING_IRQ
-       bool
-       depends on GENERIC_HARDIRQS && SMP
-       default y
-
-config IRQ_PER_CPU
-       bool
-       default y
-
-source "arch/ia64/hp/sim/Kconfig"
-
-menu "Instrumentation Support"
-        depends on EXPERIMENTAL
-
-source "arch/ia64/oprofile/Kconfig"
-
-config KPROBES
-       bool "Kprobes (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && MODULES
-       help
-         Kprobes allows you to trap at almost any kernel address and
-         execute a callback function.  register_kprobe() establishes
-         a probepoint and specifies the callback.  Kprobes is useful
-         for kernel debugging, non-intrusive instrumentation and testing.
-         If in doubt, say "N".
-endmenu
-
-source "arch/ia64/Kconfig.debug"
-
-source "security/Kconfig"
-
-source "crypto/Kconfig"
-
-#
-# override default values of drivers/xen/Kconfig
-#
-if XEN
-config XEN_SMPBOOT
-       default n
-endif
-
-source "drivers/xen/Kconfig"
diff --git a/linux-2.6-xen-sparse/arch/ia64/Makefile b/linux-2.6-xen-sparse/arch/ia64/Makefile
deleted file mode 100644 (file)
index 9c7c056..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-#
-# ia64/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies.
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (C) 1998-2004 by David Mosberger-Tang <davidm@hpl.hp.com>
-#
-
-NM := $(CROSS_COMPILE)nm -B
-READELF := $(CROSS_COMPILE)readelf
-
-export AWK
-
-CHECKFLAGS     += -m64 -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
-
-OBJCOPYFLAGS   := --strip-all
-LDFLAGS_vmlinux        := -static
-LDFLAGS_MODULE += -T $(srctree)/arch/ia64/module.lds
-AFLAGS_KERNEL  := -mconstant-gp
-EXTRA          :=
-
-cflags-y       := -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f12-f15,f32-f127 \
-                  -falign-functions=32 -frename-registers -fno-optimize-sibling-calls
-CFLAGS_KERNEL  := -mconstant-gp
-
-GAS_STATUS     = $(shell $(srctree)/arch/ia64/scripts/check-gas "$(CC)" "$(OBJDUMP)")
-CPPFLAGS += $(shell $(srctree)/arch/ia64/scripts/toolchain-flags "$(CC)" "$(OBJDUMP)" "$(READELF)")
-
-ifeq ($(GAS_STATUS),buggy)
-$(error Sorry, you need a newer version of the assember, one that is built from        \
-       a source-tree that post-dates 18-Dec-2002.  You can find a pre-compiled \
-       static binary of such an assembler at:                                  \
-                                                                               \
-               ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz)
-endif
-
-ifeq ($(call cc-version),0304)
-       cflags-$(CONFIG_ITANIUM)        += -mtune=merced
-       cflags-$(CONFIG_MCKINLEY)       += -mtune=mckinley
-endif
-
-CFLAGS += $(cflags-y)
-
-cppflags-$(CONFIG_XEN) += \
-       -D__XEN_INTERFACE_VERSION__=$(CONFIG_XEN_INTERFACE_VERSION)
-
-CPPFLAGS += $(cppflags-y)
-
-head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o
-
-libs-y                         += arch/ia64/lib/
-core-y                         += arch/ia64/kernel/ arch/ia64/mm/
-core-$(CONFIG_IA32_SUPPORT)    += arch/ia64/ia32/
-core-$(CONFIG_IA64_DIG)        += arch/ia64/dig/
-core-$(CONFIG_IA64_GENERIC)    += arch/ia64/dig/
-core-$(CONFIG_IA64_HP_ZX1)     += arch/ia64/dig/
-core-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/dig/
-core-$(CONFIG_IA64_XEN)                += arch/ia64/dig/
-core-$(CONFIG_IA64_SGI_SN2)    += arch/ia64/sn/
-core-$(CONFIG_XEN)             += arch/ia64/xen/
-
-drivers-$(CONFIG_PCI)          += arch/ia64/pci/
-drivers-$(CONFIG_IA64_HP_SIM)  += arch/ia64/hp/sim/
-drivers-$(CONFIG_IA64_HP_ZX1)  += arch/ia64/hp/common/ arch/ia64/hp/zx1/
-drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/
-drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/
-drivers-$(CONFIG_OPROFILE)     += arch/ia64/oprofile/
-
-boot := arch/ia64/hp/sim/boot
-
-PHONY += boot compressed check
-
-all: compressed unwcheck
-
-compressed: vmlinux.gz
-
-vmlinuz: vmlinux.gz
-
-vmlinux.gz: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $@
-
-unwcheck: vmlinux
-       -$(Q)READELF=$(READELF) $(srctree)/arch/ia64/scripts/unwcheck.py $<
-
-archclean:
-       $(Q)$(MAKE) $(clean)=$(boot)
-
-CLEAN_FILES += vmlinux.gz bootloader
-
-boot:  lib/lib.a vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $@
-
-install:
-       -yes | sh $(srctree)/arch/ia64/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)"
-
-define archhelp
-  echo '* compressed   - Build compressed kernel image'
-  echo '  install      - Install compressed kernel image'
-  echo '  boot         - Build vmlinux and bootloader for Ski simulator'
-  echo '* unwcheck     - Check vmlinux for invalid unwind info'
-endef
diff --git a/linux-2.6-xen-sparse/arch/ia64/hp/common/sba_iommu.c b/linux-2.6-xen-sparse/arch/ia64/hp/common/sba_iommu.c
deleted file mode 100644 (file)
index c0f6eac..0000000
+++ /dev/null
@@ -1,2160 +0,0 @@
-/*
-**  IA64 System Bus Adapter (SBA) I/O MMU manager
-**
-**     (c) Copyright 2002-2005 Alex Williamson
-**     (c) Copyright 2002-2003 Grant Grundler
-**     (c) Copyright 2002-2005 Hewlett-Packard Company
-**
-**     Portions (c) 2000 Grant Grundler (from parisc I/O MMU code)
-**     Portions (c) 1999 Dave S. Miller (from sparc64 I/O MMU code)
-**
-**     This program is free software; you can redistribute it and/or modify
-**     it under the terms of the GNU General Public License as published by
-**      the Free Software Foundation; either version 2 of the License, or
-**      (at your option) any later version.
-**
-**
-** This module initializes the IOC (I/O Controller) found on HP
-** McKinley machines and their successors.
-**
-*/
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/acpi.h>
-#include <linux/efi.h>
-#include <linux/nodemask.h>
-#include <linux/bitops.h>         /* hweight64() */
-
-#include <asm/delay.h>         /* ia64_get_itc() */
-#include <asm/io.h>
-#include <asm/page.h>          /* PAGE_OFFSET */
-#include <asm/dma.h>
-#include <asm/system.h>                /* wmb() */
-
-#include <asm/acpi-ext.h>
-
-#define PFX "IOC: "
-
-/*
-** Enabling timing search of the pdir resource map.  Output in /proc.
-** Disabled by default to optimize performance.
-*/
-#undef PDIR_SEARCH_TIMING
-
-/*
-** This option allows cards capable of 64bit DMA to bypass the IOMMU.  If
-** not defined, all DMA will be 32bit and go through the TLB.
-** There's potentially a conflict in the bio merge code with us
-** advertising an iommu, but then bypassing it.  Since I/O MMU bypassing
-** appears to give more performance than bio-level virtual merging, we'll
-** do the former for now.  NOTE: BYPASS_SG also needs to be undef'd to
-** completely restrict DMA to the IOMMU.
-*/
-#define ALLOW_IOV_BYPASS
-
-/*
-** This option specifically allows/disallows bypassing scatterlists with
-** multiple entries.  Coalescing these entries can allow better DMA streaming
-** and in some cases shows better performance than entirely bypassing the
-** IOMMU.  Performance increase on the order of 1-2% sequential output/input
-** using bonnie++ on a RAID0 MD device (sym2 & mpt).
-*/
-#undef ALLOW_IOV_BYPASS_SG
-
-/*
-** If a device prefetches beyond the end of a valid pdir entry, it will cause
-** a hard failure, ie. MCA.  Version 3.0 and later of the zx1 LBA should
-** disconnect on 4k boundaries and prevent such issues.  If the device is
-** particularly agressive, this option will keep the entire pdir valid such
-** that prefetching will hit a valid address.  This could severely impact
-** error containment, and is therefore off by default.  The page that is
-** used for spill-over is poisoned, so that should help debugging somewhat.
-*/
-#undef FULL_VALID_PDIR
-
-#define ENABLE_MARK_CLEAN
-
-/*
-** The number of debug flags is a clue - this code is fragile.  NOTE: since
-** tightening the use of res_lock the resource bitmap and actual pdir are no
-** longer guaranteed to stay in sync.  The sanity checking code isn't going to
-** like that.
-*/
-#undef DEBUG_SBA_INIT
-#undef DEBUG_SBA_RUN
-#undef DEBUG_SBA_RUN_SG
-#undef DEBUG_SBA_RESOURCE
-#undef ASSERT_PDIR_SANITY
-#undef DEBUG_LARGE_SG_ENTRIES
-#undef DEBUG_BYPASS
-
-#if defined(FULL_VALID_PDIR) && defined(ASSERT_PDIR_SANITY)
-#error FULL_VALID_PDIR and ASSERT_PDIR_SANITY are mutually exclusive
-#endif
-
-#define SBA_INLINE     __inline__
-/* #define SBA_INLINE */
-
-#ifdef DEBUG_SBA_INIT
-#define DBG_INIT(x...) printk(x)
-#else
-#define DBG_INIT(x...)
-#endif
-
-#ifdef DEBUG_SBA_RUN
-#define DBG_RUN(x...)  printk(x)
-#else
-#define DBG_RUN(x...)
-#endif
-
-#ifdef DEBUG_SBA_RUN_SG
-#define DBG_RUN_SG(x...)       printk(x)
-#else
-#define DBG_RUN_SG(x...)
-#endif
-
-
-#ifdef DEBUG_SBA_RESOURCE
-#define DBG_RES(x...)  printk(x)
-#else
-#define DBG_RES(x...)
-#endif
-
-#ifdef DEBUG_BYPASS
-#define DBG_BYPASS(x...)       printk(x)
-#else
-#define DBG_BYPASS(x...)
-#endif
-
-#ifdef ASSERT_PDIR_SANITY
-#define ASSERT(expr) \
-        if(!(expr)) { \
-                printk( "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
-                panic(#expr); \
-        }
-#else
-#define ASSERT(expr)
-#endif
-
-/*
-** The number of pdir entries to "free" before issuing
-** a read to PCOM register to flush out PCOM writes.
-** Interacts with allocation granularity (ie 4 or 8 entries
-** allocated and free'd/purged at a time might make this
-** less interesting).
-*/
-#define DELAYED_RESOURCE_CNT   64
-
-#define PCI_DEVICE_ID_HP_SX2000_IOC    0x12ec
-
-#define ZX1_IOC_ID     ((PCI_DEVICE_ID_HP_ZX1_IOC << 16) | PCI_VENDOR_ID_HP)
-#define ZX2_IOC_ID     ((PCI_DEVICE_ID_HP_ZX2_IOC << 16) | PCI_VENDOR_ID_HP)
-#define REO_IOC_ID     ((PCI_DEVICE_ID_HP_REO_IOC << 16) | PCI_VENDOR_ID_HP)
-#define SX1000_IOC_ID  ((PCI_DEVICE_ID_HP_SX1000_IOC << 16) | PCI_VENDOR_ID_HP)
-#define SX2000_IOC_ID  ((PCI_DEVICE_ID_HP_SX2000_IOC << 16) | PCI_VENDOR_ID_HP)
-
-#define ZX1_IOC_OFFSET 0x1000  /* ACPI reports SBA, we want IOC */
-
-#define IOC_FUNC_ID    0x000
-#define IOC_FCLASS     0x008   /* function class, bist, header, rev... */
-#define IOC_IBASE      0x300   /* IO TLB */
-#define IOC_IMASK      0x308
-#define IOC_PCOM       0x310
-#define IOC_TCNFG      0x318
-#define IOC_PDIR_BASE  0x320
-
-#define IOC_ROPE0_CFG  0x500
-#define   IOC_ROPE_AO    0x10  /* Allow "Relaxed Ordering" */
-
-
-/* AGP GART driver looks for this */
-#define ZX1_SBA_IOMMU_COOKIE   0x0000badbadc0ffeeUL
-
-/*
-** The zx1 IOC supports 4/8/16/64KB page sizes (see TCNFG register)
-**
-** Some IOCs (sx1000) can run at the above pages sizes, but are
-** really only supported using the IOC at a 4k page size.
-**
-** iovp_size could only be greater than PAGE_SIZE if we are
-** confident the drivers really only touch the next physical
-** page iff that driver instance owns it.
-*/
-static unsigned long iovp_size;
-static unsigned long iovp_shift;
-static unsigned long iovp_mask;
-
-struct ioc {
-       void __iomem    *ioc_hpa;       /* I/O MMU base address */
-       char            *res_map;       /* resource map, bit == pdir entry */
-       u64             *pdir_base;     /* physical base address */
-       unsigned long   ibase;          /* pdir IOV Space base */
-       unsigned long   imask;          /* pdir IOV Space mask */
-
-       unsigned long   *res_hint;      /* next avail IOVP - circular search */
-       unsigned long   dma_mask;
-       spinlock_t      res_lock;       /* protects the resource bitmap, but must be held when */
-                                       /* clearing pdir to prevent races with allocations. */
-       unsigned int    res_bitshift;   /* from the RIGHT! */
-       unsigned int    res_size;       /* size of resource map in bytes */
-#ifdef CONFIG_NUMA
-       unsigned int    node;           /* node where this IOC lives */
-#endif
-#if DELAYED_RESOURCE_CNT > 0
-       spinlock_t      saved_lock;     /* may want to try to get this on a separate cacheline */
-                                       /* than res_lock for bigger systems. */
-       int             saved_cnt;
-       struct sba_dma_pair {
-               dma_addr_t      iova;
-               size_t          size;
-       } saved[DELAYED_RESOURCE_CNT];
-#endif
-
-#ifdef PDIR_SEARCH_TIMING
-#define SBA_SEARCH_SAMPLE      0x100
-       unsigned long avg_search[SBA_SEARCH_SAMPLE];
-       unsigned long avg_idx;  /* current index into avg_search */
-#endif
-
-       /* Stuff we don't need in performance path */
-       struct ioc      *next;          /* list of IOC's in system */
-       acpi_handle     handle;         /* for multiple IOC's */
-       const char      *name;
-       unsigned int    func_id;
-       unsigned int    rev;            /* HW revision of chip */
-       u32             iov_size;
-       unsigned int    pdir_size;      /* in bytes, determined by IOV Space size */
-       struct pci_dev  *sac_only_dev;
-};
-
-static struct ioc *ioc_list;
-static int reserve_sba_gart = 1;
-
-static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t);
-static SBA_INLINE void sba_free_range(struct ioc *, dma_addr_t, size_t);
-
-#define sba_sg_address(sg)     (page_address((sg)->page) + (sg)->offset)
-
-#ifdef FULL_VALID_PDIR
-static u64 prefetch_spill_page;
-#endif
-
-#ifdef CONFIG_PCI
-# define GET_IOC(dev)  (((dev)->bus == &pci_bus_type)                                          \
-                        ? ((struct ioc *) PCI_CONTROLLER(to_pci_dev(dev))->iommu) : NULL)
-#else
-# define GET_IOC(dev)  NULL
-#endif
-
-/*
-** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
-** (or rather not merge) DMA's into managable chunks.
-** On parisc, this is more of the software/tuning constraint
-** rather than the HW. I/O MMU allocation alogorithms can be
-** faster with smaller size is (to some degree).
-*/
-#define DMA_CHUNK_SIZE  (BITS_PER_LONG*iovp_size)
-
-#define ROUNDUP(x,y) ((x + ((y)-1)) & ~((y)-1))
-
-/************************************
-** SBA register read and write support
-**
-** BE WARNED: register writes are posted.
-**  (ie follow writes which must reach HW with a read)
-**
-*/
-#define READ_REG(addr)       __raw_readq(addr)
-#define WRITE_REG(val, addr) __raw_writeq(val, addr)
-
-#ifdef DEBUG_SBA_INIT
-
-/**
- * sba_dump_tlb - debugging only - print IOMMU operating parameters
- * @hpa: base address of the IOMMU
- *
- * Print the size/location of the IO MMU PDIR.
- */
-static void
-sba_dump_tlb(char *hpa)
-{
-       DBG_INIT("IO TLB at 0x%p\n", (void *)hpa);
-       DBG_INIT("IOC_IBASE    : %016lx\n", READ_REG(hpa+IOC_IBASE));
-       DBG_INIT("IOC_IMASK    : %016lx\n", READ_REG(hpa+IOC_IMASK));
-       DBG_INIT("IOC_TCNFG    : %016lx\n", READ_REG(hpa+IOC_TCNFG));
-       DBG_INIT("IOC_PDIR_BASE: %016lx\n", READ_REG(hpa+IOC_PDIR_BASE));
-       DBG_INIT("\n");
-}
-#endif
-
-
-#ifdef ASSERT_PDIR_SANITY
-
-/**
- * sba_dump_pdir_entry - debugging only - print one IOMMU PDIR entry
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @msg: text to print ont the output line.
- * @pide: pdir index.
- *
- * Print one entry of the IO MMU PDIR in human readable form.
- */
-static void
-sba_dump_pdir_entry(struct ioc *ioc, char *msg, uint pide)
-{
-       /* start printing from lowest pde in rval */
-       u64 *ptr = &ioc->pdir_base[pide  & ~(BITS_PER_LONG - 1)];
-       unsigned long *rptr = (unsigned long *) &ioc->res_map[(pide >>3) & -sizeof(unsigned long)];
-       uint rcnt;
-
-       printk(KERN_DEBUG "SBA: %s rp %p bit %d rval 0x%lx\n",
-                msg, rptr, pide & (BITS_PER_LONG - 1), *rptr);
-
-       rcnt = 0;
-       while (rcnt < BITS_PER_LONG) {
-               printk(KERN_DEBUG "%s %2d %p %016Lx\n",
-                      (rcnt == (pide & (BITS_PER_LONG - 1)))
-                      ? "    -->" : "       ",
-                      rcnt, ptr, (unsigned long long) *ptr );
-               rcnt++;
-               ptr++;
-       }
-       printk(KERN_DEBUG "%s", msg);
-}
-
-
-/**
- * sba_check_pdir - debugging only - consistency checker
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @msg: text to print ont the output line.
- *
- * Verify the resource map and pdir state is consistent
- */
-static int
-sba_check_pdir(struct ioc *ioc, char *msg)
-{
-       u64 *rptr_end = (u64 *) &(ioc->res_map[ioc->res_size]);
-       u64 *rptr = (u64 *) ioc->res_map;       /* resource map ptr */
-       u64 *pptr = ioc->pdir_base;     /* pdir ptr */
-       uint pide = 0;
-
-       while (rptr < rptr_end) {
-               u64 rval;
-               int rcnt; /* number of bits we might check */
-
-               rval = *rptr;
-               rcnt = 64;
-
-               while (rcnt) {
-                       /* Get last byte and highest bit from that */
-                       u32 pde = ((u32)((*pptr >> (63)) & 0x1));
-                       if ((rval & 0x1) ^ pde)
-                       {
-                               /*
-                               ** BUMMER!  -- res_map != pdir --
-                               ** Dump rval and matching pdir entries
-                               */
-                               sba_dump_pdir_entry(ioc, msg, pide);
-                               return(1);
-                       }
-                       rcnt--;
-                       rval >>= 1;     /* try the next bit */
-                       pptr++;
-                       pide++;
-               }
-               rptr++; /* look at next word of res_map */
-       }
-       /* It'd be nice if we always got here :^) */
-       return 0;
-}
-
-
-/**
- * sba_dump_sg - debugging only - print Scatter-Gather list
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @startsg: head of the SG list
- * @nents: number of entries in SG list
- *
- * print the SG list so we can verify it's correct by hand.
- */
-static void
-sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
-{
-       while (nents-- > 0) {
-               printk(KERN_DEBUG " %d : DMA %08lx/%05x CPU %p\n", nents,
-                      startsg->dma_address, startsg->dma_length,
-                      sba_sg_address(startsg));
-               startsg++;
-       }
-}
-
-static void
-sba_check_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
-{
-       struct scatterlist *the_sg = startsg;
-       int the_nents = nents;
-
-       while (the_nents-- > 0) {
-               if (sba_sg_address(the_sg) == 0x0UL)
-                       sba_dump_sg(NULL, startsg, nents);
-               the_sg++;
-       }
-}
-
-#endif /* ASSERT_PDIR_SANITY */
-
-
-
-
-/**************************************************************
-*
-*   I/O Pdir Resource Management
-*
-*   Bits set in the resource map are in use.
-*   Each bit can represent a number of pages.
-*   LSbs represent lower addresses (IOVA's).
-*
-***************************************************************/
-#define PAGES_PER_RANGE 1      /* could increase this to 4 or 8 if needed */
-
-/* Convert from IOVP to IOVA and vice versa. */
-#define SBA_IOVA(ioc,iovp,offset) ((ioc->ibase) | (iovp) | (offset))
-#define SBA_IOVP(ioc,iova) ((iova) & ~(ioc->ibase))
-
-#define PDIR_ENTRY_SIZE        sizeof(u64)
-
-#define PDIR_INDEX(iovp)   ((iovp)>>iovp_shift)
-
-#define RESMAP_MASK(n)    ~(~0UL << (n))
-#define RESMAP_IDX_MASK   (sizeof(unsigned long) - 1)
-
-
-/**
- * For most cases the normal get_order is sufficient, however it limits us
- * to PAGE_SIZE being the minimum mapping alignment and TC flush granularity.
- * It only incurs about 1 clock cycle to use this one with the static variable
- * and makes the code more intuitive.
- */
-static SBA_INLINE int
-get_iovp_order (unsigned long size)
-{
-       long double d = size - 1;
-       long order;
-
-       order = ia64_getf_exp(d);
-       order = order - iovp_shift - 0xffff + 1;
-       if (order < 0)
-               order = 0;
-       return order;
-}
-
-/**
- * sba_search_bitmap - find free space in IO PDIR resource bitmap
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @bits_wanted: number of entries we need.
- * @use_hint: use res_hint to indicate where to start looking
- *
- * Find consecutive free bits in resource bitmap.
- * Each bit represents one entry in the IO Pdir.
- * Cool perf optimization: search for log2(size) bits at a time.
- */
-static SBA_INLINE unsigned long
-sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted, int use_hint)
-{
-       unsigned long *res_ptr;
-       unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]);
-       unsigned long flags, pide = ~0UL;
-
-       ASSERT(((unsigned long) ioc->res_hint & (sizeof(unsigned long) - 1UL)) == 0);
-       ASSERT(res_ptr < res_end);
-
-       spin_lock_irqsave(&ioc->res_lock, flags);
-
-       /* Allow caller to force a search through the entire resource space */
-       if (likely(use_hint)) {
-               res_ptr = ioc->res_hint;
-       } else {
-               res_ptr = (ulong *)ioc->res_map;
-               ioc->res_bitshift = 0;
-       }
-
-       /*
-        * N.B.  REO/Grande defect AR2305 can cause TLB fetch timeouts
-        * if a TLB entry is purged while in use.  sba_mark_invalid()
-        * purges IOTLB entries in power-of-two sizes, so we also
-        * allocate IOVA space in power-of-two sizes.
-        */
-       bits_wanted = 1UL << get_iovp_order(bits_wanted << iovp_shift);
-
-       if (likely(bits_wanted == 1)) {
-               unsigned int bitshiftcnt;
-               for(; res_ptr < res_end ; res_ptr++) {
-                       if (likely(*res_ptr != ~0UL)) {
-                               bitshiftcnt = ffz(*res_ptr);
-                               *res_ptr |= (1UL << bitshiftcnt);
-                               pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map);
-                               pide <<= 3;     /* convert to bit address */
-                               pide += bitshiftcnt;
-                               ioc->res_bitshift = bitshiftcnt + bits_wanted;
-                               goto found_it;
-                       }
-               }
-               goto not_found;
-
-       }
-       
-       if (likely(bits_wanted <= BITS_PER_LONG/2)) {
-               /*
-               ** Search the resource bit map on well-aligned values.
-               ** "o" is the alignment.
-               ** We need the alignment to invalidate I/O TLB using
-               ** SBA HW features in the unmap path.
-               */
-               unsigned long o = 1 << get_iovp_order(bits_wanted << iovp_shift);
-               uint bitshiftcnt = ROUNDUP(ioc->res_bitshift, o);
-               unsigned long mask, base_mask;
-
-               base_mask = RESMAP_MASK(bits_wanted);
-               mask = base_mask << bitshiftcnt;
-
-               DBG_RES("%s() o %ld %p", __FUNCTION__, o, res_ptr);
-               for(; res_ptr < res_end ; res_ptr++)
-               { 
-                       DBG_RES("    %p %lx %lx\n", res_ptr, mask, *res_ptr);
-                       ASSERT(0 != mask);
-                       for (; mask ; mask <<= o, bitshiftcnt += o) {
-                               if(0 == ((*res_ptr) & mask)) {
-                                       *res_ptr |= mask;     /* mark resources busy! */
-                                       pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map);
-                                       pide <<= 3;     /* convert to bit address */
-                                       pide += bitshiftcnt;
-                                       ioc->res_bitshift = bitshiftcnt + bits_wanted;
-                                       goto found_it;
-                               }
-                       }
-
-                       bitshiftcnt = 0;
-                       mask = base_mask;
-
-               }
-
-       } else {
-               int qwords, bits, i;
-               unsigned long *end;
-
-               qwords = bits_wanted >> 6; /* /64 */
-               bits = bits_wanted - (qwords * BITS_PER_LONG);
-
-               end = res_end - qwords;
-
-               for (; res_ptr < end; res_ptr++) {
-                       for (i = 0 ; i < qwords ; i++) {
-                               if (res_ptr[i] != 0)
-                                       goto next_ptr;
-                       }
-                       if (bits && res_ptr[i] && (__ffs(res_ptr[i]) < bits))
-                               continue;
-
-                       /* Found it, mark it */
-                       for (i = 0 ; i < qwords ; i++)
-                               res_ptr[i] = ~0UL;
-                       res_ptr[i] |= RESMAP_MASK(bits);
-
-                       pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map);
-                       pide <<= 3;     /* convert to bit address */
-                       res_ptr += qwords;
-                       ioc->res_bitshift = bits;
-                       goto found_it;
-next_ptr:
-                       ;
-               }
-       }
-
-not_found:
-       prefetch(ioc->res_map);
-       ioc->res_hint = (unsigned long *) ioc->res_map;
-       ioc->res_bitshift = 0;
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-       return (pide);
-
-found_it:
-       ioc->res_hint = res_ptr;
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-       return (pide);
-}
-
-
-/**
- * sba_alloc_range - find free bits and mark them in IO PDIR resource bitmap
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @size: number of bytes to create a mapping for
- *
- * Given a size, find consecutive unmarked and then mark those bits in the
- * resource bit map.
- */
-static int
-sba_alloc_range(struct ioc *ioc, size_t size)
-{
-       unsigned int pages_needed = size >> iovp_shift;
-#ifdef PDIR_SEARCH_TIMING
-       unsigned long itc_start;
-#endif
-       unsigned long pide;
-
-       ASSERT(pages_needed);
-       ASSERT(0 == (size & ~iovp_mask));
-
-#ifdef PDIR_SEARCH_TIMING
-       itc_start = ia64_get_itc();
-#endif
-       /*
-       ** "seek and ye shall find"...praying never hurts either...
-       */
-       pide = sba_search_bitmap(ioc, pages_needed, 1);
-       if (unlikely(pide >= (ioc->res_size << 3))) {
-               pide = sba_search_bitmap(ioc, pages_needed, 0);
-               if (unlikely(pide >= (ioc->res_size << 3))) {
-#if DELAYED_RESOURCE_CNT > 0
-                       unsigned long flags;
-
-                       /*
-                       ** With delayed resource freeing, we can give this one more shot.  We're
-                       ** getting close to being in trouble here, so do what we can to make this
-                       ** one count.
-                       */
-                       spin_lock_irqsave(&ioc->saved_lock, flags);
-                       if (ioc->saved_cnt > 0) {
-                               struct sba_dma_pair *d;
-                               int cnt = ioc->saved_cnt;
-
-                               d = &(ioc->saved[ioc->saved_cnt - 1]);
-
-                               spin_lock(&ioc->res_lock);
-                               while (cnt--) {
-                                       sba_mark_invalid(ioc, d->iova, d->size);
-                                       sba_free_range(ioc, d->iova, d->size);
-                                       d--;
-                               }
-                               ioc->saved_cnt = 0;
-                               READ_REG(ioc->ioc_hpa+IOC_PCOM);        /* flush purges */
-                               spin_unlock(&ioc->res_lock);
-                       }
-                       spin_unlock_irqrestore(&ioc->saved_lock, flags);
-
-                       pide = sba_search_bitmap(ioc, pages_needed, 0);
-                       if (unlikely(pide >= (ioc->res_size << 3)))
-                               panic(__FILE__ ": I/O MMU @ %p is out of mapping resources\n",
-                                     ioc->ioc_hpa);
-#else
-                       panic(__FILE__ ": I/O MMU @ %p is out of mapping resources\n",
-                             ioc->ioc_hpa);
-#endif
-               }
-       }
-
-#ifdef PDIR_SEARCH_TIMING
-       ioc->avg_search[ioc->avg_idx++] = (ia64_get_itc() - itc_start) / pages_needed;
-       ioc->avg_idx &= SBA_SEARCH_SAMPLE - 1;
-#endif
-
-       prefetchw(&(ioc->pdir_base[pide]));
-
-#ifdef ASSERT_PDIR_SANITY
-       /* verify the first enable bit is clear */
-       if(0x00 != ((u8 *) ioc->pdir_base)[pide*PDIR_ENTRY_SIZE + 7]) {
-               sba_dump_pdir_entry(ioc, "sba_search_bitmap() botched it?", pide);
-       }
-#endif
-
-       DBG_RES("%s(%x) %d -> %lx hint %x/%x\n",
-               __FUNCTION__, size, pages_needed, pide,
-               (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map),
-               ioc->res_bitshift );
-
-       return (pide);
-}
-
-
-/**
- * sba_free_range - unmark bits in IO PDIR resource bitmap
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @iova: IO virtual address which was previously allocated.
- * @size: number of bytes to create a mapping for
- *
- * clear bits in the ioc's resource map
- */
-static SBA_INLINE void
-sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
-{
-       unsigned long iovp = SBA_IOVP(ioc, iova);
-       unsigned int pide = PDIR_INDEX(iovp);
-       unsigned int ridx = pide >> 3;  /* convert bit to byte address */
-       unsigned long *res_ptr = (unsigned long *) &((ioc)->res_map[ridx & ~RESMAP_IDX_MASK]);
-       int bits_not_wanted = size >> iovp_shift;
-       unsigned long m;
-
-       /* Round up to power-of-two size: see AR2305 note above */
-       bits_not_wanted = 1UL << get_iovp_order(bits_not_wanted << iovp_shift);
-       for (; bits_not_wanted > 0 ; res_ptr++) {
-               
-               if (unlikely(bits_not_wanted > BITS_PER_LONG)) {
-
-                       /* these mappings start 64bit aligned */
-                       *res_ptr = 0UL;
-                       bits_not_wanted -= BITS_PER_LONG;
-                       pide += BITS_PER_LONG;
-
-               } else {
-
-                       /* 3-bits "bit" address plus 2 (or 3) bits for "byte" == bit in word */
-                       m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1));
-                       bits_not_wanted = 0;
-
-                       DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __FUNCTION__, (uint) iova, size,
-                               bits_not_wanted, m, pide, res_ptr, *res_ptr);
-
-                       ASSERT(m != 0);
-                       ASSERT(bits_not_wanted);
-                       ASSERT((*res_ptr & m) == m); /* verify same bits are set */
-                       *res_ptr &= ~m;
-               }
-       }
-}
-
-
-/**************************************************************
-*
-*   "Dynamic DMA Mapping" support (aka "Coherent I/O")
-*
-***************************************************************/
-
-/**
- * sba_io_pdir_entry - fill in one IO PDIR entry
- * @pdir_ptr:  pointer to IO PDIR entry
- * @vba: Virtual CPU address of buffer to map
- *
- * SBA Mapping Routine
- *
- * Given a virtual address (vba, arg1) sba_io_pdir_entry()
- * loads the I/O PDIR entry pointed to by pdir_ptr (arg0).
- * Each IO Pdir entry consists of 8 bytes as shown below
- * (LSB == bit 0):
- *
- *  63                    40                                 11    7        0
- * +-+---------------------+----------------------------------+----+--------+
- * |V|        U            |            PPN[39:12]            | U  |   FF   |
- * +-+---------------------+----------------------------------+----+--------+
- *
- *  V  == Valid Bit
- *  U  == Unused
- * PPN == Physical Page Number
- *
- * The physical address fields are filled with the results of virt_to_phys()
- * on the vba.
- */
-
-#if 1
-#define sba_io_pdir_entry(pdir_ptr, vba) *pdir_ptr =   \
-       ((virt_to_bus((void *)vba) & ~0xFFFULL) | 0x8000000000000000ULL)
-#else
-void SBA_INLINE
-sba_io_pdir_entry(u64 *pdir_ptr, unsigned long vba)
-{
-       *pdir_ptr = ((virt_to_bus((void *)vba) & ~0xFFFULL) |
-                   0x80000000000000FFULL);
-}
-#endif
-
-#ifdef ENABLE_MARK_CLEAN
-/**
- * Since DMA is i-cache coherent, any (complete) pages that were written via
- * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to
- * flush them when they get mapped into an executable vm-area.
- */
-static void
-mark_clean (void *addr, size_t size)
-{
-       unsigned long pg_addr, end;
-
-#ifdef CONFIG_XEN
-       /* XXX: Bad things happen starting domUs when this is enabled. */
-       if (is_running_on_xen())
-               return;
-#endif
-
-       pg_addr = PAGE_ALIGN((unsigned long) addr);
-       end = (unsigned long) addr + size;
-       while (pg_addr + PAGE_SIZE <= end) {
-               struct page *page = virt_to_page((void *)pg_addr);
-               set_bit(PG_arch_1, &page->flags);
-               pg_addr += PAGE_SIZE;
-       }
-}
-#endif
-
-/**
- * sba_mark_invalid - invalidate one or more IO PDIR entries
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @iova:  IO Virtual Address mapped earlier
- * @byte_cnt:  number of bytes this mapping covers.
- *
- * Marking the IO PDIR entry(ies) as Invalid and invalidate
- * corresponding IO TLB entry. The PCOM (Purge Command Register)
- * is to purge stale entries in the IO TLB when unmapping entries.
- *
- * The PCOM register supports purging of multiple pages, with a minium
- * of 1 page and a maximum of 2GB. Hardware requires the address be
- * aligned to the size of the range being purged. The size of the range
- * must be a power of 2. The "Cool perf optimization" in the
- * allocation routine helps keep that true.
- */
-static SBA_INLINE void
-sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
-{
-       u32 iovp = (u32) SBA_IOVP(ioc,iova);
-
-       int off = PDIR_INDEX(iovp);
-
-       /* Must be non-zero and rounded up */
-       ASSERT(byte_cnt > 0);
-       ASSERT(0 == (byte_cnt & ~iovp_mask));
-
-#ifdef ASSERT_PDIR_SANITY
-       /* Assert first pdir entry is set */
-       if (!(ioc->pdir_base[off] >> 60)) {
-               sba_dump_pdir_entry(ioc,"sba_mark_invalid()", PDIR_INDEX(iovp));
-       }
-#endif
-
-       if (byte_cnt <= iovp_size)
-       {
-               ASSERT(off < ioc->pdir_size);
-
-               iovp |= iovp_shift;     /* set "size" field for PCOM */
-
-#ifndef FULL_VALID_PDIR
-               /*
-               ** clear I/O PDIR entry "valid" bit
-               ** Do NOT clear the rest - save it for debugging.
-               ** We should only clear bits that have previously
-               ** been enabled.
-               */
-               ioc->pdir_base[off] &= ~(0x80000000000000FFULL);
-#else
-               /*
-               ** If we want to maintain the PDIR as valid, put in
-               ** the spill page so devices prefetching won't
-               ** cause a hard fail.
-               */
-               ioc->pdir_base[off] = (0x80000000000000FFULL | prefetch_spill_page);
-#endif
-       } else {
-               u32 t = get_iovp_order(byte_cnt) + iovp_shift;
-
-               iovp |= t;
-               ASSERT(t <= 31);   /* 2GB! Max value of "size" field */
-
-               do {
-                       /* verify this pdir entry is enabled */
-                       ASSERT(ioc->pdir_base[off]  >> 63);
-#ifndef FULL_VALID_PDIR
-                       /* clear I/O Pdir entry "valid" bit first */
-                       ioc->pdir_base[off] &= ~(0x80000000000000FFULL);
-#else
-                       ioc->pdir_base[off] = (0x80000000000000FFULL | prefetch_spill_page);
-#endif
-                       off++;
-                       byte_cnt -= iovp_size;
-               } while (byte_cnt > 0);
-       }
-
-       WRITE_REG(iovp | ioc->ibase, ioc->ioc_hpa+IOC_PCOM);
-}
-
-/**
- * sba_map_single - map one buffer and return IOVA for DMA
- * @dev: instance of PCI owned by the driver that's asking.
- * @addr:  driver buffer to map.
- * @size:  number of bytes to map in driver buffer.
- * @dir:  R/W or both.
- *
- * See Documentation/DMA-mapping.txt
- */
-dma_addr_t
-sba_map_single(struct device *dev, void *addr, size_t size, int dir)
-{
-       struct ioc *ioc;
-       dma_addr_t iovp;
-       dma_addr_t offset;
-       u64 *pdir_start;
-       int pide;
-#ifdef ASSERT_PDIR_SANITY
-       unsigned long flags;
-#endif
-#ifdef ALLOW_IOV_BYPASS
-       unsigned long pci_addr = virt_to_bus(addr);
-
-       ASSERT(to_pci_dev(dev)->dma_mask);
-       /*
-       ** Check if the PCI device can DMA to ptr... if so, just return ptr
-       */
-       if (likely(pci_addr & ~to_pci_dev(dev)->dma_mask) == 0 &&
-                  !range_straddles_page_boundary(addr, size)) {
-               /*
-               ** Device is bit capable of DMA'ing to the buffer...
-               ** just return the PCI address of ptr
-               */
-               DBG_BYPASS("sba_map_single() bypass mask/addr: 0x%lx/0x%lx\n",
-                          to_pci_dev(dev)->dma_mask, pci_addr);
-               return pci_addr;
-       }
-#endif
-       ioc = GET_IOC(dev);
-       ASSERT(ioc);
-
-       prefetch(ioc->res_hint);
-
-       ASSERT(size > 0);
-       ASSERT(size <= DMA_CHUNK_SIZE);
-
-       /* save offset bits */
-       offset = ((dma_addr_t) (long) addr) & ~iovp_mask;
-
-       /* round up to nearest iovp_size */
-       size = (size + offset + ~iovp_mask) & iovp_mask;
-
-#ifdef ASSERT_PDIR_SANITY
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       if (sba_check_pdir(ioc,"Check before sba_map_single()"))
-               panic("Sanity check failed");
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-
-       pide = sba_alloc_range(ioc, size);
-
-       iovp = (dma_addr_t) pide << iovp_shift;
-
-       DBG_RUN("%s() 0x%p -> 0x%lx\n",
-               __FUNCTION__, addr, (long) iovp | offset);
-
-       pdir_start = &(ioc->pdir_base[pide]);
-
-       while (size > 0) {
-               ASSERT(((u8 *)pdir_start)[7] == 0); /* verify availability */
-               sba_io_pdir_entry(pdir_start, (unsigned long) addr);
-
-               DBG_RUN("     pdir 0x%p %lx\n", pdir_start, *pdir_start);
-
-               addr += iovp_size;
-               size -= iovp_size;
-               pdir_start++;
-       }
-       /* force pdir update */
-       wmb();
-
-       /* form complete address */
-#ifdef ASSERT_PDIR_SANITY
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       sba_check_pdir(ioc,"Check after sba_map_single()");
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-       return SBA_IOVA(ioc, iovp, offset);
-}
-
-#ifdef ENABLE_MARK_CLEAN
-static SBA_INLINE void
-sba_mark_clean(struct ioc *ioc, dma_addr_t iova, size_t size)
-{
-       u32     iovp = (u32) SBA_IOVP(ioc,iova);
-       int     off = PDIR_INDEX(iovp);
-       void    *addr;
-
-       if (size <= iovp_size) {
-               addr = bus_to_virt(ioc->pdir_base[off] &
-                                  ~0xE000000000000FFFULL);
-               mark_clean(addr, size);
-       } else {
-               do {
-                       addr = bus_to_virt(ioc->pdir_base[off] &
-                                          ~0xE000000000000FFFULL);
-                       mark_clean(addr, min(size, iovp_size));
-                       off++;
-                       size -= iovp_size;
-               } while (size > 0);
-       }
-}
-#endif
-
-/**
- * sba_unmap_single - unmap one IOVA and free resources
- * @dev: instance of PCI owned by the driver that's asking.
- * @iova:  IOVA of driver buffer previously mapped.
- * @size:  number of bytes mapped in driver buffer.
- * @dir:  R/W or both.
- *
- * See Documentation/DMA-mapping.txt
- */
-void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
-{
-       struct ioc *ioc;
-#if DELAYED_RESOURCE_CNT > 0
-       struct sba_dma_pair *d;
-#endif
-       unsigned long flags;
-       dma_addr_t offset;
-
-       ioc = GET_IOC(dev);
-       ASSERT(ioc);
-
-#ifdef ALLOW_IOV_BYPASS
-       if (likely((iova & ioc->imask) != ioc->ibase)) {
-               /*
-               ** Address does not fall w/in IOVA, must be bypassing
-               */
-               DBG_BYPASS("sba_unmap_single() bypass addr: 0x%lx\n", iova);
-
-#ifdef ENABLE_MARK_CLEAN
-               if (dir == DMA_FROM_DEVICE) {
-                       mark_clean(bus_to_virt(iova), size);
-               }
-#endif
-               return;
-       }
-#endif
-       offset = iova & ~iovp_mask;
-
-       DBG_RUN("%s() iovp 0x%lx/%x\n",
-               __FUNCTION__, (long) iova, size);
-
-       iova ^= offset;        /* clear offset bits */
-       size += offset;
-       size = ROUNDUP(size, iovp_size);
-
-#ifdef ENABLE_MARK_CLEAN
-       if (dir == DMA_FROM_DEVICE)
-               sba_mark_clean(ioc, iova, size);
-#endif
-
-#if DELAYED_RESOURCE_CNT > 0
-       spin_lock_irqsave(&ioc->saved_lock, flags);
-       d = &(ioc->saved[ioc->saved_cnt]);
-       d->iova = iova;
-       d->size = size;
-       if (unlikely(++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT)) {
-               int cnt = ioc->saved_cnt;
-               spin_lock(&ioc->res_lock);
-               while (cnt--) {
-                       sba_mark_invalid(ioc, d->iova, d->size);
-                       sba_free_range(ioc, d->iova, d->size);
-                       d--;
-               }
-               ioc->saved_cnt = 0;
-               READ_REG(ioc->ioc_hpa+IOC_PCOM);        /* flush purges */
-               spin_unlock(&ioc->res_lock);
-       }
-       spin_unlock_irqrestore(&ioc->saved_lock, flags);
-#else /* DELAYED_RESOURCE_CNT == 0 */
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       sba_mark_invalid(ioc, iova, size);
-       sba_free_range(ioc, iova, size);
-       READ_REG(ioc->ioc_hpa+IOC_PCOM);        /* flush purges */
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif /* DELAYED_RESOURCE_CNT == 0 */
-}
-
-
-/**
- * sba_alloc_coherent - allocate/map shared mem for DMA
- * @dev: instance of PCI owned by the driver that's asking.
- * @size:  number of bytes mapped in driver buffer.
- * @dma_handle:  IOVA of new buffer.
- *
- * See Documentation/DMA-mapping.txt
- */
-void *
-sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags)
-{
-       struct ioc *ioc;
-       void *addr;
-
-       ioc = GET_IOC(dev);
-       ASSERT(ioc);
-
-#ifdef CONFIG_NUMA
-       {
-               struct page *page;
-               page = alloc_pages_node(ioc->node == MAX_NUMNODES ?
-                                       numa_node_id() : ioc->node, flags,
-                                       get_order(size));
-
-               if (unlikely(!page))
-                       return NULL;
-
-               addr = page_address(page);
-       }
-#else
-       addr = (void *) __get_free_pages(flags, get_order(size));
-#endif
-       if (unlikely(!addr))
-               return NULL;
-
-       memset(addr, 0, size);
-
-#ifdef ALLOW_IOV_BYPASS
-#ifdef CONFIG_XEN
-       if (xen_create_contiguous_region((unsigned long)addr, get_order(size),
-                                        fls64(dev->coherent_dma_mask)))
-               goto iommu_map;
-#endif
-       *dma_handle = virt_to_bus(addr);
-       ASSERT(dev->coherent_dma_mask);
-       /*
-       ** Check if the PCI device can DMA to ptr... if so, just return ptr
-       */
-       if (likely((*dma_handle & ~dev->coherent_dma_mask) == 0)) {
-               DBG_BYPASS("sba_alloc_coherent() bypass mask/addr: 0x%lx/0x%lx\n",
-                          dev->coherent_dma_mask, *dma_handle);
-
-               return addr;
-       }
-#ifdef CONFIG_XEN
-iommu_map:
-#endif
-#endif
-
-       /*
-        * If device can't bypass or bypass is disabled, pass the 32bit fake
-        * device to map single to get an iova mapping.
-        */
-       *dma_handle = sba_map_single(&ioc->sac_only_dev->dev, addr, size, 0);
-
-       return addr;
-}
-
-
-/**
- * sba_free_coherent - free/unmap shared mem for DMA
- * @dev: instance of PCI owned by the driver that's asking.
- * @size:  number of bytes mapped in driver buffer.
- * @vaddr:  virtual address IOVA of "consistent" buffer.
- * @dma_handler:  IO virtual address of "consistent" buffer.
- *
- * See Documentation/DMA-mapping.txt
- */
-void sba_free_coherent (struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle)
-{
-#if defined(ALLOW_IOV_BYPASS) && defined(CONFIG_XEN)
-       struct ioc *ioc = GET_IOC(dev);
-
-       if (likely((dma_handle & ioc->imask) != ioc->ibase))
-               xen_destroy_contiguous_region((unsigned long)vaddr,
-                                             get_order(size));
-#endif
-       sba_unmap_single(dev, dma_handle, size, 0);
-       free_pages((unsigned long) vaddr, get_order(size));
-}
-
-
-/*
-** Since 0 is a valid pdir_base index value, can't use that
-** to determine if a value is valid or not. Use a flag to indicate
-** the SG list entry contains a valid pdir index.
-*/
-#define PIDE_FLAG 0x1UL
-
-#ifdef DEBUG_LARGE_SG_ENTRIES
-int dump_run_sg = 0;
-#endif
-
-
-/**
- * sba_fill_pdir - write allocated SG entries into IO PDIR
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @startsg:  list of IOVA/size pairs
- * @nents: number of entries in startsg list
- *
- * Take preprocessed SG list and write corresponding entries
- * in the IO PDIR.
- */
-
-static SBA_INLINE int
-sba_fill_pdir(
-       struct ioc *ioc,
-       struct scatterlist *startsg,
-       int nents)
-{
-       struct scatterlist *dma_sg = startsg;   /* pointer to current DMA */
-       int n_mappings = 0;
-       u64 *pdirp = NULL;
-       unsigned long dma_offset = 0;
-
-       dma_sg--;
-       while (nents-- > 0) {
-               int     cnt = startsg->dma_length;
-               startsg->dma_length = 0;
-
-#ifdef DEBUG_LARGE_SG_ENTRIES
-               if (dump_run_sg)
-                       printk(" %2d : %08lx/%05x %p\n",
-                               nents, startsg->dma_address, cnt,
-                               sba_sg_address(startsg));
-#else
-               DBG_RUN_SG(" %d : %08lx/%05x %p\n",
-                               nents, startsg->dma_address, cnt,
-                               sba_sg_address(startsg));
-#endif
-               /*
-               ** Look for the start of a new DMA stream
-               */
-               if (startsg->dma_address & PIDE_FLAG) {
-                       u32 pide = startsg->dma_address & ~PIDE_FLAG;
-                       dma_offset = (unsigned long) pide & ~iovp_mask;
-                       startsg->dma_address = 0;
-                       dma_sg++;
-                       dma_sg->dma_address = pide | ioc->ibase;
-                       pdirp = &(ioc->pdir_base[pide >> iovp_shift]);
-                       n_mappings++;
-               }
-
-               /*
-               ** Look for a VCONTIG chunk
-               */
-               if (cnt) {
-                       unsigned long vaddr = (unsigned long) sba_sg_address(startsg);
-                       ASSERT(pdirp);
-
-                       /* Since multiple Vcontig blocks could make up
-                       ** one DMA stream, *add* cnt to dma_len.
-                       */
-                       dma_sg->dma_length += cnt;
-                       cnt += dma_offset;
-                       dma_offset=0;   /* only want offset on first chunk */
-                       cnt = ROUNDUP(cnt, iovp_size);
-                       do {
-                               sba_io_pdir_entry(pdirp, vaddr);
-                               vaddr += iovp_size;
-                               cnt -= iovp_size;
-                               pdirp++;
-                       } while (cnt > 0);
-               }
-               startsg++;
-       }
-       /* force pdir update */
-       wmb();
-
-#ifdef DEBUG_LARGE_SG_ENTRIES
-       dump_run_sg = 0;
-#endif
-       return(n_mappings);
-}
-
-
-/*
-** Two address ranges are DMA contiguous *iff* "end of prev" and
-** "start of next" are both on an IOV page boundary.
-**
-** (shift left is a quick trick to mask off upper bits)
-*/
-#define DMA_CONTIG(__X, __Y) \
-       (((((unsigned long) __X) | ((unsigned long) __Y)) << (BITS_PER_LONG - iovp_shift)) == 0UL)
-
-
-/**
- * sba_coalesce_chunks - preprocess the SG list
- * @ioc: IO MMU structure which owns the pdir we are interested in.
- * @startsg:  list of IOVA/size pairs
- * @nents: number of entries in startsg list
- *
- * First pass is to walk the SG list and determine where the breaks are
- * in the DMA stream. Allocates PDIR entries but does not fill them.
- * Returns the number of DMA chunks.
- *
- * Doing the fill separate from the coalescing/allocation keeps the
- * code simpler. Future enhancement could make one pass through
- * the sglist do both.
- */
-static SBA_INLINE int
-sba_coalesce_chunks( struct ioc *ioc,
-       struct scatterlist *startsg,
-       int nents)
-{
-       struct scatterlist *vcontig_sg;    /* VCONTIG chunk head */
-       unsigned long vcontig_len;         /* len of VCONTIG chunk */
-       unsigned long vcontig_end;
-       struct scatterlist *dma_sg;        /* next DMA stream head */
-       unsigned long dma_offset, dma_len; /* start/len of DMA stream */
-       int n_mappings = 0;
-
-       while (nents > 0) {
-               unsigned long vaddr = (unsigned long) sba_sg_address(startsg);
-
-               /*
-               ** Prepare for first/next DMA stream
-               */
-               dma_sg = vcontig_sg = startsg;
-               dma_len = vcontig_len = vcontig_end = startsg->length;
-               vcontig_end +=  vaddr;
-               dma_offset = vaddr & ~iovp_mask;
-
-               /* PARANOID: clear entries */
-               startsg->dma_address = startsg->dma_length = 0;
-
-               /*
-               ** This loop terminates one iteration "early" since
-               ** it's always looking one "ahead".
-               */
-               while (--nents > 0) {
-                       unsigned long vaddr;    /* tmp */
-
-                       startsg++;
-
-                       /* PARANOID */
-                       startsg->dma_address = startsg->dma_length = 0;
-
-                       /* catch brokenness in SCSI layer */
-                       ASSERT(startsg->length <= DMA_CHUNK_SIZE);
-
-                       /*
-                       ** First make sure current dma stream won't
-                       ** exceed DMA_CHUNK_SIZE if we coalesce the
-                       ** next entry.
-                       */
-                       if (((dma_len + dma_offset + startsg->length + ~iovp_mask) & iovp_mask)
-                           > DMA_CHUNK_SIZE)
-                               break;
-
-                       /*
-                       ** Then look for virtually contiguous blocks.
-                       **
-                       ** append the next transaction?
-                       */
-                       vaddr = (unsigned long) sba_sg_address(startsg);
-                       if  (vcontig_end == vaddr)
-                       {
-                               vcontig_len += startsg->length;
-                               vcontig_end += startsg->length;
-                               dma_len     += startsg->length;
-                               continue;
-                       }
-
-#ifdef DEBUG_LARGE_SG_ENTRIES
-                       dump_run_sg = (vcontig_len > iovp_size);
-#endif
-
-                       /*
-                       ** Not virtually contigous.
-                       ** Terminate prev chunk.
-                       ** Start a new chunk.
-                       **
-                       ** Once we start a new VCONTIG chunk, dma_offset
-                       ** can't change. And we need the offset from the first
-                       ** chunk - not the last one. Ergo Successive chunks
-                       ** must start on page boundaries and dove tail
-                       ** with it's predecessor.
-                       */
-                       vcontig_sg->dma_length = vcontig_len;
-
-                       vcontig_sg = startsg;
-                       vcontig_len = startsg->length;
-
-                       /*
-                       ** 3) do the entries end/start on page boundaries?
-                       **    Don't update vcontig_end until we've checked.
-                       */
-                       if (DMA_CONTIG(vcontig_end, vaddr))
-                       {
-                               vcontig_end = vcontig_len + vaddr;
-                               dma_len += vcontig_len;
-                               continue;
-                       } else {
-                               break;
-                       }
-               }
-
-               /*
-               ** End of DMA Stream
-               ** Terminate last VCONTIG block.
-               ** Allocate space for DMA stream.
-               */
-               vcontig_sg->dma_length = vcontig_len;
-               dma_len = (dma_len + dma_offset + ~iovp_mask) & iovp_mask;
-               ASSERT(dma_len <= DMA_CHUNK_SIZE);
-               dma_sg->dma_address = (dma_addr_t) (PIDE_FLAG
-                       | (sba_alloc_range(ioc, dma_len) << iovp_shift)
-                       | dma_offset);
-               n_mappings++;
-       }
-
-       return n_mappings;
-}
-
-
-/**
- * sba_map_sg - map Scatter/Gather list
- * @dev: instance of PCI owned by the driver that's asking.
- * @sglist:  array of buffer/length pairs
- * @nents:  number of entries in list
- * @dir:  R/W or both.
- *
- * See Documentation/DMA-mapping.txt
- */
-int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int dir)
-{
-       struct ioc *ioc;
-       int coalesced, filled = 0;
-#ifdef ASSERT_PDIR_SANITY
-       unsigned long flags;
-#endif
-#ifdef ALLOW_IOV_BYPASS_SG
-       struct scatterlist *sg;
-#endif
-
-       DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents);
-       ioc = GET_IOC(dev);
-       ASSERT(ioc);
-
-#ifdef ALLOW_IOV_BYPASS_SG
-       ASSERT(to_pci_dev(dev)->dma_mask);
-       if (likely((ioc->dma_mask & ~to_pci_dev(dev)->dma_mask) == 0)) {
-               for (sg = sglist ; filled < nents ; filled++, sg++){
-                       sg->dma_length = sg->length;
-                       sg->dma_address = virt_to_bus(sba_sg_address(sg));
-               }
-               return filled;
-       }
-#endif
-       /* Fast path single entry scatterlists. */
-       if (nents == 1) {
-               sglist->dma_length = sglist->length;
-               sglist->dma_address = sba_map_single(dev, sba_sg_address(sglist), sglist->length, dir);
-               return 1;
-       }
-
-#ifdef ASSERT_PDIR_SANITY
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       if (sba_check_pdir(ioc,"Check before sba_map_sg()"))
-       {
-               sba_dump_sg(ioc, sglist, nents);
-               panic("Check before sba_map_sg()");
-       }
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-
-       prefetch(ioc->res_hint);
-
-       /*
-       ** First coalesce the chunks and allocate I/O pdir space
-       **
-       ** If this is one DMA stream, we can properly map using the
-       ** correct virtual address associated with each DMA page.
-       ** w/o this association, we wouldn't have coherent DMA!
-       ** Access to the virtual address is what forces a two pass algorithm.
-       */
-       coalesced = sba_coalesce_chunks(ioc, sglist, nents);
-
-       /*
-       ** Program the I/O Pdir
-       **
-       ** map the virtual addresses to the I/O Pdir
-       ** o dma_address will contain the pdir index
-       ** o dma_len will contain the number of bytes to map
-       ** o address contains the virtual address.
-       */
-       filled = sba_fill_pdir(ioc, sglist, nents);
-
-#ifdef ASSERT_PDIR_SANITY
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       if (sba_check_pdir(ioc,"Check after sba_map_sg()"))
-       {
-               sba_dump_sg(ioc, sglist, nents);
-               panic("Check after sba_map_sg()\n");
-       }
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-
-       ASSERT(coalesced == filled);
-       DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled);
-
-       return filled;
-}
-
-
-/**
- * sba_unmap_sg - unmap Scatter/Gather list
- * @dev: instance of PCI owned by the driver that's asking.
- * @sglist:  array of buffer/length pairs
- * @nents:  number of entries in list
- * @dir:  R/W or both.
- *
- * See Documentation/DMA-mapping.txt
- */
-void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, int dir)
-{
-#ifdef ASSERT_PDIR_SANITY
-       struct ioc *ioc;
-       unsigned long flags;
-#endif
-
-       DBG_RUN_SG("%s() START %d entries,  %p,%x\n",
-               __FUNCTION__, nents, sba_sg_address(sglist), sglist->length);
-
-#ifdef ASSERT_PDIR_SANITY
-       ioc = GET_IOC(dev);
-       ASSERT(ioc);
-
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       sba_check_pdir(ioc,"Check before sba_unmap_sg()");
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-
-       while (nents && sglist->dma_length) {
-
-               sba_unmap_single(dev, sglist->dma_address, sglist->dma_length, dir);
-               sglist++;
-               nents--;
-       }
-
-       DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__,  nents);
-
-#ifdef ASSERT_PDIR_SANITY
-       spin_lock_irqsave(&ioc->res_lock, flags);
-       sba_check_pdir(ioc,"Check after sba_unmap_sg()");
-       spin_unlock_irqrestore(&ioc->res_lock, flags);
-#endif
-
-}
-
-/**************************************************************
-*
-*   Initialization and claim
-*
-***************************************************************/
-
-static void __init
-ioc_iova_init(struct ioc *ioc)
-{
-       int tcnfg;
-       int agp_found = 0;
-       struct pci_dev *device = NULL;
-#ifdef FULL_VALID_PDIR
-       unsigned long index;
-#endif
-
-       /*
-       ** Firmware programs the base and size of a "safe IOVA space"
-       ** (one that doesn't overlap memory or LMMIO space) in the
-       ** IBASE and IMASK registers.
-       */
-       ioc->ibase = READ_REG(ioc->ioc_hpa + IOC_IBASE) & ~0x1UL;
-       ioc->imask = READ_REG(ioc->ioc_hpa + IOC_IMASK) | 0xFFFFFFFF00000000UL;
-
-       ioc->iov_size = ~ioc->imask + 1;
-
-       DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n",
-               __FUNCTION__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
-               ioc->iov_size >> 20);
-
-       switch (iovp_size) {
-               case  4*1024: tcnfg = 0; break;
-               case  8*1024: tcnfg = 1; break;
-               case 16*1024: tcnfg = 2; break;
-               case 64*1024: tcnfg = 3; break;
-               default:
-                       panic(PFX "Unsupported IOTLB page size %ldK",
-                               iovp_size >> 10);
-                       break;
-       }
-       WRITE_REG(tcnfg, ioc->ioc_hpa + IOC_TCNFG);
-
-       ioc->pdir_size = (ioc->iov_size / iovp_size) * PDIR_ENTRY_SIZE;
-       ioc->pdir_base = (void *) __get_free_pages(GFP_KERNEL,
-                                                  get_order(ioc->pdir_size));
-       if (!ioc->pdir_base)
-               panic(PFX "Couldn't allocate I/O Page Table\n");
-
-#ifdef CONFIG_XEN
-       /* The page table needs to be pinned in Xen memory */
-       if (xen_create_contiguous_region((unsigned long)ioc->pdir_base,
-                                        get_order(ioc->pdir_size), 0))
-               panic(PFX "Couldn't contiguously map I/O Page Table\n");
-#endif
-       memset(ioc->pdir_base, 0, ioc->pdir_size);
-
-       DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __FUNCTION__,
-               iovp_size >> 10, ioc->pdir_base, ioc->pdir_size);
-
-       ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base);
-       WRITE_REG(virt_to_bus(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
-
-       /*
-       ** If an AGP device is present, only use half of the IOV space
-       ** for PCI DMA.  Unfortunately we can't know ahead of time
-       ** whether GART support will actually be used, for now we
-       ** can just key on an AGP device found in the system.
-       ** We program the next pdir index after we stop w/ a key for
-       ** the GART code to handshake on.
-       */
-       for_each_pci_dev(device)        
-               agp_found |= pci_find_capability(device, PCI_CAP_ID_AGP);
-
-       if (agp_found && reserve_sba_gart) {
-               printk(KERN_INFO PFX "reserving %dMb of IOVA space at 0x%lx for agpgart\n",
-                     ioc->iov_size/2 >> 20, ioc->ibase + ioc->iov_size/2);
-               ioc->pdir_size /= 2;
-               ((u64 *)ioc->pdir_base)[PDIR_INDEX(ioc->iov_size/2)] = ZX1_SBA_IOMMU_COOKIE;
-       }
-#ifdef FULL_VALID_PDIR
-       /*
-       ** Check to see if the spill page has been allocated, we don't need more than
-       ** one across multiple SBAs.
-       */
-       if (!prefetch_spill_page) {
-               char *spill_poison = "SBAIOMMU POISON";
-               int poison_size = 16;
-               void *poison_addr, *addr;
-
-               addr = (void *)__get_free_pages(GFP_KERNEL, get_order(iovp_size));
-               if (!addr)
-                       panic(PFX "Couldn't allocate PDIR spill page\n");
-
-               poison_addr = addr;
-               for ( ; (u64) poison_addr < addr + iovp_size; poison_addr += poison_size)
-                       memcpy(poison_addr, spill_poison, poison_size);
-
-               prefetch_spill_page = virt_to_bus(addr);
-
-               DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __FUNCTION__, prefetch_spill_page);
-       }
-       /*
-       ** Set all the PDIR entries valid w/ the spill page as the target
-       */
-       for (index = 0 ; index < (ioc->pdir_size / PDIR_ENTRY_SIZE) ; index++)
-               ((u64 *)ioc->pdir_base)[index] = (0x80000000000000FF | prefetch_spill_page);
-#endif
-
-       /* Clear I/O TLB of any possible entries */
-       WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM);
-       READ_REG(ioc->ioc_hpa + IOC_PCOM);
-
-       /* Enable IOVA translation */
-       WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa + IOC_IBASE);
-       READ_REG(ioc->ioc_hpa + IOC_IBASE);
-}
-
-static void __init
-ioc_resource_init(struct ioc *ioc)
-{
-       spin_lock_init(&ioc->res_lock);
-#if DELAYED_RESOURCE_CNT > 0
-       spin_lock_init(&ioc->saved_lock);
-#endif
-
-       /* resource map size dictated by pdir_size */
-       ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */
-       ioc->res_size >>= 3;  /* convert bit count to byte count */
-       DBG_INIT("%s() res_size 0x%x\n", __FUNCTION__, ioc->res_size);
-
-       ioc->res_map = (char *) __get_free_pages(GFP_KERNEL,
-                                                get_order(ioc->res_size));
-       if (!ioc->res_map)
-               panic(PFX "Couldn't allocate resource map\n");
-
-       memset(ioc->res_map, 0, ioc->res_size);
-       /* next available IOVP - circular search */
-       ioc->res_hint = (unsigned long *) ioc->res_map;
-
-#ifdef ASSERT_PDIR_SANITY
-       /* Mark first bit busy - ie no IOVA 0 */
-       ioc->res_map[0] = 0x1;
-       ioc->pdir_base[0] = 0x8000000000000000ULL | ZX1_SBA_IOMMU_COOKIE;
-#endif
-#ifdef FULL_VALID_PDIR
-       /* Mark the last resource used so we don't prefetch beyond IOVA space */
-       ioc->res_map[ioc->res_size - 1] |= 0x80UL; /* res_map is chars */
-       ioc->pdir_base[(ioc->pdir_size / PDIR_ENTRY_SIZE) - 1] = (0x80000000000000FF
-                                                             | prefetch_spill_page);
-#endif
-
-       DBG_INIT("%s() res_map %x %p\n", __FUNCTION__,
-                ioc->res_size, (void *) ioc->res_map);
-}
-
-static void __init
-ioc_sac_init(struct ioc *ioc)
-{
-       struct pci_dev *sac = NULL;
-       struct pci_controller *controller = NULL;
-
-       /*
-        * pci_alloc_coherent() must return a DMA address which is
-        * SAC (single address cycle) addressable, so allocate a
-        * pseudo-device to enforce that.
-        */
-       sac = kmalloc(sizeof(*sac), GFP_KERNEL);
-       if (!sac)
-               panic(PFX "Couldn't allocate struct pci_dev");
-       memset(sac, 0, sizeof(*sac));
-
-       controller = kmalloc(sizeof(*controller), GFP_KERNEL);
-       if (!controller)
-               panic(PFX "Couldn't allocate struct pci_controller");
-       memset(controller, 0, sizeof(*controller));
-
-       controller->iommu = ioc;
-       sac->sysdata = controller;
-       sac->dma_mask = 0xFFFFFFFFUL;
-#ifdef CONFIG_PCI
-       sac->dev.bus = &pci_bus_type;
-#endif
-       ioc->sac_only_dev = sac;
-}
-
-static void __init
-ioc_zx1_init(struct ioc *ioc)
-{
-       unsigned long rope_config;
-       unsigned int i;
-
-       if (ioc->rev < 0x20)
-               panic(PFX "IOC 2.0 or later required for IOMMU support\n");
-
-       /* 38 bit memory controller + extra bit for range displaced by MMIO */
-       ioc->dma_mask = (0x1UL << 39) - 1;
-
-       /*
-       ** Clear ROPE(N)_CONFIG AO bit.
-       ** Disables "NT Ordering" (~= !"Relaxed Ordering")
-       ** Overrides bit 1 in DMA Hint Sets.
-       ** Improves netperf UDP_STREAM by ~10% for tg3 on bcm5701.
-       */
-       for (i=0; i<(8*8); i+=8) {
-               rope_config = READ_REG(ioc->ioc_hpa + IOC_ROPE0_CFG + i);
-               rope_config &= ~IOC_ROPE_AO;
-               WRITE_REG(rope_config, ioc->ioc_hpa + IOC_ROPE0_CFG + i);
-       }
-}
-
-typedef void (initfunc)(struct ioc *);
-
-struct ioc_iommu {
-       u32 func_id;
-       char *name;
-       initfunc *init;
-};
-
-static struct ioc_iommu ioc_iommu_info[] __initdata = {
-       { ZX1_IOC_ID, "zx1", ioc_zx1_init },
-       { ZX2_IOC_ID, "zx2", NULL },
-       { SX1000_IOC_ID, "sx1000", NULL },
-       { SX2000_IOC_ID, "sx2000", NULL },
-};
-
-static struct ioc * __init
-ioc_init(u64 hpa, void *handle)
-{
-       struct ioc *ioc;
-       struct ioc_iommu *info;
-
-       ioc = kmalloc(sizeof(*ioc), GFP_KERNEL);
-       if (!ioc)
-               return NULL;
-
-       memset(ioc, 0, sizeof(*ioc));
-
-       ioc->next = ioc_list;
-       ioc_list = ioc;
-
-       ioc->handle = handle;
-       ioc->ioc_hpa = ioremap(hpa, 0x1000);
-
-       ioc->func_id = READ_REG(ioc->ioc_hpa + IOC_FUNC_ID);
-       ioc->rev = READ_REG(ioc->ioc_hpa + IOC_FCLASS) & 0xFFUL;
-       ioc->dma_mask = 0xFFFFFFFFFFFFFFFFUL;   /* conservative */
-
-       for (info = ioc_iommu_info; info < ioc_iommu_info + ARRAY_SIZE(ioc_iommu_info); info++) {
-               if (ioc->func_id == info->func_id) {
-                       ioc->name = info->name;
-                       if (info->init)
-                               (info->init)(ioc);
-               }
-       }
-
-       iovp_size = (1 << iovp_shift);
-       iovp_mask = ~(iovp_size - 1);
-
-       DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __FUNCTION__,
-               PAGE_SIZE >> 10, iovp_size >> 10);
-
-       if (!ioc->name) {
-               ioc->name = kmalloc(24, GFP_KERNEL);
-               if (ioc->name)
-                       sprintf((char *) ioc->name, "Unknown (%04x:%04x)",
-                               ioc->func_id & 0xFFFF, (ioc->func_id >> 16) & 0xFFFF);
-               else
-                       ioc->name = "Unknown";
-       }
-
-       ioc_iova_init(ioc);
-       ioc_resource_init(ioc);
-       ioc_sac_init(ioc);
-
-       if ((long) ~iovp_mask > (long) ia64_max_iommu_merge_mask)
-               ia64_max_iommu_merge_mask = ~iovp_mask;
-
-       printk(KERN_INFO PFX
-               "%s %d.%d HPA 0x%lx IOVA space %dMb at 0x%lx\n",
-               ioc->name, (ioc->rev >> 4) & 0xF, ioc->rev & 0xF,
-               hpa, ioc->iov_size >> 20, ioc->ibase);
-
-       return ioc;
-}
-
-
-
-/**************************************************************************
-**
-**   SBA initialization code (HW and SW)
-**
-**   o identify SBA chip itself
-**   o FIXME: initialize DMA hints for reasonable defaults
-**
-**************************************************************************/
-
-#ifdef CONFIG_PROC_FS
-static void *
-ioc_start(struct seq_file *s, loff_t *pos)
-{
-       struct ioc *ioc;
-       loff_t n = *pos;
-
-       for (ioc = ioc_list; ioc; ioc = ioc->next)
-               if (!n--)
-                       return ioc;
-
-       return NULL;
-}
-
-static void *
-ioc_next(struct seq_file *s, void *v, loff_t *pos)
-{
-       struct ioc *ioc = v;
-
-       ++*pos;
-       return ioc->next;
-}
-
-static void
-ioc_stop(struct seq_file *s, void *v)
-{
-}
-
-static int
-ioc_show(struct seq_file *s, void *v)
-{
-       struct ioc *ioc = v;
-       unsigned long *res_ptr = (unsigned long *)ioc->res_map;
-       int i, used = 0;
-
-       seq_printf(s, "Hewlett Packard %s IOC rev %d.%d\n",
-               ioc->name, ((ioc->rev >> 4) & 0xF), (ioc->rev & 0xF));
-#ifdef CONFIG_NUMA
-       if (ioc->node != MAX_NUMNODES)
-               seq_printf(s, "NUMA node       : %d\n", ioc->node);
-#endif
-       seq_printf(s, "IOVA size       : %ld MB\n", ((ioc->pdir_size >> 3) * iovp_size)/(1024*1024));
-       seq_printf(s, "IOVA page size  : %ld kb\n", iovp_size/1024);
-
-       for (i = 0; i < (ioc->res_size / sizeof(unsigned long)); ++i, ++res_ptr)
-               used += hweight64(*res_ptr);
-
-       seq_printf(s, "PDIR size       : %d entries\n", ioc->pdir_size >> 3);
-       seq_printf(s, "PDIR used       : %d entries\n", used);
-
-#ifdef PDIR_SEARCH_TIMING
-       {
-               unsigned long i = 0, avg = 0, min, max;
-               min = max = ioc->avg_search[0];
-               for (i = 0; i < SBA_SEARCH_SAMPLE; i++) {
-                       avg += ioc->avg_search[i];
-                       if (ioc->avg_search[i] > max) max = ioc->avg_search[i];
-                       if (ioc->avg_search[i] < min) min = ioc->avg_search[i];
-               }
-               avg /= SBA_SEARCH_SAMPLE;
-               seq_printf(s, "Bitmap search   : %ld/%ld/%ld (min/avg/max CPU Cycles/IOVA page)\n",
-                          min, avg, max);
-       }
-#endif
-#ifndef ALLOW_IOV_BYPASS
-        seq_printf(s, "IOVA bypass disabled\n");
-#endif
-       return 0;
-}
-
-static struct seq_operations ioc_seq_ops = {
-       .start = ioc_start,
-       .next  = ioc_next,
-       .stop  = ioc_stop,
-       .show  = ioc_show
-};
-
-static int
-ioc_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &ioc_seq_ops);
-}
-
-static struct file_operations ioc_fops = {
-       .open    = ioc_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release
-};
-
-static void __init
-ioc_proc_init(void)
-{
-       struct proc_dir_entry *dir, *entry;
-
-       dir = proc_mkdir("bus/mckinley", NULL);
-       if (!dir)
-               return;
-
-       entry = create_proc_entry(ioc_list->name, 0, dir);
-       if (entry)
-               entry->proc_fops = &ioc_fops;
-}
-#endif
-
-static void
-sba_connect_bus(struct pci_bus *bus)
-{
-       acpi_handle handle, parent;
-       acpi_status status;
-       struct ioc *ioc;
-
-       if (!PCI_CONTROLLER(bus))
-               panic(PFX "no sysdata on bus %d!\n", bus->number);
-
-       if (PCI_CONTROLLER(bus)->iommu)
-               return;
-
-       handle = PCI_CONTROLLER(bus)->acpi_handle;
-       if (!handle)
-               return;
-
-       /*
-        * The IOC scope encloses PCI root bridges in the ACPI
-        * namespace, so work our way out until we find an IOC we
-        * claimed previously.
-        */
-       do {
-               for (ioc = ioc_list; ioc; ioc = ioc->next)
-                       if (ioc->handle == handle) {
-                               PCI_CONTROLLER(bus)->iommu = ioc;
-                               return;
-                       }
-
-               status = acpi_get_parent(handle, &parent);
-               handle = parent;
-       } while (ACPI_SUCCESS(status));
-
-       printk(KERN_WARNING "No IOC for PCI Bus %04x:%02x in ACPI\n", pci_domain_nr(bus), bus->number);
-}
-
-#ifdef CONFIG_NUMA
-static void __init
-sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)
-{
-       unsigned int node;
-       int pxm;
-
-       ioc->node = MAX_NUMNODES;
-
-       pxm = acpi_get_pxm(handle);
-
-       if (pxm < 0)
-               return;
-
-       node = pxm_to_node(pxm);
-
-       if (node >= MAX_NUMNODES || !node_online(node))
-               return;
-
-       ioc->node = node;
-       return;
-}
-#else
-#define sba_map_ioc_to_node(ioc, handle)
-#endif
-
-static int __init
-acpi_sba_ioc_add(struct acpi_device *device)
-{
-       struct ioc *ioc;
-       acpi_status status;
-       u64 hpa, length;
-       struct acpi_buffer buffer;
-       struct acpi_device_info *dev_info;
-
-       status = hp_acpi_csr_space(device->handle, &hpa, &length);
-       if (ACPI_FAILURE(status))
-               return 1;
-
-       buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
-       status = acpi_get_object_info(device->handle, &buffer);
-       if (ACPI_FAILURE(status))
-               return 1;
-       dev_info = buffer.pointer;
-
-       /*
-        * For HWP0001, only SBA appears in ACPI namespace.  It encloses the PCI
-        * root bridges, and its CSR space includes the IOC function.
-        */
-       if (strncmp("HWP0001", dev_info->hardware_id.value, 7) == 0) {
-               hpa += ZX1_IOC_OFFSET;
-               /* zx1 based systems default to kernel page size iommu pages */
-               if (!iovp_shift)
-                       iovp_shift = min(PAGE_SHIFT, 16);
-       }
-       kfree(dev_info);
-
-       /*
-        * default anything not caught above or specified on cmdline to 4k
-        * iommu page size
-        */
-       if (!iovp_shift)
-               iovp_shift = 12;
-
-       ioc = ioc_init(hpa, device->handle);
-       if (!ioc)
-               return 1;
-
-       /* setup NUMA node association */
-       sba_map_ioc_to_node(ioc, device->handle);
-       return 0;
-}
-
-static struct acpi_driver acpi_sba_ioc_driver = {
-       .name           = "IOC IOMMU Driver",
-       .ids            = "HWP0001,HWP0004",
-       .ops            = {
-               .add    = acpi_sba_ioc_add,
-       },
-};
-
-static int __init
-sba_init(void)
-{
-       if (!ia64_platform_is("hpzx1") && !ia64_platform_is("hpzx1_swiotlb"))
-               return 0;
-
-       acpi_bus_register_driver(&acpi_sba_ioc_driver);
-       if (!ioc_list) {
-#ifdef CONFIG_IA64_GENERIC
-               extern int swiotlb_late_init_with_default_size (size_t size);
-
-               /*
-                * If we didn't find something sba_iommu can claim, we
-                * need to setup the swiotlb and switch to the dig machvec.
-                */
-               if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0)
-                       panic("Unable to find SBA IOMMU or initialize "
-                             "software I/O TLB: Try machvec=dig boot option");
-               machvec_init("dig");
-#else
-               panic("Unable to find SBA IOMMU: Try a generic or DIG kernel");
-#endif
-               return 0;
-       }
-
-#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB)
-       /*
-        * hpzx1_swiotlb needs to have a fairly small swiotlb bounce
-        * buffer setup to support devices with smaller DMA masks than
-        * sba_iommu can handle.
-        */
-       if (ia64_platform_is("hpzx1_swiotlb")) {
-               extern void hwsw_init(void);
-
-               hwsw_init();
-       }
-#endif
-
-#ifdef CONFIG_PCI
-       {
-               struct pci_bus *b = NULL;
-               while ((b = pci_find_next_bus(b)) != NULL)
-                       sba_connect_bus(b);
-       }
-#endif
-
-#ifdef CONFIG_PROC_FS
-       ioc_proc_init();
-#endif
-       return 0;
-}
-
-subsys_initcall(sba_init); /* must be initialized after ACPI etc., but before any drivers... */
-
-static int __init
-nosbagart(char *str)
-{
-       reserve_sba_gart = 0;
-       return 1;
-}
-
-int
-sba_dma_supported (struct device *dev, u64 mask)
-{
-       /* make sure it's at least 32bit capable */
-       return ((mask & 0xFFFFFFFFUL) == 0xFFFFFFFFUL);
-}
-
-int
-sba_dma_mapping_error (dma_addr_t dma_addr)
-{
-       return 0;
-}
-
-__setup("nosbagart", nosbagart);
-
-static int __init
-sba_page_override(char *str)
-{
-       unsigned long page_size;
-
-       page_size = memparse(str, &str);
-       switch (page_size) {
-               case 4096:
-               case 8192:
-               case 16384:
-               case 65536:
-                       iovp_shift = ffs(page_size) - 1;
-                       break;
-               default:
-                       printk("%s: unknown/unsupported iommu page size %ld\n",
-                              __FUNCTION__, page_size);
-       }
-
-       return 1;
-}
-
-__setup("sbapagesize=",sba_page_override);
-
-EXPORT_SYMBOL(sba_dma_mapping_error);
-EXPORT_SYMBOL(sba_map_single);
-EXPORT_SYMBOL(sba_unmap_single);
-EXPORT_SYMBOL(sba_map_sg);
-EXPORT_SYMBOL(sba_unmap_sg);
-EXPORT_SYMBOL(sba_dma_supported);
-EXPORT_SYMBOL(sba_alloc_coherent);
-EXPORT_SYMBOL(sba_free_coherent);
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/Makefile b/linux-2.6-xen-sparse/arch/ia64/kernel/Makefile
deleted file mode 100644 (file)
index ad8215a..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-extra-y        := head.o init_task.o vmlinux.lds
-
-obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o      \
-        irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o          \
-        salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \
-        unwind.o mca.o mca_asm.o topology.o
-
-obj-$(CONFIG_IA64_BRL_EMU)     += brl_emu.o
-obj-$(CONFIG_IA64_GENERIC)     += acpi-ext.o
-obj-$(CONFIG_IA64_HP_ZX1)      += acpi-ext.o
-obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += acpi-ext.o
-
-ifneq ($(CONFIG_ACPI_PROCESSOR),)
-obj-y                          += acpi-processor.o
-endif
-
-obj-$(CONFIG_IA64_PALINFO)     += palinfo.o
-obj-$(CONFIG_IOSAPIC)          += iosapic.o
-obj-$(CONFIG_MODULES)          += module.o
-obj-$(CONFIG_SMP)              += smp.o smpboot.o
-obj-$(CONFIG_NUMA)             += numa.o
-obj-$(CONFIG_PERFMON)          += perfmon_default_smpl.o
-obj-$(CONFIG_IA64_CYCLONE)     += cyclone.o
-obj-$(CONFIG_CPU_FREQ)         += cpufreq/
-obj-$(CONFIG_IA64_MCA_RECOVERY)        += mca_recovery.o
-obj-$(CONFIG_KPROBES)          += kprobes.o jprobes.o
-obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)  += uncached.o
-obj-$(CONFIG_AUDIT)            += audit.o
-mca_recovery-y                 += mca_drv.o mca_drv_asm.o
-
-# The gate DSO image is built using a special linker script.
-targets += gate.so gate-syms.o
-
-extra-y += gate.so gate-syms.o gate.lds gate.o
-
-# fp_emulate() expects f2-f5,f16-f31 to contain the user-level state.
-CFLAGS_traps.o  += -mfixed-range=f2-f5,f16-f31
-
-CPPFLAGS_gate.lds := -P -C -U$(ARCH)
-
-quiet_cmd_gate = GATE $@
-      cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@
-
-GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 \
-                    $(call ld-option, -Wl$(comma)--hash-style=sysv)
-$(obj)/gate.so: $(obj)/gate.lds $(obj)/gate.o FORCE
-       $(call if_changed,gate)
-
-$(obj)/built-in.o: $(obj)/gate-syms.o
-$(obj)/built-in.o: ld_flags += -R $(obj)/gate-syms.o
-
-GATECFLAGS_gate-syms.o = -r
-$(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE
-       $(call if_changed,gate)
-
-# gate-data.o contains the gate DSO image as data in section .data.gate.
-# We must build gate.so before we can assemble it.
-# Note: kbuild does not track this dependency due to usage of .incbin
-$(obj)/gate-data.o: $(obj)/gate.so
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c b/linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c
deleted file mode 100644 (file)
index 54e2fb8..0000000
+++ /dev/null
@@ -1,1010 +0,0 @@
-/*
- *  acpi.c - Architecture-Specific Low-Level ACPI Support
- *
- *  Copyright (C) 1999 VA Linux Systems
- *  Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com>
- *  Copyright (C) 2000, 2002-2003 Hewlett-Packard Co.
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *  Copyright (C) 2000 Intel Corp.
- *  Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com>
- *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
- *  Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com>
- *  Copyright (C) 2001 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
- *  Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
- *  Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/irq.h>
-#include <linux/acpi.h>
-#include <linux/efi.h>
-#include <linux/mmzone.h>
-#include <linux/nodemask.h>
-#include <asm/io.h>
-#include <asm/iosapic.h>
-#include <asm/machvec.h>
-#include <asm/page.h>
-#include <asm/system.h>
-#include <asm/numa.h>
-#include <asm/sal.h>
-#include <asm/cyclone.h>
-
-#define BAD_MADT_ENTRY(entry, end) (                                        \
-               (!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
-               ((acpi_table_entry_header *)entry)->length < sizeof(*entry))
-
-#define PREFIX                 "ACPI: "
-
-void (*pm_idle) (void);
-EXPORT_SYMBOL(pm_idle);
-void (*pm_power_off) (void);
-EXPORT_SYMBOL(pm_power_off);
-
-unsigned char acpi_kbd_controller_present = 1;
-unsigned char acpi_legacy_devices;
-
-unsigned int acpi_cpei_override;
-unsigned int acpi_cpei_phys_cpuid;
-
-#define MAX_SAPICS 256
-u16 ia64_acpiid_to_sapicid[MAX_SAPICS] = {[0 ... MAX_SAPICS - 1] = -1 };
-
-EXPORT_SYMBOL(ia64_acpiid_to_sapicid);
-
-const char *acpi_get_sysname(void)
-{
-#ifdef CONFIG_IA64_GENERIC
-       unsigned long rsdp_phys;
-       struct acpi20_table_rsdp *rsdp;
-       struct acpi_table_xsdt *xsdt;
-       struct acpi_table_header *hdr;
-
-       rsdp_phys = acpi_find_rsdp();
-       if (!rsdp_phys) {
-               printk(KERN_ERR
-                      "ACPI 2.0 RSDP not found, default to \"dig\"\n");
-               return "dig";
-       }
-
-       rsdp = (struct acpi20_table_rsdp *)__va(rsdp_phys);
-       if (strncmp(rsdp->signature, RSDP_SIG, sizeof(RSDP_SIG) - 1)) {
-               printk(KERN_ERR
-                      "ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n");
-               return "dig";
-       }
-
-       xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_address);
-       hdr = &xsdt->header;
-       if (strncmp(hdr->signature, XSDT_SIG, sizeof(XSDT_SIG) - 1)) {
-               printk(KERN_ERR
-                      "ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n");
-               return "dig";
-       }
-
-       if (!strcmp(hdr->oem_id, "HP")) {
-               return "hpzx1";
-       } else if (!strcmp(hdr->oem_id, "SGI")) {
-               return "sn2";
-#ifdef CONFIG_XEN
-       } else if (is_running_on_xen() && !strcmp(hdr->oem_id, "XEN")) {
-               return "xen";
-#endif
-       }
-
-       return "dig";
-#else
-# if defined (CONFIG_IA64_HP_SIM)
-       return "hpsim";
-# elif defined (CONFIG_IA64_HP_ZX1)
-       return "hpzx1";
-# elif defined (CONFIG_IA64_HP_ZX1_SWIOTLB)
-       return "hpzx1_swiotlb";
-# elif defined (CONFIG_IA64_SGI_SN2)
-       return "sn2";
-# elif defined (CONFIG_IA64_DIG)
-       return "dig";
-# elif defined (CONFIG_IA64_XEN)
-       return "xen";
-# else
-#      error Unknown platform.  Fix acpi.c.
-# endif
-#endif
-}
-
-#ifdef CONFIG_ACPI
-
-#define ACPI_MAX_PLATFORM_INTERRUPTS   256
-
-/* Array to record platform interrupt vectors for generic interrupt routing. */
-int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = {
-       [0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1
-};
-
-enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_IOSAPIC;
-
-/*
- * Interrupt routing API for device drivers.  Provides interrupt vector for
- * a generic platform event.  Currently only CPEI is implemented.
- */
-int acpi_request_vector(u32 int_type)
-{
-       int vector = -1;
-
-       if (int_type < ACPI_MAX_PLATFORM_INTERRUPTS) {
-               /* corrected platform error interrupt */
-               vector = platform_intr_list[int_type];
-       } else
-               printk(KERN_ERR
-                      "acpi_request_vector(): invalid interrupt type\n");
-       return vector;
-}
-
-char *__acpi_map_table(unsigned long phys_addr, unsigned long size)
-{
-       return __va(phys_addr);
-}
-
-/* --------------------------------------------------------------------------
-                            Boot-time Table Parsing
-   -------------------------------------------------------------------------- */
-
-static int total_cpus __initdata;
-static int available_cpus __initdata;
-struct acpi_table_madt *acpi_madt __initdata;
-static u8 has_8259;
-
-static int __init
-acpi_parse_lapic_addr_ovr(acpi_table_entry_header * header,
-                         const unsigned long end)
-{
-       struct acpi_table_lapic_addr_ovr *lapic;
-
-       lapic = (struct acpi_table_lapic_addr_ovr *)header;
-
-       if (BAD_MADT_ENTRY(lapic, end))
-               return -EINVAL;
-
-       if (lapic->address) {
-               iounmap(ipi_base_addr);
-               ipi_base_addr = ioremap(lapic->address, 0);
-       }
-       return 0;
-}
-
-static int __init
-acpi_parse_lsapic(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_lsapic *lsapic;
-
-       lsapic = (struct acpi_table_lsapic *)header;
-
-       if (BAD_MADT_ENTRY(lsapic, end))
-               return -EINVAL;
-
-       if (lsapic->flags.enabled) {
-#ifdef CONFIG_SMP
-               smp_boot_data.cpu_phys_id[available_cpus] =
-                   (lsapic->id << 8) | lsapic->eid;
-#endif
-               ia64_acpiid_to_sapicid[lsapic->acpi_id] =
-                   (lsapic->id << 8) | lsapic->eid;
-               ++available_cpus;
-       }
-
-       total_cpus++;
-       return 0;
-}
-
-static int __init
-acpi_parse_lapic_nmi(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_lapic_nmi *lacpi_nmi;
-
-       lacpi_nmi = (struct acpi_table_lapic_nmi *)header;
-
-       if (BAD_MADT_ENTRY(lacpi_nmi, end))
-               return -EINVAL;
-
-       /* TBD: Support lapic_nmi entries */
-       return 0;
-}
-
-static int __init
-acpi_parse_iosapic(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_iosapic *iosapic;
-
-       iosapic = (struct acpi_table_iosapic *)header;
-
-       if (BAD_MADT_ENTRY(iosapic, end))
-               return -EINVAL;
-
-       return iosapic_init(iosapic->address, iosapic->global_irq_base);
-}
-
-static unsigned int __initdata acpi_madt_rev;
-
-static int __init
-acpi_parse_plat_int_src(acpi_table_entry_header * header,
-                       const unsigned long end)
-{
-       struct acpi_table_plat_int_src *plintsrc;
-       int vector;
-
-       plintsrc = (struct acpi_table_plat_int_src *)header;
-
-       if (BAD_MADT_ENTRY(plintsrc, end))
-               return -EINVAL;
-
-       /*
-        * Get vector assignment for this interrupt, set attributes,
-        * and program the IOSAPIC routing table.
-        */
-       vector = iosapic_register_platform_intr(plintsrc->type,
-                                               plintsrc->global_irq,
-                                               plintsrc->iosapic_vector,
-                                               plintsrc->eid,
-                                               plintsrc->id,
-                                               (plintsrc->flags.polarity ==
-                                                1) ? IOSAPIC_POL_HIGH :
-                                               IOSAPIC_POL_LOW,
-                                               (plintsrc->flags.trigger ==
-                                                1) ? IOSAPIC_EDGE :
-                                               IOSAPIC_LEVEL);
-
-       platform_intr_list[plintsrc->type] = vector;
-       if (acpi_madt_rev > 1) {
-               acpi_cpei_override = plintsrc->plint_flags.cpei_override_flag;
-       }
-
-       /*
-        * Save the physical id, so we can check when its being removed
-        */
-       acpi_cpei_phys_cpuid = ((plintsrc->id << 8) | (plintsrc->eid)) & 0xffff;
-
-       return 0;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-unsigned int can_cpei_retarget(void)
-{
-       extern int cpe_vector;
-       extern unsigned int force_cpei_retarget;
-
-       /*
-        * Only if CPEI is supported and the override flag
-        * is present, otherwise return that its re-targettable
-        * if we are in polling mode.
-        */
-       if (cpe_vector > 0) {
-               if (acpi_cpei_override || force_cpei_retarget)
-                       return 1;
-               else
-                       return 0;
-       }
-       return 1;
-}
-
-unsigned int is_cpu_cpei_target(unsigned int cpu)
-{
-       unsigned int logical_id;
-
-       logical_id = cpu_logical_id(acpi_cpei_phys_cpuid);
-
-       if (logical_id == cpu)
-               return 1;
-       else
-               return 0;
-}
-
-void set_cpei_target_cpu(unsigned int cpu)
-{
-       acpi_cpei_phys_cpuid = cpu_physical_id(cpu);
-}
-#endif
-
-unsigned int get_cpei_target_cpu(void)
-{
-       return acpi_cpei_phys_cpuid;
-}
-
-static int __init
-acpi_parse_int_src_ovr(acpi_table_entry_header * header,
-                      const unsigned long end)
-{
-       struct acpi_table_int_src_ovr *p;
-
-       p = (struct acpi_table_int_src_ovr *)header;
-
-       if (BAD_MADT_ENTRY(p, end))
-               return -EINVAL;
-
-       iosapic_override_isa_irq(p->bus_irq, p->global_irq,
-                                (p->flags.polarity ==
-                                 1) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
-                                (p->flags.trigger ==
-                                 1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);
-       return 0;
-}
-
-static int __init
-acpi_parse_nmi_src(acpi_table_entry_header * header, const unsigned long end)
-{
-       struct acpi_table_nmi_src *nmi_src;
-
-       nmi_src = (struct acpi_table_nmi_src *)header;
-
-       if (BAD_MADT_ENTRY(nmi_src, end))
-               return -EINVAL;
-
-       /* TBD: Support nimsrc entries */
-       return 0;
-}
-
-static void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
-{
-       if (!strncmp(oem_id, "IBM", 3) && (!strncmp(oem_table_id, "SERMOW", 6))) {
-
-               /*
-                * Unfortunately ITC_DRIFT is not yet part of the
-                * official SAL spec, so the ITC_DRIFT bit is not
-                * set by the BIOS on this hardware.
-                */
-               sal_platform_features |= IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT;
-
-               cyclone_setup();
-       }
-}
-
-static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
-{
-       if (!phys_addr || !size)
-               return -EINVAL;
-
-       acpi_madt = (struct acpi_table_madt *)__va(phys_addr);
-
-       acpi_madt_rev = acpi_madt->header.revision;
-
-       /* remember the value for reference after free_initmem() */
-#ifdef CONFIG_ITANIUM
-       has_8259 = 1;           /* Firmware on old Itanium systems is broken */
-#else
-       has_8259 = acpi_madt->flags.pcat_compat;
-#endif
-       iosapic_system_init(has_8259);
-
-       /* Get base address of IPI Message Block */
-
-       if (acpi_madt->lapic_address)
-               ipi_base_addr = ioremap(acpi_madt->lapic_address, 0);
-
-       printk(KERN_INFO PREFIX "Local APIC address %p\n", ipi_base_addr);
-
-       acpi_madt_oem_check(acpi_madt->header.oem_id,
-                           acpi_madt->header.oem_table_id);
-
-       return 0;
-}
-
-#ifdef CONFIG_ACPI_NUMA
-
-#undef SLIT_DEBUG
-
-#define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32)
-
-static int __initdata srat_num_cpus;   /* number of cpus */
-static u32 __devinitdata pxm_flag[PXM_FLAG_LEN];
-#define pxm_bit_set(bit)       (set_bit(bit,(void *)pxm_flag))
-#define pxm_bit_test(bit)      (test_bit(bit,(void *)pxm_flag))
-static struct acpi_table_slit __initdata *slit_table;
-
-static int get_processor_proximity_domain(struct acpi_table_processor_affinity *pa)
-{
-       int pxm;
-
-       pxm = pa->proximity_domain;
-       if (ia64_platform_is("sn2"))
-               pxm += pa->reserved[0] << 8;
-       return pxm;
-}
-
-static int get_memory_proximity_domain(struct acpi_table_memory_affinity *ma)
-{
-       int pxm;
-
-       pxm = ma->proximity_domain;
-       if (ia64_platform_is("sn2"))
-               pxm += ma->reserved1[0] << 8;
-       return pxm;
-}
-
-/*
- * ACPI 2.0 SLIT (System Locality Information Table)
- * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf
- */
-void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
-{
-       u32 len;
-
-       len = sizeof(struct acpi_table_header) + 8
-           + slit->localities * slit->localities;
-       if (slit->header.length != len) {
-               printk(KERN_ERR
-                      "ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n",
-                      len, slit->header.length);
-               memset(numa_slit, 10, sizeof(numa_slit));
-               return;
-       }
-       slit_table = slit;
-}
-
-void __init
-acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
-{
-       int pxm;
-
-       if (!pa->flags.enabled)
-               return;
-
-       pxm = get_processor_proximity_domain(pa);
-
-       /* record this node in proximity bitmap */
-       pxm_bit_set(pxm);
-
-       node_cpuid[srat_num_cpus].phys_id =
-           (pa->apic_id << 8) | (pa->lsapic_eid);
-       /* nid should be overridden as logical node id later */
-       node_cpuid[srat_num_cpus].nid = pxm;
-       srat_num_cpus++;
-}
-
-void __init
-acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
-{
-       unsigned long paddr, size;
-       int pxm;
-       struct node_memblk_s *p, *q, *pend;
-
-       pxm = get_memory_proximity_domain(ma);
-
-       /* fill node memory chunk structure */
-       paddr = ma->base_addr_hi;
-       paddr = (paddr << 32) | ma->base_addr_lo;
-       size = ma->length_hi;
-       size = (size << 32) | ma->length_lo;
-
-       /* Ignore disabled entries */
-       if (!ma->flags.enabled)
-               return;
-
-       /* record this node in proximity bitmap */
-       pxm_bit_set(pxm);
-
-       /* Insertion sort based on base address */
-       pend = &node_memblk[num_node_memblks];
-       for (p = &node_memblk[0]; p < pend; p++) {
-               if (paddr < p->start_paddr)
-                       break;
-       }
-       if (p < pend) {
-               for (q = pend - 1; q >= p; q--)
-                       *(q + 1) = *q;
-       }
-       p->start_paddr = paddr;
-       p->size = size;
-       p->nid = pxm;
-       num_node_memblks++;
-}
-
-void __init acpi_numa_arch_fixup(void)
-{
-       int i, j, node_from, node_to;
-
-       /* If there's no SRAT, fix the phys_id and mark node 0 online */
-       if (srat_num_cpus == 0) {
-               node_set_online(0);
-               node_cpuid[0].phys_id = hard_smp_processor_id();
-               return;
-       }
-
-       /*
-        * MCD - This can probably be dropped now.  No need for pxm ID to node ID
-        * mapping with sparse node numbering iff MAX_PXM_DOMAINS <= MAX_NUMNODES.
-        */
-       nodes_clear(node_online_map);
-       for (i = 0; i < MAX_PXM_DOMAINS; i++) {
-               if (pxm_bit_test(i)) {
-                       int nid = acpi_map_pxm_to_node(i);
-                       node_set_online(nid);
-               }
-       }
-
-       /* set logical node id in memory chunk structure */
-       for (i = 0; i < num_node_memblks; i++)
-               node_memblk[i].nid = pxm_to_node(node_memblk[i].nid);
-
-       /* assign memory bank numbers for each chunk on each node */
-       for_each_online_node(i) {
-               int bank;
-
-               bank = 0;
-               for (j = 0; j < num_node_memblks; j++)
-                       if (node_memblk[j].nid == i)
-                               node_memblk[j].bank = bank++;
-       }
-
-       /* set logical node id in cpu structure */
-       for (i = 0; i < srat_num_cpus; i++)
-               node_cpuid[i].nid = pxm_to_node(node_cpuid[i].nid);
-
-       printk(KERN_INFO "Number of logical nodes in system = %d\n",
-              num_online_nodes());
-       printk(KERN_INFO "Number of memory chunks in system = %d\n",
-              num_node_memblks);
-
-       if (!slit_table)
-               return;
-       memset(numa_slit, -1, sizeof(numa_slit));
-       for (i = 0; i < slit_table->localities; i++) {
-               if (!pxm_bit_test(i))
-                       continue;
-               node_from = pxm_to_node(i);
-               for (j = 0; j < slit_table->localities; j++) {
-                       if (!pxm_bit_test(j))
-                               continue;
-                       node_to = pxm_to_node(j);
-                       node_distance(node_from, node_to) =
-                           slit_table->entry[i * slit_table->localities + j];
-               }
-       }
-
-#ifdef SLIT_DEBUG
-       printk("ACPI 2.0 SLIT locality table:\n");
-       for_each_online_node(i) {
-               for_each_online_node(j)
-                   printk("%03d ", node_distance(i, j));
-               printk("\n");
-       }
-#endif
-}
-#endif                         /* CONFIG_ACPI_NUMA */
-
-/*
- * success: return IRQ number (>=0)
- * failure: return < 0
- */
-int acpi_register_gsi(u32 gsi, int triggering, int polarity)
-{
-       if (has_8259 && gsi < 16)
-               return isa_irq_to_vector(gsi);
-
-       return iosapic_register_intr(gsi,
-                                    (polarity ==
-                                     ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH :
-                                    IOSAPIC_POL_LOW,
-                                    (triggering ==
-                                     ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :
-                                    IOSAPIC_LEVEL);
-}
-
-EXPORT_SYMBOL(acpi_register_gsi);
-
-void acpi_unregister_gsi(u32 gsi)
-{
-       iosapic_unregister_intr(gsi);
-}
-
-EXPORT_SYMBOL(acpi_unregister_gsi);
-
-static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size)
-{
-       struct acpi_table_header *fadt_header;
-       struct fadt_descriptor *fadt;
-
-       if (!phys_addr || !size)
-               return -EINVAL;
-
-       fadt_header = (struct acpi_table_header *)__va(phys_addr);
-       if (fadt_header->revision != 3)
-               return -ENODEV; /* Only deal with ACPI 2.0 FADT */
-
-       fadt = (struct fadt_descriptor *)fadt_header;
-
-       if (!(fadt->iapc_boot_arch & BAF_8042_KEYBOARD_CONTROLLER))
-               acpi_kbd_controller_present = 0;
-
-       if (fadt->iapc_boot_arch & BAF_LEGACY_DEVICES)
-               acpi_legacy_devices = 1;
-
-       acpi_register_gsi(fadt->sci_int, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW);
-       return 0;
-}
-
-unsigned long __init acpi_find_rsdp(void)
-{
-       unsigned long rsdp_phys = 0;
-
-       if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
-               rsdp_phys = efi.acpi20;
-       else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
-               printk(KERN_WARNING PREFIX
-                      "v1.0/r0.71 tables no longer supported\n");
-       return rsdp_phys;
-}
-
-int __init acpi_boot_init(void)
-{
-
-       /*
-        * MADT
-        * ----
-        * Parse the Multiple APIC Description Table (MADT), if exists.
-        * Note that this table provides platform SMP configuration
-        * information -- the successor to MPS tables.
-        */
-
-       if (acpi_table_parse(ACPI_APIC, acpi_parse_madt) < 1) {
-               printk(KERN_ERR PREFIX "Can't find MADT\n");
-               goto skip_madt;
-       }
-
-       /* Local APIC */
-
-       if (acpi_table_parse_madt
-           (ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0) < 0)
-               printk(KERN_ERR PREFIX
-                      "Error parsing LAPIC address override entry\n");
-
-       if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, NR_CPUS)
-           < 1)
-               printk(KERN_ERR PREFIX
-                      "Error parsing MADT - no LAPIC entries\n");
-
-       if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0)
-           < 0)
-               printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
-
-       /* I/O APIC */
-
-       if (acpi_table_parse_madt
-           (ACPI_MADT_IOSAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1)
-               printk(KERN_ERR PREFIX
-                      "Error parsing MADT - no IOSAPIC entries\n");
-
-       /* System-Level Interrupt Routing */
-
-       if (acpi_table_parse_madt
-           (ACPI_MADT_PLAT_INT_SRC, acpi_parse_plat_int_src,
-            ACPI_MAX_PLATFORM_INTERRUPTS) < 0)
-               printk(KERN_ERR PREFIX
-                      "Error parsing platform interrupt source entry\n");
-
-       if (acpi_table_parse_madt
-           (ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, 0) < 0)
-               printk(KERN_ERR PREFIX
-                      "Error parsing interrupt source overrides entry\n");
-
-       if (acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, 0) < 0)
-               printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
-      skip_madt:
-
-       /*
-        * FADT says whether a legacy keyboard controller is present.
-        * The FADT also contains an SCI_INT line, by which the system
-        * gets interrupts such as power and sleep buttons.  If it's not
-        * on a Legacy interrupt, it needs to be setup.
-        */
-       if (acpi_table_parse(ACPI_FADT, acpi_parse_fadt) < 1)
-               printk(KERN_ERR PREFIX "Can't find FADT\n");
-
-#ifdef CONFIG_SMP
-       if (available_cpus == 0) {
-               printk(KERN_INFO "ACPI: Found 0 CPUS; assuming 1\n");
-               printk(KERN_INFO "CPU 0 (0x%04x)", hard_smp_processor_id());
-               smp_boot_data.cpu_phys_id[available_cpus] =
-                   hard_smp_processor_id();
-               available_cpus = 1;     /* We've got at least one of these, no? */
-       }
-       smp_boot_data.cpu_count = available_cpus;
-
-       smp_build_cpu_map();
-# ifdef CONFIG_ACPI_NUMA
-       if (srat_num_cpus == 0) {
-               int cpu, i = 1;
-               for (cpu = 0; cpu < smp_boot_data.cpu_count; cpu++)
-                       if (smp_boot_data.cpu_phys_id[cpu] !=
-                           hard_smp_processor_id())
-                               node_cpuid[i++].phys_id =
-                                   smp_boot_data.cpu_phys_id[cpu];
-       }
-# endif
-#endif
-#ifdef CONFIG_ACPI_NUMA
-       build_cpu_to_node_map();
-#endif
-       /* Make boot-up look pretty */
-       printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus,
-              total_cpus);
-       return 0;
-}
-
-int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
-{
-       int vector;
-
-       if (has_8259 && gsi < 16)
-               *irq = isa_irq_to_vector(gsi);
-       else {
-               vector = gsi_to_vector(gsi);
-               if (vector == -1)
-                       return -1;
-
-               *irq = vector;
-       }
-       return 0;
-}
-
-/*
- *  ACPI based hotplug CPU support
- */
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-static
-int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid)
-{
-#ifdef CONFIG_ACPI_NUMA
-       int pxm_id;
-
-       pxm_id = acpi_get_pxm(handle);
-
-       /*
-        * Assuming that the container driver would have set the proximity
-        * domain and would have initialized pxm_to_node(pxm_id) && pxm_flag
-        */
-       node_cpuid[cpu].nid = (pxm_id < 0) ? 0 : pxm_to_node(pxm_id);
-
-       node_cpuid[cpu].phys_id = physid;
-#endif
-       return (0);
-}
-
-int additional_cpus __initdata = -1;
-
-static __init int setup_additional_cpus(char *s)
-{
-       if (s)
-               additional_cpus = simple_strtol(s, NULL, 0);
-
-       return 0;
-}
-
-early_param("additional_cpus", setup_additional_cpus);
-
-/*
- * cpu_possible_map should be static, it cannot change as cpu's
- * are onlined, or offlined. The reason is per-cpu data-structures
- * are allocated by some modules at init time, and dont expect to
- * do this dynamically on cpu arrival/departure.
- * cpu_present_map on the other hand can change dynamically.
- * In case when cpu_hotplug is not compiled, then we resort to current
- * behaviour, which is cpu_possible == cpu_present.
- * - Ashok Raj
- *
- * Three ways to find out the number of additional hotplug CPUs:
- * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
- * - The user can overwrite it with additional_cpus=NUM
- * - Otherwise don't reserve additional CPUs.
- */
-__init void prefill_possible_map(void)
-{
-       int i;
-       int possible, disabled_cpus;
-
-       disabled_cpus = total_cpus - available_cpus;
-
-       if (additional_cpus == -1) {
-               if (disabled_cpus > 0)
-                       additional_cpus = disabled_cpus;
-               else
-                       additional_cpus = 0;
-       }
-
-       possible = available_cpus + additional_cpus;
-
-       if (possible > NR_CPUS)
-               possible = NR_CPUS;
-
-       printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n",
-               possible, max((possible - available_cpus), 0));
-
-       for (i = 0; i < possible; i++)
-               cpu_set(i, cpu_possible_map);
-}
-
-int acpi_map_lsapic(acpi_handle handle, int *pcpu)
-{
-       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
-       union acpi_object *obj;
-       struct acpi_table_lsapic *lsapic;
-       cpumask_t tmp_map;
-       long physid;
-       int cpu;
-
-       if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
-               return -EINVAL;
-
-       if (!buffer.length || !buffer.pointer)
-               return -EINVAL;
-
-       obj = buffer.pointer;
-       if (obj->type != ACPI_TYPE_BUFFER ||
-           obj->buffer.length < sizeof(*lsapic)) {
-               kfree(buffer.pointer);
-               return -EINVAL;
-       }
-
-       lsapic = (struct acpi_table_lsapic *)obj->buffer.pointer;
-
-       if ((lsapic->header.type != ACPI_MADT_LSAPIC) ||
-           (!lsapic->flags.enabled)) {
-               kfree(buffer.pointer);
-               return -EINVAL;
-       }
-
-       physid = ((lsapic->id << 8) | (lsapic->eid));
-
-       kfree(buffer.pointer);
-       buffer.length = ACPI_ALLOCATE_BUFFER;
-       buffer.pointer = NULL;
-
-       cpus_complement(tmp_map, cpu_present_map);
-       cpu = first_cpu(tmp_map);
-       if (cpu >= NR_CPUS)
-               return -EINVAL;
-
-       acpi_map_cpu2node(handle, cpu, physid);
-
-       cpu_set(cpu, cpu_present_map);
-       ia64_cpu_to_sapicid[cpu] = physid;
-       ia64_acpiid_to_sapicid[lsapic->acpi_id] = ia64_cpu_to_sapicid[cpu];
-
-       *pcpu = cpu;
-       return (0);
-}
-
-EXPORT_SYMBOL(acpi_map_lsapic);
-
-int acpi_unmap_lsapic(int cpu)
-{
-       int i;
-
-       for (i = 0; i < MAX_SAPICS; i++) {
-               if (ia64_acpiid_to_sapicid[i] == ia64_cpu_to_sapicid[cpu]) {
-                       ia64_acpiid_to_sapicid[i] = -1;
-                       break;
-               }
-       }
-       ia64_cpu_to_sapicid[cpu] = -1;
-       cpu_clear(cpu, cpu_present_map);
-
-#ifdef CONFIG_ACPI_NUMA
-       /* NUMA specific cleanup's */
-#endif
-
-       return (0);
-}
-
-EXPORT_SYMBOL(acpi_unmap_lsapic);
-#endif                         /* CONFIG_ACPI_HOTPLUG_CPU */
-
-#ifdef CONFIG_ACPI_NUMA
-static acpi_status __devinit
-acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
-{
-       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
-       union acpi_object *obj;
-       struct acpi_table_iosapic *iosapic;
-       unsigned int gsi_base;
-       int pxm, node;
-
-       /* Only care about objects w/ a method that returns the MADT */
-       if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
-               return AE_OK;
-
-       if (!buffer.length || !buffer.pointer)
-               return AE_OK;
-
-       obj = buffer.pointer;
-       if (obj->type != ACPI_TYPE_BUFFER ||
-           obj->buffer.length < sizeof(*iosapic)) {
-               kfree(buffer.pointer);
-               return AE_OK;
-       }
-
-       iosapic = (struct acpi_table_iosapic *)obj->buffer.pointer;
-
-       if (iosapic->header.type != ACPI_MADT_IOSAPIC) {
-               kfree(buffer.pointer);
-               return AE_OK;
-       }
-
-       gsi_base = iosapic->global_irq_base;
-
-       kfree(buffer.pointer);
-
-       /*
-        * OK, it's an IOSAPIC MADT entry, look for a _PXM value to tell
-        * us which node to associate this with.
-        */
-       pxm = acpi_get_pxm(handle);
-       if (pxm < 0)
-               return AE_OK;
-
-       node = pxm_to_node(pxm);
-
-       if (node >= MAX_NUMNODES || !node_online(node) ||
-           cpus_empty(node_to_cpumask(node)))
-               return AE_OK;
-
-       /* We know a gsi to node mapping! */
-       map_iosapic_to_node(gsi_base, node);
-       return AE_OK;
-}
-
-static int __init
-acpi_map_iosapics (void)
-{
-       acpi_get_devices(NULL, acpi_map_iosapic, NULL, NULL);
-       return 0;
-}
-
-fs_initcall(acpi_map_iosapics);
-#endif                         /* CONFIG_ACPI_NUMA */
-
-int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
-{
-       int err;
-
-       if ((err = iosapic_init(phys_addr, gsi_base)))
-               return err;
-
-#ifdef CONFIG_ACPI_NUMA
-       acpi_map_iosapic(handle, 0, NULL, NULL);
-#endif                         /* CONFIG_ACPI_NUMA */
-
-       return 0;
-}
-
-EXPORT_SYMBOL(acpi_register_ioapic);
-
-int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
-{
-       return iosapic_remove(gsi_base);
-}
-
-EXPORT_SYMBOL(acpi_unregister_ioapic);
-
-#endif                         /* CONFIG_ACPI */
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c b/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c
deleted file mode 100644 (file)
index 2aa8c10..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed
- * to extract and format the required data.
- */
-
-#define ASM_OFFSETS_C 1
-
-#include <linux/sched.h>
-
-#include <asm-ia64/processor.h>
-#include <asm-ia64/ptrace.h>
-#include <asm-ia64/siginfo.h>
-#include <asm-ia64/sigcontext.h>
-#include <asm-ia64/mca.h>
-
-#include "../kernel/sigframe.h"
-
-#define DEFINE(sym, val) \
-        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-void foo(void)
-{
-       DEFINE(IA64_TASK_SIZE, sizeof (struct task_struct));
-       DEFINE(IA64_THREAD_INFO_SIZE, sizeof (struct thread_info));
-       DEFINE(IA64_PT_REGS_SIZE, sizeof (struct pt_regs));
-       DEFINE(IA64_SWITCH_STACK_SIZE, sizeof (struct switch_stack));
-       DEFINE(IA64_SIGINFO_SIZE, sizeof (struct siginfo));
-       DEFINE(IA64_CPU_SIZE, sizeof (struct cpuinfo_ia64));
-       DEFINE(SIGFRAME_SIZE, sizeof (struct sigframe));
-       DEFINE(UNW_FRAME_INFO_SIZE, sizeof (struct unw_frame_info));
-
-       BLANK();
-
-       DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
-       DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
-
-       BLANK();
-
-       DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, blocked));
-       DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, clear_child_tid));
-       DEFINE(IA64_TASK_GROUP_LEADER_OFFSET, offsetof (struct task_struct, group_leader));
-       DEFINE(IA64_TASK_PENDING_OFFSET,offsetof (struct task_struct, pending));
-       DEFINE(IA64_TASK_PID_OFFSET, offsetof (struct task_struct, pid));
-       DEFINE(IA64_TASK_REAL_PARENT_OFFSET, offsetof (struct task_struct, real_parent));
-       DEFINE(IA64_TASK_SIGHAND_OFFSET,offsetof (struct task_struct, sighand));
-       DEFINE(IA64_TASK_SIGNAL_OFFSET,offsetof (struct task_struct, signal));
-       DEFINE(IA64_TASK_TGID_OFFSET, offsetof (struct task_struct, tgid));
-       DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct task_struct, thread.ksp));
-       DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct task_struct, thread.on_ustack));
-
-       BLANK();
-
-       DEFINE(IA64_SIGHAND_SIGLOCK_OFFSET,offsetof (struct sighand_struct, siglock));
-
-       BLANK();
-
-       DEFINE(IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,offsetof (struct signal_struct,
-                                                            group_stop_count));
-       DEFINE(IA64_SIGNAL_SHARED_PENDING_OFFSET,offsetof (struct signal_struct, shared_pending));
-
-       BLANK();
-
-       DEFINE(IA64_PT_REGS_B6_OFFSET, offsetof (struct pt_regs, b6));
-       DEFINE(IA64_PT_REGS_B7_OFFSET, offsetof (struct pt_regs, b7));
-       DEFINE(IA64_PT_REGS_AR_CSD_OFFSET, offsetof (struct pt_regs, ar_csd));
-       DEFINE(IA64_PT_REGS_AR_SSD_OFFSET, offsetof (struct pt_regs, ar_ssd));
-       DEFINE(IA64_PT_REGS_R8_OFFSET, offsetof (struct pt_regs, r8));
-       DEFINE(IA64_PT_REGS_R9_OFFSET, offsetof (struct pt_regs, r9));
-       DEFINE(IA64_PT_REGS_R10_OFFSET, offsetof (struct pt_regs, r10));
-       DEFINE(IA64_PT_REGS_R11_OFFSET, offsetof (struct pt_regs, r11));
-       DEFINE(IA64_PT_REGS_CR_IPSR_OFFSET, offsetof (struct pt_regs, cr_ipsr));
-       DEFINE(IA64_PT_REGS_CR_IIP_OFFSET, offsetof (struct pt_regs, cr_iip));
-       DEFINE(IA64_PT_REGS_CR_IFS_OFFSET, offsetof (struct pt_regs, cr_ifs));
-       DEFINE(IA64_PT_REGS_AR_UNAT_OFFSET, offsetof (struct pt_regs, ar_unat));
-       DEFINE(IA64_PT_REGS_AR_PFS_OFFSET, offsetof (struct pt_regs, ar_pfs));
-       DEFINE(IA64_PT_REGS_AR_RSC_OFFSET, offsetof (struct pt_regs, ar_rsc));
-       DEFINE(IA64_PT_REGS_AR_RNAT_OFFSET, offsetof (struct pt_regs, ar_rnat));
-
-       DEFINE(IA64_PT_REGS_AR_BSPSTORE_OFFSET, offsetof (struct pt_regs, ar_bspstore));
-       DEFINE(IA64_PT_REGS_PR_OFFSET, offsetof (struct pt_regs, pr));
-       DEFINE(IA64_PT_REGS_B0_OFFSET, offsetof (struct pt_regs, b0));
-       DEFINE(IA64_PT_REGS_LOADRS_OFFSET, offsetof (struct pt_regs, loadrs));
-       DEFINE(IA64_PT_REGS_R1_OFFSET, offsetof (struct pt_regs, r1));
-       DEFINE(IA64_PT_REGS_R12_OFFSET, offsetof (struct pt_regs, r12));
-       DEFINE(IA64_PT_REGS_R13_OFFSET, offsetof (struct pt_regs, r13));
-       DEFINE(IA64_PT_REGS_AR_FPSR_OFFSET, offsetof (struct pt_regs, ar_fpsr));
-       DEFINE(IA64_PT_REGS_R15_OFFSET, offsetof (struct pt_regs, r15));
-       DEFINE(IA64_PT_REGS_R14_OFFSET, offsetof (struct pt_regs, r14));
-       DEFINE(IA64_PT_REGS_R2_OFFSET, offsetof (struct pt_regs, r2));
-       DEFINE(IA64_PT_REGS_R3_OFFSET, offsetof (struct pt_regs, r3));
-       DEFINE(IA64_PT_REGS_R16_OFFSET, offsetof (struct pt_regs, r16));
-       DEFINE(IA64_PT_REGS_R17_OFFSET, offsetof (struct pt_regs, r17));
-       DEFINE(IA64_PT_REGS_R18_OFFSET, offsetof (struct pt_regs, r18));
-       DEFINE(IA64_PT_REGS_R19_OFFSET, offsetof (struct pt_regs, r19));
-       DEFINE(IA64_PT_REGS_R20_OFFSET, offsetof (struct pt_regs, r20));
-       DEFINE(IA64_PT_REGS_R21_OFFSET, offsetof (struct pt_regs, r21));
-       DEFINE(IA64_PT_REGS_R22_OFFSET, offsetof (struct pt_regs, r22));
-       DEFINE(IA64_PT_REGS_R23_OFFSET, offsetof (struct pt_regs, r23));
-       DEFINE(IA64_PT_REGS_R24_OFFSET, offsetof (struct pt_regs, r24));
-       DEFINE(IA64_PT_REGS_R25_OFFSET, offsetof (struct pt_regs, r25));
-       DEFINE(IA64_PT_REGS_R26_OFFSET, offsetof (struct pt_regs, r26));
-       DEFINE(IA64_PT_REGS_R27_OFFSET, offsetof (struct pt_regs, r27));
-       DEFINE(IA64_PT_REGS_R28_OFFSET, offsetof (struct pt_regs, r28));
-       DEFINE(IA64_PT_REGS_R29_OFFSET, offsetof (struct pt_regs, r29));
-       DEFINE(IA64_PT_REGS_R30_OFFSET, offsetof (struct pt_regs, r30));
-       DEFINE(IA64_PT_REGS_R31_OFFSET, offsetof (struct pt_regs, r31));
-       DEFINE(IA64_PT_REGS_AR_CCV_OFFSET, offsetof (struct pt_regs, ar_ccv));
-       DEFINE(IA64_PT_REGS_F6_OFFSET, offsetof (struct pt_regs, f6));
-       DEFINE(IA64_PT_REGS_F7_OFFSET, offsetof (struct pt_regs, f7));
-       DEFINE(IA64_PT_REGS_F8_OFFSET, offsetof (struct pt_regs, f8));
-       DEFINE(IA64_PT_REGS_F9_OFFSET, offsetof (struct pt_regs, f9));
-       DEFINE(IA64_PT_REGS_F10_OFFSET, offsetof (struct pt_regs, f10));
-       DEFINE(IA64_PT_REGS_F11_OFFSET, offsetof (struct pt_regs, f11));
-
-       BLANK();
-
-       DEFINE(IA64_SWITCH_STACK_CALLER_UNAT_OFFSET, offsetof (struct switch_stack, caller_unat));
-       DEFINE(IA64_SWITCH_STACK_AR_FPSR_OFFSET, offsetof (struct switch_stack, ar_fpsr));
-       DEFINE(IA64_SWITCH_STACK_F2_OFFSET, offsetof (struct switch_stack, f2));
-       DEFINE(IA64_SWITCH_STACK_F3_OFFSET, offsetof (struct switch_stack, f3));
-       DEFINE(IA64_SWITCH_STACK_F4_OFFSET, offsetof (struct switch_stack, f4));
-       DEFINE(IA64_SWITCH_STACK_F5_OFFSET, offsetof (struct switch_stack, f5));
-       DEFINE(IA64_SWITCH_STACK_F12_OFFSET, offsetof (struct switch_stack, f12));
-       DEFINE(IA64_SWITCH_STACK_F13_OFFSET, offsetof (struct switch_stack, f13));
-       DEFINE(IA64_SWITCH_STACK_F14_OFFSET, offsetof (struct switch_stack, f14));
-       DEFINE(IA64_SWITCH_STACK_F15_OFFSET, offsetof (struct switch_stack, f15));
-       DEFINE(IA64_SWITCH_STACK_F16_OFFSET, offsetof (struct switch_stack, f16));
-       DEFINE(IA64_SWITCH_STACK_F17_OFFSET, offsetof (struct switch_stack, f17));
-       DEFINE(IA64_SWITCH_STACK_F18_OFFSET, offsetof (struct switch_stack, f18));
-       DEFINE(IA64_SWITCH_STACK_F19_OFFSET, offsetof (struct switch_stack, f19));
-       DEFINE(IA64_SWITCH_STACK_F20_OFFSET, offsetof (struct switch_stack, f20));
-       DEFINE(IA64_SWITCH_STACK_F21_OFFSET, offsetof (struct switch_stack, f21));
-       DEFINE(IA64_SWITCH_STACK_F22_OFFSET, offsetof (struct switch_stack, f22));
-       DEFINE(IA64_SWITCH_STACK_F23_OFFSET, offsetof (struct switch_stack, f23));
-       DEFINE(IA64_SWITCH_STACK_F24_OFFSET, offsetof (struct switch_stack, f24));
-       DEFINE(IA64_SWITCH_STACK_F25_OFFSET, offsetof (struct switch_stack, f25));
-       DEFINE(IA64_SWITCH_STACK_F26_OFFSET, offsetof (struct switch_stack, f26));
-       DEFINE(IA64_SWITCH_STACK_F27_OFFSET, offsetof (struct switch_stack, f27));
-       DEFINE(IA64_SWITCH_STACK_F28_OFFSET, offsetof (struct switch_stack, f28));
-       DEFINE(IA64_SWITCH_STACK_F29_OFFSET, offsetof (struct switch_stack, f29));
-       DEFINE(IA64_SWITCH_STACK_F30_OFFSET, offsetof (struct switch_stack, f30));
-       DEFINE(IA64_SWITCH_STACK_F31_OFFSET, offsetof (struct switch_stack, f31));
-       DEFINE(IA64_SWITCH_STACK_R4_OFFSET, offsetof (struct switch_stack, r4));
-       DEFINE(IA64_SWITCH_STACK_R5_OFFSET, offsetof (struct switch_stack, r5));
-       DEFINE(IA64_SWITCH_STACK_R6_OFFSET, offsetof (struct switch_stack, r6));
-       DEFINE(IA64_SWITCH_STACK_R7_OFFSET, offsetof (struct switch_stack, r7));
-       DEFINE(IA64_SWITCH_STACK_B0_OFFSET, offsetof (struct switch_stack, b0));
-       DEFINE(IA64_SWITCH_STACK_B1_OFFSET, offsetof (struct switch_stack, b1));
-       DEFINE(IA64_SWITCH_STACK_B2_OFFSET, offsetof (struct switch_stack, b2));
-       DEFINE(IA64_SWITCH_STACK_B3_OFFSET, offsetof (struct switch_stack, b3));
-       DEFINE(IA64_SWITCH_STACK_B4_OFFSET, offsetof (struct switch_stack, b4));
-       DEFINE(IA64_SWITCH_STACK_B5_OFFSET, offsetof (struct switch_stack, b5));
-       DEFINE(IA64_SWITCH_STACK_AR_PFS_OFFSET, offsetof (struct switch_stack, ar_pfs));
-       DEFINE(IA64_SWITCH_STACK_AR_LC_OFFSET, offsetof (struct switch_stack, ar_lc));
-       DEFINE(IA64_SWITCH_STACK_AR_UNAT_OFFSET, offsetof (struct switch_stack, ar_unat));
-       DEFINE(IA64_SWITCH_STACK_AR_RNAT_OFFSET, offsetof (struct switch_stack, ar_rnat));
-       DEFINE(IA64_SWITCH_STACK_AR_BSPSTORE_OFFSET, offsetof (struct switch_stack, ar_bspstore));
-       DEFINE(IA64_SWITCH_STACK_PR_OFFSET, offsetof (struct switch_stack, pr));
-
-       BLANK();
-
-       DEFINE(IA64_SIGCONTEXT_IP_OFFSET, offsetof (struct sigcontext, sc_ip));
-       DEFINE(IA64_SIGCONTEXT_AR_BSP_OFFSET, offsetof (struct sigcontext, sc_ar_bsp));
-       DEFINE(IA64_SIGCONTEXT_AR_FPSR_OFFSET, offsetof (struct sigcontext, sc_ar_fpsr));
-       DEFINE(IA64_SIGCONTEXT_AR_RNAT_OFFSET, offsetof (struct sigcontext, sc_ar_rnat));
-       DEFINE(IA64_SIGCONTEXT_AR_UNAT_OFFSET, offsetof (struct sigcontext, sc_ar_unat));
-       DEFINE(IA64_SIGCONTEXT_B0_OFFSET, offsetof (struct sigcontext, sc_br[0]));
-       DEFINE(IA64_SIGCONTEXT_CFM_OFFSET, offsetof (struct sigcontext, sc_cfm));
-       DEFINE(IA64_SIGCONTEXT_FLAGS_OFFSET, offsetof (struct sigcontext, sc_flags));
-       DEFINE(IA64_SIGCONTEXT_FR6_OFFSET, offsetof (struct sigcontext, sc_fr[6]));
-       DEFINE(IA64_SIGCONTEXT_PR_OFFSET, offsetof (struct sigcontext, sc_pr));
-       DEFINE(IA64_SIGCONTEXT_R12_OFFSET, offsetof (struct sigcontext, sc_gr[12]));
-       DEFINE(IA64_SIGCONTEXT_RBS_BASE_OFFSET,offsetof (struct sigcontext, sc_rbs_base));
-       DEFINE(IA64_SIGCONTEXT_LOADRS_OFFSET, offsetof (struct sigcontext, sc_loadrs));
-
-       BLANK();
-
-       DEFINE(IA64_SIGPENDING_SIGNAL_OFFSET, offsetof (struct sigpending, signal));
-
-       BLANK();
-
-       DEFINE(IA64_SIGFRAME_ARG0_OFFSET, offsetof (struct sigframe, arg0));
-       DEFINE(IA64_SIGFRAME_ARG1_OFFSET, offsetof (struct sigframe, arg1));
-       DEFINE(IA64_SIGFRAME_ARG2_OFFSET, offsetof (struct sigframe, arg2));
-       DEFINE(IA64_SIGFRAME_HANDLER_OFFSET, offsetof (struct sigframe, handler));
-       DEFINE(IA64_SIGFRAME_SIGCONTEXT_OFFSET, offsetof (struct sigframe, sc));
-       BLANK();
-    /* for assembly files which can't include sched.h: */
-       DEFINE(IA64_CLONE_VFORK, CLONE_VFORK);
-       DEFINE(IA64_CLONE_VM, CLONE_VM);
-
-       BLANK();
-       DEFINE(IA64_CPUINFO_NSEC_PER_CYC_OFFSET,
-              offsetof (struct cpuinfo_ia64, nsec_per_cyc));
-       DEFINE(IA64_CPUINFO_PTCE_BASE_OFFSET,
-              offsetof (struct cpuinfo_ia64, ptce_base));
-       DEFINE(IA64_CPUINFO_PTCE_COUNT_OFFSET,
-              offsetof (struct cpuinfo_ia64, ptce_count));
-       DEFINE(IA64_CPUINFO_PTCE_STRIDE_OFFSET,
-              offsetof (struct cpuinfo_ia64, ptce_stride));
-       BLANK();
-       DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET,
-              offsetof (struct timespec, tv_nsec));
-
-       DEFINE(CLONE_SETTLS_BIT, 19);
-#if CLONE_SETTLS != (1<<19)
-# error "CLONE_SETTLS_BIT incorrect, please fix"
-#endif
-
-       BLANK();
-       DEFINE(IA64_MCA_CPU_MCA_STACK_OFFSET,
-              offsetof (struct ia64_mca_cpu, mca_stack));
-       DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET,
-              offsetof (struct ia64_mca_cpu, init_stack));
-       BLANK();
-       DEFINE(IA64_SAL_OS_STATE_OS_GP_OFFSET,
-              offsetof (struct ia64_sal_os_state, os_gp));
-       DEFINE(IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET,
-              offsetof (struct ia64_sal_os_state, proc_state_param));
-       DEFINE(IA64_SAL_OS_STATE_SAL_RA_OFFSET,
-              offsetof (struct ia64_sal_os_state, sal_ra));
-       DEFINE(IA64_SAL_OS_STATE_SAL_GP_OFFSET,
-              offsetof (struct ia64_sal_os_state, sal_gp));
-       DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
-              offsetof (struct ia64_sal_os_state, pal_min_state));
-       DEFINE(IA64_SAL_OS_STATE_OS_STATUS_OFFSET,
-              offsetof (struct ia64_sal_os_state, os_status));
-       DEFINE(IA64_SAL_OS_STATE_CONTEXT_OFFSET,
-              offsetof (struct ia64_sal_os_state, context));
-       DEFINE(IA64_SAL_OS_STATE_SIZE,
-              sizeof (struct ia64_sal_os_state));
-       BLANK();
-
-       DEFINE(IA64_PMSA_GR_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_gr));
-       DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_bank1_gr));
-       DEFINE(IA64_PMSA_PR_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_pr));
-       DEFINE(IA64_PMSA_BR0_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_br0));
-       DEFINE(IA64_PMSA_RSC_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_rsc));
-       DEFINE(IA64_PMSA_IIP_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_iip));
-       DEFINE(IA64_PMSA_IPSR_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_ipsr));
-       DEFINE(IA64_PMSA_IFS_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_ifs));
-       DEFINE(IA64_PMSA_XIP_OFFSET,
-              offsetof (struct pal_min_state_area_s, pmsa_xip));
-       BLANK();
-
-       /* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */
-       DEFINE(IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET, offsetof (struct time_interpolator, addr));
-       DEFINE(IA64_TIME_INTERPOLATOR_SOURCE_OFFSET, offsetof (struct time_interpolator, source));
-       DEFINE(IA64_TIME_INTERPOLATOR_SHIFT_OFFSET, offsetof (struct time_interpolator, shift));
-       DEFINE(IA64_TIME_INTERPOLATOR_NSEC_OFFSET, offsetof (struct time_interpolator, nsec_per_cyc));
-       DEFINE(IA64_TIME_INTERPOLATOR_OFFSET_OFFSET, offsetof (struct time_interpolator, offset));
-       DEFINE(IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET, offsetof (struct time_interpolator, last_cycle));
-       DEFINE(IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET, offsetof (struct time_interpolator, last_counter));
-       DEFINE(IA64_TIME_INTERPOLATOR_JITTER_OFFSET, offsetof (struct time_interpolator, jitter));
-       DEFINE(IA64_TIME_INTERPOLATOR_MASK_OFFSET, offsetof (struct time_interpolator, mask));
-       DEFINE(IA64_TIME_SOURCE_CPU, TIME_SOURCE_CPU);
-       DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64);
-       DEFINE(IA64_TIME_SOURCE_MMIO32, TIME_SOURCE_MMIO32);
-       DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, offsetof (struct timespec, tv_nsec));
-
-#ifdef CONFIG_XEN
-       BLANK();
-
-#define DEFINE_MAPPED_REG_OFS(sym, field) \
-       DEFINE(sym, (XMAPPEDREGS_OFS + offsetof(mapped_regs_t, field)))
-
-       DEFINE_MAPPED_REG_OFS(XSI_PSR_I_ADDR_OFS, interrupt_mask_addr);
-       DEFINE_MAPPED_REG_OFS(XSI_IPSR_OFS, ipsr);
-       DEFINE_MAPPED_REG_OFS(XSI_IIP_OFS, iip);
-       DEFINE_MAPPED_REG_OFS(XSI_IFS_OFS, ifs);
-       DEFINE_MAPPED_REG_OFS(XSI_PRECOVER_IFS_OFS, precover_ifs);
-       DEFINE_MAPPED_REG_OFS(XSI_ISR_OFS, isr);
-       DEFINE_MAPPED_REG_OFS(XSI_IFA_OFS, ifa);
-       DEFINE_MAPPED_REG_OFS(XSI_IIPA_OFS, iipa);
-       DEFINE_MAPPED_REG_OFS(XSI_IIM_OFS, iim);
-       DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha);
-       DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir);
-       DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
-       DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
-       DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
-       DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
-       DEFINE_MAPPED_REG_OFS(XSI_B0NATS_OFS, vbnat);
-       DEFINE_MAPPED_REG_OFS(XSI_B1NATS_OFS, vnat);    
-#endif /* CONFIG_XEN */
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/entry.S b/linux-2.6-xen-sparse/arch/ia64/kernel/entry.S
deleted file mode 100644 (file)
index f46bdcf..0000000
+++ /dev/null
@@ -1,1620 +0,0 @@
-/*
- * ia64/kernel/entry.S
- *
- * Kernel entry points.
- *
- * Copyright (C) 1998-2003, 2005 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999, 2002-2003
- *     Asit Mallick <Asit.K.Mallick@intel.com>
- *     Don Dugger <Don.Dugger@intel.com>
- *     Suresh Siddha <suresh.b.siddha@intel.com>
- *     Fenghua Yu <fenghua.yu@intel.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- */
-/*
- * ia64_switch_to now places correct virtual mapping in in TR2 for
- * kernel stack. This allows us to handle interrupts without changing
- * to physical mode.
- *
- * Jonathan Nicklin    <nicklin@missioncriticallinux.com>
- * Patrick O'Rourke    <orourke@missioncriticallinux.com>
- * 11/07/2000
- */
-/*
- * Global (preserved) predicate usage on syscall entry/exit path:
- *
- *     pKStk:          See entry.h.
- *     pUStk:          See entry.h.
- *     pSys:           See entry.h.
- *     pNonSys:        !pSys
- */
-
-
-#include <asm/asmmacro.h>
-#include <asm/cache.h>
-#include <asm/errno.h>
-#include <asm/kregs.h>
-#include <asm/asm-offsets.h>
-#include <asm/pgtable.h>
-#include <asm/percpu.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/unistd.h>
-
-#include "minstate.h"
-
-       /*
-        * execve() is special because in case of success, we need to
-        * setup a null register window frame.
-        */
-ENTRY(ia64_execve)
-       /*
-        * Allocate 8 input registers since ptrace() may clobber them
-        */
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc loc1=ar.pfs,8,2,4,0
-       mov loc0=rp
-       .body
-       mov out0=in0                    // filename
-       ;;                              // stop bit between alloc and call
-       mov out1=in1                    // argv
-       mov out2=in2                    // envp
-       add out3=16,sp                  // regs
-       br.call.sptk.many rp=sys_execve
-.ret0:
-#ifdef CONFIG_IA32_SUPPORT
-       /*
-        * Check if we're returning to ia32 mode. If so, we need to restore ia32 registers
-        * from pt_regs.
-        */
-       adds r16=PT(CR_IPSR)+16,sp
-       ;;
-       ld8 r16=[r16]
-#endif
-       cmp4.ge p6,p7=r8,r0
-       mov ar.pfs=loc1                 // restore ar.pfs
-       sxt4 r8=r8                      // return 64-bit result
-       ;;
-       stf.spill [sp]=f0
-(p6)   cmp.ne pKStk,pUStk=r0,r0        // a successful execve() lands us in user-mode...
-       mov rp=loc0
-(p6)   mov ar.pfs=r0                   // clear ar.pfs on success
-(p7)   br.ret.sptk.many rp
-
-       /*
-        * In theory, we'd have to zap this state only to prevent leaking of
-        * security sensitive state (e.g., if current->mm->dumpable is zero).  However,
-        * this executes in less than 20 cycles even on Itanium, so it's not worth
-        * optimizing for...).
-        */
-       mov ar.unat=0;          mov ar.lc=0
-       mov r4=0;               mov f2=f0;              mov b1=r0
-       mov r5=0;               mov f3=f0;              mov b2=r0
-       mov r6=0;               mov f4=f0;              mov b3=r0
-       mov r7=0;               mov f5=f0;              mov b4=r0
-       ldf.fill f12=[sp];      mov f13=f0;             mov b5=r0
-       ldf.fill f14=[sp];      ldf.fill f15=[sp];      mov f16=f0
-       ldf.fill f17=[sp];      ldf.fill f18=[sp];      mov f19=f0
-       ldf.fill f20=[sp];      ldf.fill f21=[sp];      mov f22=f0
-       ldf.fill f23=[sp];      ldf.fill f24=[sp];      mov f25=f0
-       ldf.fill f26=[sp];      ldf.fill f27=[sp];      mov f28=f0
-       ldf.fill f29=[sp];      ldf.fill f30=[sp];      mov f31=f0
-#ifdef CONFIG_IA32_SUPPORT
-       tbit.nz p6,p0=r16, IA64_PSR_IS_BIT
-       movl loc0=ia64_ret_from_ia32_execve
-       ;;
-(p6)   mov rp=loc0
-#endif
-       br.ret.sptk.many rp
-END(ia64_execve)
-
-/*
- * sys_clone2(u64 flags, u64 ustack_base, u64 ustack_size, u64 parent_tidptr, u64 child_tidptr,
- *           u64 tls)
- */
-GLOBAL_ENTRY(sys_clone2)
-       /*
-        * Allocate 8 input registers since ptrace() may clobber them
-        */
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc r16=ar.pfs,8,2,6,0
-       DO_SAVE_SWITCH_STACK
-       adds r2=PT(R16)+IA64_SWITCH_STACK_SIZE+16,sp
-       mov loc0=rp
-       mov loc1=r16                            // save ar.pfs across do_fork
-       .body
-       mov out1=in1
-       mov out3=in2
-       tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-       mov out4=in3    // parent_tidptr: valid only w/CLONE_PARENT_SETTID
-       ;;
-(p6)   st8 [r2]=in5                            // store TLS in r16 for copy_thread()
-       mov out5=in4    // child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
-       adds out2=IA64_SWITCH_STACK_SIZE+16,sp  // out2 = &regs
-       mov out0=in0                            // out0 = clone_flags
-       br.call.sptk.many rp=do_fork
-.ret1: .restore sp
-       adds sp=IA64_SWITCH_STACK_SIZE,sp       // pop the switch stack
-       mov ar.pfs=loc1
-       mov rp=loc0
-       br.ret.sptk.many rp
-END(sys_clone2)
-
-/*
- * sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
- *     Deprecated.  Use sys_clone2() instead.
- */
-GLOBAL_ENTRY(sys_clone)
-       /*
-        * Allocate 8 input registers since ptrace() may clobber them
-        */
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc r16=ar.pfs,8,2,6,0
-       DO_SAVE_SWITCH_STACK
-       adds r2=PT(R16)+IA64_SWITCH_STACK_SIZE+16,sp
-       mov loc0=rp
-       mov loc1=r16                            // save ar.pfs across do_fork
-       .body
-       mov out1=in1
-       mov out3=16                             // stacksize (compensates for 16-byte scratch area)
-       tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-       mov out4=in2    // parent_tidptr: valid only w/CLONE_PARENT_SETTID
-       ;;
-(p6)   st8 [r2]=in4                            // store TLS in r13 (tp)
-       mov out5=in3    // child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
-       adds out2=IA64_SWITCH_STACK_SIZE+16,sp  // out2 = &regs
-       mov out0=in0                            // out0 = clone_flags
-       br.call.sptk.many rp=do_fork
-.ret2: .restore sp
-       adds sp=IA64_SWITCH_STACK_SIZE,sp       // pop the switch stack
-       mov ar.pfs=loc1
-       mov rp=loc0
-       br.ret.sptk.many rp
-END(sys_clone)
-
-/*
- * prev_task <- ia64_switch_to(struct task_struct *next)
- *     With Ingo's new scheduler, interrupts are disabled when this routine gets
- *     called.  The code starting at .map relies on this.  The rest of the code
- *     doesn't care about the interrupt masking status.
- */
-GLOBAL_ENTRY(__ia64_switch_to)
-       .prologue
-       alloc r16=ar.pfs,1,0,0,0
-       DO_SAVE_SWITCH_STACK
-       .body
-
-       adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
-       movl r25=init_task
-       mov r27=IA64_KR(CURRENT_STACK)
-       adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
-       dep r20=0,in0,61,3              // physical address of "next"
-       ;;
-       st8 [r22]=sp                    // save kernel stack pointer of old task
-       shr.u r26=r20,IA64_GRANULE_SHIFT
-       cmp.eq p7,p6=r25,in0
-       ;;
-       /*
-        * If we've already mapped this task's page, we can skip doing it again.
-        */
-(p6)   cmp.eq p7,p6=r26,r27
-(p6)   br.cond.dpnt .map
-       ;;
-.done:
-       ld8 sp=[r21]                    // load kernel stack pointer of new task
-       mov IA64_KR(CURRENT)=in0        // update "current" application register
-       mov r8=r13                      // return pointer to previously running task
-       mov r13=in0                     // set "current" pointer
-       ;;
-       DO_LOAD_SWITCH_STACK
-
-#ifdef CONFIG_SMP
-       sync.i                          // ensure "fc"s done by this CPU are visible on other CPUs
-#endif
-       br.ret.sptk.many rp             // boogie on out in new context
-
-.map:
-       rsm psr.ic                      // interrupts (psr.i) are already disabled here
-       movl r25=PAGE_KERNEL
-       ;;
-       srlz.d
-       or r23=r25,r20                  // construct PA | page properties
-       mov r25=IA64_GRANULE_SHIFT<<2
-       ;;
-       mov cr.itir=r25
-       mov cr.ifa=in0                  // VA of next task...
-       ;;
-       mov r25=IA64_TR_CURRENT_STACK
-       mov IA64_KR(CURRENT_STACK)=r26  // remember last page we mapped...
-       ;;
-       itr.d dtr[r25]=r23              // wire in new mapping...
-       ssm psr.ic                      // reenable the psr.ic bit
-       ;;
-       srlz.d
-       br.cond.sptk .done
-END(__ia64_switch_to)
-
-/*
- * Note that interrupts are enabled during save_switch_stack and load_switch_stack.  This
- * means that we may get an interrupt with "sp" pointing to the new kernel stack while
- * ar.bspstore is still pointing to the old kernel backing store area.  Since ar.rsc,
- * ar.rnat, ar.bsp, and ar.bspstore are all preserved by interrupts, this is not a
- * problem.  Also, we don't need to specify unwind information for preserved registers
- * that are not modified in save_switch_stack as the right unwind information is already
- * specified at the call-site of save_switch_stack.
- */
-
-/*
- * save_switch_stack:
- *     - r16 holds ar.pfs
- *     - b7 holds address to return to
- *     - rp (b0) holds return address to save
- */
-GLOBAL_ENTRY(save_switch_stack)
-       .prologue
-       .altrp b7
-       flushrs                 // flush dirty regs to backing store (must be first in insn group)
-       .save @priunat,r17
-       mov r17=ar.unat         // preserve caller's
-       .body
-#ifdef CONFIG_ITANIUM
-       adds r2=16+128,sp
-       adds r3=16+64,sp
-       adds r14=SW(R4)+16,sp
-       ;;
-       st8.spill [r14]=r4,16           // spill r4
-       lfetch.fault.excl.nt1 [r3],128
-       ;;
-       lfetch.fault.excl.nt1 [r2],128
-       lfetch.fault.excl.nt1 [r3],128
-       ;;
-       lfetch.fault.excl [r2]
-       lfetch.fault.excl [r3]
-       adds r15=SW(R5)+16,sp
-#else
-       add r2=16+3*128,sp
-       add r3=16,sp
-       add r14=SW(R4)+16,sp
-       ;;
-       st8.spill [r14]=r4,SW(R6)-SW(R4)        // spill r4 and prefetch offset 0x1c0
-       lfetch.fault.excl.nt1 [r3],128  //              prefetch offset 0x010
-       ;;
-       lfetch.fault.excl.nt1 [r3],128  //              prefetch offset 0x090
-       lfetch.fault.excl.nt1 [r2],128  //              prefetch offset 0x190
-       ;;
-       lfetch.fault.excl.nt1 [r3]      //              prefetch offset 0x110
-       lfetch.fault.excl.nt1 [r2]      //              prefetch offset 0x210
-       adds r15=SW(R5)+16,sp
-#endif
-       ;;
-       st8.spill [r15]=r5,SW(R7)-SW(R5)        // spill r5
-       mov.m ar.rsc=0                  // put RSE in mode: enforced lazy, little endian, pl 0
-       add r2=SW(F2)+16,sp             // r2 = &sw->f2
-       ;;
-       st8.spill [r14]=r6,SW(B0)-SW(R6)        // spill r6
-       mov.m r18=ar.fpsr               // preserve fpsr
-       add r3=SW(F3)+16,sp             // r3 = &sw->f3
-       ;;
-       stf.spill [r2]=f2,32
-       mov.m r19=ar.rnat
-       mov r21=b0
-
-       stf.spill [r3]=f3,32
-       st8.spill [r15]=r7,SW(B2)-SW(R7)        // spill r7
-       mov r22=b1
-       ;;
-       // since we're done with the spills, read and save ar.unat:
-       mov.m r29=ar.unat
-       mov.m r20=ar.bspstore
-       mov r23=b2
-       stf.spill [r2]=f4,32
-       stf.spill [r3]=f5,32
-       mov r24=b3
-       ;;
-       st8 [r14]=r21,SW(B1)-SW(B0)             // save b0
-       st8 [r15]=r23,SW(B3)-SW(B2)             // save b2
-       mov r25=b4
-       mov r26=b5
-       ;;
-       st8 [r14]=r22,SW(B4)-SW(B1)             // save b1
-       st8 [r15]=r24,SW(AR_PFS)-SW(B3)         // save b3
-       mov r21=ar.lc           // I-unit
-       stf.spill [r2]=f12,32
-       stf.spill [r3]=f13,32
-       ;;
-       st8 [r14]=r25,SW(B5)-SW(B4)             // save b4
-       st8 [r15]=r16,SW(AR_LC)-SW(AR_PFS)      // save ar.pfs
-       stf.spill [r2]=f14,32
-       stf.spill [r3]=f15,32
-       ;;
-       st8 [r14]=r26                           // save b5
-       st8 [r15]=r21                           // save ar.lc
-       stf.spill [r2]=f16,32
-       stf.spill [r3]=f17,32
-       ;;
-       stf.spill [r2]=f18,32
-       stf.spill [r3]=f19,32
-       ;;
-       stf.spill [r2]=f20,32
-       stf.spill [r3]=f21,32
-       ;;
-       stf.spill [r2]=f22,32
-       stf.spill [r3]=f23,32
-       ;;
-       stf.spill [r2]=f24,32
-       stf.spill [r3]=f25,32
-       ;;
-       stf.spill [r2]=f26,32
-       stf.spill [r3]=f27,32
-       ;;
-       stf.spill [r2]=f28,32
-       stf.spill [r3]=f29,32
-       ;;
-       stf.spill [r2]=f30,SW(AR_UNAT)-SW(F30)
-       stf.spill [r3]=f31,SW(PR)-SW(F31)
-       add r14=SW(CALLER_UNAT)+16,sp
-       ;;
-       st8 [r2]=r29,SW(AR_RNAT)-SW(AR_UNAT)    // save ar.unat
-       st8 [r14]=r17,SW(AR_FPSR)-SW(CALLER_UNAT) // save caller_unat
-       mov r21=pr
-       ;;
-       st8 [r2]=r19,SW(AR_BSPSTORE)-SW(AR_RNAT) // save ar.rnat
-       st8 [r3]=r21                            // save predicate registers
-       ;;
-       st8 [r2]=r20                            // save ar.bspstore
-       st8 [r14]=r18                           // save fpsr
-       mov ar.rsc=3            // put RSE back into eager mode, pl 0
-       br.cond.sptk.many b7
-END(save_switch_stack)
-
-/*
- * load_switch_stack:
- *     - "invala" MUST be done at call site (normally in DO_LOAD_SWITCH_STACK)
- *     - b7 holds address to return to
- *     - must not touch r8-r11
- */
-GLOBAL_ENTRY(load_switch_stack)
-       .prologue
-       .altrp b7
-
-       .body
-       lfetch.fault.nt1 [sp]
-       adds r2=SW(AR_BSPSTORE)+16,sp
-       adds r3=SW(AR_UNAT)+16,sp
-       mov ar.rsc=0                                            // put RSE into enforced lazy mode
-       adds r14=SW(CALLER_UNAT)+16,sp
-       adds r15=SW(AR_FPSR)+16,sp
-       ;;
-       ld8 r27=[r2],(SW(B0)-SW(AR_BSPSTORE))   // bspstore
-       ld8 r29=[r3],(SW(B1)-SW(AR_UNAT))       // unat
-       ;;
-       ld8 r21=[r2],16         // restore b0
-       ld8 r22=[r3],16         // restore b1
-       ;;
-       ld8 r23=[r2],16         // restore b2
-       ld8 r24=[r3],16         // restore b3
-       ;;
-       ld8 r25=[r2],16         // restore b4
-       ld8 r26=[r3],16         // restore b5
-       ;;
-       ld8 r16=[r2],(SW(PR)-SW(AR_PFS))        // ar.pfs
-       ld8 r17=[r3],(SW(AR_RNAT)-SW(AR_LC))    // ar.lc
-       ;;
-       ld8 r28=[r2]            // restore pr
-       ld8 r30=[r3]            // restore rnat
-       ;;
-       ld8 r18=[r14],16        // restore caller's unat
-       ld8 r19=[r15],24        // restore fpsr
-       ;;
-       ldf.fill f2=[r14],32
-       ldf.fill f3=[r15],32
-       ;;
-       ldf.fill f4=[r14],32
-       ldf.fill f5=[r15],32
-       ;;
-       ldf.fill f12=[r14],32
-       ldf.fill f13=[r15],32
-       ;;
-       ldf.fill f14=[r14],32
-       ldf.fill f15=[r15],32
-       ;;
-       ldf.fill f16=[r14],32
-       ldf.fill f17=[r15],32
-       ;;
-       ldf.fill f18=[r14],32
-       ldf.fill f19=[r15],32
-       mov b0=r21
-       ;;
-       ldf.fill f20=[r14],32
-       ldf.fill f21=[r15],32
-       mov b1=r22
-       ;;
-       ldf.fill f22=[r14],32
-       ldf.fill f23=[r15],32
-       mov b2=r23
-       ;;
-       mov ar.bspstore=r27
-       mov ar.unat=r29         // establish unat holding the NaT bits for r4-r7
-       mov b3=r24
-       ;;
-       ldf.fill f24=[r14],32
-       ldf.fill f25=[r15],32
-       mov b4=r25
-       ;;
-       ldf.fill f26=[r14],32
-       ldf.fill f27=[r15],32
-       mov b5=r26
-       ;;
-       ldf.fill f28=[r14],32
-       ldf.fill f29=[r15],32
-       mov ar.pfs=r16
-       ;;
-       ldf.fill f30=[r14],32
-       ldf.fill f31=[r15],24
-       mov ar.lc=r17
-       ;;
-       ld8.fill r4=[r14],16
-       ld8.fill r5=[r15],16
-       mov pr=r28,-1
-       ;;
-       ld8.fill r6=[r14],16
-       ld8.fill r7=[r15],16
-
-       mov ar.unat=r18                         // restore caller's unat
-       mov ar.rnat=r30                         // must restore after bspstore but before rsc!
-       mov ar.fpsr=r19                         // restore fpsr
-       mov ar.rsc=3                            // put RSE back into eager mode, pl 0
-       br.cond.sptk.many b7
-END(load_switch_stack)
-
-GLOBAL_ENTRY(prefetch_stack)
-       add r14 = -IA64_SWITCH_STACK_SIZE, sp
-       add r15 = IA64_TASK_THREAD_KSP_OFFSET, in0
-       ;;
-       ld8 r16 = [r15]                         // load next's stack pointer
-       lfetch.fault.excl [r14], 128
-       ;;
-       lfetch.fault.excl [r14], 128
-       lfetch.fault [r16], 128
-       ;;
-       lfetch.fault.excl [r14], 128
-       lfetch.fault [r16], 128
-       ;;
-       lfetch.fault.excl [r14], 128
-       lfetch.fault [r16], 128
-       ;;
-       lfetch.fault.excl [r14], 128
-       lfetch.fault [r16], 128
-       ;;
-       lfetch.fault [r16], 128
-       br.ret.sptk.many rp
-END(prefetch_stack)
-
-GLOBAL_ENTRY(execve)
-       mov r15=__NR_execve                     // put syscall number in place
-       break __BREAK_SYSCALL
-       br.ret.sptk.many rp
-END(execve)
-
-GLOBAL_ENTRY(clone)
-       mov r15=__NR_clone                      // put syscall number in place
-       break __BREAK_SYSCALL
-       br.ret.sptk.many rp
-END(clone)
-
-       /*
-        * Invoke a system call, but do some tracing before and after the call.
-        * We MUST preserve the current register frame throughout this routine
-        * because some system calls (such as ia64_execve) directly
-        * manipulate ar.pfs.
-        */
-GLOBAL_ENTRY(__ia64_trace_syscall)
-       PT_REGS_UNWIND_INFO(0)
-       /*
-        * We need to preserve the scratch registers f6-f11 in case the system
-        * call is sigreturn.
-        */
-       adds r16=PT(F6)+16,sp
-       adds r17=PT(F7)+16,sp
-       ;;
-       stf.spill [r16]=f6,32
-       stf.spill [r17]=f7,32
-       ;;
-       stf.spill [r16]=f8,32
-       stf.spill [r17]=f9,32
-       ;;
-       stf.spill [r16]=f10
-       stf.spill [r17]=f11
-       br.call.sptk.many rp=syscall_trace_enter // give parent a chance to catch syscall args
-       adds r16=PT(F6)+16,sp
-       adds r17=PT(F7)+16,sp
-       ;;
-       ldf.fill f6=[r16],32
-       ldf.fill f7=[r17],32
-       ;;
-       ldf.fill f8=[r16],32
-       ldf.fill f9=[r17],32
-       ;;
-       ldf.fill f10=[r16]
-       ldf.fill f11=[r17]
-       // the syscall number may have changed, so re-load it and re-calculate the
-       // syscall entry-point:
-       adds r15=PT(R15)+16,sp                  // r15 = &pt_regs.r15 (syscall #)
-       ;;
-       ld8 r15=[r15]
-       mov r3=NR_syscalls - 1
-       ;;
-       adds r15=-1024,r15
-       movl r16=sys_call_table
-       ;;
-       shladd r20=r15,3,r16                    // r20 = sys_call_table + 8*(syscall-1024)
-       cmp.leu p6,p7=r15,r3
-       ;;
-(p6)   ld8 r20=[r20]                           // load address of syscall entry point
-(p7)   movl r20=sys_ni_syscall
-       ;;
-       mov b6=r20
-       br.call.sptk.many rp=b6                 // do the syscall
-.strace_check_retval:
-       cmp.lt p6,p0=r8,r0                      // syscall failed?
-       adds r2=PT(R8)+16,sp                    // r2 = &pt_regs.r8
-       adds r3=PT(R10)+16,sp                   // r3 = &pt_regs.r10
-       mov r10=0
-(p6)   br.cond.sptk strace_error               // syscall failed ->
-       ;;                                      // avoid RAW on r10
-.strace_save_retval:
-.mem.offset 0,0; st8.spill [r2]=r8             // store return value in slot for r8
-.mem.offset 8,0; st8.spill [r3]=r10            // clear error indication in slot for r10
-       br.call.sptk.many rp=syscall_trace_leave // give parent a chance to catch return value
-.ret3:
-(pUStk)        cmp.eq.unc p6,p0=r0,r0                  // p6 <- pUStk
-       br.cond.sptk .work_pending_syscall_end
-
-strace_error:
-       ld8 r3=[r2]                             // load pt_regs.r8
-       sub r9=0,r8                             // negate return value to get errno value
-       ;;
-       cmp.ne p6,p0=r3,r0                      // is pt_regs.r8!=0?
-       adds r3=16,r2                           // r3=&pt_regs.r10
-       ;;
-(p6)   mov r10=-1
-(p6)   mov r8=r9
-       br.cond.sptk .strace_save_retval
-END(__ia64_trace_syscall)
-
-       /*
-        * When traced and returning from sigreturn, we invoke syscall_trace but then
-        * go straight to ia64_leave_kernel rather than ia64_leave_syscall.
-        */
-GLOBAL_ENTRY(ia64_strace_leave_kernel)
-       PT_REGS_UNWIND_INFO(0)
-{      /*
-        * Some versions of gas generate bad unwind info if the first instruction of a
-        * procedure doesn't go into the first slot of a bundle.  This is a workaround.
-        */
-       nop.m 0
-       nop.i 0
-       br.call.sptk.many rp=syscall_trace_leave // give parent a chance to catch return value
-}
-.ret4: br.cond.sptk ia64_leave_kernel
-END(ia64_strace_leave_kernel)
-
-GLOBAL_ENTRY(__ia64_ret_from_clone)
-       PT_REGS_UNWIND_INFO(0)
-{      /*
-        * Some versions of gas generate bad unwind info if the first instruction of a
-        * procedure doesn't go into the first slot of a bundle.  This is a workaround.
-        */
-       nop.m 0
-       nop.i 0
-       /*
-        * We need to call schedule_tail() to complete the scheduling process.
-        * Called by ia64_switch_to() after do_fork()->copy_thread().  r8 contains the
-        * address of the previously executing task.
-        */
-       br.call.sptk.many rp=ia64_invoke_schedule_tail
-}
-.ret8:
-       adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-       ld4 r2=[r2]
-       ;;
-       mov r8=0
-       and r2=_TIF_SYSCALL_TRACEAUDIT,r2
-       ;;
-       cmp.ne p6,p0=r2,r0
-(p6)   br.cond.spnt .strace_check_retval
-       ;;                                      // added stop bits to prevent r8 dependency
-END(__ia64_ret_from_clone)
-       // fall through
-GLOBAL_ENTRY(ia64_ret_from_syscall)
-       PT_REGS_UNWIND_INFO(0)
-       cmp.ge p6,p7=r8,r0                      // syscall executed successfully?
-       adds r2=PT(R8)+16,sp                    // r2 = &pt_regs.r8
-       mov r10=r0                              // clear error indication in r10
-(p7)   br.cond.spnt handle_syscall_error       // handle potential syscall failure
-       ;;
-       // don't fall through, ia64_leave_syscall may be #define'd
-       br.cond.sptk.few ia64_leave_syscall
-       ;;
-END(ia64_ret_from_syscall)
-/*
- * ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't
- *     need to switch to bank 0 and doesn't restore the scratch registers.
- *     To avoid leaking kernel bits, the scratch registers are set to
- *     the following known-to-be-safe values:
- *
- *               r1: restored (global pointer)
- *               r2: cleared
- *               r3: 1 (when returning to user-level)
- *           r8-r11: restored (syscall return value(s))
- *              r12: restored (user-level stack pointer)
- *              r13: restored (user-level thread pointer)
- *              r14: set to __kernel_syscall_via_epc
- *              r15: restored (syscall #)
- *          r16-r17: cleared
- *              r18: user-level b6
- *              r19: cleared
- *              r20: user-level ar.fpsr
- *              r21: user-level b0
- *              r22: cleared
- *              r23: user-level ar.bspstore
- *              r24: user-level ar.rnat
- *              r25: user-level ar.unat
- *              r26: user-level ar.pfs
- *              r27: user-level ar.rsc
- *              r28: user-level ip
- *              r29: user-level psr
- *              r30: user-level cfm
- *              r31: user-level pr
- *           f6-f11: cleared
- *               pr: restored (user-level pr)
- *               b0: restored (user-level rp)
- *               b6: restored
- *               b7: set to __kernel_syscall_via_epc
- *          ar.unat: restored (user-level ar.unat)
- *           ar.pfs: restored (user-level ar.pfs)
- *           ar.rsc: restored (user-level ar.rsc)
- *          ar.rnat: restored (user-level ar.rnat)
- *      ar.bspstore: restored (user-level ar.bspstore)
- *          ar.fpsr: restored (user-level ar.fpsr)
- *           ar.ccv: cleared
- *           ar.csd: cleared
- *           ar.ssd: cleared
- */
-GLOBAL_ENTRY(__ia64_leave_syscall)
-       PT_REGS_UNWIND_INFO(0)
-       /*
-        * work.need_resched etc. mustn't get changed by this CPU before it returns to
-        * user- or fsys-mode, hence we disable interrupts early on.
-        *
-        * p6 controls whether current_thread_info()->flags needs to be check for
-        * extra work.  We always check for extra work when returning to user-level.
-        * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-        * is 0.  After extra work processing has been completed, execution
-        * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-        * needs to be redone.
-        */
-#ifdef CONFIG_PREEMPT
-       rsm psr.i                               // disable interrupts
-       cmp.eq pLvSys,p0=r0,r0                  // pLvSys=1: leave from syscall
-(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-       .pred.rel.mutex pUStk,pKStk
-(pKStk) ld4 r21=[r20]                  // r21 <- preempt_count
-(pUStk)        mov r21=0                       // r21 <- 0
-       ;;
-       cmp.eq p6,p0=r21,r0             // p6 <- pUStk || (preempt_count == 0)
-#else /* !CONFIG_PREEMPT */
-(pUStk)        rsm psr.i
-       cmp.eq pLvSys,p0=r0,r0          // pLvSys=1: leave from syscall
-(pUStk)        cmp.eq.unc p6,p0=r0,r0          // p6 <- pUStk
-#endif
-.work_processed_syscall:
-       adds r2=PT(LOADRS)+16,r12
-       adds r3=PT(AR_BSPSTORE)+16,r12
-       adds r18=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-(p6)   ld4 r31=[r18]                           // load current_thread_info()->flags
-       ld8 r19=[r2],PT(B6)-PT(LOADRS)          // load ar.rsc value for "loadrs"
-       nop.i 0
-       ;;
-       mov r16=ar.bsp                          // M2  get existing backing store pointer
-       ld8 r18=[r2],PT(R9)-PT(B6)              // load b6
-(p6)   and r15=TIF_WORK_MASK,r31               // any work other than TIF_SYSCALL_TRACE?
-       ;;
-       ld8 r23=[r3],PT(R11)-PT(AR_BSPSTORE)    // load ar.bspstore (may be garbage)
-(p6)   cmp4.ne.unc p6,p0=r15, r0               // any special work pending?
-(p6)   br.cond.spnt .work_pending_syscall
-       ;;
-       // start restoring the state saved on the kernel stack (struct pt_regs):
-       ld8 r9=[r2],PT(CR_IPSR)-PT(R9)
-       ld8 r11=[r3],PT(CR_IIP)-PT(R11)
-(pNonSys) break 0              //      bug check: we shouldn't be here if pNonSys is TRUE!
-       ;;
-       invala                  // M0|1 invalidate ALAT
-       rsm psr.i | psr.ic      // M2   turn off interrupts and interruption collection
-       cmp.eq p9,p0=r0,r0      // A    set p9 to indicate that we should restore cr.ifs
-
-       ld8 r29=[r2],16         // M0|1 load cr.ipsr
-       ld8 r28=[r3],16         // M0|1 load cr.iip
-       mov r22=r0              // A    clear r22
-       ;;
-       ld8 r30=[r2],16         // M0|1 load cr.ifs
-       ld8 r25=[r3],16         // M0|1 load ar.unat
-(pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
-       ;;
-       ld8 r26=[r2],PT(B0)-PT(AR_PFS)  // M0|1 load ar.pfs
-(pKStk)        mov r22=psr                     // M2   read PSR now that interrupts are disabled
-       nop 0
-       ;;
-       ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
-       ld8 r27=[r3],PT(PR)-PT(AR_RSC)  // M0|1 load ar.rsc
-       mov f6=f0                       // F    clear f6
-       ;;
-       ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT)    // M0|1 load ar.rnat (may be garbage)
-       ld8 r31=[r3],PT(R1)-PT(PR)              // M0|1 load predicates
-       mov f7=f0                               // F    clear f7
-       ;;
-       ld8 r20=[r2],PT(R12)-PT(AR_FPSR)        // M0|1 load ar.fpsr
-       ld8.fill r1=[r3],16                     // M0|1 load r1
-(pUStk) mov r17=1                              // A
-       ;;
-(pUStk) st1 [r14]=r17                          // M2|3
-       ld8.fill r13=[r3],16                    // M0|1
-       mov f8=f0                               // F    clear f8
-       ;;
-       ld8.fill r12=[r2]                       // M0|1 restore r12 (sp)
-       ld8.fill r15=[r3]                       // M0|1 restore r15
-       mov b6=r18                              // I0   restore b6
-
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A
-       mov f9=f0                                       // F    clear f9
-(pKStk) br.cond.dpnt.many skip_rbs_switch              // B
-
-       srlz.d                          // M0   ensure interruption collection is off (for cover)
-       shr.u r18=r19,16                // I0|1 get byte size of existing "dirty" partition
-       cover                           // B    add current frame into dirty partition & set cr.ifs
-       ;;
-(pUStk) ld4 r17=[r17]                  // M0|1 r17 = cpu_data->phys_stacked_size_p8
-       mov r19=ar.bsp                  // M2   get new backing store pointer
-       mov f10=f0                      // F    clear f10
-
-       nop.m 0
-       movl r14=__kernel_syscall_via_epc // X
-       ;;
-       mov.m ar.csd=r0                 // M2   clear ar.csd
-       mov.m ar.ccv=r0                 // M2   clear ar.ccv
-       mov b7=r14                      // I0   clear b7 (hint with __kernel_syscall_via_epc)
-
-       mov.m ar.ssd=r0                 // M2   clear ar.ssd
-       mov f11=f0                      // F    clear f11
-       br.cond.sptk.many rbs_switch    // B
-END(__ia64_leave_syscall)
-
-#ifdef CONFIG_IA32_SUPPORT
-GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
-       PT_REGS_UNWIND_INFO(0)
-       adds r2=PT(R8)+16,sp                    // r2 = &pt_regs.r8
-       adds r3=PT(R10)+16,sp                   // r3 = &pt_regs.r10
-       ;;
-       .mem.offset 0,0
-       st8.spill [r2]=r8       // store return value in slot for r8 and set unat bit
-       .mem.offset 8,0
-       st8.spill [r3]=r0       // clear error indication in slot for r10 and set unat bit
-       ;;
-       // don't fall through, ia64_leave_kernel may be #define'd
-       br.cond.sptk.few ia64_leave_kernel
-       ;;
-END(ia64_ret_from_ia32_execve)
-#endif /* CONFIG_IA32_SUPPORT */
-GLOBAL_ENTRY(__ia64_leave_kernel)
-       PT_REGS_UNWIND_INFO(0)
-       /*
-        * work.need_resched etc. mustn't get changed by this CPU before it returns to
-        * user- or fsys-mode, hence we disable interrupts early on.
-        *
-        * p6 controls whether current_thread_info()->flags needs to be check for
-        * extra work.  We always check for extra work when returning to user-level.
-        * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-        * is 0.  After extra work processing has been completed, execution
-        * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-        * needs to be redone.
-        */
-#ifdef CONFIG_PREEMPT
-       rsm psr.i                               // disable interrupts
-       cmp.eq p0,pLvSys=r0,r0                  // pLvSys=0: leave from kernel
-(pKStk)        adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-       .pred.rel.mutex pUStk,pKStk
-(pKStk)        ld4 r21=[r20]                   // r21 <- preempt_count
-(pUStk)        mov r21=0                       // r21 <- 0
-       ;;
-       cmp.eq p6,p0=r21,r0             // p6 <- pUStk || (preempt_count == 0)
-#else
-(pUStk)        rsm psr.i
-       cmp.eq p0,pLvSys=r0,r0          // pLvSys=0: leave from kernel
-(pUStk)        cmp.eq.unc p6,p0=r0,r0          // p6 <- pUStk
-#endif
-.work_processed_kernel:
-       adds r17=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-(p6)   ld4 r31=[r17]                           // load current_thread_info()->flags
-       adds r21=PT(PR)+16,r12
-       ;;
-
-       lfetch [r21],PT(CR_IPSR)-PT(PR)
-       adds r2=PT(B6)+16,r12
-       adds r3=PT(R16)+16,r12
-       ;;
-       lfetch [r21]
-       ld8 r28=[r2],8          // load b6
-       adds r29=PT(R24)+16,r12
-
-       ld8.fill r16=[r3],PT(AR_CSD)-PT(R16)
-       adds r30=PT(AR_CCV)+16,r12
-(p6)   and r19=TIF_WORK_MASK,r31               // any work other than TIF_SYSCALL_TRACE?
-       ;;
-       ld8.fill r24=[r29]
-       ld8 r15=[r30]           // load ar.ccv
-(p6)   cmp4.ne.unc p6,p0=r19, r0               // any special work pending?
-       ;;
-       ld8 r29=[r2],16         // load b7
-       ld8 r30=[r3],16         // load ar.csd
-(p6)   br.cond.spnt .work_pending
-       ;;
-       ld8 r31=[r2],16         // load ar.ssd
-       ld8.fill r8=[r3],16
-       ;;
-       ld8.fill r9=[r2],16
-       ld8.fill r10=[r3],PT(R17)-PT(R10)
-       ;;
-       ld8.fill r11=[r2],PT(R18)-PT(R11)
-       ld8.fill r17=[r3],16
-       ;;
-       ld8.fill r18=[r2],16
-       ld8.fill r19=[r3],16
-       ;;
-       ld8.fill r20=[r2],16
-       ld8.fill r21=[r3],16
-       mov ar.csd=r30
-       mov ar.ssd=r31
-       ;;
-       rsm psr.i | psr.ic      // initiate turning off of interrupt and interruption collection
-       invala                  // invalidate ALAT
-       ;;
-       ld8.fill r22=[r2],24
-       ld8.fill r23=[r3],24
-       mov b6=r28
-       ;;
-       ld8.fill r25=[r2],16
-       ld8.fill r26=[r3],16
-       mov b7=r29
-       ;;
-       ld8.fill r27=[r2],16
-       ld8.fill r28=[r3],16
-       ;;
-       ld8.fill r29=[r2],16
-       ld8.fill r30=[r3],24
-       ;;
-       ld8.fill r31=[r2],PT(F9)-PT(R31)
-       adds r3=PT(F10)-PT(F6),r3
-       ;;
-       ldf.fill f9=[r2],PT(F6)-PT(F9)
-       ldf.fill f10=[r3],PT(F8)-PT(F10)
-       ;;
-       ldf.fill f6=[r2],PT(F7)-PT(F6)
-       ;;
-       ldf.fill f7=[r2],PT(F11)-PT(F7)
-       ldf.fill f8=[r3],32
-       ;;
-       srlz.d  // ensure that inter. collection is off (VHPT is don't care, since text is pinned)
-       mov ar.ccv=r15
-       ;;
-       ldf.fill f11=[r2]
-       bsw.0                   // switch back to bank 0 (no stop bit required beforehand...)
-       ;;
-(pUStk)        mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
-       adds r16=PT(CR_IPSR)+16,r12
-       adds r17=PT(CR_IIP)+16,r12
-
-(pKStk)        mov r22=psr             // M2 read PSR now that interrupts are disabled
-       nop.i 0
-       nop.i 0
-       ;;
-       ld8 r29=[r16],16        // load cr.ipsr
-       ld8 r28=[r17],16        // load cr.iip
-       ;;
-       ld8 r30=[r16],16        // load cr.ifs
-       ld8 r25=[r17],16        // load ar.unat
-       ;;
-       ld8 r26=[r16],16        // load ar.pfs
-       ld8 r27=[r17],16        // load ar.rsc
-       cmp.eq p9,p0=r0,r0      // set p9 to indicate that we should restore cr.ifs
-       ;;
-       ld8 r24=[r16],16        // load ar.rnat (may be garbage)
-       ld8 r23=[r17],16        // load ar.bspstore (may be garbage)
-       ;;
-       ld8 r31=[r16],16        // load predicates
-       ld8 r21=[r17],16        // load b0
-       ;;
-       ld8 r19=[r16],16        // load ar.rsc value for "loadrs"
-       ld8.fill r1=[r17],16    // load r1
-       ;;
-       ld8.fill r12=[r16],16
-       ld8.fill r13=[r17],16
-(pUStk)        adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18
-       ;;
-       ld8 r20=[r16],16        // ar.fpsr
-       ld8.fill r15=[r17],16
-       ;;
-       ld8.fill r14=[r16],16
-       ld8.fill r2=[r17]
-(pUStk)        mov r17=1
-       ;;
-       ld8.fill r3=[r16]
-(pUStk)        st1 [r18]=r17           // restore current->thread.on_ustack
-       shr.u r18=r19,16        // get byte size of existing "dirty" partition
-       ;;
-       mov r16=ar.bsp          // get existing backing store pointer
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
-       ;;
-       ld4 r17=[r17]           // r17 = cpu_data->phys_stacked_size_p8
-(pKStk)        br.cond.dpnt skip_rbs_switch
-
-       /*
-        * Restore user backing store.
-        *
-        * NOTE: alloc, loadrs, and cover can't be predicated.
-        */
-(pNonSys) br.cond.dpnt dont_preserve_current_frame
-       cover                           // add current frame into dirty partition and set cr.ifs
-       ;;
-       mov r19=ar.bsp                  // get new backing store pointer
-rbs_switch:
-       sub r16=r16,r18                 // krbs = old bsp - size of dirty partition
-       cmp.ne p9,p0=r0,r0              // clear p9 to skip restore of cr.ifs
-       ;;
-       sub r19=r19,r16                 // calculate total byte size of dirty partition
-       add r18=64,r18                  // don't force in0-in7 into memory...
-       ;;
-       shl r19=r19,16                  // shift size of dirty partition into loadrs position
-       ;;
-dont_preserve_current_frame:
-       /*
-        * To prevent leaking bits between the kernel and user-space,
-        * we must clear the stacked registers in the "invalid" partition here.
-        * Not pretty, but at least it's fast (3.34 registers/cycle on Itanium,
-        * 5 registers/cycle on McKinley).
-        */
-#      define pRecurse p6
-#      define pReturn  p7
-#ifdef CONFIG_ITANIUM
-#      define Nregs    10
-#else
-#      define Nregs    14
-#endif
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       shr.u loc1=r18,9                // RNaTslots <= floor(dirtySize / (64*8))
-       sub r17=r17,r18                 // r17 = (physStackedSize + 8) - dirtySize
-       ;;
-       mov ar.rsc=r19                  // load ar.rsc to be used for "loadrs"
-       shladd in0=loc1,3,r17
-       mov in1=0
-       ;;
-       TEXT_ALIGN(32)
-rse_clear_invalid:
-#ifdef CONFIG_ITANIUM
-       // cycle 0
- { .mii
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       cmp.lt pRecurse,p0=Nregs*8,in0  // if more than Nregs regs left to clear, (re)curse
-       add out0=-Nregs*8,in0
-}{ .mfb
-       add out1=1,in1                  // increment recursion count
-       nop.f 0
-       nop.b 0                         // can't do br.call here because of alloc (WAW on CFM)
-       ;;
-}{ .mfi        // cycle 1
-       mov loc1=0
-       nop.f 0
-       mov loc2=0
-}{ .mib
-       mov loc3=0
-       mov loc4=0
-(pRecurse) br.call.sptk.many b0=rse_clear_invalid
-
-}{ .mfi        // cycle 2
-       mov loc5=0
-       nop.f 0
-       cmp.ne pReturn,p0=r0,in1        // if recursion count != 0, we need to do a br.ret
-}{ .mib
-       mov loc6=0
-       mov loc7=0
-(pReturn) br.ret.sptk.many b0
-}
-#else /* !CONFIG_ITANIUM */
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       cmp.lt pRecurse,p0=Nregs*8,in0  // if more than Nregs regs left to clear, (re)curse
-       add out0=-Nregs*8,in0
-       add out1=1,in1                  // increment recursion count
-       mov loc1=0
-       mov loc2=0
-       ;;
-       mov loc3=0
-       mov loc4=0
-       mov loc5=0
-       mov loc6=0
-       mov loc7=0
-(pRecurse) br.call.dptk.few b0=rse_clear_invalid
-       ;;
-       mov loc8=0
-       mov loc9=0
-       cmp.ne pReturn,p0=r0,in1        // if recursion count != 0, we need to do a br.ret
-       mov loc10=0
-       mov loc11=0
-(pReturn) br.ret.dptk.many b0
-#endif /* !CONFIG_ITANIUM */
-#      undef pRecurse
-#      undef pReturn
-       ;;
-       alloc r17=ar.pfs,0,0,0,0        // drop current register frame
-       ;;
-       loadrs
-       ;;
-skip_rbs_switch:
-       mov ar.unat=r25         // M2
-(pKStk)        extr.u r22=r22,21,1     // I0 extract current value of psr.pp from r22
-(pLvSys)mov r19=r0             // A  clear r19 for leave_syscall, no-op otherwise
-       ;;
-(pUStk)        mov ar.bspstore=r23     // M2
-(pKStk)        dep r29=r22,r29,21,1    // I0 update ipsr.pp with psr.pp
-(pLvSys)mov r16=r0             // A  clear r16 for leave_syscall, no-op otherwise
-       ;;
-       mov cr.ipsr=r29         // M2
-       mov ar.pfs=r26          // I0
-(pLvSys)mov r17=r0             // A  clear r17 for leave_syscall, no-op otherwise
-
-(p9)   mov cr.ifs=r30          // M2
-       mov b0=r21              // I0
-(pLvSys)mov r18=r0             // A  clear r18 for leave_syscall, no-op otherwise
-
-       mov ar.fpsr=r20         // M2
-       mov cr.iip=r28          // M2
-       nop 0
-       ;;
-(pUStk)        mov ar.rnat=r24         // M2 must happen with RSE in lazy mode
-       nop 0
-(pLvSys)mov r2=r0
-
-       mov ar.rsc=r27          // M2
-       mov pr=r31,-1           // I0
-       rfi                     // B
-
-       /*
-        * On entry:
-        *      r20 = &current->thread_info->pre_count (if CONFIG_PREEMPT)
-        *      r31 = current->thread_info->flags
-        * On exit:
-        *      p6 = TRUE if work-pending-check needs to be redone
-        */
-.work_pending_syscall:
-       add r2=-8,r2
-       add r3=-8,r3
-       ;;
-       st8 [r2]=r8
-       st8 [r3]=r10
-.work_pending:
-       tbit.z p6,p0=r31,TIF_NEED_RESCHED               // current_thread_info()->need_resched==0?
-(p6)   br.cond.sptk.few .notify
-#ifdef CONFIG_PREEMPT
-(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1
-       ;;
-(pKStk) st4 [r20]=r21
-       ssm psr.i               // enable interrupts
-#endif
-       br.call.spnt.many rp=schedule
-.ret9: cmp.eq p6,p0=r0,r0                              // p6 <- 1
-       rsm psr.i               // disable interrupts
-       ;;
-#ifdef CONFIG_PREEMPT
-(pKStk)        adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-(pKStk)        st4 [r20]=r0            // preempt_count() <- 0
-#endif
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-       br.cond.sptk.many .work_processed_kernel        // re-check
-
-.notify:
-(pUStk)        br.call.spnt.many rp=notify_resume_user
-.ret10:        cmp.ne p6,p0=r0,r0                              // p6 <- 0
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-       br.cond.sptk.many .work_processed_kernel        // don't re-check
-
-.work_pending_syscall_end:
-       adds r2=PT(R8)+16,r12
-       adds r3=PT(R10)+16,r12
-       ;;
-       ld8 r8=[r2]
-       ld8 r10=[r3]
-       br.cond.sptk.many .work_processed_syscall       // re-check
-
-END(__ia64_leave_kernel)
-
-ENTRY(handle_syscall_error)
-       /*
-        * Some system calls (e.g., ptrace, mmap) can return arbitrary values which could
-        * lead us to mistake a negative return value as a failed syscall.  Those syscall
-        * must deposit a non-zero value in pt_regs.r8 to indicate an error.  If
-        * pt_regs.r8 is zero, we assume that the call completed successfully.
-        */
-       PT_REGS_UNWIND_INFO(0)
-       ld8 r3=[r2]             // load pt_regs.r8
-       ;;
-       cmp.eq p6,p7=r3,r0      // is pt_regs.r8==0?
-       ;;
-(p7)   mov r10=-1
-(p7)   sub r8=0,r8             // negate return value to get errno
-       br.cond.sptk ia64_leave_syscall
-END(handle_syscall_error)
-
-       /*
-        * Invoke schedule_tail(task) while preserving in0-in7, which may be needed
-        * in case a system call gets restarted.
-        */
-GLOBAL_ENTRY(ia64_invoke_schedule_tail)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc loc1=ar.pfs,8,2,1,0
-       mov loc0=rp
-       mov out0=r8                             // Address of previous task
-       ;;
-       br.call.sptk.many rp=schedule_tail
-.ret11:        mov ar.pfs=loc1
-       mov rp=loc0
-       br.ret.sptk.many rp
-END(ia64_invoke_schedule_tail)
-
-       /*
-        * Setup stack and call do_notify_resume_user().  Note that pSys and pNonSys need to
-        * be set up by the caller.  We declare 8 input registers so the system call
-        * args get preserved, in case we need to restart a system call.
-        */
-GLOBAL_ENTRY(notify_resume_user)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
-       mov r9=ar.unat
-       mov loc0=rp                             // save return address
-       mov out0=0                              // there is no "oldset"
-       adds out1=8,sp                          // out1=&sigscratch->ar_pfs
-(pSys) mov out2=1                              // out2==1 => we're in a syscall
-       ;;
-(pNonSys) mov out2=0                           // out2==0 => not a syscall
-       .fframe 16
-       .spillsp ar.unat, 16
-       st8 [sp]=r9,-16                         // allocate space for ar.unat and save it
-       st8 [out1]=loc1,-8                      // save ar.pfs, out1=&sigscratch
-       .body
-       br.call.sptk.many rp=do_notify_resume_user
-.ret15:        .restore sp
-       adds sp=16,sp                           // pop scratch stack space
-       ;;
-       ld8 r9=[sp]                             // load new unat from sigscratch->scratch_unat
-       mov rp=loc0
-       ;;
-       mov ar.unat=r9
-       mov ar.pfs=loc1
-       br.ret.sptk.many rp
-END(notify_resume_user)
-
-GLOBAL_ENTRY(sys_rt_sigsuspend)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-       alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
-       mov r9=ar.unat
-       mov loc0=rp                             // save return address
-       mov out0=in0                            // mask
-       mov out1=in1                            // sigsetsize
-       adds out2=8,sp                          // out2=&sigscratch->ar_pfs
-       ;;
-       .fframe 16
-       .spillsp ar.unat, 16
-       st8 [sp]=r9,-16                         // allocate space for ar.unat and save it
-       st8 [out2]=loc1,-8                      // save ar.pfs, out2=&sigscratch
-       .body
-       br.call.sptk.many rp=ia64_rt_sigsuspend
-.ret17:        .restore sp
-       adds sp=16,sp                           // pop scratch stack space
-       ;;
-       ld8 r9=[sp]                             // load new unat from sw->caller_unat
-       mov rp=loc0
-       ;;
-       mov ar.unat=r9
-       mov ar.pfs=loc1
-       br.ret.sptk.many rp
-END(sys_rt_sigsuspend)
-
-ENTRY(sys_rt_sigreturn)
-       PT_REGS_UNWIND_INFO(0)
-       /*
-        * Allocate 8 input registers since ptrace() may clobber them
-        */
-       alloc r2=ar.pfs,8,0,1,0
-       .prologue
-       PT_REGS_SAVES(16)
-       adds sp=-16,sp
-       .body
-       cmp.eq pNonSys,pSys=r0,r0               // sigreturn isn't a normal syscall...
-       ;;
-       /*
-        * leave_kernel() restores f6-f11 from pt_regs, but since the streamlined
-        * syscall-entry path does not save them we save them here instead.  Note: we
-        * don't need to save any other registers that are not saved by the stream-lined
-        * syscall path, because restore_sigcontext() restores them.
-        */
-       adds r16=PT(F6)+32,sp
-       adds r17=PT(F7)+32,sp
-       ;;
-       stf.spill [r16]=f6,32
-       stf.spill [r17]=f7,32
-       ;;
-       stf.spill [r16]=f8,32
-       stf.spill [r17]=f9,32
-       ;;
-       stf.spill [r16]=f10
-       stf.spill [r17]=f11
-       adds out0=16,sp                         // out0 = &sigscratch
-       br.call.sptk.many rp=ia64_rt_sigreturn
-.ret19:        .restore sp,0
-       adds sp=16,sp
-       ;;
-       ld8 r9=[sp]                             // load new ar.unat
-       mov.sptk b7=r8,__ia64_leave_kernel
-       ;;
-       mov ar.unat=r9
-       br.many b7
-END(sys_rt_sigreturn)
-
-GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
-       .prologue
-       /*
-        * r16 = fake ar.pfs, we simply need to make sure privilege is still 0
-        */
-       mov r16=r0
-       DO_SAVE_SWITCH_STACK
-       br.call.sptk.many rp=ia64_handle_unaligned      // stack frame setup in ivt
-.ret21:        .body
-       DO_LOAD_SWITCH_STACK
-       br.cond.sptk.many rp                            // goes to ia64_leave_kernel
-END(ia64_prepare_handle_unaligned)
-
-       //
-       // unw_init_running(void (*callback)(info, arg), void *arg)
-       //
-#      define EXTRA_FRAME_SIZE ((UNW_FRAME_INFO_SIZE+15)&~15)
-
-GLOBAL_ENTRY(unw_init_running)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
-       alloc loc1=ar.pfs,2,3,3,0
-       ;;
-       ld8 loc2=[in0],8
-       mov loc0=rp
-       mov r16=loc1
-       DO_SAVE_SWITCH_STACK
-       .body
-
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
-       .fframe IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE
-       SWITCH_STACK_SAVES(EXTRA_FRAME_SIZE)
-       adds sp=-EXTRA_FRAME_SIZE,sp
-       .body
-       ;;
-       adds out0=16,sp                         // &info
-       mov out1=r13                            // current
-       adds out2=16+EXTRA_FRAME_SIZE,sp        // &switch_stack
-       br.call.sptk.many rp=unw_init_frame_info
-1:     adds out0=16,sp                         // &info
-       mov b6=loc2
-       mov loc2=gp                             // save gp across indirect function call
-       ;;
-       ld8 gp=[in0]
-       mov out1=in1                            // arg
-       br.call.sptk.many rp=b6                 // invoke the callback function
-1:     mov gp=loc2                             // restore gp
-
-       // For now, we don't allow changing registers from within
-       // unw_init_running; if we ever want to allow that, we'd
-       // have to do a load_switch_stack here:
-       .restore sp
-       adds sp=IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE,sp
-
-       mov ar.pfs=loc1
-       mov rp=loc0
-       br.ret.sptk.many rp
-END(unw_init_running)
-
-       .rodata
-       .align 8
-       .globl sys_call_table
-sys_call_table:
-       data8 sys_ni_syscall            //  This must be sys_ni_syscall!  See ivt.S.
-       data8 sys_exit                          // 1025
-       data8 sys_read
-       data8 sys_write
-       data8 sys_open
-       data8 sys_close
-       data8 sys_creat                         // 1030
-       data8 sys_link
-       data8 sys_unlink
-       data8 ia64_execve
-       data8 sys_chdir
-       data8 sys_fchdir                        // 1035
-       data8 sys_utimes
-       data8 sys_mknod
-       data8 sys_chmod
-       data8 sys_chown
-       data8 sys_lseek                         // 1040
-       data8 sys_getpid
-       data8 sys_getppid
-       data8 sys_mount
-       data8 sys_umount
-       data8 sys_setuid                        // 1045
-       data8 sys_getuid
-       data8 sys_geteuid
-       data8 sys_ptrace
-       data8 sys_access
-       data8 sys_sync                          // 1050
-       data8 sys_fsync
-       data8 sys_fdatasync
-       data8 sys_kill
-       data8 sys_rename
-       data8 sys_mkdir                         // 1055
-       data8 sys_rmdir
-       data8 sys_dup
-       data8 sys_pipe
-       data8 sys_times
-       data8 ia64_brk                          // 1060
-       data8 sys_setgid
-       data8 sys_getgid
-       data8 sys_getegid
-       data8 sys_acct
-       data8 sys_ioctl                         // 1065
-       data8 sys_fcntl
-       data8 sys_umask
-       data8 sys_chroot
-       data8 sys_ustat
-       data8 sys_dup2                          // 1070
-       data8 sys_setreuid
-       data8 sys_setregid
-       data8 sys_getresuid
-       data8 sys_setresuid
-       data8 sys_getresgid                     // 1075
-       data8 sys_setresgid
-       data8 sys_getgroups
-       data8 sys_setgroups
-       data8 sys_getpgid
-       data8 sys_setpgid                       // 1080
-       data8 sys_setsid
-       data8 sys_getsid
-       data8 sys_sethostname
-       data8 sys_setrlimit
-       data8 sys_getrlimit                     // 1085
-       data8 sys_getrusage
-       data8 sys_gettimeofday
-       data8 sys_settimeofday
-       data8 sys_select
-       data8 sys_poll                          // 1090
-       data8 sys_symlink
-       data8 sys_readlink
-       data8 sys_uselib
-       data8 sys_swapon
-       data8 sys_swapoff                       // 1095
-       data8 sys_reboot
-       data8 sys_truncate
-       data8 sys_ftruncate
-       data8 sys_fchmod
-       data8 sys_fchown                        // 1100
-       data8 ia64_getpriority
-       data8 sys_setpriority
-       data8 sys_statfs
-       data8 sys_fstatfs
-       data8 sys_gettid                        // 1105
-       data8 sys_semget
-       data8 sys_semop
-       data8 sys_semctl
-       data8 sys_msgget
-       data8 sys_msgsnd                        // 1110
-       data8 sys_msgrcv
-       data8 sys_msgctl
-       data8 sys_shmget
-       data8 sys_shmat
-       data8 sys_shmdt                         // 1115
-       data8 sys_shmctl
-       data8 sys_syslog
-       data8 sys_setitimer
-       data8 sys_getitimer
-       data8 sys_ni_syscall                    // 1120         /* was: ia64_oldstat */
-       data8 sys_ni_syscall                                    /* was: ia64_oldlstat */
-       data8 sys_ni_syscall                                    /* was: ia64_oldfstat */
-       data8 sys_vhangup
-       data8 sys_lchown
-       data8 sys_remap_file_pages              // 1125
-       data8 sys_wait4
-       data8 sys_sysinfo
-       data8 sys_clone
-       data8 sys_setdomainname
-       data8 sys_newuname                      // 1130
-       data8 sys_adjtimex
-       data8 sys_ni_syscall                                    /* was: ia64_create_module */
-       data8 sys_init_module
-       data8 sys_delete_module
-       data8 sys_ni_syscall                    // 1135         /* was: sys_get_kernel_syms */
-       data8 sys_ni_syscall                                    /* was: sys_query_module */
-       data8 sys_quotactl
-       data8 sys_bdflush
-       data8 sys_sysfs
-       data8 sys_personality                   // 1140
-       data8 sys_ni_syscall            // sys_afs_syscall
-       data8 sys_setfsuid
-       data8 sys_setfsgid
-       data8 sys_getdents
-       data8 sys_flock                         // 1145
-       data8 sys_readv
-       data8 sys_writev
-       data8 sys_pread64
-       data8 sys_pwrite64
-       data8 sys_sysctl                        // 1150
-       data8 sys_mmap
-       data8 sys_munmap
-       data8 sys_mlock
-       data8 sys_mlockall
-       data8 sys_mprotect                      // 1155
-       data8 ia64_mremap
-       data8 sys_msync
-       data8 sys_munlock
-       data8 sys_munlockall
-       data8 sys_sched_getparam                // 1160
-       data8 sys_sched_setparam
-       data8 sys_sched_getscheduler
-       data8 sys_sched_setscheduler
-       data8 sys_sched_yield
-       data8 sys_sched_get_priority_max        // 1165
-       data8 sys_sched_get_priority_min
-       data8 sys_sched_rr_get_interval
-       data8 sys_nanosleep
-       data8 sys_nfsservctl
-       data8 sys_prctl                         // 1170
-       data8 sys_getpagesize
-       data8 sys_mmap2
-       data8 sys_pciconfig_read
-       data8 sys_pciconfig_write
-       data8 sys_perfmonctl                    // 1175
-       data8 sys_sigaltstack
-       data8 sys_rt_sigaction
-       data8 sys_rt_sigpending
-       data8 sys_rt_sigprocmask
-       data8 sys_rt_sigqueueinfo               // 1180
-       data8 sys_rt_sigreturn
-       data8 sys_rt_sigsuspend
-       data8 sys_rt_sigtimedwait
-       data8 sys_getcwd
-       data8 sys_capget                        // 1185
-       data8 sys_capset
-       data8 sys_sendfile64
-       data8 sys_ni_syscall            // sys_getpmsg (STREAMS)
-       data8 sys_ni_syscall            // sys_putpmsg (STREAMS)
-       data8 sys_socket                        // 1190
-       data8 sys_bind
-       data8 sys_connect
-       data8 sys_listen
-       data8 sys_accept
-       data8 sys_getsockname                   // 1195
-       data8 sys_getpeername
-       data8 sys_socketpair
-       data8 sys_send
-       data8 sys_sendto
-       data8 sys_recv                          // 1200
-       data8 sys_recvfrom
-       data8 sys_shutdown
-       data8 sys_setsockopt
-       data8 sys_getsockopt
-       data8 sys_sendmsg                       // 1205
-       data8 sys_recvmsg
-       data8 sys_pivot_root
-       data8 sys_mincore
-       data8 sys_madvise
-       data8 sys_newstat                       // 1210
-       data8 sys_newlstat
-       data8 sys_newfstat
-       data8 sys_clone2
-       data8 sys_getdents64
-       data8 sys_getunwind                     // 1215
-       data8 sys_readahead
-       data8 sys_setxattr
-       data8 sys_lsetxattr
-       data8 sys_fsetxattr
-       data8 sys_getxattr                      // 1220
-       data8 sys_lgetxattr
-       data8 sys_fgetxattr
-       data8 sys_listxattr
-       data8 sys_llistxattr
-       data8 sys_flistxattr                    // 1225
-       data8 sys_removexattr
-       data8 sys_lremovexattr
-       data8 sys_fremovexattr
-       data8 sys_tkill
-       data8 sys_futex                         // 1230
-       data8 sys_sched_setaffinity
-       data8 sys_sched_getaffinity
-       data8 sys_set_tid_address
-       data8 sys_fadvise64_64
-       data8 sys_tgkill                        // 1235
-       data8 sys_exit_group
-       data8 sys_lookup_dcookie
-       data8 sys_io_setup
-       data8 sys_io_destroy
-       data8 sys_io_getevents                  // 1240
-       data8 sys_io_submit
-       data8 sys_io_cancel
-       data8 sys_epoll_create
-       data8 sys_epoll_ctl
-       data8 sys_epoll_wait                    // 1245
-       data8 sys_restart_syscall
-       data8 sys_semtimedop
-       data8 sys_timer_create
-       data8 sys_timer_settime
-       data8 sys_timer_gettime                 // 1250
-       data8 sys_timer_getoverrun
-       data8 sys_timer_delete
-       data8 sys_clock_settime
-       data8 sys_clock_gettime
-       data8 sys_clock_getres                  // 1255
-       data8 sys_clock_nanosleep
-       data8 sys_fstatfs64
-       data8 sys_statfs64
-       data8 sys_mbind
-       data8 sys_get_mempolicy                 // 1260
-       data8 sys_set_mempolicy
-       data8 sys_mq_open
-       data8 sys_mq_unlink
-       data8 sys_mq_timedsend
-       data8 sys_mq_timedreceive               // 1265
-       data8 sys_mq_notify
-       data8 sys_mq_getsetattr
-       data8 sys_ni_syscall                    // reserved for kexec_load
-       data8 sys_ni_syscall                    // reserved for vserver
-       data8 sys_waitid                        // 1270
-       data8 sys_add_key
-       data8 sys_request_key
-       data8 sys_keyctl
-       data8 sys_ioprio_set
-       data8 sys_ioprio_get                    // 1275
-       data8 sys_move_pages
-       data8 sys_inotify_init
-       data8 sys_inotify_add_watch
-       data8 sys_inotify_rm_watch
-       data8 sys_migrate_pages                 // 1280
-       data8 sys_openat
-       data8 sys_mkdirat
-       data8 sys_mknodat
-       data8 sys_fchownat
-       data8 sys_futimesat                     // 1285
-       data8 sys_newfstatat
-       data8 sys_unlinkat
-       data8 sys_renameat
-       data8 sys_linkat
-       data8 sys_symlinkat                     // 1290
-       data8 sys_readlinkat
-       data8 sys_fchmodat
-       data8 sys_faccessat
-       data8 sys_ni_syscall                    // reserved for pselect
-       data8 sys_ni_syscall                    // 1295 reserved for ppoll
-       data8 sys_unshare
-       data8 sys_splice
-       data8 sys_ni_syscall                    // reserved for set_robust_list
-       data8 sys_ni_syscall                    // reserved for get_robust_list
-       data8 sys_sync_file_range               // 1300
-       data8 sys_tee
-       data8 sys_vmsplice
-
-       .org sys_call_table + 8*NR_syscalls     // guard against failures to increase NR_syscalls
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/fsys.S b/linux-2.6-xen-sparse/arch/ia64/kernel/fsys.S
deleted file mode 100644 (file)
index 98b5d15..0000000
+++ /dev/null
@@ -1,925 +0,0 @@
-/*
- * This file contains the light-weight system call handlers (fsyscall-handlers).
- *
- * Copyright (C) 2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *
- * 25-Sep-03 davidm    Implement fsys_rt_sigprocmask().
- * 18-Feb-03 louisk    Implement fsys_gettimeofday().
- * 28-Feb-03 davidm    Fixed several bugs in fsys_gettimeofday().  Tuned it some more,
- *                     probably broke it along the way... ;-)
- * 13-Jul-04 clameter   Implement fsys_clock_gettime and revise fsys_gettimeofday to make
- *                      it capable of using memory based clocks without falling back to C code.
- */
-
-#include <asm/asmmacro.h>
-#include <asm/errno.h>
-#include <asm/asm-offsets.h>
-#include <asm/percpu.h>
-#include <asm/thread_info.h>
-#include <asm/sal.h>
-#include <asm/signal.h>
-#include <asm/system.h>
-#include <asm/unistd.h>
-
-#include "entry.h"
-
-/*
- * See Documentation/ia64/fsys.txt for details on fsyscalls.
- *
- * On entry to an fsyscall handler:
- *   r10       = 0 (i.e., defaults to "successful syscall return")
- *   r11       = saved ar.pfs (a user-level value)
- *   r15       = system call number
- *   r16       = "current" task pointer (in normal kernel-mode, this is in r13)
- *   r32-r39   = system call arguments
- *   b6                = return address (a user-level value)
- *   ar.pfs    = previous frame-state (a user-level value)
- *   PSR.be    = cleared to zero (i.e., little-endian byte order is in effect)
- *   all other registers may contain values passed in from user-mode
- *
- * On return from an fsyscall handler:
- *   r11       = saved ar.pfs (as passed into the fsyscall handler)
- *   r15       = system call number (as passed into the fsyscall handler)
- *   r32-r39   = system call arguments (as passed into the fsyscall handler)
- *   b6                = return address (as passed into the fsyscall handler)
- *   ar.pfs    = previous frame-state (as passed into the fsyscall handler)
- */
-
-ENTRY(fsys_ni_syscall)
-       .prologue
-       .altrp b6
-       .body
-       mov r8=ENOSYS
-       mov r10=-1
-       FSYS_RETURN
-END(fsys_ni_syscall)
-
-ENTRY(fsys_getpid)
-       .prologue
-       .altrp b6
-       .body
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
-       ;;
-       ld4 r9=[r9]
-       add r8=IA64_TASK_TGID_OFFSET,r16
-       ;;
-       and r9=TIF_ALLWORK_MASK,r9
-       ld4 r8=[r8]                             // r8 = current->tgid
-       ;;
-       cmp.ne p8,p0=0,r9
-(p8)   br.spnt.many fsys_fallback_syscall
-       FSYS_RETURN
-END(fsys_getpid)
-
-ENTRY(fsys_getppid)
-       .prologue
-       .altrp b6
-       .body
-       add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16
-       ;;
-       ld8 r17=[r17]                           // r17 = current->group_leader
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
-       ;;
-
-       ld4 r9=[r9]
-       add r17=IA64_TASK_REAL_PARENT_OFFSET,r17 // r17 = &current->group_leader->real_parent
-       ;;
-       and r9=TIF_ALLWORK_MASK,r9
-
-1:     ld8 r18=[r17]                           // r18 = current->group_leader->real_parent
-       ;;
-       cmp.ne p8,p0=0,r9
-       add r8=IA64_TASK_TGID_OFFSET,r18        // r8 = &current->group_leader->real_parent->tgid
-       ;;
-
-       /*
-        * The .acq is needed to ensure that the read of tgid has returned its data before
-        * we re-check "real_parent".
-        */
-       ld4.acq r8=[r8]                         // r8 = current->group_leader->real_parent->tgid
-#ifdef CONFIG_SMP
-       /*
-        * Re-read current->group_leader->real_parent.
-        */
-       ld8 r19=[r17]                           // r19 = current->group_leader->real_parent
-(p8)   br.spnt.many fsys_fallback_syscall
-       ;;
-       cmp.ne p6,p0=r18,r19                    // did real_parent change?
-       mov r19=0                       // i must not leak kernel bits...
-(p6)   br.cond.spnt.few 1b                     // yes -> redo the read of tgid and the check
-       ;;
-       mov r17=0                       // i must not leak kernel bits...
-       mov r18=0                       // i must not leak kernel bits...
-#else
-       mov r17=0                       // i must not leak kernel bits...
-       mov r18=0                       // i must not leak kernel bits...
-       mov r19=0                       // i must not leak kernel bits...
-#endif
-       FSYS_RETURN
-END(fsys_getppid)
-
-ENTRY(fsys_set_tid_address)
-       .prologue
-       .altrp b6
-       .body
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
-       ;;
-       ld4 r9=[r9]
-       tnat.z p6,p7=r32                // check argument register for being NaT
-       ;;
-       and r9=TIF_ALLWORK_MASK,r9
-       add r8=IA64_TASK_PID_OFFSET,r16
-       add r18=IA64_TASK_CLEAR_CHILD_TID_OFFSET,r16
-       ;;
-       ld4 r8=[r8]
-       cmp.ne p8,p0=0,r9
-       mov r17=-1
-       ;;
-(p6)   st8 [r18]=r32
-(p7)   st8 [r18]=r17
-(p8)   br.spnt.many fsys_fallback_syscall
-       ;;
-       mov r17=0                       // i must not leak kernel bits...
-       mov r18=0                       // i must not leak kernel bits...
-       FSYS_RETURN
-END(fsys_set_tid_address)
-
-/*
- * Ensure that the time interpolator structure is compatible with the asm code
- */
-#if IA64_TIME_INTERPOLATOR_SOURCE_OFFSET !=0 || IA64_TIME_INTERPOLATOR_SHIFT_OFFSET != 2 \
-       || IA64_TIME_INTERPOLATOR_JITTER_OFFSET != 3 || IA64_TIME_INTERPOLATOR_NSEC_OFFSET != 4
-#error fsys_gettimeofday incompatible with changes to struct time_interpolator
-#endif
-#define CLOCK_REALTIME 0
-#define CLOCK_MONOTONIC 1
-#define CLOCK_DIVIDE_BY_1000 0x4000
-#define CLOCK_ADD_MONOTONIC 0x8000
-
-ENTRY(fsys_gettimeofday)
-       .prologue
-       .altrp b6
-       .body
-       mov r31 = r32
-       tnat.nz p6,p0 = r33             // guard against NaT argument
-(p6)    br.cond.spnt.few .fail_einval
-       mov r30 = CLOCK_DIVIDE_BY_1000
-       ;;
-.gettime:
-       // Register map
-       // Incoming r31 = pointer to address where to place result
-       //          r30 = flags determining how time is processed
-       // r2,r3 = temp r4-r7 preserved
-       // r8 = result nanoseconds
-       // r9 = result seconds
-       // r10 = temporary storage for clock difference
-       // r11 = preserved: saved ar.pfs
-       // r12 = preserved: memory stack
-       // r13 = preserved: thread pointer
-       // r14 = address of mask / mask
-       // r15 = preserved: system call number
-       // r16 = preserved: current task pointer
-       // r17 = wall to monotonic use
-       // r18 = time_interpolator->offset
-       // r19 = address of wall_to_monotonic
-       // r20 = pointer to struct time_interpolator / pointer to time_interpolator->address
-       // r21 = shift factor
-       // r22 = address of time interpolator->last_counter
-       // r23 = address of time_interpolator->last_cycle
-       // r24 = adress of time_interpolator->offset
-       // r25 = last_cycle value
-       // r26 = last_counter value
-       // r27 = pointer to xtime
-       // r28 = sequence number at the beginning of critcal section
-       // r29 = address of seqlock
-       // r30 = time processing flags / memory address
-       // r31 = pointer to result
-       // Predicates
-       // p6,p7 short term use
-       // p8 = timesource ar.itc
-       // p9 = timesource mmio64
-       // p10 = timesource mmio32
-       // p11 = timesource not to be handled by asm code
-       // p12 = memory time source ( = p9 | p10)
-       // p13 = do cmpxchg with time_interpolator_last_cycle
-       // p14 = Divide by 1000
-       // p15 = Add monotonic
-       //
-       // Note that instructions are optimized for McKinley. McKinley can process two
-       // bundles simultaneously and therefore we continuously try to feed the CPU
-       // two bundles and then a stop.
-       tnat.nz p6,p0 = r31     // branch deferred since it does not fit into bundle structure
-       mov pr = r30,0xc000     // Set predicates according to function
-       add r2 = TI_FLAGS+IA64_TASK_SIZE,r16
-       movl r20 = time_interpolator
-       ;;
-       ld8 r20 = [r20]         // get pointer to time_interpolator structure
-       movl r29 = xtime_lock
-       ld4 r2 = [r2]           // process work pending flags
-       movl r27 = xtime
-       ;;      // only one bundle here
-       ld8 r21 = [r20]         // first quad with control information
-       and r2 = TIF_ALLWORK_MASK,r2
-(p6)    br.cond.spnt.few .fail_einval  // deferred branch
-       ;;
-       add r10 = IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET,r20
-       extr r3 = r21,32,32     // time_interpolator->nsec_per_cyc
-       extr r8 = r21,0,16      // time_interpolator->source
-       cmp.ne p6, p0 = 0, r2   // Fallback if work is scheduled
-(p6)    br.cond.spnt.many fsys_fallback_syscall
-       ;;
-       cmp.eq p8,p12 = 0,r8    // Check for cpu timer
-       cmp.eq p9,p0 = 1,r8     // MMIO64 ?
-       extr r2 = r21,24,8      // time_interpolator->jitter
-       cmp.eq p10,p0 = 2,r8    // MMIO32 ?
-       cmp.ltu p11,p0 = 2,r8   // function or other clock
-(p11)  br.cond.spnt.many fsys_fallback_syscall
-       ;;
-       setf.sig f7 = r3        // Setup for scaling of counter
-(p15)  movl r19 = wall_to_monotonic
-(p12)  ld8 r30 = [r10]
-       cmp.ne p13,p0 = r2,r0   // need jitter compensation?
-       extr r21 = r21,16,8     // shift factor
-       ;;
-.time_redo:
-       .pred.rel.mutex p8,p9,p10
-       ld4.acq r28 = [r29]     // xtime_lock.sequence. Must come first for locking purposes
-(p8)   mov r2 = ar.itc         // CPU_TIMER. 36 clocks latency!!!
-       add r22 = IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET,r20
-(p9)   ld8 r2 = [r30]          // readq(ti->address). Could also have latency issues..
-(p10)  ld4 r2 = [r30]          // readw(ti->address)
-(p13)  add r23 = IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET,r20
-       ;;                      // could be removed by moving the last add upward
-       ld8 r26 = [r22]         // time_interpolator->last_counter
-(p13)  ld8 r25 = [r23]         // time interpolator->last_cycle
-       add r24 = IA64_TIME_INTERPOLATOR_OFFSET_OFFSET,r20
-(p15)  ld8 r17 = [r19],IA64_TIMESPEC_TV_NSEC_OFFSET
-       ld8 r9 = [r27],IA64_TIMESPEC_TV_NSEC_OFFSET
-       add r14 = IA64_TIME_INTERPOLATOR_MASK_OFFSET, r20
-       ;;
-       ld8 r18 = [r24]         // time_interpolator->offset
-       ld8 r8 = [r27],-IA64_TIMESPEC_TV_NSEC_OFFSET    // xtime.tv_nsec
-(p13)  sub r3 = r25,r2 // Diff needed before comparison (thanks davidm)
-       ;;
-       ld8 r14 = [r14]         // time_interpolator->mask
-(p13)  cmp.gt.unc p6,p7 = r3,r0        // check if it is less than last. p6,p7 cleared
-       sub r10 = r2,r26        // current_counter - last_counter
-       ;;
-(p6)   sub r10 = r25,r26       // time we got was less than last_cycle
-(p7)   mov ar.ccv = r25        // more than last_cycle. Prep for cmpxchg
-       ;;
-       and r10 = r10,r14       // Apply mask
-       ;;
-       setf.sig f8 = r10
-       nop.i 123
-       ;;
-(p7)   cmpxchg8.rel r3 = [r23],r2,ar.ccv
-EX(.fail_efault, probe.w.fault r31, 3) // This takes 5 cycles and we have spare time
-       xmpy.l f8 = f8,f7       // nsec_per_cyc*(counter-last_counter)
-(p15)  add r9 = r9,r17         // Add wall to monotonic.secs to result secs
-       ;;
-(p15)  ld8 r17 = [r19],-IA64_TIMESPEC_TV_NSEC_OFFSET
-(p7)   cmp.ne p7,p0 = r25,r3   // if cmpxchg not successful redo
-       // simulate tbit.nz.or p7,p0 = r28,0
-       and r28 = ~1,r28        // Make sequence even to force retry if odd
-       getf.sig r2 = f8
-       mf
-       add r8 = r8,r18         // Add time interpolator offset
-       ;;
-       ld4 r10 = [r29]         // xtime_lock.sequence
-(p15)  add r8 = r8, r17        // Add monotonic.nsecs to nsecs
-       shr.u r2 = r2,r21
-       ;;              // overloaded 3 bundles!
-       // End critical section.
-       add r8 = r8,r2          // Add xtime.nsecs
-       cmp4.ne.or p7,p0 = r28,r10
-(p7)   br.cond.dpnt.few .time_redo     // sequence number changed ?
-       // Now r8=tv->tv_nsec and r9=tv->tv_sec
-       mov r10 = r0
-       movl r2 = 1000000000
-       add r23 = IA64_TIMESPEC_TV_NSEC_OFFSET, r31
-(p14)  movl r3 = 2361183241434822607   // Prep for / 1000 hack
-       ;;
-.time_normalize:
-       mov r21 = r8
-       cmp.ge p6,p0 = r8,r2
-(p14)  shr.u r20 = r8, 3               // We can repeat this if necessary just wasting some time
-       ;;
-(p14)  setf.sig f8 = r20
-(p6)   sub r8 = r8,r2
-(p6)   add r9 = 1,r9                   // two nops before the branch.
-(p14)  setf.sig f7 = r3                // Chances for repeats are 1 in 10000 for gettod
-(p6)   br.cond.dpnt.few .time_normalize
-       ;;
-       // Divided by 8 though shift. Now divide by 125
-       // The compiler was able to do that with a multiply
-       // and a shift and we do the same
-EX(.fail_efault, probe.w.fault r23, 3)         // This also costs 5 cycles
-(p14)  xmpy.hu f8 = f8, f7                     // xmpy has 5 cycles latency so use it...
-       ;;
-       mov r8 = r0
-(p14)  getf.sig r2 = f8
-       ;;
-(p14)  shr.u r21 = r2, 4
-       ;;
-EX(.fail_efault, st8 [r31] = r9)
-EX(.fail_efault, st8 [r23] = r21)
-       FSYS_RETURN
-.fail_einval:
-       mov r8 = EINVAL
-       mov r10 = -1
-       FSYS_RETURN
-.fail_efault:
-       mov r8 = EFAULT
-       mov r10 = -1
-       FSYS_RETURN
-END(fsys_gettimeofday)
-
-ENTRY(fsys_clock_gettime)
-       .prologue
-       .altrp b6
-       .body
-       cmp4.ltu p6, p0 = CLOCK_MONOTONIC, r32
-       // Fallback if this is not CLOCK_REALTIME or CLOCK_MONOTONIC
-(p6)   br.spnt.few fsys_fallback_syscall
-       mov r31 = r33
-       shl r30 = r32,15
-       br.many .gettime
-END(fsys_clock_gettime)
-
-/*
- * long fsys_rt_sigprocmask (int how, sigset_t *set, sigset_t *oset, size_t sigsetsize).
- */
-#if _NSIG_WORDS != 1
-# error Sorry, fsys_rt_sigprocmask() needs to be updated for _NSIG_WORDS != 1.
-#endif
-ENTRY(fsys_rt_sigprocmask)
-       .prologue
-       .altrp b6
-       .body
-
-       add r2=IA64_TASK_BLOCKED_OFFSET,r16
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
-       cmp4.ltu p6,p0=SIG_SETMASK,r32
-
-       cmp.ne p15,p0=r0,r34                    // oset != NULL?
-       tnat.nz p8,p0=r34
-       add r31=IA64_TASK_SIGHAND_OFFSET,r16
-       ;;
-       ld8 r3=[r2]                             // read/prefetch current->blocked
-       ld4 r9=[r9]
-       tnat.nz.or p6,p0=r35
-
-       cmp.ne.or p6,p0=_NSIG_WORDS*8,r35
-       tnat.nz.or p6,p0=r32
-(p6)   br.spnt.few .fail_einval                // fail with EINVAL
-       ;;
-#ifdef CONFIG_SMP
-       ld8 r31=[r31]                           // r31 <- current->sighand
-#endif
-       and r9=TIF_ALLWORK_MASK,r9
-       tnat.nz.or p8,p0=r33
-       ;;
-       cmp.ne p7,p0=0,r9
-       cmp.eq p6,p0=r0,r33                     // set == NULL?
-       add r31=IA64_SIGHAND_SIGLOCK_OFFSET,r31 // r31 <- current->sighand->siglock
-(p8)   br.spnt.few .fail_efault                // fail with EFAULT
-(p7)   br.spnt.many fsys_fallback_syscall      // got pending kernel work...
-(p6)   br.dpnt.many .store_mask                // -> short-circuit to just reading the signal mask
-
-       /* Argh, we actually have to do some work and _update_ the signal mask: */
-
-EX(.fail_efault, probe.r.fault r33, 3)         // verify user has read-access to *set
-EX(.fail_efault, ld8 r14=[r33])                        // r14 <- *set
-       mov r17=(1 << (SIGKILL - 1)) | (1 << (SIGSTOP - 1))
-       ;;
-
-       rsm psr.i                               // mask interrupt delivery
-       mov ar.ccv=0
-       andcm r14=r14,r17                       // filter out SIGKILL & SIGSTOP
-
-#ifdef CONFIG_SMP
-       mov r17=1
-       ;;
-       cmpxchg4.acq r18=[r31],r17,ar.ccv       // try to acquire the lock
-       mov r8=EINVAL                   // default to EINVAL
-       ;;
-       ld8 r3=[r2]                     // re-read current->blocked now that we hold the lock
-       cmp4.ne p6,p0=r18,r0
-(p6)   br.cond.spnt.many .lock_contention
-       ;;
-#else
-       ld8 r3=[r2]                     // re-read current->blocked now that we hold the lock
-       mov r8=EINVAL                   // default to EINVAL
-#endif
-       add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16
-       add r19=IA64_TASK_SIGNAL_OFFSET,r16
-       cmp4.eq p6,p0=SIG_BLOCK,r32
-       ;;
-       ld8 r19=[r19]                   // r19 <- current->signal
-       cmp4.eq p7,p0=SIG_UNBLOCK,r32
-       cmp4.eq p8,p0=SIG_SETMASK,r32
-       ;;
-       ld8 r18=[r18]                   // r18 <- current->pending.signal
-       .pred.rel.mutex p6,p7,p8
-(p6)   or r14=r3,r14                   // SIG_BLOCK
-(p7)   andcm r14=r3,r14                // SIG_UNBLOCK
-
-(p8)   mov r14=r14                     // SIG_SETMASK
-(p6)   mov r8=0                        // clear error code
-       // recalc_sigpending()
-       add r17=IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,r19
-
-       add r19=IA64_SIGNAL_SHARED_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r19
-       ;;
-       ld4 r17=[r17]           // r17 <- current->signal->group_stop_count
-(p7)   mov r8=0                // clear error code
-
-       ld8 r19=[r19]           // r19 <- current->signal->shared_pending
-       ;;
-       cmp4.gt p6,p7=r17,r0    // p6/p7 <- (current->signal->group_stop_count > 0)?
-(p8)   mov r8=0                // clear error code
-
-       or r18=r18,r19          // r18 <- current->pending | current->signal->shared_pending
-       ;;
-       // r18 <- (current->pending | current->signal->shared_pending) & ~current->blocked:
-       andcm r18=r18,r14
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
-       ;;
-
-(p7)   cmp.ne.or.andcm p6,p7=r18,r0            // p6/p7 <- signal pending
-       mov r19=0                                       // i must not leak kernel bits...
-(p6)   br.cond.dpnt.many .sig_pending
-       ;;
-
-1:     ld4 r17=[r9]                            // r17 <- current->thread_info->flags
-       ;;
-       mov ar.ccv=r17
-       and r18=~_TIF_SIGPENDING,r17            // r18 <- r17 & ~(1 << TIF_SIGPENDING)
-       ;;
-
-       st8 [r2]=r14                            // update current->blocked with new mask
-       cmpxchg4.acq r8=[r9],r18,ar.ccv         // current->thread_info->flags <- r18
-       ;;
-       cmp.ne p6,p0=r17,r8                     // update failed?
-(p6)   br.cond.spnt.few 1b                     // yes -> retry
-
-#ifdef CONFIG_SMP
-       st4.rel [r31]=r0                        // release the lock
-#endif
-       ssm psr.i
-       ;;
-
-       srlz.d                                  // ensure psr.i is set again
-       mov r18=0                                       // i must not leak kernel bits...
-
-.store_mask:
-EX(.fail_efault, (p15) probe.w.fault r34, 3)   // verify user has write-access to *oset
-EX(.fail_efault, (p15) st8 [r34]=r3)
-       mov r2=0                                        // i must not leak kernel bits...
-       mov r3=0                                        // i must not leak kernel bits...
-       mov r8=0                                // return 0
-       mov r9=0                                        // i must not leak kernel bits...
-       mov r14=0                                       // i must not leak kernel bits...
-       mov r17=0                                       // i must not leak kernel bits...
-       mov r31=0                                       // i must not leak kernel bits...
-       FSYS_RETURN
-
-.sig_pending:
-#ifdef CONFIG_SMP
-       st4.rel [r31]=r0                        // release the lock
-#endif
-       ssm psr.i
-       ;;
-       srlz.d
-       br.sptk.many fsys_fallback_syscall      // with signal pending, do the heavy-weight syscall
-
-#ifdef CONFIG_SMP
-.lock_contention:
-       /* Rather than spinning here, fall back on doing a heavy-weight syscall.  */
-       ssm psr.i
-       ;;
-       srlz.d
-       br.sptk.many fsys_fallback_syscall
-#endif
-END(fsys_rt_sigprocmask)
-
-ENTRY(fsys_fallback_syscall)
-       .prologue
-       .altrp b6
-       .body
-       /*
-        * We only get here from light-weight syscall handlers.  Thus, we already
-        * know that r15 contains a valid syscall number.  No need to re-check.
-        */
-       adds r17=-1024,r15
-       movl r14=sys_call_table
-       ;;
-#ifdef CONFIG_XEN
-       movl r18=running_on_xen;;
-       ld4 r18=[r18];;
-       // p14 = running_on_xen
-       // p15 = !running_on_xen
-       cmp.ne p14,p15=r0,r18
-       ;;    
-(p14)  movl r18=XSI_PSR_I_ADDR;;
-(p14)  ld8 r18=[r18]
-(p14)  mov r29=1;;
-(p14)  st1 [r18]=r29
-(p15)  rsm psr.i
-#else    
-       rsm psr.i
-#endif    
-       shladd r18=r17,3,r14
-       ;;
-       ld8 r18=[r18]                           // load normal (heavy-weight) syscall entry-point
-#ifdef CONFIG_XEN
-(p14)  mov r27=r8
-(p14)  XEN_HYPER_GET_PSR
-       ;;
-(p14)  mov r29=r8
-(p14)  mov r8=r27
-(p15)  mov r29=psr                             // read psr (12 cyc load latency)
-#else    
-       mov r29=psr                             // read psr (12 cyc load latency)
-#endif    
-       mov r27=ar.rsc
-       mov r21=ar.fpsr
-       mov r26=ar.pfs
-END(fsys_fallback_syscall)
-       /* FALL THROUGH */
-GLOBAL_ENTRY(fsys_bubble_down)
-       .prologue
-       .altrp b6
-       .body
-       /*
-        * We get here for syscalls that don't have a lightweight
-        * handler.  For those, we need to bubble down into the kernel
-        * and that requires setting up a minimal pt_regs structure,
-        * and initializing the CPU state more or less as if an
-        * interruption had occurred.  To make syscall-restarts work,
-        * we setup pt_regs such that cr_iip points to the second
-        * instruction in syscall_via_break.  Decrementing the IP
-        * hence will restart the syscall via break and not
-        * decrementing IP will return us to the caller, as usual.
-        * Note that we preserve the value of psr.pp rather than
-        * initializing it from dcr.pp.  This makes it possible to
-        * distinguish fsyscall execution from other privileged
-        * execution.
-        *
-        * On entry:
-        *      - normal fsyscall handler register usage, except
-        *        that we also have:
-        *      - r18: address of syscall entry point
-        *      - r21: ar.fpsr
-        *      - r26: ar.pfs
-        *      - r27: ar.rsc
-        *      - r29: psr
-        *
-        * We used to clear some PSR bits here but that requires slow
-        * serialization.  Fortuntely, that isn't really necessary.
-        * The rationale is as follows: we used to clear bits
-        * ~PSR_PRESERVED_BITS in PSR.L.  Since
-        * PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we
-        * ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.
-        * However,
-        *
-        * PSR.BE : already is turned off in __kernel_syscall_via_epc()
-        * PSR.AC : don't care (kernel normally turns PSR.AC on)
-        * PSR.I  : already turned off by the time fsys_bubble_down gets
-        *          invoked
-        * PSR.DFL: always 0 (kernel never turns it on)
-        * PSR.DFH: don't care --- kernel never touches f32-f127 on its own
-        *          initiative
-        * PSR.DI : always 0 (kernel never turns it on)
-        * PSR.SI : always 0 (kernel never turns it on)
-        * PSR.DB : don't care --- kernel never enables kernel-level
-        *          breakpoints
-        * PSR.TB : must be 0 already; if it wasn't zero on entry to
-        *          __kernel_syscall_via_epc, the branch to fsys_bubble_down
-        *          will trigger a taken branch; the taken-trap-handler then
-        *          converts the syscall into a break-based system-call.
-        */
-       /*
-        * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.
-        * The rest we have to synthesize.
-        */
-#      define PSR_ONE_BITS             ((3 << IA64_PSR_CPL0_BIT)       \
-                                        | (0x1 << IA64_PSR_RI_BIT)     \
-                                        | IA64_PSR_BN | IA64_PSR_I)
-
-       invala                                  // M0|1
-       movl r14=ia64_ret_from_syscall          // X
-
-       nop.m 0
-       movl r28=__kernel_syscall_via_break     // X    create cr.iip
-       ;;
-
-       mov r2=r16                              // A    get task addr to addl-addressable register
-       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A
-       mov r31=pr                              // I0   save pr (2 cyc)
-       ;;
-       st1 [r16]=r0                            // M2|3 clear current->thread.on_ustack flag
-       addl r22=IA64_RBS_OFFSET,r2             // A    compute base of RBS
-       add r3=TI_FLAGS+IA64_TASK_SIZE,r2       // A
-       ;;
-       ld4 r3=[r3]                             // M0|1 r3 = current_thread_info()->flags
-       lfetch.fault.excl.nt1 [r22]             // M0|1 prefetch register backing-store
-       nop.i 0
-       ;;
-       mov ar.rsc=0                            // M2   set enforced lazy mode, pl 0, LE, loadrs=0
-       nop.m 0
-       nop.i 0
-       ;;
-       mov r23=ar.bspstore                     // M2 (12 cyc) save ar.bspstore
-       mov.m r24=ar.rnat                       // M2 (5 cyc) read ar.rnat (dual-issues!)
-       nop.i 0
-       ;;
-       mov ar.bspstore=r22                     // M2 (6 cyc) switch to kernel RBS
-       movl r8=PSR_ONE_BITS                    // X
-       ;;
-       mov r25=ar.unat                         // M2 (5 cyc) save ar.unat
-       mov r19=b6                              // I0   save b6 (2 cyc)
-       mov r20=r1                              // A    save caller's gp in r20
-       ;;
-       or r29=r8,r29                           // A    construct cr.ipsr value to save
-       mov b6=r18                              // I0   copy syscall entry-point to b6 (7 cyc)
-       addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of memory stack
-
-       mov r18=ar.bsp                          // M2   save (kernel) ar.bsp (12 cyc)
-       cmp.ne pKStk,pUStk=r0,r0                // A    set pKStk <- 0, pUStk <- 1
-       br.call.sptk.many b7=ia64_syscall_setup // B
-       ;;
-       mov ar.rsc=0x3                          // M2   set eager mode, pl 0, LE, loadrs=0
-       mov rp=r14                              // I0   set the real return addr
-       and r3=_TIF_SYSCALL_TRACEAUDIT,r3       // A
-       ;;
-#ifdef CONFIG_XEN
-       movl r14=running_on_xen;;
-       ld4 r14=[r14];;
-       // p14 = running_on_xen
-       // p15 = !running_on_xen
-       cmp.ne p14,p15=r0,r14
-       ;; 
-(p14)  movl r28=XSI_PSR_I_ADDR;;
-(p14)  ld8 r28=[r28];;
-(p14)  adds r28=-1,r28;;                       // event_pending
-(p14)  ld1 r14=[r28];;
-(p14)  cmp.ne.unc p13,p14=r14,r0;;
-(p13)  XEN_HYPER_SSM_I
-(p14)  adds r28=1,r28;;                        // event_mask
-(p14)  st1 [r28]=r0;;
-(p15)  ssm psr.i
-#else
-       ssm psr.i                               // M2   we're on kernel stacks now, reenable irqs
-#endif    
-       cmp.eq p8,p0=r3,r0                      // A
-(p10)  br.cond.spnt.many ia64_ret_from_syscall // B    return if bad call-frame or r15 is a NaT
-
-       nop.m 0
-(p8)   br.call.sptk.many b6=b6                 // B    (ignore return address)
-       br.cond.spnt ia64_trace_syscall         // B
-END(fsys_bubble_down)
-
-       .rodata
-       .align 8
-       .globl fsyscall_table
-
-       data8 fsys_bubble_down
-fsyscall_table:
-       data8 fsys_ni_syscall
-       data8 0                         // exit                 // 1025
-       data8 0                         // read
-       data8 0                         // write
-       data8 0                         // open
-       data8 0                         // close
-       data8 0                         // creat                // 1030
-       data8 0                         // link
-       data8 0                         // unlink
-       data8 0                         // execve
-       data8 0                         // chdir
-       data8 0                         // fchdir               // 1035
-       data8 0                         // utimes
-       data8 0                         // mknod
-       data8 0                         // chmod
-       data8 0                         // chown
-       data8 0                         // lseek                // 1040
-       data8 fsys_getpid               // getpid
-       data8 fsys_getppid              // getppid
-       data8 0                         // mount
-       data8 0                         // umount
-       data8 0                         // setuid               // 1045
-       data8 0                         // getuid
-       data8 0                         // geteuid
-       data8 0                         // ptrace
-       data8 0                         // access
-       data8 0                         // sync                 // 1050
-       data8 0                         // fsync
-       data8 0                         // fdatasync
-       data8 0                         // kill
-       data8 0                         // rename
-       data8 0                         // mkdir                // 1055
-       data8 0                         // rmdir
-       data8 0                         // dup
-       data8 0                         // pipe
-       data8 0                         // times
-       data8 0                         // brk                  // 1060
-       data8 0                         // setgid
-       data8 0                         // getgid
-       data8 0                         // getegid
-       data8 0                         // acct
-       data8 0                         // ioctl                // 1065
-       data8 0                         // fcntl
-       data8 0                         // umask
-       data8 0                         // chroot
-       data8 0                         // ustat
-       data8 0                         // dup2                 // 1070
-       data8 0                         // setreuid
-       data8 0                         // setregid
-       data8 0                         // getresuid
-       data8 0                         // setresuid
-       data8 0                         // getresgid            // 1075
-       data8 0                         // setresgid
-       data8 0                         // getgroups
-       data8 0                         // setgroups
-       data8 0                         // getpgid
-       data8 0                         // setpgid              // 1080
-       data8 0                         // setsid
-       data8 0                         // getsid
-       data8 0                         // sethostname
-       data8 0                         // setrlimit
-       data8 0                         // getrlimit            // 1085
-       data8 0                         // getrusage
-       data8 fsys_gettimeofday         // gettimeofday
-       data8 0                         // settimeofday
-       data8 0                         // select
-       data8 0                         // poll                 // 1090
-       data8 0                         // symlink
-       data8 0                         // readlink
-       data8 0                         // uselib
-       data8 0                         // swapon
-       data8 0                         // swapoff              // 1095
-       data8 0                         // reboot
-       data8 0                         // truncate
-       data8 0                         // ftruncate
-       data8 0                         // fchmod
-       data8 0                         // fchown               // 1100
-       data8 0                         // getpriority
-       data8 0                         // setpriority
-       data8 0                         // statfs
-       data8 0                         // fstatfs
-       data8 0                         // gettid               // 1105
-       data8 0                         // semget
-       data8 0                         // semop
-       data8 0                         // semctl
-       data8 0                         // msgget
-       data8 0                         // msgsnd               // 1110
-       data8 0                         // msgrcv
-       data8 0                         // msgctl
-       data8 0                         // shmget
-       data8 0                         // shmat
-       data8 0                         // shmdt                // 1115
-       data8 0                         // shmctl
-       data8 0                         // syslog
-       data8 0                         // setitimer
-       data8 0                         // getitimer
-       data8 0                                                 // 1120
-       data8 0
-       data8 0
-       data8 0                         // vhangup
-       data8 0                         // lchown
-       data8 0                         // remap_file_pages     // 1125
-       data8 0                         // wait4
-       data8 0                         // sysinfo
-       data8 0                         // clone
-       data8 0                         // setdomainname
-       data8 0                         // newuname             // 1130
-       data8 0                         // adjtimex
-       data8 0
-       data8 0                         // init_module
-       data8 0                         // delete_module
-       data8 0                                                 // 1135
-       data8 0
-       data8 0                         // quotactl
-       data8 0                         // bdflush
-       data8 0                         // sysfs
-       data8 0                         // personality          // 1140
-       data8 0                         // afs_syscall
-       data8 0                         // setfsuid
-       data8 0                         // setfsgid
-       data8 0                         // getdents
-       data8 0                         // flock                // 1145
-       data8 0                         // readv
-       data8 0                         // writev
-       data8 0                         // pread64
-       data8 0                         // pwrite64
-       data8 0                         // sysctl               // 1150
-       data8 0                         // mmap
-       data8 0                         // munmap
-       data8 0                         // mlock
-       data8 0                         // mlockall
-       data8 0                         // mprotect             // 1155
-       data8 0                         // mremap
-       data8 0                         // msync
-       data8 0                         // munlock
-       data8 0                         // munlockall
-       data8 0                         // sched_getparam       // 1160
-       data8 0                         // sched_setparam
-       data8 0                         // sched_getscheduler
-       data8 0                         // sched_setscheduler
-       data8 0                         // sched_yield
-       data8 0                         // sched_get_priority_max       // 1165
-       data8 0                         // sched_get_priority_min
-       data8 0                         // sched_rr_get_interval
-       data8 0                         // nanosleep
-       data8 0                         // nfsservctl
-       data8 0                         // prctl                // 1170
-       data8 0                         // getpagesize
-       data8 0                         // mmap2
-       data8 0                         // pciconfig_read
-       data8 0                         // pciconfig_write
-       data8 0                         // perfmonctl           // 1175
-       data8 0                         // sigaltstack
-       data8 0                         // rt_sigaction
-       data8 0                         // rt_sigpending
-       data8 fsys_rt_sigprocmask       // rt_sigprocmask
-       data8 0                         // rt_sigqueueinfo      // 1180
-       data8 0                         // rt_sigreturn
-       data8 0                         // rt_sigsuspend
-       data8 0                         // rt_sigtimedwait
-       data8 0                         // getcwd
-       data8 0                         // capget               // 1185
-       data8 0                         // capset
-       data8 0                         // sendfile
-       data8 0
-       data8 0
-       data8 0                         // socket               // 1190
-       data8 0                         // bind
-       data8 0                         // connect
-       data8 0                         // listen
-       data8 0                         // accept
-       data8 0                         // getsockname          // 1195
-       data8 0                         // getpeername
-       data8 0                         // socketpair
-       data8 0                         // send
-       data8 0                         // sendto
-       data8 0                         // recv                 // 1200
-       data8 0                         // recvfrom
-       data8 0                         // shutdown
-       data8 0                         // setsockopt
-       data8 0                         // getsockopt
-       data8 0                         // sendmsg              // 1205
-       data8 0                         // recvmsg
-       data8 0                         // pivot_root
-       data8 0                         // mincore
-       data8 0                         // madvise
-       data8 0                         // newstat              // 1210
-       data8 0                         // newlstat
-       data8 0                         // newfstat
-       data8 0                         // clone2
-       data8 0                         // getdents64
-       data8 0                         // getunwind            // 1215
-       data8 0                         // readahead
-       data8 0                         // setxattr
-       data8 0                         // lsetxattr
-       data8 0                         // fsetxattr
-       data8 0                         // getxattr             // 1220
-       data8 0                         // lgetxattr
-       data8 0                         // fgetxattr
-       data8 0                         // listxattr
-       data8 0                         // llistxattr
-       data8 0                         // flistxattr           // 1225
-       data8 0                         // removexattr
-       data8 0                         // lremovexattr
-       data8 0                         // fremovexattr
-       data8 0                         // tkill
-       data8 0                         // futex                // 1230
-       data8 0                         // sched_setaffinity
-       data8 0                         // sched_getaffinity
-       data8 fsys_set_tid_address      // set_tid_address
-       data8 0                         // fadvise64_64
-       data8 0                         // tgkill               // 1235
-       data8 0                         // exit_group
-       data8 0                         // lookup_dcookie
-       data8 0                         // io_setup
-       data8 0                         // io_destroy
-       data8 0                         // io_getevents         // 1240
-       data8 0                         // io_submit
-       data8 0                         // io_cancel
-       data8 0                         // epoll_create
-       data8 0                         // epoll_ctl
-       data8 0                         // epoll_wait           // 1245
-       data8 0                         // restart_syscall
-       data8 0                         // semtimedop
-       data8 0                         // timer_create
-       data8 0                         // timer_settime
-       data8 0                         // timer_gettime        // 1250
-       data8 0                         // timer_getoverrun
-       data8 0                         // timer_delete
-       data8 0                         // clock_settime
-       data8 fsys_clock_gettime        // clock_gettime
-
-       // fill in zeros for the remaining entries
-       .zero:
-       .space fsyscall_table + 8*NR_syscalls - .zero, 0
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/gate.S b/linux-2.6-xen-sparse/arch/ia64/kernel/gate.S
deleted file mode 100644 (file)
index e242e36..0000000
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * This file contains the code that gets mapped at the upper end of each task's text
- * region.  For now, it contains the signal trampoline code only.
- *
- * Copyright (C) 1999-2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-
-#include <asm/asmmacro.h>
-#include <asm/errno.h>
-#include <asm/asm-offsets.h>
-#include <asm/sigcontext.h>
-#include <asm/system.h>
-#include <asm/unistd.h>
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-# include <asm/privop.h>
-#endif
-
-/*
- * We can't easily refer to symbols inside the kernel.  To avoid full runtime relocation,
- * complications with the linker (which likes to create PLT stubs for branches
- * to targets outside the shared object) and to avoid multi-phase kernel builds, we
- * simply create minimalistic "patch lists" in special ELF sections.
- */
-       .section ".data.patch.fsyscall_table", "a"
-       .previous
-#define LOAD_FSYSCALL_TABLE(reg)                       \
-[1:]   movl reg=0;                                     \
-       .xdata4 ".data.patch.fsyscall_table", 1b-.
-
-       .section ".data.patch.brl_fsys_bubble_down", "a"
-       .previous
-#define BRL_COND_FSYS_BUBBLE_DOWN(pr)                  \
-[1:](pr)brl.cond.sptk 0;                               \
-       .xdata4 ".data.patch.brl_fsys_bubble_down", 1b-.
-
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-       // The page in which hyperprivop lives must be pinned by ITR.
-       // However vDSO area isn't pinned. So issuing hyperprivop
-       // from vDSO page causes trouble that Kevin pointed out.
-       // After clearing vpsr.ic, the vcpu is pre-empted and the itlb
-       // is flushed. Then vcpu get cpu again, tlb miss fault occures.
-       // However it results in nested dtlb fault because vpsr.ic is off.
-       // To avoid such a situation, we jump into the kernel text area
-       // which is pinned, and then issue hyperprivop and return back
-       // to vDSO page.
-       // This is Dan Magenheimer's idea.
-
-       // Currently is_running_on_xen() is defined as running_on_xen.
-       // If is_running_on_xen() is a real function, we must update
-       // according to it.
-       .section ".data.patch.running_on_xen", "a"
-       .previous
-#define LOAD_RUNNING_ON_XEN(reg)                       \
-[1:]   movl reg=0;                                     \
-       .xdata4 ".data.patch.running_on_xen", 1b-.
-
-       .section ".data.patch.brl_xen_ssm_i_0", "a"
-       .previous
-#define BRL_COND_XEN_SSM_I_0(pr)                       \
-[1:](pr)brl.cond.sptk 0;                               \
-       .xdata4 ".data.patch.brl_xen_ssm_i_0", 1b-.
-
-       .section ".data.patch.brl_xen_ssm_i_1", "a"
-       .previous
-#define BRL_COND_XEN_SSM_I_1(pr)                       \
-[1:](pr)brl.cond.sptk 0;                               \
-       .xdata4 ".data.patch.brl_xen_ssm_i_1", 1b-.
-#endif
-
-GLOBAL_ENTRY(__kernel_syscall_via_break)
-       .prologue
-       .altrp b6
-       .body
-       /*
-        * Note: for (fast) syscall restart to work, the break instruction must be
-        *       the first one in the bundle addressed by syscall_via_break.
-        */
-{ .mib
-       break 0x100000
-       nop.i 0
-       br.ret.sptk.many b6
-}
-END(__kernel_syscall_via_break)
-
-/*
- * On entry:
- *     r11 = saved ar.pfs
- *     r15 = system call #
- *     b0  = saved return address
- *     b6  = return address
- * On exit:
- *     r11 = saved ar.pfs
- *     r15 = system call #
- *     b0  = saved return address
- *     all other "scratch" registers:  undefined
- *     all "preserved" registers:      same as on entry
- */
-
-GLOBAL_ENTRY(__kernel_syscall_via_epc)
-       .prologue
-       .altrp b6
-       .body
-{
-       /*
-        * Note: the kernel cannot assume that the first two instructions in this
-        * bundle get executed.  The remaining code must be safe even if
-        * they do not get executed.
-        */
-       adds r17=-1024,r15                      // A
-       mov r10=0                               // A    default to successful syscall execution
-       epc                                     // B    causes split-issue
-}
-       ;;
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-       // r20 = 1
-       // r22 = &vcpu->vcpu_info->evtchn_upcall_mask
-       // r23 = &vpsr.ic
-       // r24 = &vcpu->vcpu_info->evtchn_upcall_pending
-       // r25 = tmp
-       // r28 = &running_on_xen
-       // r30 = running_on_xen
-       // r31 = tmp
-       // p11 = tmp
-       // p12 = running_on_xen
-       // p13 = !running_on_xen
-       // p14 = tmp
-       // p15 = tmp
-#define isXen  p12
-#define isRaw  p13
-       LOAD_RUNNING_ON_XEN(r28)
-       movl r22=XSI_PSR_I_ADDR
-       ;;
-       ld8 r22=[r22]
-       ;;
-       movl r23=XSI_PSR_IC
-       adds r24=-1,r22
-       mov r20=1
-       ;;
-       ld4 r30=[r28]
-       ;;
-       cmp.ne isXen,isRaw=r0,r30
-       ;;
-(isRaw)        rsm psr.be | psr.i
-(isXen)        st1 [r22]=r20
-(isXen)        rum psr.be
-       ;;
-#else
-       rsm psr.be | psr.i                      // M2 (5 cyc to srlz.d)
-#endif
-       LOAD_FSYSCALL_TABLE(r14)                // X
-       ;;
-       mov r16=IA64_KR(CURRENT)                // M2 (12 cyc)
-       shladd r18=r17,3,r14                    // A
-       mov r19=NR_syscalls-1                   // A
-       ;;
-       lfetch [r18]                            // M0|1
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-(isRaw)        mov r29=psr
-(isXen)        XEN_HYPER_GET_PSR
-       ;;
-(isXen)        mov r29=r8
-#else
-       mov r29=psr                             // M2 (12 cyc)
-#endif
-       // If r17 is a NaT, p6 will be zero
-       cmp.geu p6,p7=r19,r17                   // A    (sysnr > 0 && sysnr < 1024+NR_syscalls)?
-       ;;
-       mov r21=ar.fpsr                         // M2 (12 cyc)
-       tnat.nz p10,p9=r15                      // I0
-       mov.i r26=ar.pfs                        // I0 (would stall anyhow due to srlz.d...)
-       ;;
-       srlz.d                                  // M0 (forces split-issue) ensure PSR.BE==0
-(p6)   ld8 r18=[r18]                           // M0|1
-       nop.i 0
-       ;;
-       nop.m 0
-(p6)   tbit.z.unc p8,p0=r18,0                  // I0 (dual-issues with "mov b7=r18"!)
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-       ;;
-       // p14 = running_on_xen && p8
-       // p15 = !running_on_xen && p8
-(p8)   cmp.ne.unc p14,p15=r0,r30
-       ;;
-(p15)  ssm psr.i
-       BRL_COND_XEN_SSM_I_0(p14)
-       .global .vdso_ssm_i_0_ret
-.vdso_ssm_i_0_ret:
-#else
-       nop.i 0
-       ;;
-(p8)   ssm psr.i
-#endif
-(p6)   mov b7=r18                              // I0
-(p8)   br.dptk.many b7                         // B
-
-       mov r27=ar.rsc                          // M2 (12 cyc)
-/*
- * brl.cond doesn't work as intended because the linker would convert this branch
- * into a branch to a PLT.  Perhaps there will be a way to avoid this with some
- * future version of the linker.  In the meantime, we just use an indirect branch
- * instead.
- */
-#ifdef CONFIG_ITANIUM
-(p6)   add r14=-8,r14                          // r14 <- addr of fsys_bubble_down entry
-       ;;
-(p6)   ld8 r14=[r14]                           // r14 <- fsys_bubble_down
-       ;;
-(p6)   mov b7=r14
-(p6)   br.sptk.many b7
-#else
-       BRL_COND_FSYS_BUBBLE_DOWN(p6)
-#endif
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-(isRaw)        ssm psr.i
-       BRL_COND_XEN_SSM_I_1(isXen)
-       .global .vdso_ssm_i_1_ret
-.vdso_ssm_i_1_ret:
-#else
-       ssm psr.i
-#endif
-       mov r10=-1
-(p10)  mov r8=EINVAL
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-       dv_serialize_data // shut up gas warning.
-                         // we know xen_hyper_ssm_i_0 or xen_hyper_ssm_i_1
-                         // doesn't change p9 and p10
-#endif
-(p9)   mov r8=ENOSYS
-       FSYS_RETURN
-END(__kernel_syscall_via_epc)
-
-#      define ARG0_OFF         (16 + IA64_SIGFRAME_ARG0_OFFSET)
-#      define ARG1_OFF         (16 + IA64_SIGFRAME_ARG1_OFFSET)
-#      define ARG2_OFF         (16 + IA64_SIGFRAME_ARG2_OFFSET)
-#      define SIGHANDLER_OFF   (16 + IA64_SIGFRAME_HANDLER_OFFSET)
-#      define SIGCONTEXT_OFF   (16 + IA64_SIGFRAME_SIGCONTEXT_OFFSET)
-
-#      define FLAGS_OFF        IA64_SIGCONTEXT_FLAGS_OFFSET
-#      define CFM_OFF          IA64_SIGCONTEXT_CFM_OFFSET
-#      define FR6_OFF          IA64_SIGCONTEXT_FR6_OFFSET
-#      define BSP_OFF          IA64_SIGCONTEXT_AR_BSP_OFFSET
-#      define RNAT_OFF         IA64_SIGCONTEXT_AR_RNAT_OFFSET
-#      define UNAT_OFF         IA64_SIGCONTEXT_AR_UNAT_OFFSET
-#      define FPSR_OFF         IA64_SIGCONTEXT_AR_FPSR_OFFSET
-#      define PR_OFF           IA64_SIGCONTEXT_PR_OFFSET
-#      define RP_OFF           IA64_SIGCONTEXT_IP_OFFSET
-#      define SP_OFF           IA64_SIGCONTEXT_R12_OFFSET
-#      define RBS_BASE_OFF     IA64_SIGCONTEXT_RBS_BASE_OFFSET
-#      define LOADRS_OFF       IA64_SIGCONTEXT_LOADRS_OFFSET
-#      define base0            r2
-#      define base1            r3
-       /*
-        * When we get here, the memory stack looks like this:
-        *
-        *   +===============================+
-                *   |                               |
-                *   //     struct sigframe          //
-                *   |                               |
-        *   +-------------------------------+ <-- sp+16
-        *   |      16 byte of scratch       |
-        *   |            space              |
-        *   +-------------------------------+ <-- sp
-        *
-        * The register stack looks _exactly_ the way it looked at the time the signal
-        * occurred.  In other words, we're treading on a potential mine-field: each
-        * incoming general register may be a NaT value (including sp, in which case the
-        * process ends up dying with a SIGSEGV).
-        *
-        * The first thing need to do is a cover to get the registers onto the backing
-        * store.  Once that is done, we invoke the signal handler which may modify some
-        * of the machine state.  After returning from the signal handler, we return
-        * control to the previous context by executing a sigreturn system call.  A signal
-        * handler may call the rt_sigreturn() function to directly return to a given
-        * sigcontext.  However, the user-level sigreturn() needs to do much more than
-        * calling the rt_sigreturn() system call as it needs to unwind the stack to
-        * restore preserved registers that may have been saved on the signal handler's
-        * call stack.
-        */
-
-#define SIGTRAMP_SAVES                                                                         \
-       .unwabi 3, 's';         /* mark this as a sigtramp handler (saves scratch regs) */      \
-       .unwabi @svr4, 's'; /* backwards compatibility with old unwinders (remove in v2.7) */   \
-       .savesp ar.unat, UNAT_OFF+SIGCONTEXT_OFF;                                               \
-       .savesp ar.fpsr, FPSR_OFF+SIGCONTEXT_OFF;                                               \
-       .savesp pr, PR_OFF+SIGCONTEXT_OFF;                                                      \
-       .savesp rp, RP_OFF+SIGCONTEXT_OFF;                                                      \
-       .savesp ar.pfs, CFM_OFF+SIGCONTEXT_OFF;                                                 \
-       .vframesp SP_OFF+SIGCONTEXT_OFF
-
-GLOBAL_ENTRY(__kernel_sigtramp)
-       // describe the state that is active when we get here:
-       .prologue
-       SIGTRAMP_SAVES
-       .body
-
-       .label_state 1
-
-       adds base0=SIGHANDLER_OFF,sp
-       adds base1=RBS_BASE_OFF+SIGCONTEXT_OFF,sp
-       br.call.sptk.many rp=1f
-1:
-       ld8 r17=[base0],(ARG0_OFF-SIGHANDLER_OFF)       // get pointer to signal handler's plabel
-       ld8 r15=[base1]                                 // get address of new RBS base (or NULL)
-       cover                           // push args in interrupted frame onto backing store
-       ;;
-       cmp.ne p1,p0=r15,r0             // do we need to switch rbs? (note: pr is saved by kernel)
-       mov.m r9=ar.bsp                 // fetch ar.bsp
-       .spillsp.p p1, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-(p1)   br.cond.spnt setup_rbs          // yup -> (clobbers p8, r14-r16, and r18-r20)
-back_from_setup_rbs:
-       alloc r8=ar.pfs,0,0,3,0
-       ld8 out0=[base0],16             // load arg0 (signum)
-       adds base1=(ARG1_OFF-(RBS_BASE_OFF+SIGCONTEXT_OFF)),base1
-       ;;
-       ld8 out1=[base1]                // load arg1 (siginfop)
-       ld8 r10=[r17],8                 // get signal handler entry point
-       ;;
-       ld8 out2=[base0]                // load arg2 (sigcontextp)
-       ld8 gp=[r17]                    // get signal handler's global pointer
-       adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
-       ;;
-       .spillsp ar.bsp, BSP_OFF+SIGCONTEXT_OFF
-       st8 [base0]=r9                  // save sc_ar_bsp
-       adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
-       adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp
-       ;;
-       stf.spill [base0]=f6,32
-       stf.spill [base1]=f7,32
-       ;;
-       stf.spill [base0]=f8,32
-       stf.spill [base1]=f9,32
-       mov b6=r10
-       ;;
-       stf.spill [base0]=f10,32
-       stf.spill [base1]=f11,32
-       ;;
-       stf.spill [base0]=f12,32
-       stf.spill [base1]=f13,32
-       ;;
-       stf.spill [base0]=f14,32
-       stf.spill [base1]=f15,32
-       br.call.sptk.many rp=b6                 // call the signal handler
-.ret0: adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
-       ;;
-       ld8 r15=[base0]                         // fetch sc_ar_bsp
-       mov r14=ar.bsp
-       ;;
-       cmp.ne p1,p0=r14,r15                    // do we need to restore the rbs?
-(p1)   br.cond.spnt restore_rbs                // yup -> (clobbers r14-r18, f6 & f7)
-       ;;
-back_from_restore_rbs:
-       adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
-       adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp
-       ;;
-       ldf.fill f6=[base0],32
-       ldf.fill f7=[base1],32
-       ;;
-       ldf.fill f8=[base0],32
-       ldf.fill f9=[base1],32
-       ;;
-       ldf.fill f10=[base0],32
-       ldf.fill f11=[base1],32
-       ;;
-       ldf.fill f12=[base0],32
-       ldf.fill f13=[base1],32
-       ;;
-       ldf.fill f14=[base0],32
-       ldf.fill f15=[base1],32
-       mov r15=__NR_rt_sigreturn
-       .restore sp                             // pop .prologue
-       break __BREAK_SYSCALL
-
-       .prologue
-       SIGTRAMP_SAVES
-setup_rbs:
-       mov ar.rsc=0                            // put RSE into enforced lazy mode
-       ;;
-       .save ar.rnat, r19
-       mov r19=ar.rnat                         // save RNaT before switching backing store area
-       adds r14=(RNAT_OFF+SIGCONTEXT_OFF),sp
-
-       mov r18=ar.bspstore
-       mov ar.bspstore=r15                     // switch over to new register backing store area
-       ;;
-
-       .spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-       st8 [r14]=r19                           // save sc_ar_rnat
-       .body
-       mov.m r16=ar.bsp                        // sc_loadrs <- (new bsp - new bspstore) << 16
-       adds r14=(LOADRS_OFF+SIGCONTEXT_OFF),sp
-       ;;
-       invala
-       sub r15=r16,r15
-       extr.u r20=r18,3,6
-       ;;
-       mov ar.rsc=0xf                          // set RSE into eager mode, pl 3
-       cmp.eq p8,p0=63,r20
-       shl r15=r15,16
-       ;;
-       st8 [r14]=r15                           // save sc_loadrs
-(p8)   st8 [r18]=r19           // if bspstore points at RNaT slot, store RNaT there now
-       .restore sp                             // pop .prologue
-       br.cond.sptk back_from_setup_rbs
-
-       .prologue
-       SIGTRAMP_SAVES
-       .spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-       .body
-restore_rbs:
-       // On input:
-       //      r14 = bsp1 (bsp at the time of return from signal handler)
-       //      r15 = bsp0 (bsp at the time the signal occurred)
-       //
-       // Here, we need to calculate bspstore0, the value that ar.bspstore needs
-       // to be set to, based on bsp0 and the size of the dirty partition on
-       // the alternate stack (sc_loadrs >> 16).  This can be done with the
-       // following algorithm:
-       //
-       //  bspstore0 = rse_skip_regs(bsp0, -rse_num_regs(bsp1 - (loadrs >> 19), bsp1));
-       //
-       // This is what the code below does.
-       //
-       alloc r2=ar.pfs,0,0,0,0                 // alloc null frame
-       adds r16=(LOADRS_OFF+SIGCONTEXT_OFF),sp
-       adds r18=(RNAT_OFF+SIGCONTEXT_OFF),sp
-       ;;
-       ld8 r17=[r16]
-       ld8 r16=[r18]                   // get new rnat
-       extr.u r18=r15,3,6      // r18 <- rse_slot_num(bsp0)
-       ;;
-       mov ar.rsc=r17                  // put RSE into enforced lazy mode
-       shr.u r17=r17,16
-       ;;
-       sub r14=r14,r17         // r14 (bspstore1) <- bsp1 - (sc_loadrs >> 16)
-       shr.u r17=r17,3         // r17 <- (sc_loadrs >> 19)
-       ;;
-       loadrs                  // restore dirty partition
-       extr.u r14=r14,3,6      // r14 <- rse_slot_num(bspstore1)
-       ;;
-       add r14=r14,r17         // r14 <- rse_slot_num(bspstore1) + (sc_loadrs >> 19)
-       ;;
-       shr.u r14=r14,6         // r14 <- (rse_slot_num(bspstore1) + (sc_loadrs >> 19))/0x40
-       ;;
-       sub r14=r14,r17         // r14 <- -rse_num_regs(bspstore1, bsp1)
-       movl r17=0x8208208208208209
-       ;;
-       add r18=r18,r14         // r18 (delta) <- rse_slot_num(bsp0) - rse_num_regs(bspstore1,bsp1)
-       setf.sig f7=r17
-       cmp.lt p7,p0=r14,r0     // p7 <- (r14 < 0)?
-       ;;
-(p7)   adds r18=-62,r18        // delta -= 62
-       ;;
-       setf.sig f6=r18
-       ;;
-       xmpy.h f6=f6,f7
-       ;;
-       getf.sig r17=f6
-       ;;
-       add r17=r17,r18
-       shr r18=r18,63
-       ;;
-       shr r17=r17,5
-       ;;
-       sub r17=r17,r18         // r17 = delta/63
-       ;;
-       add r17=r14,r17         // r17 <- delta/63 - rse_num_regs(bspstore1, bsp1)
-       ;;
-       shladd r15=r17,3,r15    // r15 <- bsp0 + 8*(delta/63 - rse_num_regs(bspstore1, bsp1))
-       ;;
-       mov ar.bspstore=r15                     // switch back to old register backing store area
-       ;;
-       mov ar.rnat=r16                         // restore RNaT
-       mov ar.rsc=0xf                          // (will be restored later on from sc_ar_rsc)
-       // invala not necessary as that will happen when returning to user-mode
-       br.cond.sptk back_from_restore_rbs
-END(__kernel_sigtramp)
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S b/linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S
deleted file mode 100644 (file)
index 58582cc..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Linker script for gate DSO.  The gate pages are an ELF shared object prelinked to its
- * virtual address, with only one read-only segment and one execute-only segment (both fit
- * in one page).  This script controls its layout.
- */
-
-
-#include <asm/system.h>
-
-SECTIONS
-{
-  . = GATE_ADDR + SIZEOF_HEADERS;
-
-  .hash                                : { *(.hash) }                          :readable
-  .gnu.hash                    : { *(.gnu.hash) }
-  .dynsym                      : { *(.dynsym) }
-  .dynstr                      : { *(.dynstr) }
-  .gnu.version                 : { *(.gnu.version) }
-  .gnu.version_d               : { *(.gnu.version_d) }
-  .gnu.version_r               : { *(.gnu.version_r) }
-  .dynamic                     : { *(.dynamic) }                       :readable :dynamic
-
-  /*
-   * This linker script is used both with -r and with -shared.  For the layouts to match,
-   * we need to skip more than enough space for the dynamic symbol table et al.  If this
-   * amount is insufficient, ld -shared will barf.  Just increase it here.
-   */
-  . = GATE_ADDR + 0x500;
-
-  .data.patch                  : {
-                                   __start_gate_mckinley_e9_patchlist = .;
-                                   *(.data.patch.mckinley_e9)
-                                   __end_gate_mckinley_e9_patchlist = .;
-
-                                   __start_gate_vtop_patchlist = .;
-                                   *(.data.patch.vtop)
-                                   __end_gate_vtop_patchlist = .;
-
-                                   __start_gate_fsyscall_patchlist = .;
-                                   *(.data.patch.fsyscall_table)
-                                   __end_gate_fsyscall_patchlist = .;
-
-                                   __start_gate_brl_fsys_bubble_down_patchlist = .;
-                                   *(.data.patch.brl_fsys_bubble_down)
-                                   __end_gate_brl_fsys_bubble_down_patchlist = .;
-
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-                                   __start_gate_running_on_xen_patchlist = .;
-                                   *(.data.patch.running_on_xen)
-                                   __end_gate_running_on_xen_patchlist = .;
-
-                                   __start_gate_brl_xen_ssm_i_0_patchlist = .;
-                                   *(.data.patch.brl_xen_ssm_i_0)
-                                   __end_gate_brl_xen_ssm_i_0_patchlist = .;
-
-                                   __start_gate_brl_xen_ssm_i_1_patchlist = .;
-                                   *(.data.patch.brl_xen_ssm_i_1)
-                                   __end_gate_brl_xen_ssm_i_1_patchlist = .;
-#endif
-  }                                                                    :readable
-  .IA_64.unwind_info           : { *(.IA_64.unwind_info*) }
-  .IA_64.unwind                        : { *(.IA_64.unwind*) }                 :readable :unwind
-#ifdef HAVE_BUGGY_SEGREL
-  .text (GATE_ADDR + PAGE_SIZE)        : { *(.text) *(.text.*) }               :readable
-#else
-  . = ALIGN (PERCPU_PAGE_SIZE) + (. & (PERCPU_PAGE_SIZE - 1));
-  .text                                : { *(.text) *(.text.*) }               :epc
-#endif
-
-  /DISCARD/                    : {
-       *(.got.plt) *(.got)
-       *(.data .data.* .gnu.linkonce.d.*)
-       *(.dynbss)
-       *(.bss .bss.* .gnu.linkonce.b.*)
-       *(__ex_table)
-       *(__mca_table)
-  }
-}
-
-/*
- * We must supply the ELF program headers explicitly to get just one
- * PT_LOAD segment, and set the flags explicitly to make segments read-only.
- */
-PHDRS
-{
-  readable  PT_LOAD    FILEHDR PHDRS   FLAGS(4);       /* PF_R */
-#ifndef HAVE_BUGGY_SEGREL
-  epc      PT_LOAD     FILEHDR PHDRS   FLAGS(1);       /* PF_X */
-#endif
-  dynamic   PT_DYNAMIC                 FLAGS(4);       /* PF_R */
-  unwind    0x70000001; /* PT_IA_64_UNWIND, but ld doesn't match the name */
-}
-
-/*
- * This controls what symbols we export from the DSO.
- */
-VERSION
-{
-  LINUX_2.5 {
-    global:
-       __kernel_syscall_via_break;
-       __kernel_syscall_via_epc;
-       __kernel_sigtramp;
-
-    local: *;
-  };
-}
-
-/* The ELF entry point can be used to set the AT_SYSINFO value.  */
-ENTRY(__kernel_syscall_via_epc)
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/head.S b/linux-2.6-xen-sparse/arch/ia64/kernel/head.S
deleted file mode 100644 (file)
index dded6f2..0000000
+++ /dev/null
@@ -1,1229 +0,0 @@
-/*
- * Here is where the ball gets rolling as far as the kernel is concerned.
- * When control is transferred to _start, the bootload has already
- * loaded us to the correct address.  All that's left to do here is
- * to set up the kernel's global pointer and jump to the kernel
- * entry point.
- *
- * Copyright (C) 1998-2001, 2003, 2005 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999 Intel Corp.
- * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com>
- * Copyright (C) 1999 Don Dugger <Don.Dugger@intel.com>
- * Copyright (C) 2002 Fenghua Yu <fenghua.yu@intel.com>
- *   -Optimize __ia64_save_fpu() and __ia64_load_fpu() for Itanium 2.
- * Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
- *   Support for CPU Hotplug
- */
-
-
-#include <asm/asmmacro.h>
-#include <asm/fpu.h>
-#include <asm/kregs.h>
-#include <asm/mmu_context.h>
-#include <asm/asm-offsets.h>
-#include <asm/pal.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-#include <asm/mca_asm.h>
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define SAL_PSR_BITS_TO_SET                            \
-       (IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_MFH | IA64_PSR_MFL)
-
-#define SAVE_FROM_REG(src, ptr, dest)  \
-       mov dest=src;;                                          \
-       st8 [ptr]=dest,0x08
-
-#define RESTORE_REG(reg, ptr, _tmp)            \
-       ld8 _tmp=[ptr],0x08;;                           \
-       mov reg=_tmp
-
-#define SAVE_BREAK_REGS(ptr, _idx, _breg, _dest)\
-       mov ar.lc=IA64_NUM_DBG_REGS-1;;                         \
-       mov _idx=0;;                                                            \
-1:                                                                                             \
-       SAVE_FROM_REG(_breg[_idx], ptr, _dest);;        \
-       add _idx=1,_idx;;                                                       \
-       br.cloop.sptk.many 1b
-
-#define RESTORE_BREAK_REGS(ptr, _idx, _breg, _tmp, _lbl)\
-       mov ar.lc=IA64_NUM_DBG_REGS-1;;                 \
-       mov _idx=0;;                                                    \
-_lbl:  RESTORE_REG(_breg[_idx], ptr, _tmp);;   \
-       add _idx=1, _idx;;                                              \
-       br.cloop.sptk.many _lbl
-
-#define SAVE_ONE_RR(num, _reg, _tmp) \
-       movl _tmp=(num<<61);;   \
-       mov _reg=rr[_tmp]
-
-#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \
-       SAVE_ONE_RR(0,_r0, _tmp);; \
-       SAVE_ONE_RR(1,_r1, _tmp);; \
-       SAVE_ONE_RR(2,_r2, _tmp);; \
-       SAVE_ONE_RR(3,_r3, _tmp);; \
-       SAVE_ONE_RR(4,_r4, _tmp);; \
-       SAVE_ONE_RR(5,_r5, _tmp);; \
-       SAVE_ONE_RR(6,_r6, _tmp);; \
-       SAVE_ONE_RR(7,_r7, _tmp);;
-
-#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \
-       st8 [ptr]=_r0, 8;; \
-       st8 [ptr]=_r1, 8;; \
-       st8 [ptr]=_r2, 8;; \
-       st8 [ptr]=_r3, 8;; \
-       st8 [ptr]=_r4, 8;; \
-       st8 [ptr]=_r5, 8;; \
-       st8 [ptr]=_r6, 8;; \
-       st8 [ptr]=_r7, 8;;
-
-#define RESTORE_REGION_REGS(ptr, _idx1, _idx2, _tmp) \
-       mov             ar.lc=0x08-1;;                                          \
-       movl    _idx1=0x00;;                                            \
-RestRR:                                                                                        \
-       dep.z   _idx2=_idx1,61,3;;                                      \
-       ld8             _tmp=[ptr],8;;                                          \
-       mov             rr[_idx2]=_tmp;;                                        \
-       srlz.d;;                                                                        \
-       add             _idx1=1,_idx1;;                                         \
-       br.cloop.sptk.few       RestRR
-
-#define SET_AREA_FOR_BOOTING_CPU(reg1, reg2) \
-       movl reg1=sal_state_for_booting_cpu;;   \
-       ld8 reg2=[reg1];;
-
-/*
- * Adjust region registers saved before starting to save
- * break regs and rest of the states that need to be preserved.
- */
-#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(_reg1,_reg2,_pred)  \
-       SAVE_FROM_REG(b0,_reg1,_reg2);;                                         \
-       SAVE_FROM_REG(b1,_reg1,_reg2);;                                         \
-       SAVE_FROM_REG(b2,_reg1,_reg2);;                                         \
-       SAVE_FROM_REG(b3,_reg1,_reg2);;                                         \
-       SAVE_FROM_REG(b4,_reg1,_reg2);;                                         \
-       SAVE_FROM_REG(b5,_reg1,_reg2);;                                         \
-       st8 [_reg1]=r1,0x08;;                                                           \
-       st8 [_reg1]=r12,0x08;;                                                          \
-       st8 [_reg1]=r13,0x08;;                                                          \
-       SAVE_FROM_REG(ar.fpsr,_reg1,_reg2);;                            \
-       SAVE_FROM_REG(ar.pfs,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(ar.rnat,_reg1,_reg2);;                            \
-       SAVE_FROM_REG(ar.unat,_reg1,_reg2);;                            \
-       SAVE_FROM_REG(ar.bspstore,_reg1,_reg2);;                        \
-       SAVE_FROM_REG(cr.dcr,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(cr.iva,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(cr.pta,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(cr.itv,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(cr.pmv,_reg1,_reg2);;                                     \
-       SAVE_FROM_REG(cr.cmcv,_reg1,_reg2);;                            \
-       SAVE_FROM_REG(cr.lrr0,_reg1,_reg2);;                            \
-       SAVE_FROM_REG(cr.lrr1,_reg1,_reg2);;                            \
-       st8 [_reg1]=r4,0x08;;                                                           \
-       st8 [_reg1]=r5,0x08;;                                                           \
-       st8 [_reg1]=r6,0x08;;                                                           \
-       st8 [_reg1]=r7,0x08;;                                                           \
-       st8 [_reg1]=_pred,0x08;;                                                        \
-       SAVE_FROM_REG(ar.lc, _reg1, _reg2);;                            \
-       stf.spill.nta [_reg1]=f2,16;;                                           \
-       stf.spill.nta [_reg1]=f3,16;;                                           \
-       stf.spill.nta [_reg1]=f4,16;;                                           \
-       stf.spill.nta [_reg1]=f5,16;;                                           \
-       stf.spill.nta [_reg1]=f16,16;;                                          \
-       stf.spill.nta [_reg1]=f17,16;;                                          \
-       stf.spill.nta [_reg1]=f18,16;;                                          \
-       stf.spill.nta [_reg1]=f19,16;;                                          \
-       stf.spill.nta [_reg1]=f20,16;;                                          \
-       stf.spill.nta [_reg1]=f21,16;;                                          \
-       stf.spill.nta [_reg1]=f22,16;;                                          \
-       stf.spill.nta [_reg1]=f23,16;;                                          \
-       stf.spill.nta [_reg1]=f24,16;;                                          \
-       stf.spill.nta [_reg1]=f25,16;;                                          \
-       stf.spill.nta [_reg1]=f26,16;;                                          \
-       stf.spill.nta [_reg1]=f27,16;;                                          \
-       stf.spill.nta [_reg1]=f28,16;;                                          \
-       stf.spill.nta [_reg1]=f29,16;;                                          \
-       stf.spill.nta [_reg1]=f30,16;;                                          \
-       stf.spill.nta [_reg1]=f31,16;;
-
-#else
-#define SET_AREA_FOR_BOOTING_CPU(a1, a2)
-#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(a1,a2, a3)
-#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7)
-#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7)
-#endif
-
-#define SET_ONE_RR(num, pgsize, _tmp1, _tmp2, vhpt) \
-       movl _tmp1=(num << 61);;        \
-       mov _tmp2=((ia64_rid(IA64_REGION_ID_KERNEL, (num<<61)) << 8) | (pgsize << 2) | vhpt);; \
-       mov rr[_tmp1]=_tmp2
-
-       .section __special_page_section,"ax"
-
-       .global empty_zero_page
-empty_zero_page:
-       .skip PAGE_SIZE
-
-       .global swapper_pg_dir
-swapper_pg_dir:
-       .skip PAGE_SIZE
-
-       .rodata
-halt_msg:
-       stringz "Halting kernel\n"
-
-       .text
-
-       .global start_ap
-
-       /*
-        * Start the kernel.  When the bootloader passes control to _start(), r28
-        * points to the address of the boot parameter area.  Execution reaches
-        * here in physical mode.
-        */
-GLOBAL_ENTRY(_start)
-start_ap:
-       .prologue
-       .save rp, r0            // terminate unwind chain with a NULL rp
-       .body
-
-       rsm psr.i | psr.ic
-       ;;
-       srlz.i
-       ;;
- {
-       flushrs                         // must be first insn in group
-       srlz.i
- }
-       ;;
-       /*
-        * Save the region registers, predicate before they get clobbered
-        */
-       SAVE_REGION_REGS(r2, r8,r9,r10,r11,r12,r13,r14,r15);
-       mov r25=pr;;
-
-       /*
-        * Initialize kernel region registers:
-        *      rr[0]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[1]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[2]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[3]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[4]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[5]: VHPT enabled, page size = PAGE_SHIFT
-        *      rr[6]: VHPT disabled, page size = IA64_GRANULE_SHIFT
-        *      rr[7]: VHPT disabled, page size = IA64_GRANULE_SHIFT
-        * We initialize all of them to prevent inadvertently assuming
-        * something about the state of address translation early in boot.
-        */
-       SET_ONE_RR(0, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(1, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(2, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(3, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(4, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(5, PAGE_SHIFT, r2, r16, 1);;
-       SET_ONE_RR(6, IA64_GRANULE_SHIFT, r2, r16, 0);;
-       SET_ONE_RR(7, IA64_GRANULE_SHIFT, r2, r16, 0);;
-       /*
-        * Now pin mappings into the TLB for kernel text and data
-        */
-       mov r18=KERNEL_TR_PAGE_SHIFT<<2
-       movl r17=KERNEL_START
-       ;;
-       mov cr.itir=r18
-       mov cr.ifa=r17
-       mov r16=IA64_TR_KERNEL
-       mov r3=ip
-       movl r18=PAGE_KERNEL
-       ;;
-       dep r2=0,r3,0,KERNEL_TR_PAGE_SHIFT
-       ;;
-       or r18=r2,r18
-       ;;
-       srlz.i
-       ;;
-       itr.i itr[r16]=r18
-       ;;
-       itr.d dtr[r16]=r18
-       ;;
-       srlz.i
-
-       /*
-        * Switch into virtual mode:
-        */
-       movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
-                 |IA64_PSR_DI)
-       ;;
-       mov cr.ipsr=r16
-       movl r17=1f
-       ;;
-       mov cr.iip=r17
-       mov cr.ifs=r0
-       ;;
-       rfi
-       ;;
-1:     // now we are in virtual mode
-
-       SET_AREA_FOR_BOOTING_CPU(r2, r16);
-
-       STORE_REGION_REGS(r16, r8,r9,r10,r11,r12,r13,r14,r15);
-       SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(r16,r17,r25)
-       ;;
-
-       // set IVT entry point---can't access I/O ports without it
-       movl r3=ia64_ivt
-       ;;
-       mov cr.iva=r3
-       movl r2=FPSR_DEFAULT
-       ;;
-       srlz.i
-       movl gp=__gp
-
-       mov ar.fpsr=r2
-       ;;
-
-#define isAP   p2      // are we an Application Processor?
-#define isBP   p3      // are we the Bootstrap Processor?
-
-#ifdef CONFIG_SMP
-       /*
-        * Find the init_task for the currently booting CPU.  At poweron, and in
-        * UP mode, task_for_booting_cpu is NULL.
-        */
-       movl r3=task_for_booting_cpu
-       ;;
-       ld8 r3=[r3]
-       movl r2=init_task
-       ;;
-       cmp.eq isBP,isAP=r3,r0
-       ;;
-(isAP) mov r2=r3
-#else
-       movl r2=init_task
-       cmp.eq isBP,isAP=r0,r0
-#endif
-       ;;
-       tpa r3=r2               // r3 == phys addr of task struct
-       mov r16=-1
-(isBP) br.cond.dpnt .load_current // BP stack is on region 5 --- no need to map it
-
-       // load mapping for stack (virtaddr in r2, physaddr in r3)
-       rsm psr.ic
-       movl r17=PAGE_KERNEL
-       ;;
-       srlz.d
-       dep r18=0,r3,0,12
-       ;;
-       or r18=r17,r18
-       dep r2=-1,r3,61,3       // IMVA of task
-       ;;
-       mov r17=rr[r2]
-       shr.u r16=r3,IA64_GRANULE_SHIFT
-       ;;
-       dep r17=0,r17,8,24
-       ;;
-       mov cr.itir=r17
-       mov cr.ifa=r2
-
-       mov r19=IA64_TR_CURRENT_STACK
-       ;;
-       itr.d dtr[r19]=r18
-       ;;
-       ssm psr.ic
-       srlz.d
-       ;;
-
-.load_current:
-       // load the "current" pointer (r13) and ar.k6 with the current task
-       mov IA64_KR(CURRENT)=r2         // virtual address
-       mov IA64_KR(CURRENT_STACK)=r16
-       mov r13=r2
-       /*
-        * Reserve space at the top of the stack for "struct pt_regs".  Kernel
-        * threads don't store interesting values in that structure, but the space
-        * still needs to be there because time-critical stuff such as the context
-        * switching can be implemented more efficiently (for example, __switch_to()
-        * always sets the psr.dfh bit of the task it is switching to).
-        */
-
-       addl r12=IA64_STK_OFFSET-IA64_PT_REGS_SIZE-16,r2
-       addl r2=IA64_RBS_OFFSET,r2      // initialize the RSE
-       mov ar.rsc=0            // place RSE in enforced lazy mode
-       ;;
-       loadrs                  // clear the dirty partition
-       mov IA64_KR(PER_CPU_DATA)=r0    // clear physical per-CPU base
-       ;;
-       mov ar.bspstore=r2      // establish the new RSE stack
-       ;;
-       mov ar.rsc=0x3          // place RSE in eager mode
-
-(isBP) dep r28=-1,r28,61,3     // make address virtual
-(isBP) movl r2=ia64_boot_param
-       ;;
-(isBP) st8 [r2]=r28            // save the address of the boot param area passed by the bootloader
-
-#ifdef CONFIG_XEN
-       //  Note: isBP is used by the subprogram.
-       br.call.sptk.many rp=early_xen_setup
-       ;;
-#endif
-
-#ifdef CONFIG_SMP
-(isAP) br.call.sptk.many rp=start_secondary
-.ret0:
-(isAP) br.cond.sptk self
-#endif
-
-       // This is executed by the bootstrap processor (bsp) only:
-
-#ifdef CONFIG_IA64_FW_EMU
-       // initialize PAL & SAL emulator:
-       br.call.sptk.many rp=sys_fw_init
-.ret1:
-#endif
-       br.call.sptk.many rp=start_kernel
-.ret2: addl r3=@ltoff(halt_msg),gp
-       ;;
-       alloc r2=ar.pfs,8,0,2,0
-       ;;
-       ld8 out0=[r3]
-       br.call.sptk.many b0=console_print
-
-self:  hint @pause
-       br.sptk.many self               // endless loop
-END(_start)
-
-GLOBAL_ENTRY(ia64_save_debug_regs)
-       alloc r16=ar.pfs,1,0,0,0
-       mov r20=ar.lc                   // preserve ar.lc
-       mov ar.lc=IA64_NUM_DBG_REGS-1
-       mov r18=0
-       add r19=IA64_NUM_DBG_REGS*8,in0
-       ;;
-1:     mov r16=dbr[r18]
-#ifdef CONFIG_ITANIUM
-       ;;
-       srlz.d
-#endif
-       mov r17=ibr[r18]
-       add r18=1,r18
-       ;;
-       st8.nta [in0]=r16,8
-       st8.nta [r19]=r17,8
-       br.cloop.sptk.many 1b
-       ;;
-       mov ar.lc=r20                   // restore ar.lc
-       br.ret.sptk.many rp
-END(ia64_save_debug_regs)
-
-GLOBAL_ENTRY(ia64_load_debug_regs)
-       alloc r16=ar.pfs,1,0,0,0
-       lfetch.nta [in0]
-       mov r20=ar.lc                   // preserve ar.lc
-       add r19=IA64_NUM_DBG_REGS*8,in0
-       mov ar.lc=IA64_NUM_DBG_REGS-1
-       mov r18=-1
-       ;;
-1:     ld8.nta r16=[in0],8
-       ld8.nta r17=[r19],8
-       add r18=1,r18
-       ;;
-       mov dbr[r18]=r16
-#ifdef CONFIG_ITANIUM
-       ;;
-       srlz.d                          // Errata 132 (NoFix status)
-#endif
-       mov ibr[r18]=r17
-       br.cloop.sptk.many 1b
-       ;;
-       mov ar.lc=r20                   // restore ar.lc
-       br.ret.sptk.many rp
-END(ia64_load_debug_regs)
-
-GLOBAL_ENTRY(__ia64_save_fpu)
-       alloc r2=ar.pfs,1,4,0,0
-       adds loc0=96*16-16,in0
-       adds loc1=96*16-16-128,in0
-       ;;
-       stf.spill.nta [loc0]=f127,-256
-       stf.spill.nta [loc1]=f119,-256
-       ;;
-       stf.spill.nta [loc0]=f111,-256
-       stf.spill.nta [loc1]=f103,-256
-       ;;
-       stf.spill.nta [loc0]=f95,-256
-       stf.spill.nta [loc1]=f87,-256
-       ;;
-       stf.spill.nta [loc0]=f79,-256
-       stf.spill.nta [loc1]=f71,-256
-       ;;
-       stf.spill.nta [loc0]=f63,-256
-       stf.spill.nta [loc1]=f55,-256
-       adds loc2=96*16-32,in0
-       ;;
-       stf.spill.nta [loc0]=f47,-256
-       stf.spill.nta [loc1]=f39,-256
-       adds loc3=96*16-32-128,in0
-       ;;
-       stf.spill.nta [loc2]=f126,-256
-       stf.spill.nta [loc3]=f118,-256
-       ;;
-       stf.spill.nta [loc2]=f110,-256
-       stf.spill.nta [loc3]=f102,-256
-       ;;
-       stf.spill.nta [loc2]=f94,-256
-       stf.spill.nta [loc3]=f86,-256
-       ;;
-       stf.spill.nta [loc2]=f78,-256
-       stf.spill.nta [loc3]=f70,-256
-       ;;
-       stf.spill.nta [loc2]=f62,-256
-       stf.spill.nta [loc3]=f54,-256
-       adds loc0=96*16-48,in0
-       ;;
-       stf.spill.nta [loc2]=f46,-256
-       stf.spill.nta [loc3]=f38,-256
-       adds loc1=96*16-48-128,in0
-       ;;
-       stf.spill.nta [loc0]=f125,-256
-       stf.spill.nta [loc1]=f117,-256
-       ;;
-       stf.spill.nta [loc0]=f109,-256
-       stf.spill.nta [loc1]=f101,-256
-       ;;
-       stf.spill.nta [loc0]=f93,-256
-       stf.spill.nta [loc1]=f85,-256
-       ;;
-       stf.spill.nta [loc0]=f77,-256
-       stf.spill.nta [loc1]=f69,-256
-       ;;
-       stf.spill.nta [loc0]=f61,-256
-       stf.spill.nta [loc1]=f53,-256
-       adds loc2=96*16-64,in0
-       ;;
-       stf.spill.nta [loc0]=f45,-256
-       stf.spill.nta [loc1]=f37,-256
-       adds loc3=96*16-64-128,in0
-       ;;
-       stf.spill.nta [loc2]=f124,-256
-       stf.spill.nta [loc3]=f116,-256
-       ;;
-       stf.spill.nta [loc2]=f108,-256
-       stf.spill.nta [loc3]=f100,-256
-       ;;
-       stf.spill.nta [loc2]=f92,-256
-       stf.spill.nta [loc3]=f84,-256
-       ;;
-       stf.spill.nta [loc2]=f76,-256
-       stf.spill.nta [loc3]=f68,-256
-       ;;
-       stf.spill.nta [loc2]=f60,-256
-       stf.spill.nta [loc3]=f52,-256
-       adds loc0=96*16-80,in0
-       ;;
-       stf.spill.nta [loc2]=f44,-256
-       stf.spill.nta [loc3]=f36,-256
-       adds loc1=96*16-80-128,in0
-       ;;
-       stf.spill.nta [loc0]=f123,-256
-       stf.spill.nta [loc1]=f115,-256
-       ;;
-       stf.spill.nta [loc0]=f107,-256
-       stf.spill.nta [loc1]=f99,-256
-       ;;
-       stf.spill.nta [loc0]=f91,-256
-       stf.spill.nta [loc1]=f83,-256
-       ;;
-       stf.spill.nta [loc0]=f75,-256
-       stf.spill.nta [loc1]=f67,-256
-       ;;
-       stf.spill.nta [loc0]=f59,-256
-       stf.spill.nta [loc1]=f51,-256
-       adds loc2=96*16-96,in0
-       ;;
-       stf.spill.nta [loc0]=f43,-256
-       stf.spill.nta [loc1]=f35,-256
-       adds loc3=96*16-96-128,in0
-       ;;
-       stf.spill.nta [loc2]=f122,-256
-       stf.spill.nta [loc3]=f114,-256
-       ;;
-       stf.spill.nta [loc2]=f106,-256
-       stf.spill.nta [loc3]=f98,-256
-       ;;
-       stf.spill.nta [loc2]=f90,-256
-       stf.spill.nta [loc3]=f82,-256
-       ;;
-       stf.spill.nta [loc2]=f74,-256
-       stf.spill.nta [loc3]=f66,-256
-       ;;
-       stf.spill.nta [loc2]=f58,-256
-       stf.spill.nta [loc3]=f50,-256
-       adds loc0=96*16-112,in0
-       ;;
-       stf.spill.nta [loc2]=f42,-256
-       stf.spill.nta [loc3]=f34,-256
-       adds loc1=96*16-112-128,in0
-       ;;
-       stf.spill.nta [loc0]=f121,-256
-       stf.spill.nta [loc1]=f113,-256
-       ;;
-       stf.spill.nta [loc0]=f105,-256
-       stf.spill.nta [loc1]=f97,-256
-       ;;
-       stf.spill.nta [loc0]=f89,-256
-       stf.spill.nta [loc1]=f81,-256
-       ;;
-       stf.spill.nta [loc0]=f73,-256
-       stf.spill.nta [loc1]=f65,-256
-       ;;
-       stf.spill.nta [loc0]=f57,-256
-       stf.spill.nta [loc1]=f49,-256
-       adds loc2=96*16-128,in0
-       ;;
-       stf.spill.nta [loc0]=f41,-256
-       stf.spill.nta [loc1]=f33,-256
-       adds loc3=96*16-128-128,in0
-       ;;
-       stf.spill.nta [loc2]=f120,-256
-       stf.spill.nta [loc3]=f112,-256
-       ;;
-       stf.spill.nta [loc2]=f104,-256
-       stf.spill.nta [loc3]=f96,-256
-       ;;
-       stf.spill.nta [loc2]=f88,-256
-       stf.spill.nta [loc3]=f80,-256
-       ;;
-       stf.spill.nta [loc2]=f72,-256
-       stf.spill.nta [loc3]=f64,-256
-       ;;
-       stf.spill.nta [loc2]=f56,-256
-       stf.spill.nta [loc3]=f48,-256
-       ;;
-       stf.spill.nta [loc2]=f40
-       stf.spill.nta [loc3]=f32
-       br.ret.sptk.many rp
-END(__ia64_save_fpu)
-
-GLOBAL_ENTRY(__ia64_load_fpu)
-       alloc r2=ar.pfs,1,2,0,0
-       adds r3=128,in0
-       adds r14=256,in0
-       adds r15=384,in0
-       mov loc0=512
-       mov loc1=-1024+16
-       ;;
-       ldf.fill.nta f32=[in0],loc0
-       ldf.fill.nta f40=[ r3],loc0
-       ldf.fill.nta f48=[r14],loc0
-       ldf.fill.nta f56=[r15],loc0
-       ;;
-       ldf.fill.nta f64=[in0],loc0
-       ldf.fill.nta f72=[ r3],loc0
-       ldf.fill.nta f80=[r14],loc0
-       ldf.fill.nta f88=[r15],loc0
-       ;;
-       ldf.fill.nta f96=[in0],loc1
-       ldf.fill.nta f104=[ r3],loc1
-       ldf.fill.nta f112=[r14],loc1
-       ldf.fill.nta f120=[r15],loc1
-       ;;
-       ldf.fill.nta f33=[in0],loc0
-       ldf.fill.nta f41=[ r3],loc0
-       ldf.fill.nta f49=[r14],loc0
-       ldf.fill.nta f57=[r15],loc0
-       ;;
-       ldf.fill.nta f65=[in0],loc0
-       ldf.fill.nta f73=[ r3],loc0
-       ldf.fill.nta f81=[r14],loc0
-       ldf.fill.nta f89=[r15],loc0
-       ;;
-       ldf.fill.nta f97=[in0],loc1
-       ldf.fill.nta f105=[ r3],loc1
-       ldf.fill.nta f113=[r14],loc1
-       ldf.fill.nta f121=[r15],loc1
-       ;;
-       ldf.fill.nta f34=[in0],loc0
-       ldf.fill.nta f42=[ r3],loc0
-       ldf.fill.nta f50=[r14],loc0
-       ldf.fill.nta f58=[r15],loc0
-       ;;
-       ldf.fill.nta f66=[in0],loc0
-       ldf.fill.nta f74=[ r3],loc0
-       ldf.fill.nta f82=[r14],loc0
-       ldf.fill.nta f90=[r15],loc0
-       ;;
-       ldf.fill.nta f98=[in0],loc1
-       ldf.fill.nta f106=[ r3],loc1
-       ldf.fill.nta f114=[r14],loc1
-       ldf.fill.nta f122=[r15],loc1
-       ;;
-       ldf.fill.nta f35=[in0],loc0
-       ldf.fill.nta f43=[ r3],loc0
-       ldf.fill.nta f51=[r14],loc0
-       ldf.fill.nta f59=[r15],loc0
-       ;;
-       ldf.fill.nta f67=[in0],loc0
-       ldf.fill.nta f75=[ r3],loc0
-       ldf.fill.nta f83=[r14],loc0
-       ldf.fill.nta f91=[r15],loc0
-       ;;
-       ldf.fill.nta f99=[in0],loc1
-       ldf.fill.nta f107=[ r3],loc1
-       ldf.fill.nta f115=[r14],loc1
-       ldf.fill.nta f123=[r15],loc1
-       ;;
-       ldf.fill.nta f36=[in0],loc0
-       ldf.fill.nta f44=[ r3],loc0
-       ldf.fill.nta f52=[r14],loc0
-       ldf.fill.nta f60=[r15],loc0
-       ;;
-       ldf.fill.nta f68=[in0],loc0
-       ldf.fill.nta f76=[ r3],loc0
-       ldf.fill.nta f84=[r14],loc0
-       ldf.fill.nta f92=[r15],loc0
-       ;;
-       ldf.fill.nta f100=[in0],loc1
-       ldf.fill.nta f108=[ r3],loc1
-       ldf.fill.nta f116=[r14],loc1
-       ldf.fill.nta f124=[r15],loc1
-       ;;
-       ldf.fill.nta f37=[in0],loc0
-       ldf.fill.nta f45=[ r3],loc0
-       ldf.fill.nta f53=[r14],loc0
-       ldf.fill.nta f61=[r15],loc0
-       ;;
-       ldf.fill.nta f69=[in0],loc0
-       ldf.fill.nta f77=[ r3],loc0
-       ldf.fill.nta f85=[r14],loc0
-       ldf.fill.nta f93=[r15],loc0
-       ;;
-       ldf.fill.nta f101=[in0],loc1
-       ldf.fill.nta f109=[ r3],loc1
-       ldf.fill.nta f117=[r14],loc1
-       ldf.fill.nta f125=[r15],loc1
-       ;;
-       ldf.fill.nta f38 =[in0],loc0
-       ldf.fill.nta f46 =[ r3],loc0
-       ldf.fill.nta f54 =[r14],loc0
-       ldf.fill.nta f62 =[r15],loc0
-       ;;
-       ldf.fill.nta f70 =[in0],loc0
-       ldf.fill.nta f78 =[ r3],loc0
-       ldf.fill.nta f86 =[r14],loc0
-       ldf.fill.nta f94 =[r15],loc0
-       ;;
-       ldf.fill.nta f102=[in0],loc1
-       ldf.fill.nta f110=[ r3],loc1
-       ldf.fill.nta f118=[r14],loc1
-       ldf.fill.nta f126=[r15],loc1
-       ;;
-       ldf.fill.nta f39 =[in0],loc0
-       ldf.fill.nta f47 =[ r3],loc0
-       ldf.fill.nta f55 =[r14],loc0
-       ldf.fill.nta f63 =[r15],loc0
-       ;;
-       ldf.fill.nta f71 =[in0],loc0
-       ldf.fill.nta f79 =[ r3],loc0
-       ldf.fill.nta f87 =[r14],loc0
-       ldf.fill.nta f95 =[r15],loc0
-       ;;
-       ldf.fill.nta f103=[in0]
-       ldf.fill.nta f111=[ r3]
-       ldf.fill.nta f119=[r14]
-       ldf.fill.nta f127=[r15]
-       br.ret.sptk.many rp
-END(__ia64_load_fpu)
-
-GLOBAL_ENTRY(__ia64_init_fpu)
-       stf.spill [sp]=f0               // M3
-       mov      f32=f0                 // F
-       nop.b    0
-
-       ldfps    f33,f34=[sp]           // M0
-       ldfps    f35,f36=[sp]           // M1
-       mov      f37=f0                 // F
-       ;;
-
-       setf.s   f38=r0                 // M2
-       setf.s   f39=r0                 // M3
-       mov      f40=f0                 // F
-
-       ldfps    f41,f42=[sp]           // M0
-       ldfps    f43,f44=[sp]           // M1
-       mov      f45=f0                 // F
-
-       setf.s   f46=r0                 // M2
-       setf.s   f47=r0                 // M3
-       mov      f48=f0                 // F
-
-       ldfps    f49,f50=[sp]           // M0
-       ldfps    f51,f52=[sp]           // M1
-       mov      f53=f0                 // F
-
-       setf.s   f54=r0                 // M2
-       setf.s   f55=r0                 // M3
-       mov      f56=f0                 // F
-
-       ldfps    f57,f58=[sp]           // M0
-       ldfps    f59,f60=[sp]           // M1
-       mov      f61=f0                 // F
-
-       setf.s   f62=r0                 // M2
-       setf.s   f63=r0                 // M3
-       mov      f64=f0                 // F
-
-       ldfps    f65,f66=[sp]           // M0
-       ldfps    f67,f68=[sp]           // M1
-       mov      f69=f0                 // F
-
-       setf.s   f70=r0                 // M2
-       setf.s   f71=r0                 // M3
-       mov      f72=f0                 // F
-
-       ldfps    f73,f74=[sp]           // M0
-       ldfps    f75,f76=[sp]           // M1
-       mov      f77=f0                 // F
-
-       setf.s   f78=r0                 // M2
-       setf.s   f79=r0                 // M3
-       mov      f80=f0                 // F
-
-       ldfps    f81,f82=[sp]           // M0
-       ldfps    f83,f84=[sp]           // M1
-       mov      f85=f0                 // F
-
-       setf.s   f86=r0                 // M2
-       setf.s   f87=r0                 // M3
-       mov      f88=f0                 // F
-
-       /*
-        * When the instructions are cached, it would be faster to initialize
-        * the remaining registers with simply mov instructions (F-unit).
-        * This gets the time down to ~29 cycles.  However, this would use up
-        * 33 bundles, whereas continuing with the above pattern yields
-        * 10 bundles and ~30 cycles.
-        */
-
-       ldfps    f89,f90=[sp]           // M0
-       ldfps    f91,f92=[sp]           // M1
-       mov      f93=f0                 // F
-
-       setf.s   f94=r0                 // M2
-       setf.s   f95=r0                 // M3
-       mov      f96=f0                 // F
-
-       ldfps    f97,f98=[sp]           // M0
-       ldfps    f99,f100=[sp]          // M1
-       mov      f101=f0                // F
-
-       setf.s   f102=r0                // M2
-       setf.s   f103=r0                // M3
-       mov      f104=f0                // F
-
-       ldfps    f105,f106=[sp]         // M0
-       ldfps    f107,f108=[sp]         // M1
-       mov      f109=f0                // F
-
-       setf.s   f110=r0                // M2
-       setf.s   f111=r0                // M3
-       mov      f112=f0                // F
-
-       ldfps    f113,f114=[sp]         // M0
-       ldfps    f115,f116=[sp]         // M1
-       mov      f117=f0                // F
-
-       setf.s   f118=r0                // M2
-       setf.s   f119=r0                // M3
-       mov      f120=f0                // F
-
-       ldfps    f121,f122=[sp]         // M0
-       ldfps    f123,f124=[sp]         // M1
-       mov      f125=f0                // F
-
-       setf.s   f126=r0                // M2
-       setf.s   f127=r0                // M3
-       br.ret.sptk.many rp             // F
-END(__ia64_init_fpu)
-
-/*
- * Switch execution mode from virtual to physical
- *
- * Inputs:
- *     r16 = new psr to establish
- * Output:
- *     r19 = old virtual address of ar.bsp
- *     r20 = old virtual address of sp
- *
- * Note: RSE must already be in enforced lazy mode
- */
-GLOBAL_ENTRY(ia64_switch_mode_phys)
- {
-       rsm psr.i | psr.ic              // disable interrupts and interrupt collection
-       mov r15=ip
- }
-       ;;
- {
-       flushrs                         // must be first insn in group
-       srlz.i
- }
-       ;;
-       mov cr.ipsr=r16                 // set new PSR
-       add r3=1f-ia64_switch_mode_phys,r15
-
-       mov r19=ar.bsp
-       mov r20=sp
-       mov r14=rp                      // get return address into a general register
-       ;;
-
-       // going to physical mode, use tpa to translate virt->phys
-       tpa r17=r19
-       tpa r3=r3
-       tpa sp=sp
-       tpa r14=r14
-       ;;
-
-       mov r18=ar.rnat                 // save ar.rnat
-       mov ar.bspstore=r17             // this steps on ar.rnat
-       mov cr.iip=r3
-       mov cr.ifs=r0
-       ;;
-       mov ar.rnat=r18                 // restore ar.rnat
-       rfi                             // must be last insn in group
-       ;;
-1:     mov rp=r14
-       br.ret.sptk.many rp
-END(ia64_switch_mode_phys)
-
-/*
- * Switch execution mode from physical to virtual
- *
- * Inputs:
- *     r16 = new psr to establish
- *     r19 = new bspstore to establish
- *     r20 = new sp to establish
- *
- * Note: RSE must already be in enforced lazy mode
- */
-GLOBAL_ENTRY(ia64_switch_mode_virt)
- {
-       rsm psr.i | psr.ic              // disable interrupts and interrupt collection
-       mov r15=ip
- }
-       ;;
- {
-       flushrs                         // must be first insn in group
-       srlz.i
- }
-       ;;
-       mov cr.ipsr=r16                 // set new PSR
-       add r3=1f-ia64_switch_mode_virt,r15
-
-       mov r14=rp                      // get return address into a general register
-       ;;
-
-       // going to virtual
-       //   - for code addresses, set upper bits of addr to KERNEL_START
-       //   - for stack addresses, copy from input argument
-       movl r18=KERNEL_START
-       dep r3=0,r3,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT
-       dep r14=0,r14,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT
-       mov sp=r20
-       ;;
-       or r3=r3,r18
-       or r14=r14,r18
-       ;;
-
-       mov r18=ar.rnat                 // save ar.rnat
-       mov ar.bspstore=r19             // this steps on ar.rnat
-       mov cr.iip=r3
-       mov cr.ifs=r0
-       ;;
-       mov ar.rnat=r18                 // restore ar.rnat
-       rfi                             // must be last insn in group
-       ;;
-1:     mov rp=r14
-       br.ret.sptk.many rp
-END(ia64_switch_mode_virt)
-
-GLOBAL_ENTRY(ia64_delay_loop)
-       .prologue
-{      nop 0                   // work around GAS unwind info generation bug...
-       .save ar.lc,r2
-       mov r2=ar.lc
-       .body
-       ;;
-       mov ar.lc=r32
-}
-       ;;
-       // force loop to be 32-byte aligned (GAS bug means we cannot use .align
-       // inside function body without corrupting unwind info).
-{      nop 0 }
-1:     br.cloop.sptk.few 1b
-       ;;
-       mov ar.lc=r2
-       br.ret.sptk.many rp
-END(ia64_delay_loop)
-
-/*
- * Return a CPU-local timestamp in nano-seconds.  This timestamp is
- * NOT synchronized across CPUs its return value must never be
- * compared against the values returned on another CPU.  The usage in
- * kernel/sched.c ensures that.
- *
- * The return-value of sched_clock() is NOT supposed to wrap-around.
- * If it did, it would cause some scheduling hiccups (at the worst).
- * Fortunately, with a 64-bit cycle-counter ticking at 100GHz, even
- * that would happen only once every 5+ years.
- *
- * The code below basically calculates:
- *
- *   (ia64_get_itc() * local_cpu_data->nsec_per_cyc) >> IA64_NSEC_PER_CYC_SHIFT
- *
- * except that the multiplication and the shift are done with 128-bit
- * intermediate precision so that we can produce a full 64-bit result.
- */
-GLOBAL_ENTRY(sched_clock)
-       addl r8=THIS_CPU(cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0
-       mov.m r9=ar.itc         // fetch cycle-counter                          (35 cyc)
-       ;;
-       ldf8 f8=[r8]
-       ;;
-       setf.sig f9=r9          // certain to stall, so issue it _after_ ldf8...
-       ;;
-       xmpy.lu f10=f9,f8       // calculate low 64 bits of 128-bit product     (4 cyc)
-       xmpy.hu f11=f9,f8       // calculate high 64 bits of 128-bit product
-       ;;
-       getf.sig r8=f10         //                                              (5 cyc)
-       getf.sig r9=f11
-       ;;
-       shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT
-       br.ret.sptk.many rp
-END(sched_clock)
-
-GLOBAL_ENTRY(start_kernel_thread)
-       .prologue
-       .save rp, r0                            // this is the end of the call-chain
-       .body
-       alloc r2 = ar.pfs, 0, 0, 2, 0
-       mov out0 = r9
-       mov out1 = r11;;
-       br.call.sptk.many rp = kernel_thread_helper;;
-       mov out0 = r8
-       br.call.sptk.many rp = sys_exit;;
-1:     br.sptk.few 1b                          // not reached
-END(start_kernel_thread)
-
-#ifdef CONFIG_IA64_BRL_EMU
-
-/*
- *  Assembly routines used by brl_emu.c to set preserved register state.
- */
-
-#define SET_REG(reg)                           \
- GLOBAL_ENTRY(ia64_set_##reg);                 \
-       alloc r16=ar.pfs,1,0,0,0;               \
-       mov reg=r32;                            \
-       ;;                                      \
-       br.ret.sptk.many rp;                    \
- END(ia64_set_##reg)
-
-SET_REG(b1);
-SET_REG(b2);
-SET_REG(b3);
-SET_REG(b4);
-SET_REG(b5);
-
-#endif /* CONFIG_IA64_BRL_EMU */
-
-#ifdef CONFIG_SMP
-       /*
-        * This routine handles spinlock contention.  It uses a non-standard calling
-        * convention to avoid converting leaf routines into interior routines.  Because
-        * of this special convention, there are several restrictions:
-        *
-        * - do not use gp relative variables, this code is called from the kernel
-        *   and from modules, r1 is undefined.
-        * - do not use stacked registers, the caller owns them.
-        * - do not use the scratch stack space, the caller owns it.
-        * - do not use any registers other than the ones listed below
-        *
-        * Inputs:
-        *   ar.pfs - saved CFM of caller
-        *   ar.ccv - 0 (and available for use)
-        *   r27    - flags from spin_lock_irqsave or 0.  Must be preserved.
-        *   r28    - available for use.
-        *   r29    - available for use.
-        *   r30    - available for use.
-        *   r31    - address of lock, available for use.
-        *   b6     - return address
-        *   p14    - available for use.
-        *   p15    - used to track flag status.
-        *
-        * If you patch this code to use more registers, do not forget to update
-        * the clobber lists for spin_lock() in include/asm-ia64/spinlock.h.
-        */
-
-#if (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
-
-GLOBAL_ENTRY(ia64_spinlock_contention_pre3_4)
-       .prologue
-       .save ar.pfs, r0        // this code effectively has a zero frame size
-       .save rp, r28
-       .body
-       nop 0
-       tbit.nz p15,p0=r27,IA64_PSR_I_BIT
-       .restore sp             // pop existing prologue after next insn
-       mov b6 = r28
-       .prologue
-       .save ar.pfs, r0
-       .altrp b6
-       .body
-       ;;
-(p15)  ssm psr.i               // reenable interrupts if they were on
-                               // DavidM says that srlz.d is slow and is not required in this case
-.wait:
-       // exponential backoff, kdb, lockmeter etc. go in here
-       hint @pause
-       ld4 r30=[r31]           // don't use ld4.bias; if it's contended, we won't write the word
-       nop 0
-       ;;
-       cmp4.ne p14,p0=r30,r0
-(p14)  br.cond.sptk.few .wait
-(p15)  rsm psr.i               // disable interrupts if we reenabled them
-       br.cond.sptk.few b6     // lock is now free, try to acquire
-       .global ia64_spinlock_contention_pre3_4_end     // for kernprof
-ia64_spinlock_contention_pre3_4_end:
-END(ia64_spinlock_contention_pre3_4)
-
-#else
-
-GLOBAL_ENTRY(ia64_spinlock_contention)
-       .prologue
-       .altrp b6
-       .body
-       tbit.nz p15,p0=r27,IA64_PSR_I_BIT
-       ;;
-.wait:
-(p15)  ssm psr.i               // reenable interrupts if they were on
-                               // DavidM says that srlz.d is slow and is not required in this case
-.wait2:
-       // exponential backoff, kdb, lockmeter etc. go in here
-       hint @pause
-       ld4 r30=[r31]           // don't use ld4.bias; if it's contended, we won't write the word
-       ;;
-       cmp4.ne p14,p0=r30,r0
-       mov r30 = 1
-(p14)  br.cond.sptk.few .wait2
-(p15)  rsm psr.i               // disable interrupts if we reenabled them
-       ;;
-       cmpxchg4.acq r30=[r31], r30, ar.ccv
-       ;;
-       cmp4.ne p14,p0=r0,r30
-(p14)  br.cond.sptk.few .wait
-
-       br.ret.sptk.many b6     // lock is now taken
-END(ia64_spinlock_contention)
-
-#endif
-
-#ifdef CONFIG_HOTPLUG_CPU
-GLOBAL_ENTRY(ia64_jump_to_sal)
-       alloc r16=ar.pfs,1,0,0,0;;
-       rsm psr.i  | psr.ic
-{
-       flushrs
-       srlz.i
-}
-       tpa r25=in0
-       movl r18=tlb_purge_done;;
-       DATA_VA_TO_PA(r18);;
-       mov b1=r18      // Return location
-       movl r18=ia64_do_tlb_purge;;
-       DATA_VA_TO_PA(r18);;
-       mov b2=r18      // doing tlb_flush work
-       mov ar.rsc=0  // Put RSE  in enforced lazy, LE mode
-       movl r17=1f;;
-       DATA_VA_TO_PA(r17);;
-       mov cr.iip=r17
-       movl r16=SAL_PSR_BITS_TO_SET;;
-       mov cr.ipsr=r16
-       mov cr.ifs=r0;;
-       rfi;;
-1:
-       /*
-        * Invalidate all TLB data/inst
-        */
-       br.sptk.many b2;; // jump to tlb purge code
-
-tlb_purge_done:
-       RESTORE_REGION_REGS(r25, r17,r18,r19);;
-       RESTORE_REG(b0, r25, r17);;
-       RESTORE_REG(b1, r25, r17);;
-       RESTORE_REG(b2, r25, r17);;
-       RESTORE_REG(b3, r25, r17);;
-       RESTORE_REG(b4, r25, r17);;
-       RESTORE_REG(b5, r25, r17);;
-       ld8 r1=[r25],0x08;;
-       ld8 r12=[r25],0x08;;
-       ld8 r13=[r25],0x08;;
-       RESTORE_REG(ar.fpsr, r25, r17);;
-       RESTORE_REG(ar.pfs, r25, r17);;
-       RESTORE_REG(ar.rnat, r25, r17);;
-       RESTORE_REG(ar.unat, r25, r17);;
-       RESTORE_REG(ar.bspstore, r25, r17);;
-       RESTORE_REG(cr.dcr, r25, r17);;
-       RESTORE_REG(cr.iva, r25, r17);;
-       RESTORE_REG(cr.pta, r25, r17);;
-       RESTORE_REG(cr.itv, r25, r17);;
-       RESTORE_REG(cr.pmv, r25, r17);;
-       RESTORE_REG(cr.cmcv, r25, r17);;
-       RESTORE_REG(cr.lrr0, r25, r17);;
-       RESTORE_REG(cr.lrr1, r25, r17);;
-       ld8 r4=[r25],0x08;;
-       ld8 r5=[r25],0x08;;
-       ld8 r6=[r25],0x08;;
-       ld8 r7=[r25],0x08;;
-       ld8 r17=[r25],0x08;;
-       mov pr=r17,-1;;
-       RESTORE_REG(ar.lc, r25, r17);;
-       /*
-        * Now Restore floating point regs
-        */
-       ldf.fill.nta f2=[r25],16;;
-       ldf.fill.nta f3=[r25],16;;
-       ldf.fill.nta f4=[r25],16;;
-       ldf.fill.nta f5=[r25],16;;
-       ldf.fill.nta f16=[r25],16;;
-       ldf.fill.nta f17=[r25],16;;
-       ldf.fill.nta f18=[r25],16;;
-       ldf.fill.nta f19=[r25],16;;
-       ldf.fill.nta f20=[r25],16;;
-       ldf.fill.nta f21=[r25],16;;
-       ldf.fill.nta f22=[r25],16;;
-       ldf.fill.nta f23=[r25],16;;
-       ldf.fill.nta f24=[r25],16;;
-       ldf.fill.nta f25=[r25],16;;
-       ldf.fill.nta f26=[r25],16;;
-       ldf.fill.nta f27=[r25],16;;
-       ldf.fill.nta f28=[r25],16;;
-       ldf.fill.nta f29=[r25],16;;
-       ldf.fill.nta f30=[r25],16;;
-       ldf.fill.nta f31=[r25],16;;
-
-       /*
-        * Now that we have done all the register restores
-        * we are now ready for the big DIVE to SAL Land
-        */
-       ssm psr.ic;;
-       srlz.d;;
-       br.ret.sptk.many b0;;
-END(ia64_jump_to_sal)
-#endif /* CONFIG_HOTPLUG_CPU */
-
-#endif /* CONFIG_SMP */
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c b/linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c
deleted file mode 100644 (file)
index 1541b57..0000000
+++ /dev/null
@@ -1,1253 +0,0 @@
-/*
- * I/O SAPIC support.
- *
- * Copyright (C) 1999 Intel Corp.
- * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
- * Copyright (C) 2000-2002 J.I. Lee <jung-ik.lee@intel.com>
- * Copyright (C) 1999-2000, 2002-2003 Hewlett-Packard Co.
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com>
- *
- * 00/04/19    D. Mosberger    Rewritten to mirror more closely the x86 I/O
- *                             APIC code.  In particular, we now have separate
- *                             handlers for edge and level triggered
- *                             interrupts.
- * 00/10/27    Asit Mallick, Goutham Rao <goutham.rao@intel.com> IRQ vector
- *                             allocation PCI to vector mapping, shared PCI
- *                             interrupts.
- * 00/10/27    D. Mosberger    Document things a bit more to make them more
- *                             understandable.  Clean up much of the old
- *                             IOSAPIC cruft.
- * 01/07/27    J.I. Lee        PCI irq routing, Platform/Legacy interrupts
- *                             and fixes for ACPI S5(SoftOff) support.
- * 02/01/23    J.I. Lee        iosapic pgm fixes for PCI irq routing from _PRT
- * 02/01/07     E. Focht        <efocht@ess.nec.de> Redirectable interrupt
- *                             vectors in iosapic_set_affinity(),
- *                             initializations for /proc/irq/#/smp_affinity
- * 02/04/02    P. Diefenbaugh  Cleaned up ACPI PCI IRQ routing.
- * 02/04/18    J.I. Lee        bug fix in iosapic_init_pci_irq
- * 02/04/30    J.I. Lee        bug fix in find_iosapic to fix ACPI PCI IRQ to
- *                             IOSAPIC mapping error
- * 02/07/29    T. Kochi        Allocate interrupt vectors dynamically
- * 02/08/04    T. Kochi        Cleaned up terminology (irq, global system
- *                             interrupt, vector, etc.)
- * 02/09/20    D. Mosberger    Simplified by taking advantage of ACPI's
- *                             pci_irq code.
- * 03/02/19    B. Helgaas      Make pcat_compat system-wide, not per-IOSAPIC.
- *                             Remove iosapic_address & gsi_base from
- *                             external interfaces.  Rationalize
- *                             __init/__devinit attributes.
- * 04/12/04 Ashok Raj  <ashok.raj@intel.com> Intel Corporation 2004
- *                             Updated to work with irq migration necessary
- *                             for CPU Hotplug
- */
-/*
- * Here is what the interrupt logic between a PCI device and the kernel looks
- * like:
- *
- * (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC,
- *     INTD).  The device is uniquely identified by its bus-, and slot-number
- *     (the function number does not matter here because all functions share
- *     the same interrupt lines).
- *
- * (2) The motherboard routes the interrupt line to a pin on a IOSAPIC
- *     controller.  Multiple interrupt lines may have to share the same
- *     IOSAPIC pin (if they're level triggered and use the same polarity).
- *     Each interrupt line has a unique Global System Interrupt (GSI) number
- *     which can be calculated as the sum of the controller's base GSI number
- *     and the IOSAPIC pin number to which the line connects.
- *
- * (3) The IOSAPIC uses an internal routing table entries (RTEs) to map the
- * IOSAPIC pin into the IA-64 interrupt vector.  This interrupt vector is then
- * sent to the CPU.
- *
- * (4) The kernel recognizes an interrupt as an IRQ.  The IRQ interface is
- *     used as architecture-independent interrupt handling mechanism in Linux.
- *     As an IRQ is a number, we have to have
- *     IA-64 interrupt vector number <-> IRQ number mapping.  On smaller
- *     systems, we use one-to-one mapping between IA-64 vector and IRQ.  A
- *     platform can implement platform_irq_to_vector(irq) and
- *     platform_local_vector_to_irq(vector) APIs to differentiate the mapping.
- *     Please see also include/asm-ia64/hw_irq.h for those APIs.
- *
- * To sum up, there are three levels of mappings involved:
- *
- *     PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ
- *
- * Note: The term "IRQ" is loosely used everywhere in Linux kernel to
- * describeinterrupts.  Now we use "IRQ" only for Linux IRQ's.  ISA IRQ
- * (isa_irq) is the only exception in this source code.
- */
-
-#include <linux/acpi.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/pci.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/string.h>
-#include <linux/bootmem.h>
-
-#include <asm/delay.h>
-#include <asm/hw_irq.h>
-#include <asm/io.h>
-#include <asm/iosapic.h>
-#include <asm/machvec.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-
-#undef DEBUG_INTERRUPT_ROUTING
-
-#ifdef DEBUG_INTERRUPT_ROUTING
-#define DBG(fmt...)    printk(fmt)
-#else
-#define DBG(fmt...)
-#endif
-
-#define NR_PREALLOCATE_RTE_ENTRIES \
-       (PAGE_SIZE / sizeof(struct iosapic_rte_info))
-#define RTE_PREALLOCATED       (1)
-
-static DEFINE_SPINLOCK(iosapic_lock);
-
-/*
- * These tables map IA-64 vectors to the IOSAPIC pin that generates this
- * vector.
- */
-
-struct iosapic_rte_info {
-       struct list_head rte_list;      /* node in list of RTEs sharing the
-                                        * same vector */
-       char __iomem    *addr;          /* base address of IOSAPIC */
-       unsigned int    gsi_base;       /* first GSI assigned to this
-                                        * IOSAPIC */
-       char            rte_index;      /* IOSAPIC RTE index */
-       int             refcnt;         /* reference counter */
-       unsigned int    flags;          /* flags */
-} ____cacheline_aligned;
-
-static struct iosapic_intr_info {
-       struct list_head rtes;          /* RTEs using this vector (empty =>
-                                        * not an IOSAPIC interrupt) */
-       int             count;          /* # of RTEs that shares this vector */
-       u32             low32;          /* current value of low word of
-                                        * Redirection table entry */
-       unsigned int    dest;           /* destination CPU physical ID */
-       unsigned char   dmode   : 3;    /* delivery mode (see iosapic.h) */
-       unsigned char   polarity: 1;    /* interrupt polarity
-                                        * (see iosapic.h) */
-       unsigned char   trigger : 1;    /* trigger mode (see iosapic.h) */
-} iosapic_intr_info[IA64_NUM_VECTORS];
-
-static struct iosapic {
-       char __iomem    *addr;          /* base address of IOSAPIC */
-       unsigned int    gsi_base;       /* first GSI assigned to this
-                                        * IOSAPIC */
-       unsigned short  num_rte;        /* # of RTEs on this IOSAPIC */
-       int             rtes_inuse;     /* # of RTEs in use on this IOSAPIC */
-#ifdef CONFIG_NUMA
-       unsigned short  node;           /* numa node association via pxm */
-#endif
-} iosapic_lists[NR_IOSAPICS];
-
-static unsigned char pcat_compat __devinitdata;        /* 8259 compatibility flag */
-
-static int iosapic_kmalloc_ok;
-static LIST_HEAD(free_rte_list);
-
-#ifdef CONFIG_XEN
-#include <xen/interface/xen.h>
-#include <xen/interface/physdev.h>
-#include <asm/hypervisor.h>
-static inline unsigned int xen_iosapic_read(char __iomem *iosapic, unsigned int reg)
-{
-       struct physdev_apic apic_op;
-       int ret;
-
-       apic_op.apic_physbase = (unsigned long)iosapic -
-                                       __IA64_UNCACHED_OFFSET;
-       apic_op.reg = reg;
-       ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
-       if (ret)
-               return ret;
-       return apic_op.value;
-}
-
-static inline void xen_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
-{
-       struct physdev_apic apic_op;
-
-       apic_op.apic_physbase = (unsigned long)iosapic - 
-                                       __IA64_UNCACHED_OFFSET;
-       apic_op.reg = reg;
-       apic_op.value = val;
-       HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
-}
-
-static inline unsigned int iosapic_read(char __iomem *iosapic, unsigned int reg)
-{
-       if (!is_running_on_xen()) {
-               writel(reg, iosapic + IOSAPIC_REG_SELECT);
-               return readl(iosapic + IOSAPIC_WINDOW);
-       } else
-               return xen_iosapic_read(iosapic, reg);
-}
-
-static inline void iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
-{
-       if (!is_running_on_xen()) {
-               writel(reg, iosapic + IOSAPIC_REG_SELECT);
-               writel(val, iosapic + IOSAPIC_WINDOW);
-       } else
-               xen_iosapic_write(iosapic, reg, val);
-}
-
-int xen_assign_irq_vector(int irq)
-{
-       struct physdev_irq irq_op;
-
-       irq_op.irq = irq;
-       if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
-               return -ENOSPC;
-
-       return irq_op.vector;
-}
-
-void xen_free_irq_vector(int vector)
-{
-       struct physdev_irq irq_op;
-
-       irq_op.vector = vector;
-       if (HYPERVISOR_physdev_op(PHYSDEVOP_free_irq_vector, &irq_op))
-               printk(KERN_WARNING "%s: xen_free_irq_vecotr fail vector=%d\n",
-                      __FUNCTION__, vector);
-}
-#endif /* XEN */
-
-/*
- * Find an IOSAPIC associated with a GSI
- */
-static inline int
-find_iosapic (unsigned int gsi)
-{
-       int i;
-
-       for (i = 0; i < NR_IOSAPICS; i++) {
-               if ((unsigned) (gsi - iosapic_lists[i].gsi_base) <
-                   iosapic_lists[i].num_rte)
-                       return i;
-       }
-
-       return -1;
-}
-
-static inline int
-_gsi_to_vector (unsigned int gsi)
-{
-       struct iosapic_intr_info *info;
-       struct iosapic_rte_info *rte;
-
-       for (info = iosapic_intr_info; info <
-                    iosapic_intr_info + IA64_NUM_VECTORS; ++info)
-               list_for_each_entry(rte, &info->rtes, rte_list)
-                       if (rte->gsi_base + rte->rte_index == gsi)
-                               return info - iosapic_intr_info;
-       return -1;
-}
-
-/*
- * Translate GSI number to the corresponding IA-64 interrupt vector.  If no
- * entry exists, return -1.
- */
-inline int
-gsi_to_vector (unsigned int gsi)
-{
-       return _gsi_to_vector(gsi);
-}
-
-int
-gsi_to_irq (unsigned int gsi)
-{
-       unsigned long flags;
-       int irq;
-       /*
-        * XXX fix me: this assumes an identity mapping between IA-64 vector
-        * and Linux irq numbers...
-        */
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               irq = _gsi_to_vector(gsi);
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-
-       return irq;
-}
-
-static struct iosapic_rte_info *gsi_vector_to_rte(unsigned int gsi,
-                                                 unsigned int vec)
-{
-       struct iosapic_rte_info *rte;
-
-       list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
-               if (rte->gsi_base + rte->rte_index == gsi)
-                       return rte;
-       return NULL;
-}
-
-static void
-set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask)
-{
-       unsigned long pol, trigger, dmode;
-       u32 low32, high32;
-       char __iomem *addr;
-       int rte_index;
-       char redir;
-       struct iosapic_rte_info *rte;
-
-       DBG(KERN_DEBUG"IOSAPIC: routing vector %d to 0x%x\n", vector, dest);
-
-       rte = gsi_vector_to_rte(gsi, vector);
-       if (!rte)
-               return;         /* not an IOSAPIC interrupt */
-
-       rte_index = rte->rte_index;
-       addr    = rte->addr;
-       pol     = iosapic_intr_info[vector].polarity;
-       trigger = iosapic_intr_info[vector].trigger;
-       dmode   = iosapic_intr_info[vector].dmode;
-
-       redir = (dmode == IOSAPIC_LOWEST_PRIORITY) ? 1 : 0;
-
-#ifdef CONFIG_SMP
-       {
-               unsigned int irq;
-
-               for (irq = 0; irq < NR_IRQS; ++irq)
-                       if (irq_to_vector(irq) == vector) {
-                               set_irq_affinity_info(irq,
-                                                     (int)(dest & 0xffff),
-                                                     redir);
-                               break;
-                       }
-       }
-#endif
-
-       low32 = ((pol << IOSAPIC_POLARITY_SHIFT) |
-                (trigger << IOSAPIC_TRIGGER_SHIFT) |
-                (dmode << IOSAPIC_DELIVERY_SHIFT) |
-                ((mask ? 1 : 0) << IOSAPIC_MASK_SHIFT) |
-                vector);
-
-       /* dest contains both id and eid */
-       high32 = (dest << IOSAPIC_DEST_SHIFT);
-
-       iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
-       iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-       iosapic_intr_info[vector].low32 = low32;
-       iosapic_intr_info[vector].dest = dest;
-}
-
-static void
-nop (unsigned int irq)
-{
-       /* do nothing... */
-}
-
-static void
-mask_irq (unsigned int irq)
-{
-       unsigned long flags;
-       char __iomem *addr;
-       u32 low32;
-       int rte_index;
-       ia64_vector vec = irq_to_vector(irq);
-       struct iosapic_rte_info *rte;
-
-       if (list_empty(&iosapic_intr_info[vec].rtes))
-               return;                 /* not an IOSAPIC interrupt! */
-
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               /* set only the mask bit */
-               low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK;
-               list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
-                                   rte_list) {
-                       addr = rte->addr;
-                       rte_index = rte->rte_index;
-                       iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-               }
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-}
-
-static void
-unmask_irq (unsigned int irq)
-{
-       unsigned long flags;
-       char __iomem *addr;
-       u32 low32;
-       int rte_index;
-       ia64_vector vec = irq_to_vector(irq);
-       struct iosapic_rte_info *rte;
-
-       if (list_empty(&iosapic_intr_info[vec].rtes))
-               return;                 /* not an IOSAPIC interrupt! */
-
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK;
-               list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
-                                   rte_list) {
-                       addr = rte->addr;
-                       rte_index = rte->rte_index;
-                       iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-               }
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-}
-
-
-static void
-iosapic_set_affinity (unsigned int irq, cpumask_t mask)
-{
-#ifdef CONFIG_SMP
-       unsigned long flags;
-       u32 high32, low32;
-       int dest, rte_index;
-       char __iomem *addr;
-       int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0;
-       ia64_vector vec;
-       struct iosapic_rte_info *rte;
-
-       irq &= (~IA64_IRQ_REDIRECTED);
-       vec = irq_to_vector(irq);
-
-       if (cpus_empty(mask))
-               return;
-
-       dest = cpu_physical_id(first_cpu(mask));
-
-       if (list_empty(&iosapic_intr_info[vec].rtes))
-               return;                 /* not an IOSAPIC interrupt */
-
-       set_irq_affinity_info(irq, dest, redir);
-
-       /* dest contains both id and eid */
-       high32 = dest << IOSAPIC_DEST_SHIFT;
-
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               low32 = iosapic_intr_info[vec].low32 &
-                       ~(7 << IOSAPIC_DELIVERY_SHIFT);
-
-               if (redir)
-                       /* change delivery mode to lowest priority */
-                       low32 |= (IOSAPIC_LOWEST_PRIORITY <<
-                                 IOSAPIC_DELIVERY_SHIFT);
-               else
-                       /* change delivery mode to fixed */
-                       low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT);
-
-               iosapic_intr_info[vec].low32 = low32;
-               iosapic_intr_info[vec].dest = dest;
-               list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
-                                   rte_list) {
-                       addr = rte->addr;
-                       rte_index = rte->rte_index;
-                       iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index),
-                                     high32);
-                       iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-               }
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-#endif
-}
-
-/*
- * Handlers for level-triggered interrupts.
- */
-
-static unsigned int
-iosapic_startup_level_irq (unsigned int irq)
-{
-       unmask_irq(irq);
-       return 0;
-}
-
-static void
-iosapic_end_level_irq (unsigned int irq)
-{
-       ia64_vector vec = irq_to_vector(irq);
-       struct iosapic_rte_info *rte;
-
-       move_native_irq(irq);
-       list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
-               iosapic_eoi(rte->addr, vec);
-}
-
-#define iosapic_shutdown_level_irq     mask_irq
-#define iosapic_enable_level_irq       unmask_irq
-#define iosapic_disable_level_irq      mask_irq
-#define iosapic_ack_level_irq          nop
-
-struct hw_interrupt_type irq_type_iosapic_level = {
-       .typename =     "IO-SAPIC-level",
-       .startup =      iosapic_startup_level_irq,
-       .shutdown =     iosapic_shutdown_level_irq,
-       .enable =       iosapic_enable_level_irq,
-       .disable =      iosapic_disable_level_irq,
-       .ack =          iosapic_ack_level_irq,
-       .end =          iosapic_end_level_irq,
-       .set_affinity = iosapic_set_affinity
-};
-
-/*
- * Handlers for edge-triggered interrupts.
- */
-
-static unsigned int
-iosapic_startup_edge_irq (unsigned int irq)
-{
-       unmask_irq(irq);
-       /*
-        * IOSAPIC simply drops interrupts pended while the
-        * corresponding pin was masked, so we can't know if an
-        * interrupt is pending already.  Let's hope not...
-        */
-       return 0;
-}
-
-static void
-iosapic_ack_edge_irq (unsigned int irq)
-{
-       irq_desc_t *idesc = irq_desc + irq;
-
-       move_native_irq(irq);
-       /*
-        * Once we have recorded IRQ_PENDING already, we can mask the
-        * interrupt for real. This prevents IRQ storms from unhandled
-        * devices.
-        */
-       if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) ==
-           (IRQ_PENDING|IRQ_DISABLED))
-               mask_irq(irq);
-}
-
-#define iosapic_enable_edge_irq                unmask_irq
-#define iosapic_disable_edge_irq       nop
-#define iosapic_end_edge_irq           nop
-
-struct hw_interrupt_type irq_type_iosapic_edge = {
-       .typename =     "IO-SAPIC-edge",
-       .startup =      iosapic_startup_edge_irq,
-       .shutdown =     iosapic_disable_edge_irq,
-       .enable =       iosapic_enable_edge_irq,
-       .disable =      iosapic_disable_edge_irq,
-       .ack =          iosapic_ack_edge_irq,
-       .end =          iosapic_end_edge_irq,
-       .set_affinity = iosapic_set_affinity
-};
-
-unsigned int
-iosapic_version (char __iomem *addr)
-{
-       /*
-        * IOSAPIC Version Register return 32 bit structure like:
-        * {
-        *      unsigned int version   : 8;
-        *      unsigned int reserved1 : 8;
-        *      unsigned int max_redir : 8;
-        *      unsigned int reserved2 : 8;
-        * }
-        */
-       return iosapic_read(addr, IOSAPIC_VERSION);
-}
-
-static int iosapic_find_sharable_vector (unsigned long trigger,
-                                        unsigned long pol)
-{
-       int i, vector = -1, min_count = -1;
-       struct iosapic_intr_info *info;
-
-       /*
-        * shared vectors for edge-triggered interrupts are not
-        * supported yet
-        */
-       if (trigger == IOSAPIC_EDGE)
-               return -1;
-
-       for (i = IA64_FIRST_DEVICE_VECTOR; i <= IA64_LAST_DEVICE_VECTOR; i++) {
-               info = &iosapic_intr_info[i];
-               if (info->trigger == trigger && info->polarity == pol &&
-                   (info->dmode == IOSAPIC_FIXED || info->dmode ==
-                    IOSAPIC_LOWEST_PRIORITY)) {
-                       if (min_count == -1 || info->count < min_count) {
-                               vector = i;
-                               min_count = info->count;
-                       }
-               }
-       }
-
-       return vector;
-}
-
-/*
- * if the given vector is already owned by other,
- *  assign a new vector for the other and make the vector available
- */
-static void __init
-iosapic_reassign_vector (int vector)
-{
-       int new_vector;
-
-       if (!list_empty(&iosapic_intr_info[vector].rtes)) {
-               new_vector = assign_irq_vector(AUTO_ASSIGN);
-               if (new_vector < 0)
-                       panic("%s: out of interrupt vectors!\n", __FUNCTION__);
-               printk(KERN_INFO "Reassigning vector %d to %d\n",
-                      vector, new_vector);
-               memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
-                      sizeof(struct iosapic_intr_info));
-               INIT_LIST_HEAD(&iosapic_intr_info[new_vector].rtes);
-               list_move(iosapic_intr_info[vector].rtes.next,
-                         &iosapic_intr_info[new_vector].rtes);
-               memset(&iosapic_intr_info[vector], 0,
-                      sizeof(struct iosapic_intr_info));
-               iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
-               INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
-       }
-}
-
-static struct iosapic_rte_info *iosapic_alloc_rte (void)
-{
-       int i;
-       struct iosapic_rte_info *rte;
-       int preallocated = 0;
-
-       if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) {
-               rte = alloc_bootmem(sizeof(struct iosapic_rte_info) *
-                                   NR_PREALLOCATE_RTE_ENTRIES);
-               if (!rte)
-                       return NULL;
-               for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++)
-                       list_add(&rte->rte_list, &free_rte_list);
-       }
-
-       if (!list_empty(&free_rte_list)) {
-               rte = list_entry(free_rte_list.next, struct iosapic_rte_info,
-                                rte_list);
-               list_del(&rte->rte_list);
-               preallocated++;
-       } else {
-               rte = kmalloc(sizeof(struct iosapic_rte_info), GFP_ATOMIC);
-               if (!rte)
-                       return NULL;
-       }
-
-       memset(rte, 0, sizeof(struct iosapic_rte_info));
-       if (preallocated)
-               rte->flags |= RTE_PREALLOCATED;
-
-       return rte;
-}
-
-static void iosapic_free_rte (struct iosapic_rte_info *rte)
-{
-       if (rte->flags & RTE_PREALLOCATED)
-               list_add_tail(&rte->rte_list, &free_rte_list);
-       else
-               kfree(rte);
-}
-
-static inline int vector_is_shared (int vector)
-{
-       return (iosapic_intr_info[vector].count > 1);
-}
-
-static int
-register_intr (unsigned int gsi, int vector, unsigned char delivery,
-              unsigned long polarity, unsigned long trigger)
-{
-       irq_desc_t *idesc;
-       struct hw_interrupt_type *irq_type;
-       int rte_index;
-       int index;
-       unsigned long gsi_base;
-       void __iomem *iosapic_address;
-       struct iosapic_rte_info *rte;
-
-       index = find_iosapic(gsi);
-       if (index < 0) {
-               printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
-                      __FUNCTION__, gsi);
-               return -ENODEV;
-       }
-
-       iosapic_address = iosapic_lists[index].addr;
-       gsi_base = iosapic_lists[index].gsi_base;
-
-       rte = gsi_vector_to_rte(gsi, vector);
-       if (!rte) {
-               rte = iosapic_alloc_rte();
-               if (!rte) {
-                       printk(KERN_WARNING "%s: cannot allocate memory\n",
-                              __FUNCTION__);
-                       return -ENOMEM;
-               }
-
-               rte_index = gsi - gsi_base;
-               rte->rte_index  = rte_index;
-               rte->addr       = iosapic_address;
-               rte->gsi_base   = gsi_base;
-               rte->refcnt++;
-               list_add_tail(&rte->rte_list, &iosapic_intr_info[vector].rtes);
-               iosapic_intr_info[vector].count++;
-               iosapic_lists[index].rtes_inuse++;
-       }
-       else if (vector_is_shared(vector)) {
-               struct iosapic_intr_info *info = &iosapic_intr_info[vector];
-               if (info->trigger != trigger || info->polarity != polarity) {
-                       printk (KERN_WARNING
-                               "%s: cannot override the interrupt\n",
-                               __FUNCTION__);
-                       return -EINVAL;
-               }
-       }
-
-       iosapic_intr_info[vector].polarity = polarity;
-       iosapic_intr_info[vector].dmode    = delivery;
-       iosapic_intr_info[vector].trigger  = trigger;
-
-       if (is_running_on_xen())
-               return 0;
-
-       if (trigger == IOSAPIC_EDGE)
-               irq_type = &irq_type_iosapic_edge;
-       else
-               irq_type = &irq_type_iosapic_level;
-
-       idesc = irq_desc + vector;
-       if (idesc->chip != irq_type) {
-               if (idesc->chip != &no_irq_type)
-                       printk(KERN_WARNING
-                              "%s: changing vector %d from %s to %s\n",
-                              __FUNCTION__, vector,
-                              idesc->chip->typename, irq_type->typename);
-               idesc->chip = irq_type;
-       }
-       return 0;
-}
-
-static unsigned int
-get_target_cpu (unsigned int gsi, int vector)
-{
-#ifdef CONFIG_SMP
-       static int cpu = -1;
-       extern int cpe_vector;
-
-       /*
-        * In case of vector shared by multiple RTEs, all RTEs that
-        * share the vector need to use the same destination CPU.
-        */
-       if (!list_empty(&iosapic_intr_info[vector].rtes))
-               return iosapic_intr_info[vector].dest;
-
-       /*
-        * If the platform supports redirection via XTP, let it
-        * distribute interrupts.
-        */
-       if (smp_int_redirect & SMP_IRQ_REDIRECTION)
-               return cpu_physical_id(smp_processor_id());
-
-       /*
-        * Some interrupts (ACPI SCI, for instance) are registered
-        * before the BSP is marked as online.
-        */
-       if (!cpu_online(smp_processor_id()))
-               return cpu_physical_id(smp_processor_id());
-
-#ifdef CONFIG_ACPI
-       if (cpe_vector > 0 && vector == IA64_CPEP_VECTOR)
-               return get_cpei_target_cpu();
-#endif
-
-#ifdef CONFIG_NUMA
-       {
-               int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
-               cpumask_t cpu_mask;
-
-               iosapic_index = find_iosapic(gsi);
-               if (iosapic_index < 0 ||
-                   iosapic_lists[iosapic_index].node == MAX_NUMNODES)
-                       goto skip_numa_setup;
-
-               cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node);
-
-               for_each_cpu_mask(numa_cpu, cpu_mask) {
-                       if (!cpu_online(numa_cpu))
-                               cpu_clear(numa_cpu, cpu_mask);
-               }
-
-               num_cpus = cpus_weight(cpu_mask);
-
-               if (!num_cpus)
-                       goto skip_numa_setup;
-
-               /* Use vector assignment to distribute across cpus in node */
-               cpu_index = vector % num_cpus;
-
-               for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++)
-                       numa_cpu = next_cpu(numa_cpu, cpu_mask);
-
-               if (numa_cpu != NR_CPUS)
-                       return cpu_physical_id(numa_cpu);
-       }
-skip_numa_setup:
-#endif
-       /*
-        * Otherwise, round-robin interrupt vectors across all the
-        * processors.  (It'd be nice if we could be smarter in the
-        * case of NUMA.)
-        */
-       do {
-               if (++cpu >= NR_CPUS)
-                       cpu = 0;
-       } while (!cpu_online(cpu));
-
-       return cpu_physical_id(cpu);
-#else  /* CONFIG_SMP */
-       return cpu_physical_id(smp_processor_id());
-#endif
-}
-
-/*
- * ACPI can describe IOSAPIC interrupts via static tables and namespace
- * methods.  This provides an interface to register those interrupts and
- * program the IOSAPIC RTE.
- */
-int
-iosapic_register_intr (unsigned int gsi,
-                      unsigned long polarity, unsigned long trigger)
-{
-       int vector, mask = 1, err;
-       unsigned int dest;
-       unsigned long flags;
-       struct iosapic_rte_info *rte;
-       u32 low32;
-again:
-       /*
-        * If this GSI has already been registered (i.e., it's a
-        * shared interrupt, or we lost a race to register it),
-        * don't touch the RTE.
-        */
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               vector = gsi_to_vector(gsi);
-               if (vector > 0) {
-                       rte = gsi_vector_to_rte(gsi, vector);
-                       rte->refcnt++;
-                       spin_unlock_irqrestore(&iosapic_lock, flags);
-                       return vector;
-               }
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-
-       /* If vector is running out, we try to find a sharable vector */
-       vector = assign_irq_vector(AUTO_ASSIGN);
-       if (vector < 0) {
-               vector = iosapic_find_sharable_vector(trigger, polarity);
-               if (vector < 0)
-                       return -ENOSPC;
-       }
-
-       spin_lock_irqsave(&irq_desc[vector].lock, flags);
-       spin_lock(&iosapic_lock);
-       {
-               if (gsi_to_vector(gsi) > 0) {
-                       if (list_empty(&iosapic_intr_info[vector].rtes))
-                               free_irq_vector(vector);
-                       spin_unlock(&iosapic_lock);
-                       spin_unlock_irqrestore(&irq_desc[vector].lock,
-                                              flags);
-                       goto again;
-               }
-
-               dest = get_target_cpu(gsi, vector);
-               err = register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY,
-                             polarity, trigger);
-               if (err < 0) {
-                       spin_unlock(&iosapic_lock);
-                       spin_unlock_irqrestore(&irq_desc[vector].lock,
-                                              flags);
-                       return err;
-               }
-
-               /*
-                * If the vector is shared and already unmasked for
-                * other interrupt sources, don't mask it.
-                */
-               low32 = iosapic_intr_info[vector].low32;
-               if (vector_is_shared(vector) && !(low32 & IOSAPIC_MASK))
-                       mask = 0;
-               set_rte(gsi, vector, dest, mask);
-       }
-       spin_unlock(&iosapic_lock);
-       spin_unlock_irqrestore(&irq_desc[vector].lock, flags);
-
-       printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n",
-              gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-              (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-              cpu_logical_id(dest), dest, vector);
-
-       return vector;
-}
-
-void
-iosapic_unregister_intr (unsigned int gsi)
-{
-       unsigned long flags;
-       int irq, vector, index;
-       irq_desc_t *idesc;
-       u32 low32;
-       unsigned long trigger, polarity;
-       unsigned int dest;
-       struct iosapic_rte_info *rte;
-
-       /*
-        * If the irq associated with the gsi is not found,
-        * iosapic_unregister_intr() is unbalanced. We need to check
-        * this again after getting locks.
-        */
-       irq = gsi_to_irq(gsi);
-       if (irq < 0) {
-               printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n",
-                      gsi);
-               WARN_ON(1);
-               return;
-       }
-       vector = irq_to_vector(irq);
-
-       idesc = irq_desc + irq;
-       spin_lock_irqsave(&idesc->lock, flags);
-       spin_lock(&iosapic_lock);
-       {
-               if ((rte = gsi_vector_to_rte(gsi, vector)) == NULL) {
-                       printk(KERN_ERR
-                              "iosapic_unregister_intr(%u) unbalanced\n",
-                              gsi);
-                       WARN_ON(1);
-                       goto out;
-               }
-
-               if (--rte->refcnt > 0)
-                       goto out;
-
-               /* Mask the interrupt */
-               low32 = iosapic_intr_info[vector].low32 | IOSAPIC_MASK;
-               iosapic_write(rte->addr, IOSAPIC_RTE_LOW(rte->rte_index),
-                             low32);
-
-               /* Remove the rte entry from the list */
-               list_del(&rte->rte_list);
-               iosapic_intr_info[vector].count--;
-               iosapic_free_rte(rte);
-               index = find_iosapic(gsi);
-               iosapic_lists[index].rtes_inuse--;
-               WARN_ON(iosapic_lists[index].rtes_inuse < 0);
-
-               trigger  = iosapic_intr_info[vector].trigger;
-               polarity = iosapic_intr_info[vector].polarity;
-               dest     = iosapic_intr_info[vector].dest;
-               printk(KERN_INFO
-                      "GSI %u (%s, %s) -> CPU %d (0x%04x)"
-                      " vector %d unregistered\n",
-                      gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-                      (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-                      cpu_logical_id(dest), dest, vector);
-
-               if (list_empty(&iosapic_intr_info[vector].rtes)) {
-                       /* Sanity check */
-                       BUG_ON(iosapic_intr_info[vector].count);
-
-                       /* Clear the interrupt controller descriptor */
-                       idesc->chip = &no_irq_type;
-
-                       /* Clear the interrupt information */
-                       memset(&iosapic_intr_info[vector], 0,
-                              sizeof(struct iosapic_intr_info));
-                       iosapic_intr_info[vector].low32 |= IOSAPIC_MASK;
-                       INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
-
-                       if (idesc->action) {
-                               printk(KERN_ERR
-                                      "interrupt handlers still exist on"
-                                      "IRQ %u\n", irq);
-                               WARN_ON(1);
-                       }
-
-                       /* Free the interrupt vector */
-                       free_irq_vector(vector);
-               }
-       }
- out:
-       spin_unlock(&iosapic_lock);
-       spin_unlock_irqrestore(&idesc->lock, flags);
-}
-
-/*
- * ACPI calls this when it finds an entry for a platform interrupt.
- */
-int __init
-iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
-                               int iosapic_vector, u16 eid, u16 id,
-                               unsigned long polarity, unsigned long trigger)
-{
-       static const char * const name[] = {"unknown", "PMI", "INIT", "CPEI"};
-       unsigned char delivery;
-       int vector, mask = 0;
-       unsigned int dest = ((id << 8) | eid) & 0xffff;
-
-       switch (int_type) {
-             case ACPI_INTERRUPT_PMI:
-               vector = iosapic_vector;
-               /*
-                * since PMI vector is alloc'd by FW(ACPI) not by kernel,
-                * we need to make sure the vector is available
-                */
-               iosapic_reassign_vector(vector);
-               delivery = IOSAPIC_PMI;
-               break;
-             case ACPI_INTERRUPT_INIT:
-               vector = assign_irq_vector(AUTO_ASSIGN);
-               if (vector < 0)
-                       panic("%s: out of interrupt vectors!\n", __FUNCTION__);
-               delivery = IOSAPIC_INIT;
-               break;
-             case ACPI_INTERRUPT_CPEI:
-               vector = IA64_CPE_VECTOR;
-               delivery = IOSAPIC_LOWEST_PRIORITY;
-               mask = 1;
-               break;
-             default:
-               printk(KERN_ERR "%s: invalid int type 0x%x\n", __FUNCTION__,
-                      int_type);
-               return -1;
-       }
-
-       register_intr(gsi, vector, delivery, polarity, trigger);
-
-       printk(KERN_INFO
-              "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x)"
-              " vector %d\n",
-              int_type < ARRAY_SIZE(name) ? name[int_type] : "unknown",
-              int_type, gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-              (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-              cpu_logical_id(dest), dest, vector);
-
-       set_rte(gsi, vector, dest, mask);
-       return vector;
-}
-
-/*
- * ACPI calls this when it finds an entry for a legacy ISA IRQ override.
- */
-void __init
-iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
-                         unsigned long polarity,
-                         unsigned long trigger)
-{
-       int vector;
-       unsigned int dest = cpu_physical_id(smp_processor_id());
-
-       vector = isa_irq_to_vector(isa_irq);
-
-       register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, trigger);
-
-       DBG("ISA: IRQ %u -> GSI %u (%s,%s) -> CPU %d (0x%04x) vector %d\n",
-           isa_irq, gsi, trigger == IOSAPIC_EDGE ? "edge" : "level",
-           polarity == IOSAPIC_POL_HIGH ? "high" : "low",
-           cpu_logical_id(dest), dest, vector);
-
-       set_rte(gsi, vector, dest, 1);
-}
-
-void __init
-iosapic_system_init (int system_pcat_compat)
-{
-       int vector;
-
-       for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) {
-               iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
-               /* mark as unused */
-               INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
-       }
-
-       pcat_compat = system_pcat_compat;
-       if (is_running_on_xen())
-               return;
-
-       if (pcat_compat) {
-               /*
-                * Disable the compatibility mode interrupts (8259 style),
-                * needs IN/OUT support enabled.
-                */
-               printk(KERN_INFO
-                      "%s: Disabling PC-AT compatible 8259 interrupts\n",
-                      __FUNCTION__);
-               outb(0xff, 0xA1);
-               outb(0xff, 0x21);
-       }
-}
-
-static inline int
-iosapic_alloc (void)
-{
-       int index;
-
-       for (index = 0; index < NR_IOSAPICS; index++)
-               if (!iosapic_lists[index].addr)
-                       return index;
-
-       printk(KERN_WARNING "%s: failed to allocate iosapic\n", __FUNCTION__);
-       return -1;
-}
-
-static inline void
-iosapic_free (int index)
-{
-       memset(&iosapic_lists[index], 0, sizeof(iosapic_lists[0]));
-}
-
-static inline int
-iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)
-{
-       int index;
-       unsigned int gsi_end, base, end;
-
-       /* check gsi range */
-       gsi_end = gsi_base + ((ver >> 16) & 0xff);
-       for (index = 0; index < NR_IOSAPICS; index++) {
-               if (!iosapic_lists[index].addr)
-                       continue;
-
-               base = iosapic_lists[index].gsi_base;
-               end  = base + iosapic_lists[index].num_rte - 1;
-
-               if (gsi_end < base || end < gsi_base)
-                       continue; /* OK */
-
-               return -EBUSY;
-       }
-       return 0;
-}
-
-int __devinit
-iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
-{
-       int num_rte, err, index;
-       unsigned int isa_irq, ver;
-       char __iomem *addr;
-       unsigned long flags;
-
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               addr = ioremap(phys_addr, 0);
-               ver = iosapic_version(addr);
-
-               if ((err = iosapic_check_gsi_range(gsi_base, ver))) {
-                       iounmap(addr);
-                       spin_unlock_irqrestore(&iosapic_lock, flags);
-                       return err;
-               }
-
-               /*
-                * The MAX_REDIR register holds the highest input pin
-                * number (starting from 0).
-                * We add 1 so that we can use it for number of pins (= RTEs)
-                */
-               num_rte = ((ver >> 16) & 0xff) + 1;
-
-               index = iosapic_alloc();
-               iosapic_lists[index].addr = addr;
-               iosapic_lists[index].gsi_base = gsi_base;
-               iosapic_lists[index].num_rte = num_rte;
-#ifdef CONFIG_NUMA
-               iosapic_lists[index].node = MAX_NUMNODES;
-#endif
-       }
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-
-       if ((gsi_base == 0) && pcat_compat) {
-               /*
-                * Map the legacy ISA devices into the IOSAPIC data.  Some of
-                * these may get reprogrammed later on with data from the ACPI
-                * Interrupt Source Override table.
-                */
-               for (isa_irq = 0; isa_irq < 16; ++isa_irq)
-                       iosapic_override_isa_irq(isa_irq, isa_irq,
-                                                IOSAPIC_POL_HIGH,
-                                                IOSAPIC_EDGE);
-       }
-       return 0;
-}
-
-#ifdef CONFIG_HOTPLUG
-int
-iosapic_remove (unsigned int gsi_base)
-{
-       int index, err = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&iosapic_lock, flags);
-       {
-               index = find_iosapic(gsi_base);
-               if (index < 0) {
-                       printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n",
-                              __FUNCTION__, gsi_base);
-                       goto out;
-               }
-
-               if (iosapic_lists[index].rtes_inuse) {
-                       err = -EBUSY;
-                       printk(KERN_WARNING
-                              "%s: IOSAPIC for GSI base %u is busy\n",
-                              __FUNCTION__, gsi_base);
-                       goto out;
-               }
-
-               iounmap(iosapic_lists[index].addr);
-               iosapic_free(index);
-       }
- out:
-       spin_unlock_irqrestore(&iosapic_lock, flags);
-       return err;
-}
-#endif /* CONFIG_HOTPLUG */
-
-#ifdef CONFIG_NUMA
-void __devinit
-map_iosapic_to_node(unsigned int gsi_base, int node)
-{
-       int index;
-
-       index = find_iosapic(gsi_base);
-       if (index < 0) {
-               printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
-                      __FUNCTION__, gsi_base);
-               return;
-       }
-       iosapic_lists[index].node = node;
-       return;
-}
-#endif
-
-static int __init iosapic_enable_kmalloc (void)
-{
-       iosapic_kmalloc_ok = 1;
-       return 0;
-}
-core_initcall (iosapic_enable_kmalloc);
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c b/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c
deleted file mode 100644 (file)
index 5a9db93..0000000
+++ /dev/null
@@ -1,649 +0,0 @@
-/*
- * linux/arch/ia64/kernel/irq.c
- *
- * Copyright (C) 1998-2001 Hewlett-Packard Co
- *     Stephane Eranian <eranian@hpl.hp.com>
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *
- *  6/10/99: Updated to bring in sync with x86 version to facilitate
- *          support for SMP and different interrupt controllers.
- *
- * 09/15/00 Goutham Rao <goutham.rao@intel.com> Implemented pci_irq_to_vector
- *                      PCI to vector allocation routine.
- * 04/14/2004 Ashok Raj <ashok.raj@intel.com>
- *                                             Added CPU Hotplug handling for IPF.
- */
-
-#include <linux/module.h>
-
-#include <linux/jiffies.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/kernel_stat.h>
-#include <linux/slab.h>
-#include <linux/ptrace.h>
-#include <linux/random.h>      /* for rand_initialize_irq() */
-#include <linux/signal.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/threads.h>
-#include <linux/bitops.h>
-#ifdef CONFIG_XEN
-#include <linux/cpu.h>
-#endif
-
-#include <asm/delay.h>
-#include <asm/intrinsics.h>
-#include <asm/io.h>
-#include <asm/hw_irq.h>
-#include <asm/machvec.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-
-#ifdef CONFIG_PERFMON
-# include <asm/perfmon.h>
-#endif
-
-#define IRQ_DEBUG      0
-
-/* These can be overridden in platform_irq_init */
-int ia64_first_device_vector = IA64_DEF_FIRST_DEVICE_VECTOR;
-int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR;
-
-/* default base addr of IPI table */
-void __iomem *ipi_base_addr = ((void __iomem *)
-                              (__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR));
-
-/*
- * Legacy IRQ to IA-64 vector translation table.
- */
-__u8 isa_irq_to_vector_map[16] = {
-       /* 8259 IRQ translation, first 16 entries */
-       0x2f, 0x20, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29,
-       0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21
-};
-EXPORT_SYMBOL(isa_irq_to_vector_map);
-
-static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_MAX_DEVICE_VECTORS)];
-
-int
-assign_irq_vector (int irq)
-{
-       int pos, vector;
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               extern int xen_assign_irq_vector(int);
-               return xen_assign_irq_vector(irq);
-       }
-#endif
- again:
-       pos = find_first_zero_bit(ia64_vector_mask, IA64_NUM_DEVICE_VECTORS);
-       vector = IA64_FIRST_DEVICE_VECTOR + pos;
-       if (vector > IA64_LAST_DEVICE_VECTOR)
-               return -ENOSPC;
-       if (test_and_set_bit(pos, ia64_vector_mask))
-               goto again;
-       return vector;
-}
-
-void
-free_irq_vector (int vector)
-{
-       int pos;
-
-       if (vector < IA64_FIRST_DEVICE_VECTOR || vector > IA64_LAST_DEVICE_VECTOR)
-               return;
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               extern void xen_free_irq_vector(int);
-               xen_free_irq_vector(vector);
-               return;
-       }
-#endif
-       pos = vector - IA64_FIRST_DEVICE_VECTOR;
-       if (!test_and_clear_bit(pos, ia64_vector_mask))
-               printk(KERN_WARNING "%s: double free!\n", __FUNCTION__);
-}
-
-int
-reserve_irq_vector (int vector)
-{
-       int pos;
-
-       if (vector < IA64_FIRST_DEVICE_VECTOR ||
-           vector > IA64_LAST_DEVICE_VECTOR)
-               return -EINVAL;
-
-       pos = vector - IA64_FIRST_DEVICE_VECTOR;
-       return test_and_set_bit(pos, ia64_vector_mask);
-}
-
-#ifdef CONFIG_SMP
-#      define IS_RESCHEDULE(vec)       (vec == IA64_IPI_RESCHEDULE)
-#else
-#      define IS_RESCHEDULE(vec)       (0)
-#endif
-/*
- * That's where the IVT branches when we get an external
- * interrupt. This branches to the correct hardware IRQ handler via
- * function ptr.
- */
-void
-ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
-{
-       unsigned long saved_tpr;
-
-#if IRQ_DEBUG
-       {
-               unsigned long bsp, sp;
-
-               /*
-                * Note: if the interrupt happened while executing in
-                * the context switch routine (ia64_switch_to), we may
-                * get a spurious stack overflow here.  This is
-                * because the register and the memory stack are not
-                * switched atomically.
-                */
-               bsp = ia64_getreg(_IA64_REG_AR_BSP);
-               sp = ia64_getreg(_IA64_REG_SP);
-
-               if ((sp - bsp) < 1024) {
-                       static unsigned char count;
-                       static long last_time;
-
-                       if (jiffies - last_time > 5*HZ)
-                               count = 0;
-                       if (++count < 5) {
-                               last_time = jiffies;
-                               printk("ia64_handle_irq: DANGER: less than "
-                                      "1KB of free stack space!!\n"
-                                      "(bsp=0x%lx, sp=%lx)\n", bsp, sp);
-                       }
-               }
-       }
-#endif /* IRQ_DEBUG */
-
-       /*
-        * Always set TPR to limit maximum interrupt nesting depth to
-        * 16 (without this, it would be ~240, which could easily lead
-        * to kernel stack overflows).
-        */
-       irq_enter();
-       saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
-       ia64_srlz_d();
-       while (vector != IA64_SPURIOUS_INT_VECTOR) {
-               if (!IS_RESCHEDULE(vector)) {
-                       ia64_setreg(_IA64_REG_CR_TPR, vector);
-                       ia64_srlz_d();
-
-                       __do_IRQ(local_vector_to_irq(vector), regs);
-
-                       /*
-                        * Disable interrupts and send EOI:
-                        */
-                       local_irq_disable();
-                       ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
-               }
-               ia64_eoi();
-               vector = ia64_get_ivr();
-       }
-       /*
-        * This must be done *after* the ia64_eoi().  For example, the keyboard softirq
-        * handler needs to be able to wait for further keyboard interrupts, which can't
-        * come through until ia64_eoi() has been done.
-        */
-       irq_exit();
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-/*
- * This function emulates a interrupt processing when a cpu is about to be
- * brought down.
- */
-void ia64_process_pending_intr(void)
-{
-       ia64_vector vector;
-       unsigned long saved_tpr;
-       extern unsigned int vectors_in_migration[NR_IRQS];
-
-       vector = ia64_get_ivr();
-
-        irq_enter();
-        saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
-        ia64_srlz_d();
-
-        /*
-         * Perform normal interrupt style processing
-         */
-       while (vector != IA64_SPURIOUS_INT_VECTOR) {
-               if (!IS_RESCHEDULE(vector)) {
-                       ia64_setreg(_IA64_REG_CR_TPR, vector);
-                       ia64_srlz_d();
-
-                       /*
-                        * Now try calling normal ia64_handle_irq as it would have got called
-                        * from a real intr handler. Try passing null for pt_regs, hopefully
-                        * it will work. I hope it works!.
-                        * Probably could shared code.
-                        */
-                       vectors_in_migration[local_vector_to_irq(vector)]=0;
-                       __do_IRQ(local_vector_to_irq(vector), NULL);
-
-                       /*
-                        * Disable interrupts and send EOI
-                        */
-                       local_irq_disable();
-                       ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
-               }
-               ia64_eoi();
-               vector = ia64_get_ivr();
-       }
-       irq_exit();
-}
-#endif
-
-
-#ifdef CONFIG_SMP
-extern irqreturn_t handle_IPI (int irq, void *dev_id, struct pt_regs *regs);
-
-static struct irqaction ipi_irqaction = {
-       .handler =      handle_IPI,
-       .flags =        IRQF_DISABLED,
-       .name =         "IPI"
-};
-#endif
-
-#ifdef CONFIG_XEN
-#include <xen/evtchn.h>
-#include <xen/interface/callback.h>
-
-static DEFINE_PER_CPU(int, timer_irq) = -1;
-static DEFINE_PER_CPU(int, ipi_irq) = -1;
-static DEFINE_PER_CPU(int, resched_irq) = -1;
-static DEFINE_PER_CPU(int, cmc_irq) = -1;
-static DEFINE_PER_CPU(int, cmcp_irq) = -1;
-static DEFINE_PER_CPU(int, cpep_irq) = -1;
-static char timer_name[NR_CPUS][15];
-static char ipi_name[NR_CPUS][15];
-static char resched_name[NR_CPUS][15];
-static char cmc_name[NR_CPUS][15];
-static char cmcp_name[NR_CPUS][15];
-static char cpep_name[NR_CPUS][15];
-
-struct saved_irq {
-       unsigned int irq;
-       struct irqaction *action;
-};
-/* 16 should be far optimistic value, since only several percpu irqs
- * are registered early.
- */
-#define MAX_LATE_IRQ   16
-static struct saved_irq saved_percpu_irqs[MAX_LATE_IRQ];
-static unsigned short late_irq_cnt = 0;
-static unsigned short saved_irq_cnt = 0;
-static int xen_slab_ready = 0;
-
-#ifdef CONFIG_SMP
-/* Dummy stub. Though we may check RESCHEDULE_VECTOR before __do_IRQ,
- * it ends up to issue several memory accesses upon percpu data and
- * thus adds unnecessary traffic to other paths.
- */
-static irqreturn_t
-handle_reschedule(int irq, void *dev_id, struct pt_regs *regs)
-{
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction resched_irqaction = {
-       .handler =      handle_reschedule,
-       .flags =        SA_INTERRUPT,
-       .name =         "RESCHED"
-};
-#endif
-
-/*
- * This is xen version percpu irq registration, which needs bind
- * to xen specific evtchn sub-system. One trick here is that xen
- * evtchn binding interface depends on kmalloc because related
- * port needs to be freed at device/cpu down. So we cache the
- * registration on BSP before slab is ready and then deal them
- * at later point. For rest instances happening after slab ready,
- * we hook them to xen evtchn immediately.
- *
- * FIXME: MCA is not supported by far, and thus "nomca" boot param is
- * required.
- */
-static void
-xen_register_percpu_irq(unsigned int cpu, unsigned int vec,
-                        struct irqaction *action, int save)
-{
-       irq_desc_t *desc;
-       int irq = 0;
-
-       if (xen_slab_ready) {
-               switch (vec) {
-               case IA64_TIMER_VECTOR:
-                       sprintf(timer_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_virq_to_irqhandler(VIRQ_ITC, cpu,
-                               action->handler, action->flags,
-                               timer_name[cpu], action->dev_id);
-                       per_cpu(timer_irq,cpu) = irq;
-                       break;
-               case IA64_IPI_RESCHEDULE:
-                       sprintf(resched_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR, cpu,
-                               action->handler, action->flags,
-                               resched_name[cpu], action->dev_id);
-                       per_cpu(resched_irq,cpu) = irq;
-                       break;
-               case IA64_IPI_VECTOR:
-                       sprintf(ipi_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_ipi_to_irqhandler(IPI_VECTOR, cpu,
-                               action->handler, action->flags,
-                               ipi_name[cpu], action->dev_id);
-                       per_cpu(ipi_irq,cpu) = irq;
-                       break;
-               case IA64_CMC_VECTOR:
-                       sprintf(cmc_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_virq_to_irqhandler(VIRQ_MCA_CMC, cpu,
-                                                     action->handler,
-                                                     action->flags,
-                                                     cmc_name[cpu],
-                                                     action->dev_id);
-                       per_cpu(cmc_irq,cpu) = irq;
-                       break;
-               case IA64_CMCP_VECTOR:
-                       sprintf(cmcp_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_ipi_to_irqhandler(CMCP_VECTOR, cpu,
-                                                    action->handler,
-                                                    action->flags,
-                                                    cmcp_name[cpu],
-                                                    action->dev_id);
-                       per_cpu(cmcp_irq,cpu) = irq;
-                       break;
-               case IA64_CPEP_VECTOR:
-                       sprintf(cpep_name[cpu], "%s%d", action->name, cpu);
-                       irq = bind_ipi_to_irqhandler(CPEP_VECTOR, cpu,
-                                                    action->handler,
-                                                    action->flags,
-                                                    cpep_name[cpu],
-                                                    action->dev_id);
-                       per_cpu(cpep_irq,cpu) = irq;
-                       break;
-               case IA64_CPE_VECTOR:
-               case IA64_MCA_RENDEZ_VECTOR:
-               case IA64_PERFMON_VECTOR:
-               case IA64_MCA_WAKEUP_VECTOR:
-               case IA64_SPURIOUS_INT_VECTOR:
-                       /* No need to complain, these aren't supported. */
-                       break;
-               default:
-                       printk(KERN_WARNING "Percpu irq %d is unsupported "
-                              "by xen!\n", vec);
-                       break;
-               }
-               BUG_ON(irq < 0);
-
-               if (irq > 0) {
-                       /*
-                        * Mark percpu.  Without this, migrate_irqs() will
-                        * mark the interrupt for migrations and trigger it
-                        * on cpu hotplug.
-                        */
-                       desc = irq_desc + irq;
-                       desc->status |= IRQ_PER_CPU;
-               }
-       } 
-
-       /* For BSP, we cache registered percpu irqs, and then re-walk
-        * them when initializing APs
-        */
-       if (!cpu && save) {
-               BUG_ON(saved_irq_cnt == MAX_LATE_IRQ);
-               saved_percpu_irqs[saved_irq_cnt].irq = vec;
-               saved_percpu_irqs[saved_irq_cnt].action = action;
-               saved_irq_cnt++;
-               if (!xen_slab_ready)
-                       late_irq_cnt++;
-       }
-}
-
-static void
-xen_bind_early_percpu_irq (void)
-{
-       int i;
-
-       xen_slab_ready = 1;
-       /* There's no race when accessing this cached array, since only
-        * BSP will face with such step shortly
-        */
-       for (i = 0; i < late_irq_cnt; i++)
-               xen_register_percpu_irq(smp_processor_id(),
-                                       saved_percpu_irqs[i].irq,
-                                       saved_percpu_irqs[i].action, 0);
-}
-
-/* FIXME: There's no obvious point to check whether slab is ready. So
- * a hack is used here by utilizing a late time hook.
- */
-extern void (*late_time_init)(void);
-extern char xen_event_callback;
-extern void xen_init_IRQ(void);
-
-#ifdef CONFIG_HOTPLUG_CPU
-static int __devinit
-unbind_evtchn_callback(struct notifier_block *nfb,
-                       unsigned long action, void *hcpu)
-{
-       unsigned int cpu = (unsigned long)hcpu;
-
-       if (action == CPU_DEAD) {
-               /* Unregister evtchn.  */
-               if (per_cpu(cpep_irq,cpu) >= 0) {
-                       unbind_from_irqhandler(per_cpu(cpep_irq, cpu), NULL);
-                       per_cpu(cpep_irq, cpu) = -1;
-               }
-               if (per_cpu(cmcp_irq,cpu) >= 0) {
-                       unbind_from_irqhandler(per_cpu(cmcp_irq, cpu), NULL);
-                       per_cpu(cmcp_irq, cpu) = -1;
-               }
-               if (per_cpu(cmc_irq,cpu) >= 0) {
-                       unbind_from_irqhandler(per_cpu(cmc_irq, cpu), NULL);
-                       per_cpu(cmc_irq, cpu) = -1;
-               }
-               if (per_cpu(ipi_irq,cpu) >= 0) {
-                       unbind_from_irqhandler (per_cpu(ipi_irq, cpu), NULL);
-                       per_cpu(ipi_irq, cpu) = -1;
-               }
-               if (per_cpu(resched_irq,cpu) >= 0) {
-                       unbind_from_irqhandler (per_cpu(resched_irq, cpu),
-                                               NULL);
-                       per_cpu(resched_irq, cpu) = -1;
-               }
-               if (per_cpu(timer_irq,cpu) >= 0) {
-                       unbind_from_irqhandler (per_cpu(timer_irq, cpu), NULL);
-                       per_cpu(timer_irq, cpu) = -1;
-               }
-       }
-       return NOTIFY_OK;
-}
-
-static struct notifier_block unbind_evtchn_notifier = {
-       .notifier_call = unbind_evtchn_callback,
-       .priority = 0
-};
-#endif
-
-DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
-void xen_smp_intr_init_early(unsigned int cpu)
-{
-#ifdef CONFIG_SMP
-       unsigned int i;
-
-       for (i = 0; i < saved_irq_cnt; i++)
-               xen_register_percpu_irq(cpu, saved_percpu_irqs[i].irq,
-                                       saved_percpu_irqs[i].action, 0);
-#endif
-}
-
-void xen_smp_intr_init(void)
-{
-#ifdef CONFIG_SMP
-       unsigned int cpu = smp_processor_id();
-       struct callback_register event = {
-               .type = CALLBACKTYPE_event,
-               .address = (unsigned long)&xen_event_callback,
-       };
-
-       if (cpu == 0) {
-               /* Initialization was already done for boot cpu.  */
-#ifdef CONFIG_HOTPLUG_CPU
-               /* Register the notifier only once.  */
-               register_cpu_notifier(&unbind_evtchn_notifier);
-#endif
-               return;
-       }
-
-       /* This should be piggyback when setup vcpu guest context */
-       BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
-#endif /* CONFIG_SMP */
-}
-
-void
-xen_irq_init(void)
-{
-       struct callback_register event = {
-               .type = CALLBACKTYPE_event,
-               .address = (unsigned long)&xen_event_callback,
-       };
-
-       xen_init_IRQ();
-       BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
-       late_time_init = xen_bind_early_percpu_irq;
-#ifdef CONFIG_SMP
-       register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
-#endif
-}
-
-void
-xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect)
-{
-       int irq = -1;
-
-#ifdef CONFIG_SMP
-       /* TODO: we need to call vcpu_up here */
-       if (unlikely(vector == ap_wakeup_vector)) {
-               extern void xen_send_ipi (int cpu, int vec);
-
-               /* XXX
-                * This should be in __cpu_up(cpu) in ia64 smpboot.c
-                * like x86. But don't want to modify it,
-                * keep it untouched.
-                */
-               xen_smp_intr_init_early(cpu);
-
-               xen_send_ipi (cpu, vector);
-               //vcpu_prepare_and_up(cpu);
-               return;
-       }
-#endif
-
-       switch (vector) {
-               case IA64_IPI_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
-                       break;
-               case IA64_IPI_RESCHEDULE:
-                       irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
-                       break;
-               case IA64_CMCP_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR];
-                       break;
-               case IA64_CPEP_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
-                       break;
-               default:
-                       printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
-                              vector);
-                       irq = 0;
-                       break;
-       }               
-       
-       BUG_ON(irq < 0);
-       notify_remote_via_irq(irq);
-       return;
-}
-#endif /* CONFIG_XEN */
-
-void
-register_percpu_irq (ia64_vector vec, struct irqaction *action)
-{
-       irq_desc_t *desc;
-       unsigned int irq;
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen())
-               return xen_register_percpu_irq(smp_processor_id(), 
-                                              vec, action, 1);
-#endif
-
-       for (irq = 0; irq < NR_IRQS; ++irq)
-               if (irq_to_vector(irq) == vec) {
-                       desc = irq_desc + irq;
-                       desc->status |= IRQ_PER_CPU;
-                       desc->chip = &irq_type_ia64_lsapic;
-                       if (action)
-                               setup_irq(irq, action);
-               }
-}
-
-void __init
-init_IRQ (void)
-{
-       register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
-#ifdef CONFIG_SMP
-       register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
-#endif
-#ifdef CONFIG_PERFMON
-       pfm_init_percpu();
-#endif
-       platform_irq_init();
-#ifdef CONFIG_XEN
-       if (is_running_on_xen() && !ia64_platform_is("xen"))
-               xen_irq_init();
-#endif
-}
-
-void
-ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
-{
-       void __iomem *ipi_addr;
-       unsigned long ipi_data;
-       unsigned long phys_cpu_id;
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               xen_platform_send_ipi(cpu, vector, delivery_mode, redirect);
-               return;
-       }
-#endif
-
-#ifdef CONFIG_SMP
-       phys_cpu_id = cpu_physical_id(cpu);
-#else
-       phys_cpu_id = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff;
-#endif
-
-       /*
-        * cpu number is in 8bit ID and 8bit EID
-        */
-
-       ipi_data = (delivery_mode << 8) | (vector & 0xff);
-       ipi_addr = ipi_base_addr + ((phys_cpu_id << 4) | ((redirect & 1) << 3));
-
-       writeq(ipi_data, ipi_addr);
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/pal.S b/linux-2.6-xen-sparse/arch/ia64/kernel/pal.S
deleted file mode 100644 (file)
index af5cc0b..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * PAL Firmware support
- * IA-64 Processor Programmers Reference Vol 2
- *
- * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999-2001, 2003 Hewlett-Packard Co
- *     David Mosberger <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- *
- * 05/22/2000 eranian Added support for stacked register calls
- * 05/24/2000 eranian Added support for physical mode static calls
- */
-
-#include <asm/asmmacro.h>
-#include <asm/processor.h>
-
-       .data
-       .globl pal_entry_point
-pal_entry_point:
-       data8 ia64_pal_default_handler
-       .text
-
-/*
- * Set the PAL entry point address.  This could be written in C code, but we do it here
- * to keep it all in one module (besides, it's so trivial that it's
- * not a big deal).
- *
- * in0         Address of the PAL entry point (text address, NOT a function descriptor).
- */
-GLOBAL_ENTRY(ia64_pal_handler_init)
-       alloc r3=ar.pfs,1,0,0,0
-       movl r2=pal_entry_point
-       ;;
-       st8 [r2]=in0
-       br.ret.sptk.many rp
-END(ia64_pal_handler_init)
-
-/*
- * Default PAL call handler.  This needs to be coded in assembly because it uses
- * the static calling convention, i.e., the RSE may not be used and calls are
- * done via "br.cond" (not "br.call").
- */
-GLOBAL_ENTRY(ia64_pal_default_handler)
-       mov r8=-1
-       br.cond.sptk.many rp
-END(ia64_pal_default_handler)
-
-/*
- * Make a PAL call using the static calling convention.
- *
- * in0         Index of PAL service
- * in1 - in3   Remaining PAL arguments
- * in4        1 ==> clear psr.ic,  0 ==> don't clear psr.ic
- *
- */
-GLOBAL_ENTRY(__ia64_pal_call_static)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
-       alloc loc1 = ar.pfs,5,5,0,0
-       movl loc2 = pal_entry_point
-1:     {
-         mov r28 = in0
-         mov r29 = in1
-         mov r8 = ip
-       }
-       ;;
-       ld8 loc2 = [loc2]               // loc2 <- entry point
-       tbit.nz p6,p7 = in4, 0
-       adds r8 = 1f-1b,r8
-       mov loc4=ar.rsc                 // save RSE configuration
-       ;;
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-       mov loc3 = psr
-       mov loc0 = rp
-       .body
-       mov r30 = in2
-
-(p6)   rsm psr.i | psr.ic
-       mov r31 = in3
-       mov b7 = loc2
-
-(p7)   rsm psr.i
-       ;;
-(p6)   srlz.i
-       mov rp = r8
-       br.cond.sptk.many b7
-1:     mov psr.l = loc3
-       mov ar.rsc = loc4               // restore RSE configuration
-       mov ar.pfs = loc1
-       mov rp = loc0
-       ;;
-       srlz.d                          // seralize restoration of psr.l
-       br.ret.sptk.many b0
-END(__ia64_pal_call_static)
-
-/*
- * Make a PAL call using the stacked registers calling convention.
- *
- * Inputs:
- *     in0         Index of PAL service
- *     in2 - in3   Remaning PAL arguments
- */
-GLOBAL_ENTRY(ia64_pal_call_stacked)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
-       alloc loc1 = ar.pfs,4,4,4,0
-       movl loc2 = pal_entry_point
-
-       mov r28  = in0                  // Index MUST be copied to r28
-       mov out0 = in0                  // AND in0 of PAL function
-       mov loc0 = rp
-       .body
-       ;;
-       ld8 loc2 = [loc2]               // loc2 <- entry point
-       mov out1 = in1
-       mov out2 = in2
-       mov out3 = in3
-       mov loc3 = psr
-       ;;
-       rsm psr.i
-       mov b7 = loc2
-       ;;
-       br.call.sptk.many rp=b7         // now make the call
-.ret0: mov psr.l  = loc3
-       mov ar.pfs = loc1
-       mov rp = loc0
-       ;;
-       srlz.d                          // serialize restoration of psr.l
-       br.ret.sptk.many b0
-END(ia64_pal_call_stacked)
-
-/*
- * Make a physical mode PAL call using the static registers calling convention.
- *
- * Inputs:
- *     in0         Index of PAL service
- *     in2 - in3   Remaning PAL arguments
- *
- * PSR_LP, PSR_TB, PSR_ID, PSR_DA are never set by the kernel.
- * So we don't need to clear them.
- */
-#define PAL_PSR_BITS_TO_CLEAR                                                  \
-       (IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT  | IA64_PSR_DB | IA64_PSR_RT |  \
-        IA64_PSR_DD | IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED |                \
-        IA64_PSR_DFL | IA64_PSR_DFH)
-
-#define PAL_PSR_BITS_TO_SET                                                    \
-       (IA64_PSR_BN)
-
-
-GLOBAL_ENTRY(ia64_pal_call_phys_static)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
-       alloc loc1 = ar.pfs,4,7,0,0
-       movl loc2 = pal_entry_point
-1:     {
-         mov r28  = in0                // copy procedure index
-         mov r8   = ip                 // save ip to compute branch
-         mov loc0 = rp                 // save rp
-       }
-       .body
-       ;;
-       ld8 loc2 = [loc2]               // loc2 <- entry point
-       mov r29  = in1                  // first argument
-       mov r30  = in2                  // copy arg2
-       mov r31  = in3                  // copy arg3
-       ;;
-       mov loc3 = psr                  // save psr
-       adds r8  = 1f-1b,r8             // calculate return address for call
-       ;;
-       mov loc4=ar.rsc                 // save RSE configuration
-       dep.z loc2=loc2,0,61            // convert pal entry point to physical
-       tpa r8=r8                       // convert rp to physical
-       ;;
-       mov b7 = loc2                   // install target to branch reg
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-       movl r16=PAL_PSR_BITS_TO_CLEAR
-       movl r17=PAL_PSR_BITS_TO_SET
-       ;;
-       or loc3=loc3,r17                // add in psr the bits to set
-       ;;
-       andcm r16=loc3,r16              // removes bits to clear from psr
-       br.call.sptk.many rp=ia64_switch_mode_phys
-.ret1: mov rp = r8                     // install return address (physical)
-       mov loc5 = r19
-       mov loc6 = r20
-       br.cond.sptk.many b7
-1:
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-       mov r16=loc3                    // r16= original psr
-       mov r19=loc5
-       mov r20=loc6
-       br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
-.ret2:
-       mov psr.l = loc3                // restore init PSR
-
-       mov ar.pfs = loc1
-       mov rp = loc0
-       ;;
-       mov ar.rsc=loc4                 // restore RSE configuration
-       srlz.d                          // seralize restoration of psr.l
-       br.ret.sptk.many b0
-END(ia64_pal_call_phys_static)
-
-/*
- * Make a PAL call using the stacked registers in physical mode.
- *
- * Inputs:
- *     in0         Index of PAL service
- *     in2 - in3   Remaning PAL arguments
- */
-GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
-       alloc   loc1 = ar.pfs,5,7,4,0
-       movl    loc2 = pal_entry_point
-1:     {
-         mov r28  = in0                // copy procedure index
-         mov loc0 = rp         // save rp
-       }
-       .body
-       ;;
-       ld8 loc2 = [loc2]               // loc2 <- entry point
-       mov loc3 = psr                  // save psr
-       ;;
-       mov loc4=ar.rsc                 // save RSE configuration
-       dep.z loc2=loc2,0,61            // convert pal entry point to physical
-       ;;
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-       movl r16=PAL_PSR_BITS_TO_CLEAR
-       movl r17=PAL_PSR_BITS_TO_SET
-       ;;
-       or loc3=loc3,r17                // add in psr the bits to set
-       mov b7 = loc2                   // install target to branch reg
-       ;;
-       andcm r16=loc3,r16              // removes bits to clear from psr
-       br.call.sptk.many rp=ia64_switch_mode_phys
-
-       mov out0 = in0                  // first argument
-       mov out1 = in1                  // copy arg2
-       mov out2 = in2                  // copy arg3
-       mov out3 = in3                  // copy arg3
-       mov loc5 = r19
-       mov loc6 = r20
-
-       br.call.sptk.many rp=b7         // now make the call
-
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-       mov r16=loc3                    // r16= original psr
-       mov r19=loc5
-       mov r20=loc6
-       br.call.sptk.many rp=ia64_switch_mode_virt      // return to virtual mode
-
-       mov psr.l  = loc3               // restore init PSR
-       mov ar.pfs = loc1
-       mov rp = loc0
-       ;;
-       mov ar.rsc=loc4                 // restore RSE configuration
-       srlz.d                          // seralize restoration of psr.l
-       br.ret.sptk.many b0
-END(ia64_pal_call_phys_stacked)
-
-/*
- * Save scratch fp scratch regs which aren't saved in pt_regs already (fp10-fp15).
- *
- * NOTE: We need to do this since firmware (SAL and PAL) may use any of the scratch
- * regs fp-low partition.
- *
- * Inputs:
- *      in0    Address of stack storage for fp regs
- */
-GLOBAL_ENTRY(ia64_save_scratch_fpregs)
-       alloc r3=ar.pfs,1,0,0,0
-       add r2=16,in0
-       ;;
-       stf.spill [in0] = f10,32
-       stf.spill [r2]  = f11,32
-       ;;
-       stf.spill [in0] = f12,32
-       stf.spill [r2]  = f13,32
-       ;;
-       stf.spill [in0] = f14,32
-       stf.spill [r2]  = f15,32
-       br.ret.sptk.many rp
-END(ia64_save_scratch_fpregs)
-
-/*
- * Load scratch fp scratch regs (fp10-fp15)
- *
- * Inputs:
- *      in0    Address of stack storage for fp regs
- */
-GLOBAL_ENTRY(ia64_load_scratch_fpregs)
-       alloc r3=ar.pfs,1,0,0,0
-       add r2=16,in0
-       ;;
-       ldf.fill  f10 = [in0],32
-       ldf.fill  f11 = [r2],32
-       ;;
-       ldf.fill  f12 = [in0],32
-       ldf.fill  f13 = [r2],32
-       ;;
-       ldf.fill  f14 = [in0],32
-       ldf.fill  f15 = [r2],32
-       br.ret.sptk.many rp
-END(ia64_load_scratch_fpregs)
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/patch.c b/linux-2.6-xen-sparse/arch/ia64/kernel/patch.c
deleted file mode 100644 (file)
index 73597d2..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Instruction-patching support.
- *
- * Copyright (C) 2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-#include <linux/init.h>
-#include <linux/string.h>
-
-#include <asm/patch.h>
-#include <asm/processor.h>
-#include <asm/sections.h>
-#include <asm/system.h>
-#include <asm/unistd.h>
-
-/*
- * This was adapted from code written by Tony Luck:
- *
- * The 64-bit value in a "movl reg=value" is scattered between the two words of the bundle
- * like this:
- *
- * 6  6         5         4         3         2         1
- * 3210987654321098765432109876543210987654321098765432109876543210
- * ABBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCDEEEEEFFFFFFFFFGGGGGGG
- *
- * CCCCCCCCCCCCCCCCCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- * xxxxAFFFFFFFFFEEEEEDxGGGGGGGxxxxxxxxxxxxxBBBBBBBBBBBBBBBBBBBBBBB
- */
-static u64
-get_imm64 (u64 insn_addr)
-{
-       u64 *p = (u64 *) (insn_addr & -16);     /* mask out slot number */
-
-       return ( (p[1] & 0x0800000000000000UL) << 4)  | /*A*/
-               ((p[1] & 0x00000000007fffffUL) << 40) | /*B*/
-               ((p[0] & 0xffffc00000000000UL) >> 24) | /*C*/
-               ((p[1] & 0x0000100000000000UL) >> 23) | /*D*/
-               ((p[1] & 0x0003e00000000000UL) >> 29) | /*E*/
-               ((p[1] & 0x07fc000000000000UL) >> 43) | /*F*/
-               ((p[1] & 0x000007f000000000UL) >> 36);  /*G*/
-}
-
-/* Patch instruction with "val" where "mask" has 1 bits. */
-void
-ia64_patch (u64 insn_addr, u64 mask, u64 val)
-{
-       u64 m0, m1, v0, v1, b0, b1, *b = (u64 *) (insn_addr & -16);
-#      define insn_mask ((1UL << 41) - 1)
-       unsigned long shift;
-
-       b0 = b[0]; b1 = b[1];
-       shift = 5 + 41 * (insn_addr % 16); /* 5 bits of template, then 3 x 41-bit instructions */
-       if (shift >= 64) {
-               m1 = mask << (shift - 64);
-               v1 = val << (shift - 64);
-       } else {
-               m0 = mask << shift; m1 = mask >> (64 - shift);
-               v0 = val  << shift; v1 = val >> (64 - shift);
-               b[0] = (b0 & ~m0) | (v0 & m0);
-       }
-       b[1] = (b1 & ~m1) | (v1 & m1);
-}
-
-void
-ia64_patch_imm64 (u64 insn_addr, u64 val)
-{
-       /* The assembler may generate offset pointing to either slot 1
-          or slot 2 for a long (2-slot) instruction, occupying slots 1
-          and 2.  */
-       insn_addr &= -16UL;
-       ia64_patch(insn_addr + 2,
-                  0x01fffefe000UL, (  ((val & 0x8000000000000000UL) >> 27) /* bit 63 -> 36 */
-                                    | ((val & 0x0000000000200000UL) <<  0) /* bit 21 -> 21 */
-                                    | ((val & 0x00000000001f0000UL) <<  6) /* bit 16 -> 22 */
-                                    | ((val & 0x000000000000ff80UL) << 20) /* bit  7 -> 27 */
-                                    | ((val & 0x000000000000007fUL) << 13) /* bit  0 -> 13 */));
-       ia64_patch(insn_addr + 1, 0x1ffffffffffUL, val >> 22);
-}
-
-void
-ia64_patch_imm60 (u64 insn_addr, u64 val)
-{
-       /* The assembler may generate offset pointing to either slot 1
-          or slot 2 for a long (2-slot) instruction, occupying slots 1
-          and 2.  */
-       insn_addr &= -16UL;
-       ia64_patch(insn_addr + 2,
-                  0x011ffffe000UL, (  ((val & 0x0800000000000000UL) >> 23) /* bit 59 -> 36 */
-                                    | ((val & 0x00000000000fffffUL) << 13) /* bit  0 -> 13 */));
-       ia64_patch(insn_addr + 1, 0x1fffffffffcUL, val >> 18);
-}
-
-/*
- * We need sometimes to load the physical address of a kernel
- * object.  Often we can convert the virtual address to physical
- * at execution time, but sometimes (either for performance reasons
- * or during error recovery) we cannot to this.  Patch the marked
- * bundles to load the physical address.
- */
-void __init
-ia64_patch_vtop (unsigned long start, unsigned long end)
-{
-       s32 *offp = (s32 *) start;
-       u64 ip;
-
-       while (offp < (s32 *) end) {
-               ip = (u64) offp + *offp;
-
-               /* replace virtual address with corresponding physical address: */
-               ia64_patch_imm64(ip, ia64_tpa(get_imm64(ip)));
-               ia64_fc((void *) ip);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-void __init
-ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)
-{
-       static int first_time = 1;
-       int need_workaround;
-       s32 *offp = (s32 *) start;
-       u64 *wp;
-
-       need_workaround = (local_cpu_data->family == 0x1f && local_cpu_data->model == 0);
-
-       if (first_time) {
-               first_time = 0;
-               if (need_workaround)
-                       printk(KERN_INFO "Leaving McKinley Errata 9 workaround enabled\n");
-               else
-                       printk(KERN_INFO "McKinley Errata 9 workaround not needed; "
-                              "disabling it\n");
-       }
-       if (need_workaround)
-               return;
-
-       while (offp < (s32 *) end) {
-               wp = (u64 *) ia64_imva((char *) offp + *offp);
-               wp[0] = 0x0000000100000000UL; /* nop.m 0; nop.i 0; nop.i 0 */
-               wp[1] = 0x0004000000000200UL;
-               wp[2] = 0x0000000100000011UL; /* nop.m 0; nop.i 0; br.ret.sptk.many b6 */
-               wp[3] = 0x0084006880000200UL;
-               ia64_fc(wp); ia64_fc(wp + 2);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-static void __init
-patch_fsyscall_table (unsigned long start, unsigned long end)
-{
-       extern unsigned long fsyscall_table[NR_syscalls];
-       s32 *offp = (s32 *) start;
-       u64 ip;
-
-       while (offp < (s32 *) end) {
-               ip = (u64) ia64_imva((char *) offp + *offp);
-               ia64_patch_imm64(ip, (u64) fsyscall_table);
-               ia64_fc((void *) ip);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-static void __init
-patch_brl_fsys_bubble_down (unsigned long start, unsigned long end)
-{
-       extern char fsys_bubble_down[];
-       s32 *offp = (s32 *) start;
-       u64 ip;
-
-       while (offp < (s32 *) end) {
-               ip = (u64) offp + *offp;
-               ia64_patch_imm60((u64) ia64_imva((void *) ip),
-                                (u64) (fsys_bubble_down - (ip & -16)) / 16);
-               ia64_fc((void *) ip);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-extern char __start_gate_running_on_xen_patchlist[];
-extern char __end_gate_running_on_xen_patchlist[];
-
-void
-patch_running_on_xen(unsigned long start, unsigned long end)
-{
-       extern int running_on_xen;
-       s32 *offp = (s32 *)start;
-       u64 ip;
-
-       while (offp < (s32 *)end) {
-               ip = (u64)ia64_imva((char *)offp + *offp);
-               ia64_patch_imm64(ip, (u64)&running_on_xen);
-               ia64_fc((void *)ip);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-static void
-patch_brl_symaddr(unsigned long start, unsigned long end,
-                  unsigned long symaddr)
-{
-       s32 *offp = (s32 *)start;
-       u64 ip;
-
-       while (offp < (s32 *)end) {
-               ip = (u64)offp + *offp;
-               ia64_patch_imm60((u64)ia64_imva((void *)ip),
-                                (u64)(symaddr - (ip & -16)) / 16);
-               ia64_fc((void *)ip);
-               ++offp;
-       }
-       ia64_sync_i();
-       ia64_srlz_i();
-}
-
-#define EXTERN_PATCHLIST(name)                                 \
-       extern char __start_gate_brl_##name##_patchlist[];      \
-       extern char __end_gate_brl_##name##_patchlist[];        \
-       extern char name[]
-
-#define PATCH_BRL_SYMADDR(name)                                                \
-       patch_brl_symaddr((unsigned long)__start_gate_brl_##name##_patchlist, \
-                         (unsigned long)__end_gate_brl_##name##_patchlist,   \
-                         (unsigned long)name)
-
-static void
-patch_brl_in_vdso(void)
-{
-       EXTERN_PATCHLIST(xen_ssm_i_0);
-       EXTERN_PATCHLIST(xen_ssm_i_1);
-
-       PATCH_BRL_SYMADDR(xen_ssm_i_0);
-       PATCH_BRL_SYMADDR(xen_ssm_i_1);
-}
-#else
-#define patch_running_on_xen(start, end)       do { } while (0)
-#define patch_brl_in_vdso()                    do { } while (0)
-#endif
-
-void __init
-ia64_patch_gate (void)
-{
-#      define START(name)      ((unsigned long) __start_gate_##name##_patchlist)
-#      define END(name)        ((unsigned long)__end_gate_##name##_patchlist)
-
-       patch_fsyscall_table(START(fsyscall), END(fsyscall));
-       patch_brl_fsys_bubble_down(START(brl_fsys_bubble_down), END(brl_fsys_bubble_down));
-#ifdef CONFIG_XEN
-       patch_running_on_xen(START(running_on_xen), END(running_on_xen));
-       patch_brl_in_vdso();
-#endif
-       ia64_patch_vtop(START(vtop), END(vtop));
-       ia64_patch_mckinley_e9(START(mckinley_e9), END(mckinley_e9));
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c b/linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c
deleted file mode 100644 (file)
index 59d277f..0000000
+++ /dev/null
@@ -1,6943 +0,0 @@
-/*
- * This file implements the perfmon-2 subsystem which is used
- * to program the IA-64 Performance Monitoring Unit (PMU).
- *
- * The initial version of perfmon.c was written by
- * Ganesh Venkitachalam, IBM Corp.
- *
- * Then it was modified for perfmon-1.x by Stephane Eranian and
- * David Mosberger, Hewlett Packard Co.
- *
- * Version Perfmon-2.x is a rewrite of perfmon-1.x
- * by Stephane Eranian, Hewlett Packard Co.
- *
- * Copyright (C) 1999-2005  Hewlett Packard Co
- *               Stephane Eranian <eranian@hpl.hp.com>
- *               David Mosberger-Tang <davidm@hpl.hp.com>
- *
- * More information about perfmon available at:
- *     http://www.hpl.hp.com/research/linux/perfmon
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/smp_lock.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/init.h>
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-#include <linux/sysctl.h>
-#include <linux/list.h>
-#include <linux/file.h>
-#include <linux/poll.h>
-#include <linux/vfs.h>
-#include <linux/pagemap.h>
-#include <linux/mount.h>
-#include <linux/bitops.h>
-#include <linux/capability.h>
-#include <linux/rcupdate.h>
-#include <linux/completion.h>
-
-#include <asm/errno.h>
-#include <asm/intrinsics.h>
-#include <asm/page.h>
-#include <asm/perfmon.h>
-#include <asm/processor.h>
-#include <asm/signal.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/delay.h>
-
-#ifdef CONFIG_PERFMON
-#ifdef CONFIG_XEN
-//#include <xen/xenoprof.h>
-#include <xen/interface/xenoprof.h>
-
-static int xenoprof_is_primary = 0;
-#define init_xenoprof_primary(is_primary)  (xenoprof_is_primary = (is_primary))
-#define is_xenoprof_primary()  (xenoprof_is_primary)
-#define XEN_NOT_SUPPORTED_YET                                          \
-       do {                                                            \
-               if (is_running_on_xen()) {                              \
-                       printk("%s is not supported yet under xen.\n",  \
-                              __func__);                               \
-                       return -ENOSYS;                                 \
-               }                                                       \
-       } while (0)
-#else
-#define init_xenoprof_primary(is_primary)      do { } while (0)
-#define is_xenoprof_primary()                  (0)
-#define XEN_NOT_SUPPORTED_YET                  do { } while (0)
-#define HYPERVISOR_perfmon_op(cmd, arg, count) do { } while (0)
-#endif
-
-/*
- * perfmon context state
- */
-#define PFM_CTX_UNLOADED       1       /* context is not loaded onto any task */
-#define PFM_CTX_LOADED         2       /* context is loaded onto a task */
-#define PFM_CTX_MASKED         3       /* context is loaded but monitoring is masked due to overflow */
-#define PFM_CTX_ZOMBIE         4       /* owner of the context is closing it */
-
-#define PFM_INVALID_ACTIVATION (~0UL)
-
-/*
- * depth of message queue
- */
-#define PFM_MAX_MSGS           32
-#define PFM_CTXQ_EMPTY(g)      ((g)->ctx_msgq_head == (g)->ctx_msgq_tail)
-
-/*
- * type of a PMU register (bitmask).
- * bitmask structure:
- *     bit0   : register implemented
- *     bit1   : end marker
- *     bit2-3 : reserved
- *     bit4   : pmc has pmc.pm
- *     bit5   : pmc controls a counter (has pmc.oi), pmd is used as counter
- *     bit6-7 : register type
- *     bit8-31: reserved
- */
-#define PFM_REG_NOTIMPL                0x0 /* not implemented at all */
-#define PFM_REG_IMPL           0x1 /* register implemented */
-#define PFM_REG_END            0x2 /* end marker */
-#define PFM_REG_MONITOR                (0x1<<4|PFM_REG_IMPL) /* a PMC with a pmc.pm field only */
-#define PFM_REG_COUNTING       (0x2<<4|PFM_REG_MONITOR) /* a monitor + pmc.oi+ PMD used as a counter */
-#define PFM_REG_CONTROL                (0x4<<4|PFM_REG_IMPL) /* PMU control register */
-#define        PFM_REG_CONFIG          (0x8<<4|PFM_REG_IMPL) /* configuration register */
-#define PFM_REG_BUFFER         (0xc<<4|PFM_REG_IMPL) /* PMD used as buffer */
-
-#define PMC_IS_LAST(i) (pmu_conf->pmc_desc[i].type & PFM_REG_END)
-#define PMD_IS_LAST(i) (pmu_conf->pmd_desc[i].type & PFM_REG_END)
-
-#define PMC_OVFL_NOTIFY(ctx, i)        ((ctx)->ctx_pmds[i].flags &  PFM_REGFL_OVFL_NOTIFY)
-
-/* i assumed unsigned */
-#define PMC_IS_IMPL(i)   (i< PMU_MAX_PMCS && (pmu_conf->pmc_desc[i].type & PFM_REG_IMPL))
-#define PMD_IS_IMPL(i)   (i< PMU_MAX_PMDS && (pmu_conf->pmd_desc[i].type & PFM_REG_IMPL))
-
-/* XXX: these assume that register i is implemented */
-#define PMD_IS_COUNTING(i) ((pmu_conf->pmd_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
-#define PMC_IS_COUNTING(i) ((pmu_conf->pmc_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
-#define PMC_IS_MONITOR(i)  ((pmu_conf->pmc_desc[i].type & PFM_REG_MONITOR)  == PFM_REG_MONITOR)
-#define PMC_IS_CONTROL(i)  ((pmu_conf->pmc_desc[i].type & PFM_REG_CONTROL)  == PFM_REG_CONTROL)
-
-#define PMC_DFL_VAL(i)     pmu_conf->pmc_desc[i].default_value
-#define PMC_RSVD_MASK(i)   pmu_conf->pmc_desc[i].reserved_mask
-#define PMD_PMD_DEP(i)    pmu_conf->pmd_desc[i].dep_pmd[0]
-#define PMC_PMD_DEP(i)    pmu_conf->pmc_desc[i].dep_pmd[0]
-
-#define PFM_NUM_IBRS     IA64_NUM_DBG_REGS
-#define PFM_NUM_DBRS     IA64_NUM_DBG_REGS
-
-#define CTX_OVFL_NOBLOCK(c)    ((c)->ctx_fl_block == 0)
-#define CTX_HAS_SMPL(c)                ((c)->ctx_fl_is_sampling)
-#define PFM_CTX_TASK(h)                (h)->ctx_task
-
-#define PMU_PMC_OI             5 /* position of pmc.oi bit */
-
-/* XXX: does not support more than 64 PMDs */
-#define CTX_USED_PMD(ctx, mask) (ctx)->ctx_used_pmds[0] |= (mask)
-#define CTX_IS_USED_PMD(ctx, c) (((ctx)->ctx_used_pmds[0] & (1UL << (c))) != 0UL)
-
-#define CTX_USED_MONITOR(ctx, mask) (ctx)->ctx_used_monitors[0] |= (mask)
-
-#define CTX_USED_IBR(ctx,n)    (ctx)->ctx_used_ibrs[(n)>>6] |= 1UL<< ((n) % 64)
-#define CTX_USED_DBR(ctx,n)    (ctx)->ctx_used_dbrs[(n)>>6] |= 1UL<< ((n) % 64)
-#define CTX_USES_DBREGS(ctx)   (((pfm_context_t *)(ctx))->ctx_fl_using_dbreg==1)
-#define PFM_CODE_RR    0       /* requesting code range restriction */
-#define PFM_DATA_RR    1       /* requestion data range restriction */
-
-#define PFM_CPUINFO_CLEAR(v)   pfm_get_cpu_var(pfm_syst_info) &= ~(v)
-#define PFM_CPUINFO_SET(v)     pfm_get_cpu_var(pfm_syst_info) |= (v)
-#define PFM_CPUINFO_GET()      pfm_get_cpu_var(pfm_syst_info)
-
-#define RDEP(x)        (1UL<<(x))
-
-/*
- * context protection macros
- * in SMP:
- *     - we need to protect against CPU concurrency (spin_lock)
- *     - we need to protect against PMU overflow interrupts (local_irq_disable)
- * in UP:
- *     - we need to protect against PMU overflow interrupts (local_irq_disable)
- *
- * spin_lock_irqsave()/spin_lock_irqrestore():
- *     in SMP: local_irq_disable + spin_lock
- *     in UP : local_irq_disable
- *
- * spin_lock()/spin_lock():
- *     in UP : removed automatically
- *     in SMP: protect against context accesses from other CPU. interrupts
- *             are not masked. This is useful for the PMU interrupt handler
- *             because we know we will not get PMU concurrency in that code.
- */
-#define PROTECT_CTX(c, f) \
-       do {  \
-               DPRINT(("spinlock_irq_save ctx %p by [%d]\n", c, current->pid)); \
-               spin_lock_irqsave(&(c)->ctx_lock, f); \
-               DPRINT(("spinlocked ctx %p  by [%d]\n", c, current->pid)); \
-       } while(0)
-
-#define UNPROTECT_CTX(c, f) \
-       do { \
-               DPRINT(("spinlock_irq_restore ctx %p by [%d]\n", c, current->pid)); \
-               spin_unlock_irqrestore(&(c)->ctx_lock, f); \
-       } while(0)
-
-#define PROTECT_CTX_NOPRINT(c, f) \
-       do {  \
-               spin_lock_irqsave(&(c)->ctx_lock, f); \
-       } while(0)
-
-
-#define UNPROTECT_CTX_NOPRINT(c, f) \
-       do { \
-               spin_unlock_irqrestore(&(c)->ctx_lock, f); \
-       } while(0)
-
-
-#define PROTECT_CTX_NOIRQ(c) \
-       do {  \
-               spin_lock(&(c)->ctx_lock); \
-       } while(0)
-
-#define UNPROTECT_CTX_NOIRQ(c) \
-       do { \
-               spin_unlock(&(c)->ctx_lock); \
-       } while(0)
-
-
-#ifdef CONFIG_SMP
-
-#define GET_ACTIVATION()       pfm_get_cpu_var(pmu_activation_number)
-#define INC_ACTIVATION()       pfm_get_cpu_var(pmu_activation_number)++
-#define SET_ACTIVATION(c)      (c)->ctx_last_activation = GET_ACTIVATION()
-
-#else /* !CONFIG_SMP */
-#define SET_ACTIVATION(t)      do {} while(0)
-#define GET_ACTIVATION(t)      do {} while(0)
-#define INC_ACTIVATION(t)      do {} while(0)
-#endif /* CONFIG_SMP */
-
-#define SET_PMU_OWNER(t, c)    do { pfm_get_cpu_var(pmu_owner) = (t); pfm_get_cpu_var(pmu_ctx) = (c); } while(0)
-#define GET_PMU_OWNER()                pfm_get_cpu_var(pmu_owner)
-#define GET_PMU_CTX()          pfm_get_cpu_var(pmu_ctx)
-
-#define LOCK_PFS(g)            spin_lock_irqsave(&pfm_sessions.pfs_lock, g)
-#define UNLOCK_PFS(g)          spin_unlock_irqrestore(&pfm_sessions.pfs_lock, g)
-
-#define PFM_REG_RETFLAG_SET(flags, val)        do { flags &= ~PFM_REG_RETFL_MASK; flags |= (val); } while(0)
-
-/*
- * cmp0 must be the value of pmc0
- */
-#define PMC0_HAS_OVFL(cmp0)  (cmp0 & ~0x1UL)
-
-#define PFMFS_MAGIC 0xa0b4d889
-
-/*
- * debugging
- */
-#define PFM_DEBUGGING 1
-#ifdef PFM_DEBUGGING
-#define DPRINT(a) \
-       do { \
-               if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), current->pid); printk a; } \
-       } while (0)
-
-#define DPRINT_ovfl(a) \
-       do { \
-               if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), current->pid); printk a; } \
-       } while (0)
-#endif
-
-/*
- * 64-bit software counter structure
- *
- * the next_reset_type is applied to the next call to pfm_reset_regs()
- */
-typedef struct {
-       unsigned long   val;            /* virtual 64bit counter value */
-       unsigned long   lval;           /* last reset value */
-       unsigned long   long_reset;     /* reset value on sampling overflow */
-       unsigned long   short_reset;    /* reset value on overflow */
-       unsigned long   reset_pmds[4];  /* which other pmds to reset when this counter overflows */
-       unsigned long   smpl_pmds[4];   /* which pmds are accessed when counter overflow */
-       unsigned long   seed;           /* seed for random-number generator */
-       unsigned long   mask;           /* mask for random-number generator */
-       unsigned int    flags;          /* notify/do not notify */
-       unsigned long   eventid;        /* overflow event identifier */
-} pfm_counter_t;
-
-/*
- * context flags
- */
-typedef struct {
-       unsigned int block:1;           /* when 1, task will blocked on user notifications */
-       unsigned int system:1;          /* do system wide monitoring */
-       unsigned int using_dbreg:1;     /* using range restrictions (debug registers) */
-       unsigned int is_sampling:1;     /* true if using a custom format */
-       unsigned int excl_idle:1;       /* exclude idle task in system wide session */
-       unsigned int going_zombie:1;    /* context is zombie (MASKED+blocking) */
-       unsigned int trap_reason:2;     /* reason for going into pfm_handle_work() */
-       unsigned int no_msg:1;          /* no message sent on overflow */
-       unsigned int can_restart:1;     /* allowed to issue a PFM_RESTART */
-       unsigned int reserved:22;
-} pfm_context_flags_t;
-
-#define PFM_TRAP_REASON_NONE           0x0     /* default value */
-#define PFM_TRAP_REASON_BLOCK          0x1     /* we need to block on overflow */
-#define PFM_TRAP_REASON_RESET          0x2     /* we need to reset PMDs */
-
-
-/*
- * perfmon context: encapsulates all the state of a monitoring session
- */
-
-typedef struct pfm_context {
-       spinlock_t              ctx_lock;               /* context protection */
-
-       pfm_context_flags_t     ctx_flags;              /* bitmask of flags  (block reason incl.) */
-       unsigned int            ctx_state;              /* state: active/inactive (no bitfield) */
-
-       struct task_struct      *ctx_task;              /* task to which context is attached */
-
-       unsigned long           ctx_ovfl_regs[4];       /* which registers overflowed (notification) */
-
-       struct completion       ctx_restart_done;       /* use for blocking notification mode */
-
-       unsigned long           ctx_used_pmds[4];       /* bitmask of PMD used            */
-       unsigned long           ctx_all_pmds[4];        /* bitmask of all accessible PMDs */
-       unsigned long           ctx_reload_pmds[4];     /* bitmask of force reload PMD on ctxsw in */
-
-       unsigned long           ctx_all_pmcs[4];        /* bitmask of all accessible PMCs */
-       unsigned long           ctx_reload_pmcs[4];     /* bitmask of force reload PMC on ctxsw in */
-       unsigned long           ctx_used_monitors[4];   /* bitmask of monitor PMC being used */
-
-       unsigned long           ctx_pmcs[IA64_NUM_PMC_REGS];    /*  saved copies of PMC values */
-
-       unsigned int            ctx_used_ibrs[1];               /* bitmask of used IBR (speedup ctxsw in) */
-       unsigned int            ctx_used_dbrs[1];               /* bitmask of used DBR (speedup ctxsw in) */
-       unsigned long           ctx_dbrs[IA64_NUM_DBG_REGS];    /* DBR values (cache) when not loaded */
-       unsigned long           ctx_ibrs[IA64_NUM_DBG_REGS];    /* IBR values (cache) when not loaded */
-
-       pfm_counter_t           ctx_pmds[IA64_NUM_PMD_REGS]; /* software state for PMDS */
-
-       u64                     ctx_saved_psr_up;       /* only contains psr.up value */
-
-       unsigned long           ctx_last_activation;    /* context last activation number for last_cpu */
-       unsigned int            ctx_last_cpu;           /* CPU id of current or last CPU used (SMP only) */
-       unsigned int            ctx_cpu;                /* cpu to which perfmon is applied (system wide) */
-
-       int                     ctx_fd;                 /* file descriptor used my this context */
-       pfm_ovfl_arg_t          ctx_ovfl_arg;           /* argument to custom buffer format handler */
-
-       pfm_buffer_fmt_t        *ctx_buf_fmt;           /* buffer format callbacks */
-       void                    *ctx_smpl_hdr;          /* points to sampling buffer header kernel vaddr */
-       unsigned long           ctx_smpl_size;          /* size of sampling buffer */
-       void                    *ctx_smpl_vaddr;        /* user level virtual address of smpl buffer */
-
-       wait_queue_head_t       ctx_msgq_wait;
-       pfm_msg_t               ctx_msgq[PFM_MAX_MSGS];
-       int                     ctx_msgq_head;
-       int                     ctx_msgq_tail;
-       struct fasync_struct    *ctx_async_queue;
-
-       wait_queue_head_t       ctx_zombieq;            /* termination cleanup wait queue */
-} pfm_context_t;
-
-/*
- * magic number used to verify that structure is really
- * a perfmon context
- */
-#define PFM_IS_FILE(f)         ((f)->f_op == &pfm_file_ops)
-
-#define PFM_GET_CTX(t)         ((pfm_context_t *)(t)->thread.pfm_context)
-
-#ifdef CONFIG_SMP
-#define SET_LAST_CPU(ctx, v)   (ctx)->ctx_last_cpu = (v)
-#define GET_LAST_CPU(ctx)      (ctx)->ctx_last_cpu
-#else
-#define SET_LAST_CPU(ctx, v)   do {} while(0)
-#define GET_LAST_CPU(ctx)      do {} while(0)
-#endif
-
-
-#define ctx_fl_block           ctx_flags.block
-#define ctx_fl_system          ctx_flags.system
-#define ctx_fl_using_dbreg     ctx_flags.using_dbreg
-#define ctx_fl_is_sampling     ctx_flags.is_sampling
-#define ctx_fl_excl_idle       ctx_flags.excl_idle
-#define ctx_fl_going_zombie    ctx_flags.going_zombie
-#define ctx_fl_trap_reason     ctx_flags.trap_reason
-#define ctx_fl_no_msg          ctx_flags.no_msg
-#define ctx_fl_can_restart     ctx_flags.can_restart
-
-#define PFM_SET_WORK_PENDING(t, v)     do { (t)->thread.pfm_needs_checking = v; } while(0);
-#define PFM_GET_WORK_PENDING(t)                (t)->thread.pfm_needs_checking
-
-/*
- * global information about all sessions
- * mostly used to synchronize between system wide and per-process
- */
-typedef struct {
-       spinlock_t              pfs_lock;                  /* lock the structure */
-
-       unsigned int            pfs_task_sessions;         /* number of per task sessions */
-       unsigned int            pfs_sys_sessions;          /* number of per system wide sessions */
-       unsigned int            pfs_sys_use_dbregs;        /* incremented when a system wide session uses debug regs */
-       unsigned int            pfs_ptrace_use_dbregs;     /* incremented when a process uses debug regs */
-       struct task_struct      *pfs_sys_session[NR_CPUS]; /* point to task owning a system-wide session */
-} pfm_session_t;
-
-/*
- * information about a PMC or PMD.
- * dep_pmd[]: a bitmask of dependent PMD registers
- * dep_pmc[]: a bitmask of dependent PMC registers
- */
-typedef int (*pfm_reg_check_t)(struct task_struct *task, pfm_context_t *ctx, unsigned int cnum, unsigned long *val, struct pt_regs *regs);
-typedef struct {
-       unsigned int            type;
-       int                     pm_pos;
-       unsigned long           default_value;  /* power-on default value */
-       unsigned long           reserved_mask;  /* bitmask of reserved bits */
-       pfm_reg_check_t         read_check;
-       pfm_reg_check_t         write_check;
-       unsigned long           dep_pmd[4];
-       unsigned long           dep_pmc[4];
-} pfm_reg_desc_t;
-
-/* assume cnum is a valid monitor */
-#define PMC_PM(cnum, val)      (((val) >> (pmu_conf->pmc_desc[cnum].pm_pos)) & 0x1)
-
-/*
- * This structure is initialized at boot time and contains
- * a description of the PMU main characteristics.
- *
- * If the probe function is defined, detection is based
- * on its return value: 
- *     - 0 means recognized PMU
- *     - anything else means not supported
- * When the probe function is not defined, then the pmu_family field
- * is used and it must match the host CPU family such that:
- *     - cpu->family & config->pmu_family != 0
- */
-typedef struct {
-       unsigned long  ovfl_val;        /* overflow value for counters */
-
-       pfm_reg_desc_t *pmc_desc;       /* detailed PMC register dependencies descriptions */
-       pfm_reg_desc_t *pmd_desc;       /* detailed PMD register dependencies descriptions */
-
-       unsigned int   num_pmcs;        /* number of PMCS: computed at init time */
-       unsigned int   num_pmds;        /* number of PMDS: computed at init time */
-       unsigned long  impl_pmcs[4];    /* bitmask of implemented PMCS */
-       unsigned long  impl_pmds[4];    /* bitmask of implemented PMDS */
-
-       char          *pmu_name;        /* PMU family name */
-       unsigned int  pmu_family;       /* cpuid family pattern used to identify pmu */
-       unsigned int  flags;            /* pmu specific flags */
-       unsigned int  num_ibrs;         /* number of IBRS: computed at init time */
-       unsigned int  num_dbrs;         /* number of DBRS: computed at init time */
-       unsigned int  num_counters;     /* PMC/PMD counting pairs : computed at init time */
-       int           (*probe)(void);   /* customized probe routine */
-       unsigned int  use_rr_dbregs:1;  /* set if debug registers used for range restriction */
-} pmu_config_t;
-/*
- * PMU specific flags
- */
-#define PFM_PMU_IRQ_RESEND     1       /* PMU needs explicit IRQ resend */
-
-/*
- * debug register related type definitions
- */
-typedef struct {
-       unsigned long ibr_mask:56;
-       unsigned long ibr_plm:4;
-       unsigned long ibr_ig:3;
-       unsigned long ibr_x:1;
-} ibr_mask_reg_t;
-
-typedef struct {
-       unsigned long dbr_mask:56;
-       unsigned long dbr_plm:4;
-       unsigned long dbr_ig:2;
-       unsigned long dbr_w:1;
-       unsigned long dbr_r:1;
-} dbr_mask_reg_t;
-
-typedef union {
-       unsigned long  val;
-       ibr_mask_reg_t ibr;
-       dbr_mask_reg_t dbr;
-} dbreg_t;
-
-
-/*
- * perfmon command descriptions
- */
-typedef struct {
-       int             (*cmd_func)(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
-       char            *cmd_name;
-       int             cmd_flags;
-       unsigned int    cmd_narg;
-       size_t          cmd_argsize;
-       int             (*cmd_getsize)(void *arg, size_t *sz);
-} pfm_cmd_desc_t;
-
-#define PFM_CMD_FD             0x01    /* command requires a file descriptor */
-#define PFM_CMD_ARG_READ       0x02    /* command must read argument(s) */
-#define PFM_CMD_ARG_RW         0x04    /* command must read/write argument(s) */
-#define PFM_CMD_STOP           0x08    /* command does not work on zombie context */
-
-
-#define PFM_CMD_NAME(cmd)      pfm_cmd_tab[(cmd)].cmd_name
-#define PFM_CMD_READ_ARG(cmd)  (pfm_cmd_tab[(cmd)].cmd_flags & PFM_CMD_ARG_READ)
-#define PFM_CMD_RW_ARG(cmd)    (pfm_cmd_tab[(cmd)].cmd_flags & PFM_CMD_ARG_RW)
-#define PFM_CMD_USE_FD(cmd)    (pfm_cmd_tab[(cmd)].cmd_flags & PFM_CMD_FD)
-#define PFM_CMD_STOPPED(cmd)   (pfm_cmd_tab[(cmd)].cmd_flags & PFM_CMD_STOP)
-
-#define PFM_CMD_ARG_MANY       -1 /* cannot be zero */
-
-typedef struct {
-       unsigned long pfm_spurious_ovfl_intr_count;     /* keep track of spurious ovfl interrupts */
-       unsigned long pfm_replay_ovfl_intr_count;       /* keep track of replayed ovfl interrupts */
-       unsigned long pfm_ovfl_intr_count;              /* keep track of ovfl interrupts */
-       unsigned long pfm_ovfl_intr_cycles;             /* cycles spent processing ovfl interrupts */
-       unsigned long pfm_ovfl_intr_cycles_min;         /* min cycles spent processing ovfl interrupts */
-       unsigned long pfm_ovfl_intr_cycles_max;         /* max cycles spent processing ovfl interrupts */
-       unsigned long pfm_smpl_handler_calls;
-       unsigned long pfm_smpl_handler_cycles;
-       char pad[SMP_CACHE_BYTES] ____cacheline_aligned;
-} pfm_stats_t;
-
-/*
- * perfmon internal variables
- */
-static pfm_stats_t             pfm_stats[NR_CPUS];
-static pfm_session_t           pfm_sessions;   /* global sessions information */
-
-static DEFINE_SPINLOCK(pfm_alt_install_check);
-static pfm_intr_handler_desc_t  *pfm_alt_intr_handler;
-
-static struct proc_dir_entry   *perfmon_dir;
-static pfm_uuid_t              pfm_null_uuid = {0,};
-
-static spinlock_t              pfm_buffer_fmt_lock;
-static LIST_HEAD(pfm_buffer_fmt_list);
-
-static pmu_config_t            *pmu_conf;
-
-/* sysctl() controls */
-pfm_sysctl_t pfm_sysctl;
-EXPORT_SYMBOL(pfm_sysctl);
-
-static ctl_table pfm_ctl_table[]={
-       {1, "debug", &pfm_sysctl.debug, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
-       {2, "debug_ovfl", &pfm_sysctl.debug_ovfl, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
-       {3, "fastctxsw", &pfm_sysctl.fastctxsw, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
-       {4, "expert_mode", &pfm_sysctl.expert_mode, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
-       { 0, },
-};
-static ctl_table pfm_sysctl_dir[] = {
-       {1, "perfmon", NULL, 0, 0755, pfm_ctl_table, },
-       {0,},
-};
-static ctl_table pfm_sysctl_root[] = {
-       {1, "kernel", NULL, 0, 0755, pfm_sysctl_dir, },
-       {0,},
-};
-static struct ctl_table_header *pfm_sysctl_header;
-
-static int pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
-
-#define pfm_get_cpu_var(v)             __ia64_per_cpu_var(v)
-#define pfm_get_cpu_data(a,b)          per_cpu(a, b)
-
-static inline void
-pfm_put_task(struct task_struct *task)
-{
-       if (task != current) put_task_struct(task);
-}
-
-static inline void
-pfm_set_task_notify(struct task_struct *task)
-{
-       struct thread_info *info;
-
-       info = (struct thread_info *) ((char *) task + IA64_TASK_SIZE);
-       set_bit(TIF_NOTIFY_RESUME, &info->flags);
-}
-
-static inline void
-pfm_clear_task_notify(void)
-{
-       clear_thread_flag(TIF_NOTIFY_RESUME);
-}
-
-static inline void
-pfm_reserve_page(unsigned long a)
-{
-       SetPageReserved(vmalloc_to_page((void *)a));
-}
-static inline void
-pfm_unreserve_page(unsigned long a)
-{
-       ClearPageReserved(vmalloc_to_page((void*)a));
-}
-
-static inline unsigned long
-pfm_protect_ctx_ctxsw(pfm_context_t *x)
-{
-       spin_lock(&(x)->ctx_lock);
-       return 0UL;
-}
-
-static inline void
-pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f)
-{
-       spin_unlock(&(x)->ctx_lock);
-}
-
-static inline unsigned int
-pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct)
-{
-       return do_munmap(mm, addr, len);
-}
-
-static inline unsigned long 
-pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec)
-{
-       return get_unmapped_area(file, addr, len, pgoff, flags);
-}
-
-
-static int
-pfmfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data,
-            struct vfsmount *mnt)
-{
-       return get_sb_pseudo(fs_type, "pfm:", NULL, PFMFS_MAGIC, mnt);
-}
-
-static struct file_system_type pfm_fs_type = {
-       .name     = "pfmfs",
-       .get_sb   = pfmfs_get_sb,
-       .kill_sb  = kill_anon_super,
-};
-
-DEFINE_PER_CPU(unsigned long, pfm_syst_info);
-DEFINE_PER_CPU(struct task_struct *, pmu_owner);
-DEFINE_PER_CPU(pfm_context_t  *, pmu_ctx);
-DEFINE_PER_CPU(unsigned long, pmu_activation_number);
-EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info);
-
-
-/* forward declaration */
-static struct file_operations pfm_file_ops;
-
-/*
- * forward declarations
- */
-#ifndef CONFIG_SMP
-static void pfm_lazy_save_regs (struct task_struct *ta);
-#endif
-
-void dump_pmu_state(const char *);
-static int pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
-
-#include "perfmon_itanium.h"
-#include "perfmon_mckinley.h"
-#include "perfmon_montecito.h"
-#include "perfmon_generic.h"
-
-static pmu_config_t *pmu_confs[]={
-       &pmu_conf_mont,
-       &pmu_conf_mck,
-       &pmu_conf_ita,
-       &pmu_conf_gen, /* must be last */
-       NULL
-};
-
-
-static int pfm_end_notify_user(pfm_context_t *ctx);
-
-static inline void
-pfm_clear_psr_pp(void)
-{
-       ia64_rsm(IA64_PSR_PP);
-       ia64_srlz_i();
-}
-
-static inline void
-pfm_set_psr_pp(void)
-{
-       ia64_ssm(IA64_PSR_PP);
-       ia64_srlz_i();
-}
-
-static inline void
-pfm_clear_psr_up(void)
-{
-       ia64_rsm(IA64_PSR_UP);
-       ia64_srlz_i();
-}
-
-static inline void
-pfm_set_psr_up(void)
-{
-       ia64_ssm(IA64_PSR_UP);
-       ia64_srlz_i();
-}
-
-static inline unsigned long
-pfm_get_psr(void)
-{
-       unsigned long tmp;
-       tmp = ia64_getreg(_IA64_REG_PSR);
-       ia64_srlz_i();
-       return tmp;
-}
-
-static inline void
-pfm_set_psr_l(unsigned long val)
-{
-       ia64_setreg(_IA64_REG_PSR_L, val);
-       ia64_srlz_i();
-}
-
-static inline void
-pfm_freeze_pmu(void)
-{
-       ia64_set_pmc(0,1UL);
-       ia64_srlz_d();
-}
-
-static inline void
-pfm_unfreeze_pmu(void)
-{
-       ia64_set_pmc(0,0UL);
-       ia64_srlz_d();
-}
-
-static inline void
-pfm_restore_ibrs(unsigned long *ibrs, unsigned int nibrs)
-{
-       int i;
-
-       for (i=0; i < nibrs; i++) {
-               ia64_set_ibr(i, ibrs[i]);
-               ia64_dv_serialize_instruction();
-       }
-       ia64_srlz_i();
-}
-
-static inline void
-pfm_restore_dbrs(unsigned long *dbrs, unsigned int ndbrs)
-{
-       int i;
-
-       for (i=0; i < ndbrs; i++) {
-               ia64_set_dbr(i, dbrs[i]);
-               ia64_dv_serialize_data();
-       }
-       ia64_srlz_d();
-}
-
-/*
- * PMD[i] must be a counter. no check is made
- */
-static inline unsigned long
-pfm_read_soft_counter(pfm_context_t *ctx, int i)
-{
-       return ctx->ctx_pmds[i].val + (ia64_get_pmd(i) & pmu_conf->ovfl_val);
-}
-
-/*
- * PMD[i] must be a counter. no check is made
- */
-static inline void
-pfm_write_soft_counter(pfm_context_t *ctx, int i, unsigned long val)
-{
-       unsigned long ovfl_val = pmu_conf->ovfl_val;
-
-       ctx->ctx_pmds[i].val = val  & ~ovfl_val;
-       /*
-        * writing to unimplemented part is ignore, so we do not need to
-        * mask off top part
-        */
-       ia64_set_pmd(i, val & ovfl_val);
-}
-
-static pfm_msg_t *
-pfm_get_new_msg(pfm_context_t *ctx)
-{
-       int idx, next;
-
-       next = (ctx->ctx_msgq_tail+1) % PFM_MAX_MSGS;
-
-       DPRINT(("ctx_fd=%p head=%d tail=%d\n", ctx, ctx->ctx_msgq_head, ctx->ctx_msgq_tail));
-       if (next == ctx->ctx_msgq_head) return NULL;
-
-       idx =   ctx->ctx_msgq_tail;
-       ctx->ctx_msgq_tail = next;
-
-       DPRINT(("ctx=%p head=%d tail=%d msg=%d\n", ctx, ctx->ctx_msgq_head, ctx->ctx_msgq_tail, idx));
-
-       return ctx->ctx_msgq+idx;
-}
-
-static pfm_msg_t *
-pfm_get_next_msg(pfm_context_t *ctx)
-{
-       pfm_msg_t *msg;
-
-       DPRINT(("ctx=%p head=%d tail=%d\n", ctx, ctx->ctx_msgq_head, ctx->ctx_msgq_tail));
-
-       if (PFM_CTXQ_EMPTY(ctx)) return NULL;
-
-       /*
-        * get oldest message
-        */
-       msg = ctx->ctx_msgq+ctx->ctx_msgq_head;
-
-       /*
-        * and move forward
-        */
-       ctx->ctx_msgq_head = (ctx->ctx_msgq_head+1) % PFM_MAX_MSGS;
-
-       DPRINT(("ctx=%p head=%d tail=%d type=%d\n", ctx, ctx->ctx_msgq_head, ctx->ctx_msgq_tail, msg->pfm_gen_msg.msg_type));
-
-       return msg;
-}
-
-static void
-pfm_reset_msgq(pfm_context_t *ctx)
-{
-       ctx->ctx_msgq_head = ctx->ctx_msgq_tail = 0;
-       DPRINT(("ctx=%p msgq reset\n", ctx));
-}
-
-static void *
-pfm_rvmalloc(unsigned long size)
-{
-       void *mem;
-       unsigned long addr;
-
-       size = PAGE_ALIGN(size);
-       mem  = vmalloc(size);
-       if (mem) {
-               //printk("perfmon: CPU%d pfm_rvmalloc(%ld)=%p\n", smp_processor_id(), size, mem);
-               memset(mem, 0, size);
-               addr = (unsigned long)mem;
-               while (size > 0) {
-                       pfm_reserve_page(addr);
-                       addr+=PAGE_SIZE;
-                       size-=PAGE_SIZE;
-               }
-       }
-       return mem;
-}
-
-static void
-pfm_rvfree(void *mem, unsigned long size)
-{
-       unsigned long addr;
-
-       if (mem) {
-               DPRINT(("freeing physical buffer @%p size=%lu\n", mem, size));
-               addr = (unsigned long) mem;
-               while ((long) size > 0) {
-                       pfm_unreserve_page(addr);
-                       addr+=PAGE_SIZE;
-                       size-=PAGE_SIZE;
-               }
-               vfree(mem);
-       }
-       return;
-}
-
-static pfm_context_t *
-pfm_context_alloc(void)
-{
-       pfm_context_t *ctx;
-
-       /* 
-        * allocate context descriptor 
-        * must be able to free with interrupts disabled
-        */
-       ctx = kmalloc(sizeof(pfm_context_t), GFP_KERNEL);
-       if (ctx) {
-               memset(ctx, 0, sizeof(pfm_context_t));
-               DPRINT(("alloc ctx @%p\n", ctx));
-       }
-       return ctx;
-}
-
-static void
-pfm_context_free(pfm_context_t *ctx)
-{
-       if (ctx) {
-               DPRINT(("free ctx @%p\n", ctx));
-               kfree(ctx);
-       }
-}
-
-static void
-pfm_mask_monitoring(struct task_struct *task)
-{
-       pfm_context_t *ctx = PFM_GET_CTX(task);
-       struct thread_struct *th = &task->thread;
-       unsigned long mask, val, ovfl_mask;
-       int i;
-
-       DPRINT_ovfl(("masking monitoring for [%d]\n", task->pid));
-
-       ovfl_mask = pmu_conf->ovfl_val;
-       /*
-        * monitoring can only be masked as a result of a valid
-        * counter overflow. In UP, it means that the PMU still
-        * has an owner. Note that the owner can be different
-        * from the current task. However the PMU state belongs
-        * to the owner.
-        * In SMP, a valid overflow only happens when task is
-        * current. Therefore if we come here, we know that
-        * the PMU state belongs to the current task, therefore
-        * we can access the live registers.
-        *
-        * So in both cases, the live register contains the owner's
-        * state. We can ONLY touch the PMU registers and NOT the PSR.
-        *
-        * As a consequence to this call, the thread->pmds[] array
-        * contains stale information which must be ignored
-        * when context is reloaded AND monitoring is active (see
-        * pfm_restart).
-        */
-       mask = ctx->ctx_used_pmds[0];
-       for (i = 0; mask; i++, mask>>=1) {
-               /* skip non used pmds */
-               if ((mask & 0x1) == 0) continue;
-               val = ia64_get_pmd(i);
-
-               if (PMD_IS_COUNTING(i)) {
-                       /*
-                        * we rebuild the full 64 bit value of the counter
-                        */
-                       ctx->ctx_pmds[i].val += (val & ovfl_mask);
-               } else {
-                       ctx->ctx_pmds[i].val = val;
-               }
-               DPRINT_ovfl(("pmd[%d]=0x%lx hw_pmd=0x%lx\n",
-                       i,
-                       ctx->ctx_pmds[i].val,
-                       val & ovfl_mask));
-       }
-       /*
-        * mask monitoring by setting the privilege level to 0
-        * we cannot use psr.pp/psr.up for this, it is controlled by
-        * the user
-        *
-        * if task is current, modify actual registers, otherwise modify
-        * thread save state, i.e., what will be restored in pfm_load_regs()
-        */
-       mask = ctx->ctx_used_monitors[0] >> PMU_FIRST_COUNTER;
-       for(i= PMU_FIRST_COUNTER; mask; i++, mask>>=1) {
-               if ((mask & 0x1) == 0UL) continue;
-               ia64_set_pmc(i, th->pmcs[i] & ~0xfUL);
-               th->pmcs[i] &= ~0xfUL;
-               DPRINT_ovfl(("pmc[%d]=0x%lx\n", i, th->pmcs[i]));
-       }
-       /*
-        * make all of this visible
-        */
-       ia64_srlz_d();
-}
-
-/*
- * must always be done with task == current
- *
- * context must be in MASKED state when calling
- */
-static void
-pfm_restore_monitoring(struct task_struct *task)
-{
-       pfm_context_t *ctx = PFM_GET_CTX(task);
-       struct thread_struct *th = &task->thread;
-       unsigned long mask, ovfl_mask;
-       unsigned long psr, val;
-       int i, is_system;
-
-       is_system = ctx->ctx_fl_system;
-       ovfl_mask = pmu_conf->ovfl_val;
-
-       if (task != current) {
-               printk(KERN_ERR "perfmon.%d: invalid task[%d] current[%d]\n", __LINE__, task->pid, current->pid);
-               return;
-       }
-       if (ctx->ctx_state != PFM_CTX_MASKED) {
-               printk(KERN_ERR "perfmon.%d: task[%d] current[%d] invalid state=%d\n", __LINE__,
-                       task->pid, current->pid, ctx->ctx_state);
-               return;
-       }
-       psr = pfm_get_psr();
-       /*
-        * monitoring is masked via the PMC.
-        * As we restore their value, we do not want each counter to
-        * restart right away. We stop monitoring using the PSR,
-        * restore the PMC (and PMD) and then re-establish the psr
-        * as it was. Note that there can be no pending overflow at
-        * this point, because monitoring was MASKED.
-        *
-        * system-wide session are pinned and self-monitoring
-        */
-       if (is_system && (PFM_CPUINFO_GET() & PFM_CPUINFO_DCR_PP)) {
-               /* disable dcr pp */
-               ia64_setreg(_IA64_REG_CR_DCR, ia64_getreg(_IA64_REG_CR_DCR) & ~IA64_DCR_PP);
-               pfm_clear_psr_pp();
-       } else {
-               pfm_clear_psr_up();
-       }
-       /*
-        * first, we restore the PMD
-        */
-       mask = ctx->ctx_used_pmds[0];
-       for (i = 0; mask; i++, mask>>=1) {
-               /* skip non used pmds */
-               if ((mask & 0x1) == 0) continue;
-
-               if (PMD_IS_COUNTING(i)) {
-                       /*
-                        * we split the 64bit value according to
-                        * counter width
-                        */
-                       val = ctx->ctx_pmds[i].val & ovfl_mask;
-                       ctx->ctx_pmds[i].val &= ~ovfl_mask;
-               } else {
-                       val = ctx->ctx_pmds[i].val;
-               }
-               ia64_set_pmd(i, val);
-
-               DPRINT(("pmd[%d]=0x%lx hw_pmd=0x%lx\n",
-                       i,
-                       ctx->ctx_pmds[i].val,
-                       val));
-       }
-       /*
-        * restore the PMCs
-        */
-       mask = ctx->ctx_used_monitors[0] >> PMU_FIRST_COUNTER;
-       for(i= PMU_FIRST_COUNTER; mask; i++, mask>>=1) {
-               if ((mask & 0x1) == 0UL) continue;
-               th->pmcs[i] = ctx->ctx_pmcs[i];
-               ia64_set_pmc(i, th->pmcs[i]);
-               DPRINT(("[%d] pmc[%d]=0x%lx\n", task->pid, i, th->pmcs[i]));
-       }
-       ia64_srlz_d();
-
-       /*
-        * must restore DBR/IBR because could be modified while masked
-        * XXX: need to optimize 
-        */
-       if (ctx->ctx_fl_using_dbreg) {
-               pfm_restore_ibrs(ctx->ctx_ibrs, pmu_conf->num_ibrs);
-               pfm_restore_dbrs(ctx->ctx_dbrs, pmu_conf->num_dbrs);
-       }
-
-       /*
-        * now restore PSR
-        */
-       if (is_system && (PFM_CPUINFO_GET() & PFM_CPUINFO_DCR_PP)) {
-               /* enable dcr pp */
-               ia64_setreg(_IA64_REG_CR_DCR, ia64_getreg(_IA64_REG_CR_DCR) | IA64_DCR_PP);
-               ia64_srlz_i();
-       }
-       pfm_set_psr_l(psr);
-}
-
-static inline void
-pfm_save_pmds(unsigned long *pmds, unsigned long mask)
-{
-       int i;
-
-       ia64_srlz_d();
-
-       for (i=0; mask; i++, mask>>=1) {
-               if (mask & 0x1) pmds[i] = ia64_get_pmd(i);
-       }
-}
-
-/*
- * reload from thread state (used for ctxw only)
- */
-static inline void
-pfm_restore_pmds(unsigned long *pmds, unsigned long mask)
-{
-       int i;
-       unsigned long val, ovfl_val = pmu_conf->ovfl_val;
-
-       for (i=0; mask; i++, mask>>=1) {
-               if ((mask & 0x1) == 0) continue;
-               val = PMD_IS_COUNTING(i) ? pmds[i] & ovfl_val : pmds[i];
-               ia64_set_pmd(i, val);
-       }
-       ia64_srlz_d();
-}
-
-/*
- * propagate PMD from context to thread-state
- */
-static inline void
-pfm_copy_pmds(struct task_struct *task, pfm_context_t *ctx)
-{
-       struct thread_struct *thread = &task->thread;
-       unsigned long ovfl_val = pmu_conf->ovfl_val;
-       unsigned long mask = ctx->ctx_all_pmds[0];
-       unsigned long val;
-       int i;
-
-       DPRINT(("mask=0x%lx\n", mask));
-
-       for (i=0; mask; i++, mask>>=1) {
-
-               val = ctx->ctx_pmds[i].val;
-
-               /*
-                * We break up the 64 bit value into 2 pieces
-                * the lower bits go to the machine state in the
-                * thread (will be reloaded on ctxsw in).
-                * The upper part stays in the soft-counter.
-                */
-               if (PMD_IS_COUNTING(i)) {
-                       ctx->ctx_pmds[i].val = val & ~ovfl_val;
-                        val &= ovfl_val;
-               }
-               thread->pmds[i] = val;
-
-               DPRINT(("pmd[%d]=0x%lx soft_val=0x%lx\n",
-                       i,
-                       thread->pmds[i],
-                       ctx->ctx_pmds[i].val));
-       }
-}
-
-/*
- * propagate PMC from context to thread-state
- */
-static inline void
-pfm_copy_pmcs(struct task_struct *task, pfm_context_t *ctx)
-{
-       struct thread_struct *thread = &task->thread;
-       unsigned long mask = ctx->ctx_all_pmcs[0];
-       int i;
-
-       DPRINT(("mask=0x%lx\n", mask));
-
-       for (i=0; mask; i++, mask>>=1) {
-               /* masking 0 with ovfl_val yields 0 */
-               thread->pmcs[i] = ctx->ctx_pmcs[i];
-               DPRINT(("pmc[%d]=0x%lx\n", i, thread->pmcs[i]));
-       }
-}
-
-
-
-static inline void
-pfm_restore_pmcs(unsigned long *pmcs, unsigned long mask)
-{
-       int i;
-
-       for (i=0; mask; i++, mask>>=1) {
-               if ((mask & 0x1) == 0) continue;
-               ia64_set_pmc(i, pmcs[i]);
-       }
-       ia64_srlz_d();
-}
-
-static inline int
-pfm_uuid_cmp(pfm_uuid_t a, pfm_uuid_t b)
-{
-       return memcmp(a, b, sizeof(pfm_uuid_t));
-}
-
-static inline int
-pfm_buf_fmt_exit(pfm_buffer_fmt_t *fmt, struct task_struct *task, void *buf, struct pt_regs *regs)
-{
-       int ret = 0;
-       if (fmt->fmt_exit) ret = (*fmt->fmt_exit)(task, buf, regs);
-       return ret;
-}
-
-static inline int
-pfm_buf_fmt_getsize(pfm_buffer_fmt_t *fmt, struct task_struct *task, unsigned int flags, int cpu, void *arg, unsigned long *size)
-{
-       int ret = 0;
-       if (fmt->fmt_getsize) ret = (*fmt->fmt_getsize)(task, flags, cpu, arg, size);
-       return ret;
-}
-
-
-static inline int
-pfm_buf_fmt_validate(pfm_buffer_fmt_t *fmt, struct task_struct *task, unsigned int flags,
-                    int cpu, void *arg)
-{
-       int ret = 0;
-       if (fmt->fmt_validate) ret = (*fmt->fmt_validate)(task, flags, cpu, arg);
-       return ret;
-}
-
-static inline int
-pfm_buf_fmt_init(pfm_buffer_fmt_t *fmt, struct task_struct *task, void *buf, unsigned int flags,
-                    int cpu, void *arg)
-{
-       int ret = 0;
-       if (fmt->fmt_init) ret = (*fmt->fmt_init)(task, buf, flags, cpu, arg);
-       return ret;
-}
-
-static inline int
-pfm_buf_fmt_restart(pfm_buffer_fmt_t *fmt, struct task_struct *task, pfm_ovfl_ctrl_t *ctrl, void *buf, struct pt_regs *regs)
-{
-       int ret = 0;
-       if (fmt->fmt_restart) ret = (*fmt->fmt_restart)(task, ctrl, buf, regs);
-       return ret;
-}
-
-static inline int
-pfm_buf_fmt_restart_active(pfm_buffer_fmt_t *fmt, struct task_struct *task, pfm_ovfl_ctrl_t *ctrl, void *buf, struct pt_regs *regs)
-{
-       int ret = 0;
-       if (fmt->fmt_restart_active) ret = (*fmt->fmt_restart_active)(task, ctrl, buf, regs);
-       return ret;
-}
-
-static pfm_buffer_fmt_t *
-__pfm_find_buffer_fmt(pfm_uuid_t uuid)
-{
-       struct list_head * pos;
-       pfm_buffer_fmt_t * entry;
-
-       list_for_each(pos, &pfm_buffer_fmt_list) {
-               entry = list_entry(pos, pfm_buffer_fmt_t, fmt_list);
-               if (pfm_uuid_cmp(uuid, entry->fmt_uuid) == 0)
-                       return entry;
-       }
-       return NULL;
-}
-/*
- * find a buffer format based on its uuid
- */
-static pfm_buffer_fmt_t *
-pfm_find_buffer_fmt(pfm_uuid_t uuid)
-{
-       pfm_buffer_fmt_t * fmt;
-       spin_lock(&pfm_buffer_fmt_lock);
-       fmt = __pfm_find_buffer_fmt(uuid);
-       spin_unlock(&pfm_buffer_fmt_lock);
-       return fmt;
-}
-int
-pfm_register_buffer_fmt(pfm_buffer_fmt_t *fmt)
-{
-       int ret = 0;
-
-       /* some sanity checks */
-       if (fmt == NULL || fmt->fmt_name == NULL) return -EINVAL;
-
-       /* we need at least a handler */
-       if (fmt->fmt_handler == NULL) return -EINVAL;
-
-       /*
-        * XXX: need check validity of fmt_arg_size
-        */
-
-       spin_lock(&pfm_buffer_fmt_lock);
-
-       if (__pfm_find_buffer_fmt(fmt->fmt_uuid)) {
-               printk(KERN_ERR "perfmon: duplicate sampling format: %s\n", fmt->fmt_name);
-               ret = -EBUSY;
-               goto out;
-       } 
-       list_add(&fmt->fmt_list, &pfm_buffer_fmt_list);
-       printk(KERN_INFO "perfmon: added sampling format %s\n", fmt->fmt_name);
-
-out:
-       spin_unlock(&pfm_buffer_fmt_lock);
-       return ret;
-}
-EXPORT_SYMBOL(pfm_register_buffer_fmt);
-
-int
-pfm_unregister_buffer_fmt(pfm_uuid_t uuid)
-{
-       pfm_buffer_fmt_t *fmt;
-       int ret = 0;
-
-       spin_lock(&pfm_buffer_fmt_lock);
-
-       fmt = __pfm_find_buffer_fmt(uuid);
-       if (!fmt) {
-               printk(KERN_ERR "perfmon: cannot unregister format, not found\n");
-               ret = -EINVAL;
-               goto out;
-       }
-       list_del_init(&fmt->fmt_list);
-       printk(KERN_INFO "perfmon: removed sampling format: %s\n", fmt->fmt_name);
-
-out:
-       spin_unlock(&pfm_buffer_fmt_lock);
-       return ret;
-
-}
-EXPORT_SYMBOL(pfm_unregister_buffer_fmt);
-
-extern void update_pal_halt_status(int);
-
-static int
-pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)
-{
-       unsigned long flags;
-       /*
-        * validy checks on cpu_mask have been done upstream
-        */
-       LOCK_PFS(flags);
-
-       DPRINT(("in sys_sessions=%u task_sessions=%u dbregs=%u syswide=%d cpu=%u\n",
-               pfm_sessions.pfs_sys_sessions,
-               pfm_sessions.pfs_task_sessions,
-               pfm_sessions.pfs_sys_use_dbregs,
-               is_syswide,
-               cpu));
-
-       if (is_syswide) {
-               /*
-                * cannot mix system wide and per-task sessions
-                */
-               if (pfm_sessions.pfs_task_sessions > 0UL) {
-                       DPRINT(("system wide not possible, %u conflicting task_sessions\n",
-                               pfm_sessions.pfs_task_sessions));
-                       goto abort;
-               }
-
-               if (pfm_sessions.pfs_sys_session[cpu]) goto error_conflict;
-
-               DPRINT(("reserving system wide session on CPU%u currently on CPU%u\n", cpu, smp_processor_id()));
-
-               pfm_sessions.pfs_sys_session[cpu] = task;
-
-               pfm_sessions.pfs_sys_sessions++ ;
-
-       } else {
-               if (pfm_sessions.pfs_sys_sessions) goto abort;
-               pfm_sessions.pfs_task_sessions++;
-       }
-
-       DPRINT(("out sys_sessions=%u task_sessions=%u dbregs=%u syswide=%d cpu=%u\n",
-               pfm_sessions.pfs_sys_sessions,
-               pfm_sessions.pfs_task_sessions,
-               pfm_sessions.pfs_sys_use_dbregs,
-               is_syswide,
-               cpu));
-
-       /*
-        * disable default_idle() to go to PAL_HALT
-        */
-       update_pal_halt_status(0);
-
-       UNLOCK_PFS(flags);
-
-       return 0;
-
-error_conflict:
-       DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n",
-               pfm_sessions.pfs_sys_session[cpu]->pid,
-               cpu));
-abort:
-       UNLOCK_PFS(flags);
-
-       return -EBUSY;
-
-}
-
-static int
-pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu)
-{
-       unsigned long flags;
-       /*
-        * validy checks on cpu_mask have been done upstream
-        */
-       LOCK_PFS(flags);
-
-       DPRINT(("in sys_sessions=%u task_sessions=%u dbregs=%u syswide=%d cpu=%u\n",
-               pfm_sessions.pfs_sys_sessions,
-               pfm_sessions.pfs_task_sessions,
-               pfm_sessions.pfs_sys_use_dbregs,
-               is_syswide,
-               cpu));
-
-
-       if (is_syswide) {
-               pfm_sessions.pfs_sys_session[cpu] = NULL;
-               /*
-                * would not work with perfmon+more than one bit in cpu_mask
-                */
-               if (ctx && ctx->ctx_fl_using_dbreg) {
-                       if (pfm_sessions.pfs_sys_use_dbregs == 0) {
-                               printk(KERN_ERR "perfmon: invalid release for ctx %p sys_use_dbregs=0\n", ctx);
-                       } else {
-                               pfm_sessions.pfs_sys_use_dbregs--;
-                       }
-               }
-               pfm_sessions.pfs_sys_sessions--;
-       } else {
-               pfm_sessions.pfs_task_sessions--;
-       }
-       DPRINT(("out sys_sessions=%u task_sessions=%u dbregs=%u syswide=%d cpu=%u\n",
-               pfm_sessions.pfs_sys_sessions,
-               pfm_sessions.pfs_task_sessions,
-               pfm_sessions.pfs_sys_use_dbregs,
-               is_syswide,
-               cpu));
-
-       /*
-        * if possible, enable default_idle() to go into PAL_HALT
-        */
-       if (pfm_sessions.pfs_task_sessions == 0 && pfm_sessions.pfs_sys_sessions == 0)
-               update_pal_halt_status(1);
-
-       UNLOCK_PFS(flags);
-
-       return 0;
-}
-
-/*
- * removes virtual mapping of the sampling buffer.
- * IMPORTANT: cannot be called with interrupts disable, e.g. inside
- * a PROTECT_CTX() section.
- */
-static int
-pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long size)
-{
-       int r;
-
-       /* sanity checks */
-       if (task->mm == NULL || size == 0UL || vaddr == NULL) {
-               printk(KERN_ERR "perfmon: pfm_remove_smpl_mapping [%d] invalid context mm=%p\n", task->pid, task->mm);
-               return -EINVAL;
-       }
-
-       DPRINT(("smpl_vaddr=%p size=%lu\n", vaddr, size));
-
-       /*
-        * does the actual unmapping
-        */
-       down_write(&task->mm->mmap_sem);
-
-       DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size));
-
-       r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0);
-
-       up_write(&task->mm->mmap_sem);
-       if (r !=0) {
-               printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task->pid, vaddr, size);
-       }
-
-       DPRINT(("do_unmap(%p, %lu)=%d\n", vaddr, size, r));
-
-       return 0;
-}
-
-/*
- * free actual physical storage used by sampling buffer
- */
-#if 0
-static int
-pfm_free_smpl_buffer(pfm_context_t *ctx)
-{
-       pfm_buffer_fmt_t *fmt;
-
-       if (ctx->ctx_smpl_hdr == NULL) goto invalid_free;
-
-       /*
-        * we won't use the buffer format anymore
-        */
-       fmt = ctx->ctx_buf_fmt;
-
-       DPRINT(("sampling buffer @%p size %lu vaddr=%p\n",
-               ctx->ctx_smpl_hdr,
-               ctx->ctx_smpl_size,
-               ctx->ctx_smpl_vaddr));
-
-       pfm_buf_fmt_exit(fmt, current, NULL, NULL);
-
-       /*
-        * free the buffer
-        */
-       pfm_rvfree(ctx->ctx_smpl_hdr, ctx->ctx_smpl_size);
-
-       ctx->ctx_smpl_hdr  = NULL;
-       ctx->ctx_smpl_size = 0UL;
-
-       return 0;
-
-invalid_free:
-       printk(KERN_ERR "perfmon: pfm_free_smpl_buffer [%d] no buffer\n", current->pid);
-       return -EINVAL;
-}
-#endif
-
-static inline void
-pfm_exit_smpl_buffer(pfm_buffer_fmt_t *fmt)
-{
-       if (fmt == NULL) return;
-
-       pfm_buf_fmt_exit(fmt, current, NULL, NULL);
-
-}
-
-/*
- * pfmfs should _never_ be mounted by userland - too much of security hassle,
- * no real gain from having the whole whorehouse mounted. So we don't need
- * any operations on the root directory. However, we need a non-trivial
- * d_name - pfm: will go nicely and kill the special-casing in procfs.
- */
-static struct vfsmount *pfmfs_mnt;
-
-static int __init
-init_pfm_fs(void)
-{
-       int err = register_filesystem(&pfm_fs_type);
-       if (!err) {
-               pfmfs_mnt = kern_mount(&pfm_fs_type);
-               err = PTR_ERR(pfmfs_mnt);
-               if (IS_ERR(pfmfs_mnt))
-                       unregister_filesystem(&pfm_fs_type);
-               else
-                       err = 0;
-       }
-       return err;
-}
-
-static void __exit
-exit_pfm_fs(void)
-{
-       unregister_filesystem(&pfm_fs_type);
-       mntput(pfmfs_mnt);
-}
-
-static ssize_t
-pfm_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
-{
-       pfm_context_t *ctx;
-       pfm_msg_t *msg;
-       ssize_t ret;
-       unsigned long flags;
-       DECLARE_WAITQUEUE(wait, current);
-       XEN_NOT_SUPPORTED_YET;
-       if (PFM_IS_FILE(filp) == 0) {
-               printk(KERN_ERR "perfmon: pfm_poll: bad magic [%d]\n", current->pid);
-               return -EINVAL;
-       }
-
-       ctx = (pfm_context_t *)filp->private_data;
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: pfm_read: NULL ctx [%d]\n", current->pid);
-               return -EINVAL;
-       }
-
-       /*
-        * check even when there is no message
-        */
-       if (size < sizeof(pfm_msg_t)) {
-               DPRINT(("message is too small ctx=%p (>=%ld)\n", ctx, sizeof(pfm_msg_t)));
-               return -EINVAL;
-       }
-
-       PROTECT_CTX(ctx, flags);
-
-       /*
-        * put ourselves on the wait queue
-        */
-       add_wait_queue(&ctx->ctx_msgq_wait, &wait);
-
-
-       for(;;) {
-               /*
-                * check wait queue
-                */
-
-               set_current_state(TASK_INTERRUPTIBLE);
-
-               DPRINT(("head=%d tail=%d\n", ctx->ctx_msgq_head, ctx->ctx_msgq_tail));
-
-               ret = 0;
-               if(PFM_CTXQ_EMPTY(ctx) == 0) break;
-
-               UNPROTECT_CTX(ctx, flags);
-
-               /*
-                * check non-blocking read
-                */
-               ret = -EAGAIN;
-               if(filp->f_flags & O_NONBLOCK) break;
-
-               /*
-                * check pending signals
-                */
-               if(signal_pending(current)) {
-                       ret = -EINTR;
-                       break;
-               }
-               /*
-                * no message, so wait
-                */
-               schedule();
-
-               PROTECT_CTX(ctx, flags);
-       }
-       DPRINT(("[%d] back to running ret=%ld\n", current->pid, ret));
-       set_current_state(TASK_RUNNING);
-       remove_wait_queue(&ctx->ctx_msgq_wait, &wait);
-
-       if (ret < 0) goto abort;
-
-       ret = -EINVAL;
-       msg = pfm_get_next_msg(ctx);
-       if (msg == NULL) {
-               printk(KERN_ERR "perfmon: pfm_read no msg for ctx=%p [%d]\n", ctx, current->pid);
-               goto abort_locked;
-       }
-
-       DPRINT(("fd=%d type=%d\n", msg->pfm_gen_msg.msg_ctx_fd, msg->pfm_gen_msg.msg_type));
-
-       ret = -EFAULT;
-       if(copy_to_user(buf, msg, sizeof(pfm_msg_t)) == 0) ret = sizeof(pfm_msg_t);
-
-abort_locked:
-       UNPROTECT_CTX(ctx, flags);
-abort:
-       return ret;
-}
-
-static ssize_t
-pfm_write(struct file *file, const char __user *ubuf,
-                         size_t size, loff_t *ppos)
-{
-       DPRINT(("pfm_write called\n"));
-       return -EINVAL;
-}
-
-static unsigned int
-pfm_poll(struct file *filp, poll_table * wait)
-{
-       pfm_context_t *ctx;
-       unsigned long flags;
-       unsigned int mask = 0;
-
-       if (PFM_IS_FILE(filp) == 0) {
-               printk(KERN_ERR "perfmon: pfm_poll: bad magic [%d]\n", current->pid);
-               return 0;
-       }
-
-       ctx = (pfm_context_t *)filp->private_data;
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: pfm_poll: NULL ctx [%d]\n", current->pid);
-               return 0;
-       }
-
-
-       DPRINT(("pfm_poll ctx_fd=%d before poll_wait\n", ctx->ctx_fd));
-
-       poll_wait(filp, &ctx->ctx_msgq_wait, wait);
-
-       PROTECT_CTX(ctx, flags);
-
-       if (PFM_CTXQ_EMPTY(ctx) == 0)
-               mask =  POLLIN | POLLRDNORM;
-
-       UNPROTECT_CTX(ctx, flags);
-
-       DPRINT(("pfm_poll ctx_fd=%d mask=0x%x\n", ctx->ctx_fd, mask));
-
-       return mask;
-}
-
-static int
-pfm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       DPRINT(("pfm_ioctl called\n"));
-       return -EINVAL;
-}
-
-/*
- * interrupt cannot be masked when coming here
- */
-static inline int
-pfm_do_fasync(int fd, struct file *filp, pfm_context_t *ctx, int on)
-{
-       int ret;
-
-       ret = fasync_helper (fd, filp, on, &ctx->ctx_async_queue);
-
-       DPRINT(("pfm_fasync called by [%d] on ctx_fd=%d on=%d async_queue=%p ret=%d\n",
-               current->pid,
-               fd,
-               on,
-               ctx->ctx_async_queue, ret));
-
-       return ret;
-}
-
-static int
-pfm_fasync(int fd, struct file *filp, int on)
-{
-       pfm_context_t *ctx;
-       int ret;
-
-       if (PFM_IS_FILE(filp) == 0) {
-               printk(KERN_ERR "perfmon: pfm_fasync bad magic [%d]\n", current->pid);
-               return -EBADF;
-       }
-
-       ctx = (pfm_context_t *)filp->private_data;
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: pfm_fasync NULL ctx [%d]\n", current->pid);
-               return -EBADF;
-       }
-       /*
-        * we cannot mask interrupts during this call because this may
-        * may go to sleep if memory is not readily avalaible.
-        *
-        * We are protected from the conetxt disappearing by the get_fd()/put_fd()
-        * done in caller. Serialization of this function is ensured by caller.
-        */
-       ret = pfm_do_fasync(fd, filp, ctx, on);
-
-
-       DPRINT(("pfm_fasync called on ctx_fd=%d on=%d async_queue=%p ret=%d\n",
-               fd,
-               on,
-               ctx->ctx_async_queue, ret));
-
-       return ret;
-}
-
-#ifdef CONFIG_SMP
-/*
- * this function is exclusively called from pfm_close().
- * The context is not protected at that time, nor are interrupts
- * on the remote CPU. That's necessary to avoid deadlocks.
- */
-static void
-pfm_syswide_force_stop(void *info)
-{
-       pfm_context_t   *ctx = (pfm_context_t *)info;
-       struct pt_regs *regs = task_pt_regs(current);
-       struct task_struct *owner;
-       unsigned long flags;
-       int ret;
-
-       if (ctx->ctx_cpu != smp_processor_id()) {
-               printk(KERN_ERR "perfmon: pfm_syswide_force_stop for CPU%d  but on CPU%d\n",
-                       ctx->ctx_cpu,
-                       smp_processor_id());
-               return;
-       }
-       owner = GET_PMU_OWNER();
-       if (owner != ctx->ctx_task) {
-               printk(KERN_ERR "perfmon: pfm_syswide_force_stop CPU%d unexpected owner [%d] instead of [%d]\n",
-                       smp_processor_id(),
-                       owner->pid, ctx->ctx_task->pid);
-               return;
-       }
-       if (GET_PMU_CTX() != ctx) {
-               printk(KERN_ERR "perfmon: pfm_syswide_force_stop CPU%d unexpected ctx %p instead of %p\n",
-                       smp_processor_id(),
-                       GET_PMU_CTX(), ctx);
-               return;
-       }
-
-       DPRINT(("on CPU%d forcing system wide stop for [%d]\n", smp_processor_id(), ctx->ctx_task->pid));       
-       /*
-        * the context is already protected in pfm_close(), we simply
-        * need to mask interrupts to avoid a PMU interrupt race on
-        * this CPU
-        */
-       local_irq_save(flags);
-
-       ret = pfm_context_unload(ctx, NULL, 0, regs);
-       if (ret) {
-               DPRINT(("context_unload returned %d\n", ret));
-       }
-
-       /*
-        * unmask interrupts, PMU interrupts are now spurious here
-        */
-       local_irq_restore(flags);
-}
-
-static void
-pfm_syswide_cleanup_other_cpu(pfm_context_t *ctx)
-{
-       int ret;
-
-       DPRINT(("calling CPU%d for cleanup\n", ctx->ctx_cpu));
-       ret = smp_call_function_single(ctx->ctx_cpu, pfm_syswide_force_stop, ctx, 0, 1);
-       DPRINT(("called CPU%d for cleanup ret=%d\n", ctx->ctx_cpu, ret));
-}
-#endif /* CONFIG_SMP */
-
-/*
- * called for each close(). Partially free resources.
- * When caller is self-monitoring, the context is unloaded.
- */
-static int
-pfm_flush(struct file *filp, fl_owner_t id)
-{
-       pfm_context_t *ctx;
-       struct task_struct *task;
-       struct pt_regs *regs;
-       unsigned long flags;
-       unsigned long smpl_buf_size = 0UL;
-       void *smpl_buf_vaddr = NULL;
-       int state, is_system;
-
-       if (PFM_IS_FILE(filp) == 0) {
-               DPRINT(("bad magic for\n"));
-               return -EBADF;
-       }
-
-       ctx = (pfm_context_t *)filp->private_data;
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: pfm_flush: NULL ctx [%d]\n", current->pid);
-               return -EBADF;
-       }
-
-       /*
-        * remove our file from the async queue, if we use this mode.
-        * This can be done without the context being protected. We come
-        * here when the context has become unreacheable by other tasks.
-        *
-        * We may still have active monitoring at this point and we may
-        * end up in pfm_overflow_handler(). However, fasync_helper()
-        * operates with interrupts disabled and it cleans up the
-        * queue. If the PMU handler is called prior to entering
-        * fasync_helper() then it will send a signal. If it is
-        * invoked after, it will find an empty queue and no
-        * signal will be sent. In both case, we are safe
-        */
-       if (filp->f_flags & FASYNC) {
-               DPRINT(("cleaning up async_queue=%p\n", ctx->ctx_async_queue));
-               pfm_do_fasync (-1, filp, ctx, 0);
-       }
-
-       PROTECT_CTX(ctx, flags);
-
-       state     = ctx->ctx_state;
-       is_system = ctx->ctx_fl_system;
-
-       task = PFM_CTX_TASK(ctx);
-       regs = task_pt_regs(task);
-
-       DPRINT(("ctx_state=%d is_current=%d\n",
-               state,
-               task == current ? 1 : 0));
-
-       /*
-        * if state == UNLOADED, then task is NULL
-        */
-
-       /*
-        * we must stop and unload because we are losing access to the context.
-        */
-       if (task == current) {
-#ifdef CONFIG_SMP
-               /*
-                * the task IS the owner but it migrated to another CPU: that's bad
-                * but we must handle this cleanly. Unfortunately, the kernel does
-                * not provide a mechanism to block migration (while the context is loaded).
-                *
-                * We need to release the resource on the ORIGINAL cpu.
-                */
-               if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-
-                       DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-                       /*
-                        * keep context protected but unmask interrupt for IPI
-                        */
-                       local_irq_restore(flags);
-
-                       pfm_syswide_cleanup_other_cpu(ctx);
-
-                       /*
-                        * restore interrupt masking
-                        */
-                       local_irq_save(flags);
-
-                       /*
-                        * context is unloaded at this point
-                        */
-               } else
-#endif /* CONFIG_SMP */
-               {
-
-                       DPRINT(("forcing unload\n"));
-                       /*
-                       * stop and unload, returning with state UNLOADED
-                       * and session unreserved.
-                       */
-                       pfm_context_unload(ctx, NULL, 0, regs);
-
-                       DPRINT(("ctx_state=%d\n", ctx->ctx_state));
-               }
-       }
-
-       /*
-        * remove virtual mapping, if any, for the calling task.
-        * cannot reset ctx field until last user is calling close().
-        *
-        * ctx_smpl_vaddr must never be cleared because it is needed
-        * by every task with access to the context
-        *
-        * When called from do_exit(), the mm context is gone already, therefore
-        * mm is NULL, i.e., the VMA is already gone  and we do not have to
-        * do anything here
-        */
-       if (ctx->ctx_smpl_vaddr && current->mm) {
-               smpl_buf_vaddr = ctx->ctx_smpl_vaddr;
-               smpl_buf_size  = ctx->ctx_smpl_size;
-       }
-
-       UNPROTECT_CTX(ctx, flags);
-
-       /*
-        * if there was a mapping, then we systematically remove it
-        * at this point. Cannot be done inside critical section
-        * because some VM function reenables interrupts.
-        *
-        */
-       if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size);
-
-       return 0;
-}
-/*
- * called either on explicit close() or from exit_files(). 
- * Only the LAST user of the file gets to this point, i.e., it is
- * called only ONCE.
- *
- * IMPORTANT: we get called ONLY when the refcnt on the file gets to zero 
- * (fput()),i.e, last task to access the file. Nobody else can access the 
- * file at this point.
- *
- * When called from exit_files(), the VMA has been freed because exit_mm()
- * is executed before exit_files().
- *
- * When called from exit_files(), the current task is not yet ZOMBIE but we
- * flush the PMU state to the context. 
- */
-static int
-pfm_close(struct inode *inode, struct file *filp)
-{
-       pfm_context_t *ctx;
-       struct task_struct *task;
-       struct pt_regs *regs;
-       DECLARE_WAITQUEUE(wait, current);
-       unsigned long flags;
-       unsigned long smpl_buf_size = 0UL;
-       void *smpl_buf_addr = NULL;
-       int free_possible = 1;
-       int state, is_system;
-
-       DPRINT(("pfm_close called private=%p\n", filp->private_data));
-
-       if (PFM_IS_FILE(filp) == 0) {
-               DPRINT(("bad magic\n"));
-               return -EBADF;
-       }
-       
-       ctx = (pfm_context_t *)filp->private_data;
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: pfm_close: NULL ctx [%d]\n", current->pid);
-               return -EBADF;
-       }
-
-       PROTECT_CTX(ctx, flags);
-
-       state     = ctx->ctx_state;
-       is_system = ctx->ctx_fl_system;
-
-       task = PFM_CTX_TASK(ctx);
-       regs = task_pt_regs(task);
-
-       DPRINT(("ctx_state=%d is_current=%d\n", 
-               state,
-               task == current ? 1 : 0));
-
-       /*
-        * if task == current, then pfm_flush() unloaded the context
-        */
-       if (state == PFM_CTX_UNLOADED) goto doit;
-
-       /*
-        * context is loaded/masked and task != current, we need to
-        * either force an unload or go zombie
-        */
-
-       /*
-        * The task is currently blocked or will block after an overflow.
-        * we must force it to wakeup to get out of the
-        * MASKED state and transition to the unloaded state by itself.
-        *
-        * This situation is only possible for per-task mode
-        */
-       if (state == PFM_CTX_MASKED && CTX_OVFL_NOBLOCK(ctx) == 0) {
-
-               /*
-                * set a "partial" zombie state to be checked
-                * upon return from down() in pfm_handle_work().
-                *
-                * We cannot use the ZOMBIE state, because it is checked
-                * by pfm_load_regs() which is called upon wakeup from down().
-                * In such case, it would free the context and then we would
-                * return to pfm_handle_work() which would access the
-                * stale context. Instead, we set a flag invisible to pfm_load_regs()
-                * but visible to pfm_handle_work().
-                *
-                * For some window of time, we have a zombie context with
-                * ctx_state = MASKED  and not ZOMBIE
-                */
-               ctx->ctx_fl_going_zombie = 1;
-
-               /*
-                * force task to wake up from MASKED state
-                */
-               complete(&ctx->ctx_restart_done);
-
-               DPRINT(("waking up ctx_state=%d\n", state));
-
-               /*
-                * put ourself to sleep waiting for the other
-                * task to report completion
-                *
-                * the context is protected by mutex, therefore there
-                * is no risk of being notified of completion before
-                * begin actually on the waitq.
-                */
-               set_current_state(TASK_INTERRUPTIBLE);
-               add_wait_queue(&ctx->ctx_zombieq, &wait);
-
-               UNPROTECT_CTX(ctx, flags);
-
-               /*
-                * XXX: check for signals :
-                *      - ok for explicit close
-                *      - not ok when coming from exit_files()
-                */
-               schedule();
-
-
-               PROTECT_CTX(ctx, flags);
-
-
-               remove_wait_queue(&ctx->ctx_zombieq, &wait);
-               set_current_state(TASK_RUNNING);
-
-               /*
-                * context is unloaded at this point
-                */
-               DPRINT(("after zombie wakeup ctx_state=%d for\n", state));
-       }
-       else if (task != current) {
-#ifdef CONFIG_SMP
-               /*
-                * switch context to zombie state
-                */
-               ctx->ctx_state = PFM_CTX_ZOMBIE;
-
-               DPRINT(("zombie ctx for [%d]\n", task->pid));
-               /*
-                * cannot free the context on the spot. deferred until
-                * the task notices the ZOMBIE state
-                */
-               free_possible = 0;
-#else
-               pfm_context_unload(ctx, NULL, 0, regs);
-#endif
-       }
-
-doit:
-       /* reload state, may have changed during  opening of critical section */
-       state = ctx->ctx_state;
-
-       /*
-        * the context is still attached to a task (possibly current)
-        * we cannot destroy it right now
-        */
-
-       /*
-        * we must free the sampling buffer right here because
-        * we cannot rely on it being cleaned up later by the
-        * monitored task. It is not possible to free vmalloc'ed
-        * memory in pfm_load_regs(). Instead, we remove the buffer
-        * now. should there be subsequent PMU overflow originally
-        * meant for sampling, the will be converted to spurious
-        * and that's fine because the monitoring tools is gone anyway.
-        */
-       if (ctx->ctx_smpl_hdr) {
-               smpl_buf_addr = ctx->ctx_smpl_hdr;
-               smpl_buf_size = ctx->ctx_smpl_size;
-               /* no more sampling */
-               ctx->ctx_smpl_hdr = NULL;
-               ctx->ctx_fl_is_sampling = 0;
-       }
-
-       DPRINT(("ctx_state=%d free_possible=%d addr=%p size=%lu\n",
-               state,
-               free_possible,
-               smpl_buf_addr,
-               smpl_buf_size));
-
-       if (smpl_buf_addr) pfm_exit_smpl_buffer(ctx->ctx_buf_fmt);
-
-       /*
-        * UNLOADED that the session has already been unreserved.
-        */
-       if (state == PFM_CTX_ZOMBIE) {
-               pfm_unreserve_session(ctx, ctx->ctx_fl_system , ctx->ctx_cpu);
-       }
-
-       /*
-        * disconnect file descriptor from context must be done
-        * before we unlock.
-        */
-       filp->private_data = NULL;
-
-       /*
-        * if we free on the spot, the context is now completely unreacheable
-        * from the callers side. The monitored task side is also cut, so we
-        * can freely cut.
-        *
-        * If we have a deferred free, only the caller side is disconnected.
-        */
-       UNPROTECT_CTX(ctx, flags);
-
-       /*
-        * All memory free operations (especially for vmalloc'ed memory)
-        * MUST be done with interrupts ENABLED.
-        */
-       if (smpl_buf_addr)  pfm_rvfree(smpl_buf_addr, smpl_buf_size);
-
-       /*
-        * return the memory used by the context
-        */
-       if (free_possible) pfm_context_free(ctx);
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary()) {
-                       int ret = HYPERVISOR_perfmon_op(PFM_DESTROY_CONTEXT,
-                                                       NULL, 0);
-                       if (ret)
-                               printk("%s:%d PFM_DESTROY_CONTEXT hypercall "
-                                      "failed\n", __func__, __LINE__);
-               }
-       }
-       return 0;
-}
-
-static int
-pfm_no_open(struct inode *irrelevant, struct file *dontcare)
-{
-       DPRINT(("pfm_no_open called\n"));
-       return -ENXIO;
-}
-
-
-
-static struct file_operations pfm_file_ops = {
-       .llseek   = no_llseek,
-       .read     = pfm_read,
-       .write    = pfm_write,
-       .poll     = pfm_poll,
-       .ioctl    = pfm_ioctl,
-       .open     = pfm_no_open,        /* special open code to disallow open via /proc */
-       .fasync   = pfm_fasync,
-       .release  = pfm_close,
-       .flush    = pfm_flush
-};
-
-static int
-pfmfs_delete_dentry(struct dentry *dentry)
-{
-       return 1;
-}
-
-static struct dentry_operations pfmfs_dentry_operations = {
-       .d_delete = pfmfs_delete_dentry,
-};
-
-
-static int
-pfm_alloc_fd(struct file **cfile)
-{
-       int fd, ret = 0;
-       struct file *file = NULL;
-       struct inode * inode;
-       char name[32];
-       struct qstr this;
-
-       fd = get_unused_fd();
-       if (fd < 0) return -ENFILE;
-
-       ret = -ENFILE;
-
-       file = get_empty_filp();
-       if (!file) goto out;
-
-       /*
-        * allocate a new inode
-        */
-       inode = new_inode(pfmfs_mnt->mnt_sb);
-       if (!inode) goto out;
-
-       DPRINT(("new inode ino=%ld @%p\n", inode->i_ino, inode));
-
-       inode->i_mode = S_IFCHR|S_IRUGO;
-       inode->i_uid  = current->fsuid;
-       inode->i_gid  = current->fsgid;
-
-       sprintf(name, "[%lu]", inode->i_ino);
-       this.name = name;
-       this.len  = strlen(name);
-       this.hash = inode->i_ino;
-
-       ret = -ENOMEM;
-
-       /*
-        * allocate a new dcache entry
-        */
-       file->f_dentry = d_alloc(pfmfs_mnt->mnt_sb->s_root, &this);
-       if (!file->f_dentry) goto out;
-
-       file->f_dentry->d_op = &pfmfs_dentry_operations;
-
-       d_add(file->f_dentry, inode);
-       file->f_vfsmnt = mntget(pfmfs_mnt);
-       file->f_mapping = inode->i_mapping;
-
-       file->f_op    = &pfm_file_ops;
-       file->f_mode  = FMODE_READ;
-       file->f_flags = O_RDONLY;
-       file->f_pos   = 0;
-
-       /*
-        * may have to delay until context is attached?
-        */
-       fd_install(fd, file);
-
-       /*
-        * the file structure we will use
-        */
-       *cfile = file;
-
-       return fd;
-out:
-       if (file) put_filp(file);
-       put_unused_fd(fd);
-       return ret;
-}
-
-static void
-pfm_free_fd(int fd, struct file *file)
-{
-       struct files_struct *files = current->files;
-       struct fdtable *fdt;
-
-       /* 
-        * there ie no fd_uninstall(), so we do it here
-        */
-       spin_lock(&files->file_lock);
-       fdt = files_fdtable(files);
-       rcu_assign_pointer(fdt->fd[fd], NULL);
-       spin_unlock(&files->file_lock);
-
-       if (file)
-               put_filp(file);
-       put_unused_fd(fd);
-}
-
-static int
-pfm_remap_buffer(struct vm_area_struct *vma, unsigned long buf, unsigned long addr, unsigned long size)
-{
-       DPRINT(("CPU%d buf=0x%lx addr=0x%lx size=%ld\n", smp_processor_id(), buf, addr, size));
-
-       while (size > 0) {
-               unsigned long pfn = ia64_tpa(buf) >> PAGE_SHIFT;
-
-
-               if (remap_pfn_range(vma, addr, pfn, PAGE_SIZE, PAGE_READONLY))
-                       return -ENOMEM;
-
-               addr  += PAGE_SIZE;
-               buf   += PAGE_SIZE;
-               size  -= PAGE_SIZE;
-       }
-       return 0;
-}
-
-/*
- * allocate a sampling buffer and remaps it into the user address space of the task
- */
-static int
-pfm_smpl_buffer_alloc(struct task_struct *task, pfm_context_t *ctx, unsigned long rsize, void **user_vaddr)
-{
-       struct mm_struct *mm = task->mm;
-       struct vm_area_struct *vma = NULL;
-       unsigned long size;
-       void *smpl_buf;
-
-
-       /*
-        * the fixed header + requested size and align to page boundary
-        */
-       size = PAGE_ALIGN(rsize);
-
-       DPRINT(("sampling buffer rsize=%lu size=%lu bytes\n", rsize, size));
-
-       /*
-        * check requested size to avoid Denial-of-service attacks
-        * XXX: may have to refine this test
-        * Check against address space limit.
-        *
-        * if ((mm->total_vm << PAGE_SHIFT) + len> task->rlim[RLIMIT_AS].rlim_cur)
-        *      return -ENOMEM;
-        */
-       if (size > task->signal->rlim[RLIMIT_MEMLOCK].rlim_cur)
-               return -ENOMEM;
-
-       /*
-        * We do the easy to undo allocations first.
-        *
-        * pfm_rvmalloc(), clears the buffer, so there is no leak
-        */
-       smpl_buf = pfm_rvmalloc(size);
-       if (smpl_buf == NULL) {
-               DPRINT(("Can't allocate sampling buffer\n"));
-               return -ENOMEM;
-       }
-
-       DPRINT(("smpl_buf @%p\n", smpl_buf));
-
-       /* allocate vma */
-       vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!vma) {
-               DPRINT(("Cannot allocate vma\n"));
-               goto error_kmem;
-       }
-       memset(vma, 0, sizeof(*vma));
-
-       /*
-        * partially initialize the vma for the sampling buffer
-        */
-       vma->vm_mm           = mm;
-       vma->vm_flags        = VM_READ| VM_MAYREAD |VM_RESERVED;
-       vma->vm_page_prot    = PAGE_READONLY; /* XXX may need to change */
-
-       /*
-        * Now we have everything we need and we can initialize
-        * and connect all the data structures
-        */
-
-       ctx->ctx_smpl_hdr   = smpl_buf;
-       ctx->ctx_smpl_size  = size; /* aligned size */
-
-       /*
-        * Let's do the difficult operations next.
-        *
-        * now we atomically find some area in the address space and
-        * remap the buffer in it.
-        */
-       down_write(&task->mm->mmap_sem);
-
-       /* find some free area in address space, must have mmap sem held */
-       vma->vm_start = pfm_get_unmapped_area(NULL, 0, size, 0, MAP_PRIVATE|MAP_ANONYMOUS, 0);
-       if (vma->vm_start == 0UL) {
-               DPRINT(("Cannot find unmapped area for size %ld\n", size));
-               up_write(&task->mm->mmap_sem);
-               goto error;
-       }
-       vma->vm_end = vma->vm_start + size;
-       vma->vm_pgoff = vma->vm_start >> PAGE_SHIFT;
-
-       DPRINT(("aligned size=%ld, hdr=%p mapped @0x%lx\n", size, ctx->ctx_smpl_hdr, vma->vm_start));
-
-       /* can only be applied to current task, need to have the mm semaphore held when called */
-       if (pfm_remap_buffer(vma, (unsigned long)smpl_buf, vma->vm_start, size)) {
-               DPRINT(("Can't remap buffer\n"));
-               up_write(&task->mm->mmap_sem);
-               goto error;
-       }
-
-       /*
-        * now insert the vma in the vm list for the process, must be
-        * done with mmap lock held
-        */
-       insert_vm_struct(mm, vma);
-
-       mm->total_vm  += size >> PAGE_SHIFT;
-       vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file,
-                                                       vma_pages(vma));
-       up_write(&task->mm->mmap_sem);
-
-       /*
-        * keep track of user level virtual address
-        */
-       ctx->ctx_smpl_vaddr = (void *)vma->vm_start;
-       *(unsigned long *)user_vaddr = vma->vm_start;
-
-       return 0;
-
-error:
-       kmem_cache_free(vm_area_cachep, vma);
-error_kmem:
-       pfm_rvfree(smpl_buf, size);
-
-       return -ENOMEM;
-}
-
-/*
- * XXX: do something better here
- */
-static int
-pfm_bad_permissions(struct task_struct *task)
-{
-       /* inspired by ptrace_attach() */
-       DPRINT(("cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
-               current->uid,
-               current->gid,
-               task->euid,
-               task->suid,
-               task->uid,
-               task->egid,
-               task->sgid));
-
-       return ((current->uid != task->euid)
-           || (current->uid != task->suid)
-           || (current->uid != task->uid)
-           || (current->gid != task->egid)
-           || (current->gid != task->sgid)
-           || (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE);
-}
-
-static int
-pfarg_is_sane(struct task_struct *task, pfarg_context_t *pfx)
-{
-       int ctx_flags;
-
-       /* valid signal */
-
-       ctx_flags = pfx->ctx_flags;
-
-       if (ctx_flags & PFM_FL_SYSTEM_WIDE) {
-
-               /*
-                * cannot block in this mode
-                */
-               if (ctx_flags & PFM_FL_NOTIFY_BLOCK) {
-                       DPRINT(("cannot use blocking mode when in system wide monitoring\n"));
-                       return -EINVAL;
-               }
-       } else {
-       }
-       /* probably more to add here */
-
-       return 0;
-}
-
-static int
-pfm_setup_buffer_fmt(struct task_struct *task, pfm_context_t *ctx, unsigned int ctx_flags,
-                    unsigned int cpu, pfarg_context_t *arg)
-{
-       pfm_buffer_fmt_t *fmt = NULL;
-       unsigned long size = 0UL;
-       void *uaddr = NULL;
-       void *fmt_arg = NULL;
-       int ret = 0;
-#define PFM_CTXARG_BUF_ARG(a)  (pfm_buffer_fmt_t *)(a+1)
-
-       /* invoke and lock buffer format, if found */
-       fmt = pfm_find_buffer_fmt(arg->ctx_smpl_buf_id);
-       if (fmt == NULL) {
-               DPRINT(("[%d] cannot find buffer format\n", task->pid));
-               return -EINVAL;
-       }
-
-       /*
-        * buffer argument MUST be contiguous to pfarg_context_t
-        */
-       if (fmt->fmt_arg_size) fmt_arg = PFM_CTXARG_BUF_ARG(arg);
-
-       ret = pfm_buf_fmt_validate(fmt, task, ctx_flags, cpu, fmt_arg);
-
-       DPRINT(("[%d] after validate(0x%x,%d,%p)=%d\n", task->pid, ctx_flags, cpu, fmt_arg, ret));
-
-       if (ret) goto error;
-
-       /* link buffer format and context */
-       ctx->ctx_buf_fmt = fmt;
-
-       /*
-        * check if buffer format wants to use perfmon buffer allocation/mapping service
-        */
-       ret = pfm_buf_fmt_getsize(fmt, task, ctx_flags, cpu, fmt_arg, &size);
-       if (ret) goto error;
-
-       if (size) {
-               /*
-                * buffer is always remapped into the caller's address space
-                */
-               ret = pfm_smpl_buffer_alloc(current, ctx, size, &uaddr);
-               if (ret) goto error;
-
-               /* keep track of user address of buffer */
-               arg->ctx_smpl_vaddr = uaddr;
-       }
-       ret = pfm_buf_fmt_init(fmt, task, ctx->ctx_smpl_hdr, ctx_flags, cpu, fmt_arg);
-
-error:
-       return ret;
-}
-
-static void
-pfm_reset_pmu_state(pfm_context_t *ctx)
-{
-       int i;
-
-       /*
-        * install reset values for PMC.
-        */
-       for (i=1; PMC_IS_LAST(i) == 0; i++) {
-               if (PMC_IS_IMPL(i) == 0) continue;
-               ctx->ctx_pmcs[i] = PMC_DFL_VAL(i);
-               DPRINT(("pmc[%d]=0x%lx\n", i, ctx->ctx_pmcs[i]));
-       }
-       /*
-        * PMD registers are set to 0UL when the context in memset()
-        */
-
-       /*
-        * On context switched restore, we must restore ALL pmc and ALL pmd even
-        * when they are not actively used by the task. In UP, the incoming process
-        * may otherwise pick up left over PMC, PMD state from the previous process.
-        * As opposed to PMD, stale PMC can cause harm to the incoming
-        * process because they may change what is being measured.
-        * Therefore, we must systematically reinstall the entire
-        * PMC state. In SMP, the same thing is possible on the
-        * same CPU but also on between 2 CPUs.
-        *
-        * The problem with PMD is information leaking especially
-        * to user level when psr.sp=0
-        *
-        * There is unfortunately no easy way to avoid this problem
-        * on either UP or SMP. This definitively slows down the
-        * pfm_load_regs() function.
-        */
-
-        /*
-         * bitmask of all PMCs accessible to this context
-         *
-         * PMC0 is treated differently.
-         */
-       ctx->ctx_all_pmcs[0] = pmu_conf->impl_pmcs[0] & ~0x1;
-
-       /*
-        * bitmask of all PMDs that are accesible to this context
-        */
-       ctx->ctx_all_pmds[0] = pmu_conf->impl_pmds[0];
-
-       DPRINT(("<%d> all_pmcs=0x%lx all_pmds=0x%lx\n", ctx->ctx_fd, ctx->ctx_all_pmcs[0],ctx->ctx_all_pmds[0]));
-
-       /*
-        * useful in case of re-enable after disable
-        */
-       ctx->ctx_used_ibrs[0] = 0UL;
-       ctx->ctx_used_dbrs[0] = 0UL;
-}
-
-static int
-pfm_ctx_getsize(void *arg, size_t *sz)
-{
-       pfarg_context_t *req = (pfarg_context_t *)arg;
-       pfm_buffer_fmt_t *fmt;
-
-       *sz = 0;
-
-       if (!pfm_uuid_cmp(req->ctx_smpl_buf_id, pfm_null_uuid)) return 0;
-
-       fmt = pfm_find_buffer_fmt(req->ctx_smpl_buf_id);
-       if (fmt == NULL) {
-               DPRINT(("cannot find buffer format\n"));
-               return -EINVAL;
-       }
-       /* get just enough to copy in user parameters */
-       *sz = fmt->fmt_arg_size;
-       DPRINT(("arg_size=%lu\n", *sz));
-
-       return 0;
-}
-
-
-
-/*
- * cannot attach if :
- *     - kernel task
- *     - task not owned by caller
- *     - task incompatible with context mode
- */
-static int
-pfm_task_incompatible(pfm_context_t *ctx, struct task_struct *task)
-{
-       /*
-        * no kernel task or task not owner by caller
-        */
-       if (task->mm == NULL) {
-               DPRINT(("task [%d] has not memory context (kernel thread)\n", task->pid));
-               return -EPERM;
-       }
-       if (pfm_bad_permissions(task)) {
-               DPRINT(("no permission to attach to  [%d]\n", task->pid));
-               return -EPERM;
-       }
-       /*
-        * cannot block in self-monitoring mode
-        */
-       if (CTX_OVFL_NOBLOCK(ctx) == 0 && task == current) {
-               DPRINT(("cannot load a blocking context on self for [%d]\n", task->pid));
-               return -EINVAL;
-       }
-
-       if (task->exit_state == EXIT_ZOMBIE) {
-               DPRINT(("cannot attach to  zombie task [%d]\n", task->pid));
-               return -EBUSY;
-       }
-
-       /*
-        * always ok for self
-        */
-       if (task == current) return 0;
-
-       if ((task->state != TASK_STOPPED) && (task->state != TASK_TRACED)) {
-               DPRINT(("cannot attach to non-stopped task [%d] state=%ld\n", task->pid, task->state));
-               return -EBUSY;
-       }
-       /*
-        * make sure the task is off any CPU
-        */
-       wait_task_inactive(task);
-
-       /* more to come... */
-
-       return 0;
-}
-
-static int
-pfm_get_task(pfm_context_t *ctx, pid_t pid, struct task_struct **task)
-{
-       struct task_struct *p = current;
-       int ret;
-
-       /* XXX: need to add more checks here */
-       if (pid < 2) return -EPERM;
-
-       if (pid != current->pid) {
-
-               read_lock(&tasklist_lock);
-
-               p = find_task_by_pid(pid);
-
-               /* make sure task cannot go away while we operate on it */
-               if (p) get_task_struct(p);
-
-               read_unlock(&tasklist_lock);
-
-               if (p == NULL) return -ESRCH;
-       }
-
-       ret = pfm_task_incompatible(ctx, p);
-       if (ret == 0) {
-               *task = p;
-       } else if (p != current) {
-               pfm_put_task(p);
-       }
-       return ret;
-}
-
-
-
-static int
-pfm_context_create(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       pfarg_context_t *req = (pfarg_context_t *)arg;
-       struct file *filp;
-       int ctx_flags;
-       int ret;
-
-       /* let's check the arguments first */
-       ret = pfarg_is_sane(current, req);
-       if (ret < 0) return ret;
-
-       ctx_flags = req->ctx_flags;
-
-       ret = -ENOMEM;
-
-       ctx = pfm_context_alloc();
-       if (!ctx) goto error;
-
-       ret = pfm_alloc_fd(&filp);
-       if (ret < 0) goto error_file;
-
-       req->ctx_fd = ctx->ctx_fd = ret;
-
-       /*
-        * attach context to file
-        */
-       filp->private_data = ctx;
-
-       /*
-        * does the user want to sample?
-        */
-       if (pfm_uuid_cmp(req->ctx_smpl_buf_id, pfm_null_uuid)) {
-               ret = pfm_setup_buffer_fmt(current, ctx, ctx_flags, 0, req);
-               if (ret) goto buffer_error;
-       }
-
-       /*
-        * init context protection lock
-        */
-       spin_lock_init(&ctx->ctx_lock);
-
-       /*
-        * context is unloaded
-        */
-       ctx->ctx_state = PFM_CTX_UNLOADED;
-
-       /*
-        * initialization of context's flags
-        */
-       ctx->ctx_fl_block       = (ctx_flags & PFM_FL_NOTIFY_BLOCK) ? 1 : 0;
-       ctx->ctx_fl_system      = (ctx_flags & PFM_FL_SYSTEM_WIDE) ? 1: 0;
-       ctx->ctx_fl_is_sampling = ctx->ctx_buf_fmt ? 1 : 0; /* assume record() is defined */
-       ctx->ctx_fl_no_msg      = (ctx_flags & PFM_FL_OVFL_NO_MSG) ? 1: 0;
-       /*
-        * will move to set properties
-        * ctx->ctx_fl_excl_idle   = (ctx_flags & PFM_FL_EXCL_IDLE) ? 1: 0;
-        */
-
-       /*
-        * init restart semaphore to locked
-        */
-       init_completion(&ctx->ctx_restart_done);
-
-       /*
-        * activation is used in SMP only
-        */
-       ctx->ctx_last_activation = PFM_INVALID_ACTIVATION;
-       SET_LAST_CPU(ctx, -1);
-
-       /*
-        * initialize notification message queue
-        */
-       ctx->ctx_msgq_head = ctx->ctx_msgq_tail = 0;
-       init_waitqueue_head(&ctx->ctx_msgq_wait);
-       init_waitqueue_head(&ctx->ctx_zombieq);
-
-       DPRINT(("ctx=%p flags=0x%x system=%d notify_block=%d excl_idle=%d no_msg=%d ctx_fd=%d \n",
-               ctx,
-               ctx_flags,
-               ctx->ctx_fl_system,
-               ctx->ctx_fl_block,
-               ctx->ctx_fl_excl_idle,
-               ctx->ctx_fl_no_msg,
-               ctx->ctx_fd));
-
-       /*
-        * initialize soft PMU state
-        */
-       pfm_reset_pmu_state(ctx);
-
-       if (is_running_on_xen()) {
-               /*
-                * kludge to get xenoprof.is_primary.
-                * XENOPROF_init/ia64 is nop. so it is safe to call it here.
-                */
-               struct xenoprof_init init;
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_init, &init);
-               if (ret)
-                       goto buffer_error;
-               init_xenoprof_primary(init.is_primary);
-
-               if (is_xenoprof_primary()) {
-                       ret = HYPERVISOR_perfmon_op(PFM_CREATE_CONTEXT, arg, 0);
-                       if (ret)
-                               goto buffer_error;
-               }
-       }
-       return 0;
-
-buffer_error:
-       pfm_free_fd(ctx->ctx_fd, filp);
-
-       if (ctx->ctx_buf_fmt) {
-               pfm_buf_fmt_exit(ctx->ctx_buf_fmt, current, NULL, regs);
-       }
-error_file:
-       pfm_context_free(ctx);
-
-error:
-       return ret;
-}
-
-static inline unsigned long
-pfm_new_counter_value (pfm_counter_t *reg, int is_long_reset)
-{
-       unsigned long val = is_long_reset ? reg->long_reset : reg->short_reset;
-       unsigned long new_seed, old_seed = reg->seed, mask = reg->mask;
-       extern unsigned long carta_random32 (unsigned long seed);
-
-       if (reg->flags & PFM_REGFL_RANDOM) {
-               new_seed = carta_random32(old_seed);
-               val -= (old_seed & mask);       /* counter values are negative numbers! */
-               if ((mask >> 32) != 0)
-                       /* construct a full 64-bit random value: */
-                       new_seed |= carta_random32(old_seed >> 32) << 32;
-               reg->seed = new_seed;
-       }
-       reg->lval = val;
-       return val;
-}
-
-static void
-pfm_reset_regs_masked(pfm_context_t *ctx, unsigned long *ovfl_regs, int is_long_reset)
-{
-       unsigned long mask = ovfl_regs[0];
-       unsigned long reset_others = 0UL;
-       unsigned long val;
-       int i;
-
-       /*
-        * now restore reset value on sampling overflowed counters
-        */
-       mask >>= PMU_FIRST_COUNTER;
-       for(i = PMU_FIRST_COUNTER; mask; i++, mask >>= 1) {
-
-               if ((mask & 0x1UL) == 0UL) continue;
-
-               ctx->ctx_pmds[i].val = val = pfm_new_counter_value(ctx->ctx_pmds+ i, is_long_reset);
-               reset_others        |= ctx->ctx_pmds[i].reset_pmds[0];
-
-               DPRINT_ovfl((" %s reset ctx_pmds[%d]=%lx\n", is_long_reset ? "long" : "short", i, val));
-       }
-
-       /*
-        * Now take care of resetting the other registers
-        */
-       for(i = 0; reset_others; i++, reset_others >>= 1) {
-
-               if ((reset_others & 0x1) == 0) continue;
-
-               ctx->ctx_pmds[i].val = val = pfm_new_counter_value(ctx->ctx_pmds + i, is_long_reset);
-
-               DPRINT_ovfl(("%s reset_others pmd[%d]=%lx\n",
-                         is_long_reset ? "long" : "short", i, val));
-       }
-}
-
-static void
-pfm_reset_regs(pfm_context_t *ctx, unsigned long *ovfl_regs, int is_long_reset)
-{
-       unsigned long mask = ovfl_regs[0];
-       unsigned long reset_others = 0UL;
-       unsigned long val;
-       int i;
-
-       DPRINT_ovfl(("ovfl_regs=0x%lx is_long_reset=%d\n", ovfl_regs[0], is_long_reset));
-
-       if (ctx->ctx_state == PFM_CTX_MASKED) {
-               pfm_reset_regs_masked(ctx, ovfl_regs, is_long_reset);
-               return;
-       }
-
-       /*
-        * now restore reset value on sampling overflowed counters
-        */
-       mask >>= PMU_FIRST_COUNTER;
-       for(i = PMU_FIRST_COUNTER; mask; i++, mask >>= 1) {
-
-               if ((mask & 0x1UL) == 0UL) continue;
-
-               val           = pfm_new_counter_value(ctx->ctx_pmds+ i, is_long_reset);
-               reset_others |= ctx->ctx_pmds[i].reset_pmds[0];
-
-               DPRINT_ovfl((" %s reset ctx_pmds[%d]=%lx\n", is_long_reset ? "long" : "short", i, val));
-
-               pfm_write_soft_counter(ctx, i, val);
-       }
-
-       /*
-        * Now take care of resetting the other registers
-        */
-       for(i = 0; reset_others; i++, reset_others >>= 1) {
-
-               if ((reset_others & 0x1) == 0) continue;
-
-               val = pfm_new_counter_value(ctx->ctx_pmds + i, is_long_reset);
-
-               if (PMD_IS_COUNTING(i)) {
-                       pfm_write_soft_counter(ctx, i, val);
-               } else {
-                       ia64_set_pmd(i, val);
-               }
-               DPRINT_ovfl(("%s reset_others pmd[%d]=%lx\n",
-                         is_long_reset ? "long" : "short", i, val));
-       }
-       ia64_srlz_d();
-}
-
-static int
-pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct thread_struct *thread = NULL;
-       struct task_struct *task;
-       pfarg_reg_t *req = (pfarg_reg_t *)arg;
-       unsigned long value, pmc_pm;
-       unsigned long smpl_pmds, reset_pmds, impl_pmds;
-       unsigned int cnum, reg_flags, flags, pmc_type;
-       int i, can_access_pmu = 0, is_loaded, is_system, expert_mode;
-       int is_monitor, is_counting, state;
-       int ret = -EINVAL;
-       pfm_reg_check_t wr_func;
-#define PFM_CHECK_PMC_PM(x, y, z) ((x)->ctx_fl_system ^ PMC_PM(y, z))
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_WRITE_PMCS,
-                                                    arg, count);
-               return 0;
-       }
-       state     = ctx->ctx_state;
-       is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
-       is_system = ctx->ctx_fl_system;
-       task      = ctx->ctx_task;
-       impl_pmds = pmu_conf->impl_pmds[0];
-
-       if (state == PFM_CTX_ZOMBIE) return -EINVAL;
-
-       if (is_loaded) {
-               thread = &task->thread;
-               /*
-                * In system wide and when the context is loaded, access can only happen
-                * when the caller is running on the CPU being monitored by the session.
-                * It does not have to be the owner (ctx_task) of the context per se.
-                */
-               if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-                       DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-                       return -EBUSY;
-               }
-               can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
-       }
-       expert_mode = pfm_sysctl.expert_mode; 
-
-       for (i = 0; i < count; i++, req++) {
-
-               cnum       = req->reg_num;
-               reg_flags  = req->reg_flags;
-               value      = req->reg_value;
-               smpl_pmds  = req->reg_smpl_pmds[0];
-               reset_pmds = req->reg_reset_pmds[0];
-               flags      = 0;
-
-
-               if (cnum >= PMU_MAX_PMCS) {
-                       DPRINT(("pmc%u is invalid\n", cnum));
-                       goto error;
-               }
-
-               pmc_type   = pmu_conf->pmc_desc[cnum].type;
-               pmc_pm     = (value >> pmu_conf->pmc_desc[cnum].pm_pos) & 0x1;
-               is_counting = (pmc_type & PFM_REG_COUNTING) == PFM_REG_COUNTING ? 1 : 0;
-               is_monitor  = (pmc_type & PFM_REG_MONITOR) == PFM_REG_MONITOR ? 1 : 0;
-
-               /*
-                * we reject all non implemented PMC as well
-                * as attempts to modify PMC[0-3] which are used
-                * as status registers by the PMU
-                */
-               if ((pmc_type & PFM_REG_IMPL) == 0 || (pmc_type & PFM_REG_CONTROL) == PFM_REG_CONTROL) {
-                       DPRINT(("pmc%u is unimplemented or no-access pmc_type=%x\n", cnum, pmc_type));
-                       goto error;
-               }
-               wr_func = pmu_conf->pmc_desc[cnum].write_check;
-               /*
-                * If the PMC is a monitor, then if the value is not the default:
-                *      - system-wide session: PMCx.pm=1 (privileged monitor)
-                *      - per-task           : PMCx.pm=0 (user monitor)
-                */
-               if (is_monitor && value != PMC_DFL_VAL(cnum) && is_system ^ pmc_pm) {
-                       DPRINT(("pmc%u pmc_pm=%lu is_system=%d\n",
-                               cnum,
-                               pmc_pm,
-                               is_system));
-                       goto error;
-               }
-
-               if (is_counting) {
-                       /*
-                        * enforce generation of overflow interrupt. Necessary on all
-                        * CPUs.
-                        */
-                       value |= 1 << PMU_PMC_OI;
-
-                       if (reg_flags & PFM_REGFL_OVFL_NOTIFY) {
-                               flags |= PFM_REGFL_OVFL_NOTIFY;
-                       }
-
-                       if (reg_flags & PFM_REGFL_RANDOM) flags |= PFM_REGFL_RANDOM;
-
-                       /* verify validity of smpl_pmds */
-                       if ((smpl_pmds & impl_pmds) != smpl_pmds) {
-                               DPRINT(("invalid smpl_pmds 0x%lx for pmc%u\n", smpl_pmds, cnum));
-                               goto error;
-                       }
-
-                       /* verify validity of reset_pmds */
-                       if ((reset_pmds & impl_pmds) != reset_pmds) {
-                               DPRINT(("invalid reset_pmds 0x%lx for pmc%u\n", reset_pmds, cnum));
-                               goto error;
-                       }
-               } else {
-                       if (reg_flags & (PFM_REGFL_OVFL_NOTIFY|PFM_REGFL_RANDOM)) {
-                               DPRINT(("cannot set ovfl_notify or random on pmc%u\n", cnum));
-                               goto error;
-                       }
-                       /* eventid on non-counting monitors are ignored */
-               }
-
-               /*
-                * execute write checker, if any
-                */
-               if (likely(expert_mode == 0 && wr_func)) {
-                       ret = (*wr_func)(task, ctx, cnum, &value, regs);
-                       if (ret) goto error;
-                       ret = -EINVAL;
-               }
-
-               /*
-                * no error on this register
-                */
-               PFM_REG_RETFLAG_SET(req->reg_flags, 0);
-
-               /*
-                * Now we commit the changes to the software state
-                */
-
-               /*
-                * update overflow information
-                */
-               if (is_counting) {
-                       /*
-                        * full flag update each time a register is programmed
-                        */
-                       ctx->ctx_pmds[cnum].flags = flags;
-
-                       ctx->ctx_pmds[cnum].reset_pmds[0] = reset_pmds;
-                       ctx->ctx_pmds[cnum].smpl_pmds[0]  = smpl_pmds;
-                       ctx->ctx_pmds[cnum].eventid       = req->reg_smpl_eventid;
-
-                       /*
-                        * Mark all PMDS to be accessed as used.
-                        *
-                        * We do not keep track of PMC because we have to
-                        * systematically restore ALL of them.
-                        *
-                        * We do not update the used_monitors mask, because
-                        * if we have not programmed them, then will be in
-                        * a quiescent state, therefore we will not need to
-                        * mask/restore then when context is MASKED.
-                        */
-                       CTX_USED_PMD(ctx, reset_pmds);
-                       CTX_USED_PMD(ctx, smpl_pmds);
-                       /*
-                        * make sure we do not try to reset on
-                        * restart because we have established new values
-                        */
-                       if (state == PFM_CTX_MASKED) ctx->ctx_ovfl_regs[0] &= ~1UL << cnum;
-               }
-               /*
-                * Needed in case the user does not initialize the equivalent
-                * PMD. Clearing is done indirectly via pfm_reset_pmu_state() so there is no
-                * possible leak here.
-                */
-               CTX_USED_PMD(ctx, pmu_conf->pmc_desc[cnum].dep_pmd[0]);
-
-               /*
-                * keep track of the monitor PMC that we are using.
-                * we save the value of the pmc in ctx_pmcs[] and if
-                * the monitoring is not stopped for the context we also
-                * place it in the saved state area so that it will be
-                * picked up later by the context switch code.
-                *
-                * The value in ctx_pmcs[] can only be changed in pfm_write_pmcs().
-                *
-                * The value in thread->pmcs[] may be modified on overflow, i.e.,  when
-                * monitoring needs to be stopped.
-                */
-               if (is_monitor) CTX_USED_MONITOR(ctx, 1UL << cnum);
-
-               /*
-                * update context state
-                */
-               ctx->ctx_pmcs[cnum] = value;
-
-               if (is_loaded) {
-                       /*
-                        * write thread state
-                        */
-                       if (is_system == 0) thread->pmcs[cnum] = value;
-
-                       /*
-                        * write hardware register if we can
-                        */
-                       if (can_access_pmu) {
-                               ia64_set_pmc(cnum, value);
-                       }
-#ifdef CONFIG_SMP
-                       else {
-                               /*
-                                * per-task SMP only here
-                                *
-                                * we are guaranteed that the task is not running on the other CPU,
-                                * we indicate that this PMD will need to be reloaded if the task
-                                * is rescheduled on the CPU it ran last on.
-                                */
-                               ctx->ctx_reload_pmcs[0] |= 1UL << cnum;
-                       }
-#endif
-               }
-
-               DPRINT(("pmc[%u]=0x%lx ld=%d apmu=%d flags=0x%x all_pmcs=0x%lx used_pmds=0x%lx eventid=%ld smpl_pmds=0x%lx reset_pmds=0x%lx reloads_pmcs=0x%lx used_monitors=0x%lx ovfl_regs=0x%lx\n",
-                         cnum,
-                         value,
-                         is_loaded,
-                         can_access_pmu,
-                         flags,
-                         ctx->ctx_all_pmcs[0],
-                         ctx->ctx_used_pmds[0],
-                         ctx->ctx_pmds[cnum].eventid,
-                         smpl_pmds,
-                         reset_pmds,
-                         ctx->ctx_reload_pmcs[0],
-                         ctx->ctx_used_monitors[0],
-                         ctx->ctx_ovfl_regs[0]));
-       }
-
-       /*
-        * make sure the changes are visible
-        */
-       if (can_access_pmu) ia64_srlz_d();
-
-       return 0;
-error:
-       PFM_REG_RETFLAG_SET(req->reg_flags, PFM_REG_RETFL_EINVAL);
-       return ret;
-}
-
-static int
-pfm_write_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct thread_struct *thread = NULL;
-       struct task_struct *task;
-       pfarg_reg_t *req = (pfarg_reg_t *)arg;
-       unsigned long value, hw_value, ovfl_mask;
-       unsigned int cnum;
-       int i, can_access_pmu = 0, state;
-       int is_counting, is_loaded, is_system, expert_mode;
-       int ret = -EINVAL;
-       pfm_reg_check_t wr_func;
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_WRITE_PMDS,
-                                                    arg, count);
-               return 0;
-       }
-
-       state     = ctx->ctx_state;
-       is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
-       is_system = ctx->ctx_fl_system;
-       ovfl_mask = pmu_conf->ovfl_val;
-       task      = ctx->ctx_task;
-
-       if (unlikely(state == PFM_CTX_ZOMBIE)) return -EINVAL;
-
-       /*
-        * on both UP and SMP, we can only write to the PMC when the task is
-        * the owner of the local PMU.
-        */
-       if (likely(is_loaded)) {
-               thread = &task->thread;
-               /*
-                * In system wide and when the context is loaded, access can only happen
-                * when the caller is running on the CPU being monitored by the session.
-                * It does not have to be the owner (ctx_task) of the context per se.
-                */
-               if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-                       DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-                       return -EBUSY;
-               }
-               can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
-       }
-       expert_mode = pfm_sysctl.expert_mode; 
-
-       for (i = 0; i < count; i++, req++) {
-
-               cnum  = req->reg_num;
-               value = req->reg_value;
-
-               if (!PMD_IS_IMPL(cnum)) {
-                       DPRINT(("pmd[%u] is unimplemented or invalid\n", cnum));
-                       goto abort_mission;
-               }
-               is_counting = PMD_IS_COUNTING(cnum);
-               wr_func     = pmu_conf->pmd_desc[cnum].write_check;
-
-               /*
-                * execute write checker, if any
-                */
-               if (unlikely(expert_mode == 0 && wr_func)) {
-                       unsigned long v = value;
-
-                       ret = (*wr_func)(task, ctx, cnum, &v, regs);
-                       if (ret) goto abort_mission;
-
-                       value = v;
-                       ret   = -EINVAL;
-               }
-
-               /*
-                * no error on this register
-                */
-               PFM_REG_RETFLAG_SET(req->reg_flags, 0);
-
-               /*
-                * now commit changes to software state
-                */
-               hw_value = value;
-
-               /*
-                * update virtualized (64bits) counter
-                */
-               if (is_counting) {
-                       /*
-                        * write context state
-                        */
-                       ctx->ctx_pmds[cnum].lval = value;
-
-                       /*
-                        * when context is load we use the split value
-                        */
-                       if (is_loaded) {
-                               hw_value = value &  ovfl_mask;
-                               value    = value & ~ovfl_mask;
-                       }
-               }
-               /*
-                * update reset values (not just for counters)
-                */
-               ctx->ctx_pmds[cnum].long_reset  = req->reg_long_reset;
-               ctx->ctx_pmds[cnum].short_reset = req->reg_short_reset;
-
-               /*
-                * update randomization parameters (not just for counters)
-                */
-               ctx->ctx_pmds[cnum].seed = req->reg_random_seed;
-               ctx->ctx_pmds[cnum].mask = req->reg_random_mask;
-
-               /*
-                * update context value
-                */
-               ctx->ctx_pmds[cnum].val  = value;
-
-               /*
-                * Keep track of what we use
-                *
-                * We do not keep track of PMC because we have to
-                * systematically restore ALL of them.
-                */
-               CTX_USED_PMD(ctx, PMD_PMD_DEP(cnum));
-
-               /*
-                * mark this PMD register used as well
-                */
-               CTX_USED_PMD(ctx, RDEP(cnum));
-
-               /*
-                * make sure we do not try to reset on
-                * restart because we have established new values
-                */
-               if (is_counting && state == PFM_CTX_MASKED) {
-                       ctx->ctx_ovfl_regs[0] &= ~1UL << cnum;
-               }
-
-               if (is_loaded) {
-                       /*
-                        * write thread state
-                        */
-                       if (is_system == 0) thread->pmds[cnum] = hw_value;
-
-                       /*
-                        * write hardware register if we can
-                        */
-                       if (can_access_pmu) {
-                               ia64_set_pmd(cnum, hw_value);
-                       } else {
-#ifdef CONFIG_SMP
-                               /*
-                                * we are guaranteed that the task is not running on the other CPU,
-                                * we indicate that this PMD will need to be reloaded if the task
-                                * is rescheduled on the CPU it ran last on.
-                                */
-                               ctx->ctx_reload_pmds[0] |= 1UL << cnum;
-#endif
-                       }
-               }
-
-               DPRINT(("pmd[%u]=0x%lx ld=%d apmu=%d, hw_value=0x%lx ctx_pmd=0x%lx  short_reset=0x%lx "
-                         "long_reset=0x%lx notify=%c seed=0x%lx mask=0x%lx used_pmds=0x%lx reset_pmds=0x%lx reload_pmds=0x%lx all_pmds=0x%lx ovfl_regs=0x%lx\n",
-                       cnum,
-                       value,
-                       is_loaded,
-                       can_access_pmu,
-                       hw_value,
-                       ctx->ctx_pmds[cnum].val,
-                       ctx->ctx_pmds[cnum].short_reset,
-                       ctx->ctx_pmds[cnum].long_reset,
-                       PMC_OVFL_NOTIFY(ctx, cnum) ? 'Y':'N',
-                       ctx->ctx_pmds[cnum].seed,
-                       ctx->ctx_pmds[cnum].mask,
-                       ctx->ctx_used_pmds[0],
-                       ctx->ctx_pmds[cnum].reset_pmds[0],
-                       ctx->ctx_reload_pmds[0],
-                       ctx->ctx_all_pmds[0],
-                       ctx->ctx_ovfl_regs[0]));
-       }
-
-       /*
-        * make changes visible
-        */
-       if (can_access_pmu) ia64_srlz_d();
-
-       return 0;
-
-abort_mission:
-       /*
-        * for now, we have only one possibility for error
-        */
-       PFM_REG_RETFLAG_SET(req->reg_flags, PFM_REG_RETFL_EINVAL);
-       return ret;
-}
-
-/*
- * By the way of PROTECT_CONTEXT(), interrupts are masked while we are in this function.
- * Therefore we know, we do not have to worry about the PMU overflow interrupt. If an
- * interrupt is delivered during the call, it will be kept pending until we leave, making
- * it appears as if it had been generated at the UNPROTECT_CONTEXT(). At least we are
- * guaranteed to return consistent data to the user, it may simply be old. It is not
- * trivial to treat the overflow while inside the call because you may end up in
- * some module sampling buffer code causing deadlocks.
- */
-static int
-pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct thread_struct *thread = NULL;
-       struct task_struct *task;
-       unsigned long val = 0UL, lval, ovfl_mask, sval;
-       pfarg_reg_t *req = (pfarg_reg_t *)arg;
-       unsigned int cnum, reg_flags = 0;
-       int i, can_access_pmu = 0, state;
-       int is_loaded, is_system, is_counting, expert_mode;
-       int ret = -EINVAL;
-       pfm_reg_check_t rd_func;
-       XEN_NOT_SUPPORTED_YET;
-
-       /*
-        * access is possible when loaded only for
-        * self-monitoring tasks or in UP mode
-        */
-
-       state     = ctx->ctx_state;
-       is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
-       is_system = ctx->ctx_fl_system;
-       ovfl_mask = pmu_conf->ovfl_val;
-       task      = ctx->ctx_task;
-
-       if (state == PFM_CTX_ZOMBIE) return -EINVAL;
-
-       if (likely(is_loaded)) {
-               thread = &task->thread;
-               /*
-                * In system wide and when the context is loaded, access can only happen
-                * when the caller is running on the CPU being monitored by the session.
-                * It does not have to be the owner (ctx_task) of the context per se.
-                */
-               if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-                       DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-                       return -EBUSY;
-               }
-               /*
-                * this can be true when not self-monitoring only in UP
-                */
-               can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
-
-               if (can_access_pmu) ia64_srlz_d();
-       }
-       expert_mode = pfm_sysctl.expert_mode; 
-
-       DPRINT(("ld=%d apmu=%d ctx_state=%d\n",
-               is_loaded,
-               can_access_pmu,
-               state));
-
-       /*
-        * on both UP and SMP, we can only read the PMD from the hardware register when
-        * the task is the owner of the local PMU.
-        */
-
-       for (i = 0; i < count; i++, req++) {
-
-               cnum        = req->reg_num;
-               reg_flags   = req->reg_flags;
-
-               if (unlikely(!PMD_IS_IMPL(cnum))) goto error;
-               /*
-                * we can only read the register that we use. That includes
-                * the one we explicitely initialize AND the one we want included
-                * in the sampling buffer (smpl_regs).
-                *
-                * Having this restriction allows optimization in the ctxsw routine
-                * without compromising security (leaks)
-                */
-               if (unlikely(!CTX_IS_USED_PMD(ctx, cnum))) goto error;
-
-               sval        = ctx->ctx_pmds[cnum].val;
-               lval        = ctx->ctx_pmds[cnum].lval;
-               is_counting = PMD_IS_COUNTING(cnum);
-
-               /*
-                * If the task is not the current one, then we check if the
-                * PMU state is still in the local live register due to lazy ctxsw.
-                * If true, then we read directly from the registers.
-                */
-               if (can_access_pmu){
-                       val = ia64_get_pmd(cnum);
-               } else {
-                       /*
-                        * context has been saved
-                        * if context is zombie, then task does not exist anymore.
-                        * In this case, we use the full value saved in the context (pfm_flush_regs()).
-                        */
-                       val = is_loaded ? thread->pmds[cnum] : 0UL;
-               }
-               rd_func = pmu_conf->pmd_desc[cnum].read_check;
-
-               if (is_counting) {
-                       /*
-                        * XXX: need to check for overflow when loaded
-                        */
-                       val &= ovfl_mask;
-                       val += sval;
-               }
-
-               /*
-                * execute read checker, if any
-                */
-               if (unlikely(expert_mode == 0 && rd_func)) {
-                       unsigned long v = val;
-                       ret = (*rd_func)(ctx->ctx_task, ctx, cnum, &v, regs);
-                       if (ret) goto error;
-                       val = v;
-                       ret = -EINVAL;
-               }
-
-               PFM_REG_RETFLAG_SET(reg_flags, 0);
-
-               DPRINT(("pmd[%u]=0x%lx\n", cnum, val));
-
-               /*
-                * update register return value, abort all if problem during copy.
-                * we only modify the reg_flags field. no check mode is fine because
-                * access has been verified upfront in sys_perfmonctl().
-                */
-               req->reg_value            = val;
-               req->reg_flags            = reg_flags;
-               req->reg_last_reset_val   = lval;
-       }
-
-       return 0;
-
-error:
-       PFM_REG_RETFLAG_SET(req->reg_flags, PFM_REG_RETFL_EINVAL);
-       return ret;
-}
-
-int
-pfm_mod_write_pmcs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
-{
-       pfm_context_t *ctx;
-
-       if (req == NULL) return -EINVAL;
-
-       ctx = GET_PMU_CTX();
-
-       if (ctx == NULL) return -EINVAL;
-
-       /*
-        * for now limit to current task, which is enough when calling
-        * from overflow handler
-        */
-       if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
-
-       return pfm_write_pmcs(ctx, req, nreq, regs);
-}
-EXPORT_SYMBOL(pfm_mod_write_pmcs);
-
-int
-pfm_mod_read_pmds(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
-{
-       pfm_context_t *ctx;
-
-       if (req == NULL) return -EINVAL;
-
-       ctx = GET_PMU_CTX();
-
-       if (ctx == NULL) return -EINVAL;
-
-       /*
-        * for now limit to current task, which is enough when calling
-        * from overflow handler
-        */
-       if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
-
-       return pfm_read_pmds(ctx, req, nreq, regs);
-}
-EXPORT_SYMBOL(pfm_mod_read_pmds);
-
-/*
- * Only call this function when a process it trying to
- * write the debug registers (reading is always allowed)
- */
-int
-pfm_use_debug_registers(struct task_struct *task)
-{
-       pfm_context_t *ctx = task->thread.pfm_context;
-       unsigned long flags;
-       int ret = 0;
-
-       if (pmu_conf->use_rr_dbregs == 0) return 0;
-
-       DPRINT(("called for [%d]\n", task->pid));
-
-       /*
-        * do it only once
-        */
-       if (task->thread.flags & IA64_THREAD_DBG_VALID) return 0;
-
-       /*
-        * Even on SMP, we do not need to use an atomic here because
-        * the only way in is via ptrace() and this is possible only when the
-        * process is stopped. Even in the case where the ctxsw out is not totally
-        * completed by the time we come here, there is no way the 'stopped' process
-        * could be in the middle of fiddling with the pfm_write_ibr_dbr() routine.
-        * So this is always safe.
-        */
-       if (ctx && ctx->ctx_fl_using_dbreg == 1) return -1;
-
-       LOCK_PFS(flags);
-
-       /*
-        * We cannot allow setting breakpoints when system wide monitoring
-        * sessions are using the debug registers.
-        */
-       if (pfm_sessions.pfs_sys_use_dbregs> 0)
-               ret = -1;
-       else
-               pfm_sessions.pfs_ptrace_use_dbregs++;
-
-       DPRINT(("ptrace_use_dbregs=%u  sys_use_dbregs=%u by [%d] ret = %d\n",
-                 pfm_sessions.pfs_ptrace_use_dbregs,
-                 pfm_sessions.pfs_sys_use_dbregs,
-                 task->pid, ret));
-
-       UNLOCK_PFS(flags);
-
-       return ret;
-}
-
-/*
- * This function is called for every task that exits with the
- * IA64_THREAD_DBG_VALID set. This indicates a task which was
- * able to use the debug registers for debugging purposes via
- * ptrace(). Therefore we know it was not using them for
- * perfmormance monitoring, so we only decrement the number
- * of "ptraced" debug register users to keep the count up to date
- */
-int
-pfm_release_debug_registers(struct task_struct *task)
-{
-       unsigned long flags;
-       int ret;
-
-       if (pmu_conf->use_rr_dbregs == 0) return 0;
-
-       LOCK_PFS(flags);
-       if (pfm_sessions.pfs_ptrace_use_dbregs == 0) {
-               printk(KERN_ERR "perfmon: invalid release for [%d] ptrace_use_dbregs=0\n", task->pid);
-               ret = -1;
-       }  else {
-               pfm_sessions.pfs_ptrace_use_dbregs--;
-               ret = 0;
-       }
-       UNLOCK_PFS(flags);
-
-       return ret;
-}
-
-static int
-pfm_restart(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct task_struct *task;
-       pfm_buffer_fmt_t *fmt;
-       pfm_ovfl_ctrl_t rst_ctrl;
-       int state, is_system;
-       int ret = 0;
-       XEN_NOT_SUPPORTED_YET;
-
-       state     = ctx->ctx_state;
-       fmt       = ctx->ctx_buf_fmt;
-       is_system = ctx->ctx_fl_system;
-       task      = PFM_CTX_TASK(ctx);
-
-       switch(state) {
-               case PFM_CTX_MASKED:
-                       break;
-               case PFM_CTX_LOADED: 
-                       if (CTX_HAS_SMPL(ctx) && fmt->fmt_restart_active) break;
-                       /* fall through */
-               case PFM_CTX_UNLOADED:
-               case PFM_CTX_ZOMBIE:
-                       DPRINT(("invalid state=%d\n", state));
-                       return -EBUSY;
-               default:
-                       DPRINT(("state=%d, cannot operate (no active_restart handler)\n", state));
-                       return -EINVAL;
-       }
-
-       /*
-        * In system wide and when the context is loaded, access can only happen
-        * when the caller is running on the CPU being monitored by the session.
-        * It does not have to be the owner (ctx_task) of the context per se.
-        */
-       if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-               DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-               return -EBUSY;
-       }
-
-       /* sanity check */
-       if (unlikely(task == NULL)) {
-               printk(KERN_ERR "perfmon: [%d] pfm_restart no task\n", current->pid);
-               return -EINVAL;
-       }
-
-       if (task == current || is_system) {
-
-               fmt = ctx->ctx_buf_fmt;
-
-               DPRINT(("restarting self %d ovfl=0x%lx\n",
-                       task->pid,
-                       ctx->ctx_ovfl_regs[0]));
-
-               if (CTX_HAS_SMPL(ctx)) {
-
-                       prefetch(ctx->ctx_smpl_hdr);
-
-                       rst_ctrl.bits.mask_monitoring = 0;
-                       rst_ctrl.bits.reset_ovfl_pmds = 0;
-
-                       if (state == PFM_CTX_LOADED)
-                               ret = pfm_buf_fmt_restart_active(fmt, task, &rst_ctrl, ctx->ctx_smpl_hdr, regs);
-                       else
-                               ret = pfm_buf_fmt_restart(fmt, task, &rst_ctrl, ctx->ctx_smpl_hdr, regs);
-               } else {
-                       rst_ctrl.bits.mask_monitoring = 0;
-                       rst_ctrl.bits.reset_ovfl_pmds = 1;
-               }
-
-               if (ret == 0) {
-                       if (rst_ctrl.bits.reset_ovfl_pmds)
-                               pfm_reset_regs(ctx, ctx->ctx_ovfl_regs, PFM_PMD_LONG_RESET);
-
-                       if (rst_ctrl.bits.mask_monitoring == 0) {
-                               DPRINT(("resuming monitoring for [%d]\n", task->pid));
-
-                               if (state == PFM_CTX_MASKED) pfm_restore_monitoring(task);
-                       } else {
-                               DPRINT(("keeping monitoring stopped for [%d]\n", task->pid));
-
-                               // cannot use pfm_stop_monitoring(task, regs);
-                       }
-               }
-               /*
-                * clear overflowed PMD mask to remove any stale information
-                */
-               ctx->ctx_ovfl_regs[0] = 0UL;
-
-               /*
-                * back to LOADED state
-                */
-               ctx->ctx_state = PFM_CTX_LOADED;
-
-               /*
-                * XXX: not really useful for self monitoring
-                */
-               ctx->ctx_fl_can_restart = 0;
-
-               return 0;
-       }
-
-       /* 
-        * restart another task
-        */
-
-       /*
-        * When PFM_CTX_MASKED, we cannot issue a restart before the previous 
-        * one is seen by the task.
-        */
-       if (state == PFM_CTX_MASKED) {
-               if (ctx->ctx_fl_can_restart == 0) return -EINVAL;
-               /*
-                * will prevent subsequent restart before this one is
-                * seen by other task
-                */
-               ctx->ctx_fl_can_restart = 0;
-       }
-
-       /*
-        * if blocking, then post the semaphore is PFM_CTX_MASKED, i.e.
-        * the task is blocked or on its way to block. That's the normal
-        * restart path. If the monitoring is not masked, then the task
-        * can be actively monitoring and we cannot directly intervene.
-        * Therefore we use the trap mechanism to catch the task and
-        * force it to reset the buffer/reset PMDs.
-        *
-        * if non-blocking, then we ensure that the task will go into
-        * pfm_handle_work() before returning to user mode.
-        *
-        * We cannot explicitely reset another task, it MUST always
-        * be done by the task itself. This works for system wide because
-        * the tool that is controlling the session is logically doing 
-        * "self-monitoring".
-        */
-       if (CTX_OVFL_NOBLOCK(ctx) == 0 && state == PFM_CTX_MASKED) {
-               DPRINT(("unblocking [%d] \n", task->pid));
-               complete(&ctx->ctx_restart_done);
-       } else {
-               DPRINT(("[%d] armed exit trap\n", task->pid));
-
-               ctx->ctx_fl_trap_reason = PFM_TRAP_REASON_RESET;
-
-               PFM_SET_WORK_PENDING(task, 1);
-
-               pfm_set_task_notify(task);
-
-               /*
-                * XXX: send reschedule if task runs on another CPU
-                */
-       }
-       return 0;
-}
-
-static int
-pfm_debug(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       unsigned int m = *(unsigned int *)arg;
-       XEN_NOT_SUPPORTED_YET;
-
-       pfm_sysctl.debug = m == 0 ? 0 : 1;
-
-       printk(KERN_INFO "perfmon debugging %s (timing reset)\n", pfm_sysctl.debug ? "on" : "off");
-
-       if (m == 0) {
-               memset(pfm_stats, 0, sizeof(pfm_stats));
-               for(m=0; m < NR_CPUS; m++) pfm_stats[m].pfm_ovfl_intr_cycles_min = ~0UL;
-       }
-       return 0;
-}
-
-/*
- * arg can be NULL and count can be zero for this function
- */
-static int
-pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct thread_struct *thread = NULL;
-       struct task_struct *task;
-       pfarg_dbreg_t *req = (pfarg_dbreg_t *)arg;
-       unsigned long flags;
-       dbreg_t dbreg;
-       unsigned int rnum;
-       int first_time;
-       int ret = 0, state;
-       int i, can_access_pmu = 0;
-       int is_system, is_loaded;
-
-       if (pmu_conf->use_rr_dbregs == 0) return -EINVAL;
-
-       state     = ctx->ctx_state;
-       is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
-       is_system = ctx->ctx_fl_system;
-       task      = ctx->ctx_task;
-
-       if (state == PFM_CTX_ZOMBIE) return -EINVAL;
-
-       /*
-        * on both UP and SMP, we can only write to the PMC when the task is
-        * the owner of the local PMU.
-        */
-       if (is_loaded) {
-               thread = &task->thread;
-               /*
-                * In system wide and when the context is loaded, access can only happen
-                * when the caller is running on the CPU being monitored by the session.
-                * It does not have to be the owner (ctx_task) of the context per se.
-                */
-               if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-                       DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-                       return -EBUSY;
-               }
-               can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
-       }
-
-       /*
-        * we do not need to check for ipsr.db because we do clear ibr.x, dbr.r, and dbr.w
-        * ensuring that no real breakpoint can be installed via this call.
-        *
-        * IMPORTANT: regs can be NULL in this function
-        */
-
-       first_time = ctx->ctx_fl_using_dbreg == 0;
-
-       /*
-        * don't bother if we are loaded and task is being debugged
-        */
-       if (is_loaded && (thread->flags & IA64_THREAD_DBG_VALID) != 0) {
-               DPRINT(("debug registers already in use for [%d]\n", task->pid));
-               return -EBUSY;
-       }
-
-       /*
-        * check for debug registers in system wide mode
-        *
-        * If though a check is done in pfm_context_load(),
-        * we must repeat it here, in case the registers are
-        * written after the context is loaded
-        */
-       if (is_loaded) {
-               LOCK_PFS(flags);
-
-               if (first_time && is_system) {
-                       if (pfm_sessions.pfs_ptrace_use_dbregs)
-                               ret = -EBUSY;
-                       else
-                               pfm_sessions.pfs_sys_use_dbregs++;
-               }
-               UNLOCK_PFS(flags);
-       }
-
-       if (ret != 0) return ret;
-
-       /*
-        * mark ourself as user of the debug registers for
-        * perfmon purposes.
-        */
-       ctx->ctx_fl_using_dbreg = 1;
-
-       /*
-        * clear hardware registers to make sure we don't
-        * pick up stale state.
-        *
-        * for a system wide session, we do not use
-        * thread.dbr, thread.ibr because this process
-        * never leaves the current CPU and the state
-        * is shared by all processes running on it
-        */
-       if (first_time && can_access_pmu) {
-               DPRINT(("[%d] clearing ibrs, dbrs\n", task->pid));
-               for (i=0; i < pmu_conf->num_ibrs; i++) {
-                       ia64_set_ibr(i, 0UL);
-                       ia64_dv_serialize_instruction();
-               }
-               ia64_srlz_i();
-               for (i=0; i < pmu_conf->num_dbrs; i++) {
-                       ia64_set_dbr(i, 0UL);
-                       ia64_dv_serialize_data();
-               }
-               ia64_srlz_d();
-       }
-
-       /*
-        * Now install the values into the registers
-        */
-       for (i = 0; i < count; i++, req++) {
-
-               rnum      = req->dbreg_num;
-               dbreg.val = req->dbreg_value;
-
-               ret = -EINVAL;
-
-               if ((mode == PFM_CODE_RR && rnum >= PFM_NUM_IBRS) || ((mode == PFM_DATA_RR) && rnum >= PFM_NUM_DBRS)) {
-                       DPRINT(("invalid register %u val=0x%lx mode=%d i=%d count=%d\n",
-                                 rnum, dbreg.val, mode, i, count));
-
-                       goto abort_mission;
-               }
-
-               /*
-                * make sure we do not install enabled breakpoint
-                */
-               if (rnum & 0x1) {
-                       if (mode == PFM_CODE_RR)
-                               dbreg.ibr.ibr_x = 0;
-                       else
-                               dbreg.dbr.dbr_r = dbreg.dbr.dbr_w = 0;
-               }
-
-               PFM_REG_RETFLAG_SET(req->dbreg_flags, 0);
-
-               /*
-                * Debug registers, just like PMC, can only be modified
-                * by a kernel call. Moreover, perfmon() access to those
-                * registers are centralized in this routine. The hardware
-                * does not modify the value of these registers, therefore,
-                * if we save them as they are written, we can avoid having
-                * to save them on context switch out. This is made possible
-                * by the fact that when perfmon uses debug registers, ptrace()
-                * won't be able to modify them concurrently.
-                */
-               if (mode == PFM_CODE_RR) {
-                       CTX_USED_IBR(ctx, rnum);
-
-                       if (can_access_pmu) {
-                               ia64_set_ibr(rnum, dbreg.val);
-                               ia64_dv_serialize_instruction();
-                       }
-
-                       ctx->ctx_ibrs[rnum] = dbreg.val;
-
-                       DPRINT(("write ibr%u=0x%lx used_ibrs=0x%x ld=%d apmu=%d\n",
-                               rnum, dbreg.val, ctx->ctx_used_ibrs[0], is_loaded, can_access_pmu));
-               } else {
-                       CTX_USED_DBR(ctx, rnum);
-
-                       if (can_access_pmu) {
-                               ia64_set_dbr(rnum, dbreg.val);
-                               ia64_dv_serialize_data();
-                       }
-                       ctx->ctx_dbrs[rnum] = dbreg.val;
-
-                       DPRINT(("write dbr%u=0x%lx used_dbrs=0x%x ld=%d apmu=%d\n",
-                               rnum, dbreg.val, ctx->ctx_used_dbrs[0], is_loaded, can_access_pmu));
-               }
-       }
-
-       return 0;
-
-abort_mission:
-       /*
-        * in case it was our first attempt, we undo the global modifications
-        */
-       if (first_time) {
-               LOCK_PFS(flags);
-               if (ctx->ctx_fl_system) {
-                       pfm_sessions.pfs_sys_use_dbregs--;
-               }
-               UNLOCK_PFS(flags);
-               ctx->ctx_fl_using_dbreg = 0;
-       }
-       /*
-        * install error return flag
-        */
-       PFM_REG_RETFLAG_SET(req->dbreg_flags, PFM_REG_RETFL_EINVAL);
-
-       return ret;
-}
-
-static int
-pfm_write_ibrs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       return pfm_write_ibr_dbr(PFM_CODE_RR, ctx, arg, count, regs);
-}
-
-static int
-pfm_write_dbrs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       return pfm_write_ibr_dbr(PFM_DATA_RR, ctx, arg, count, regs);
-}
-
-int
-pfm_mod_write_ibrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
-{
-       pfm_context_t *ctx;
-
-       if (req == NULL) return -EINVAL;
-
-       ctx = GET_PMU_CTX();
-
-       if (ctx == NULL) return -EINVAL;
-
-       /*
-        * for now limit to current task, which is enough when calling
-        * from overflow handler
-        */
-       if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
-
-       return pfm_write_ibrs(ctx, req, nreq, regs);
-}
-EXPORT_SYMBOL(pfm_mod_write_ibrs);
-
-int
-pfm_mod_write_dbrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
-{
-       pfm_context_t *ctx;
-
-       if (req == NULL) return -EINVAL;
-
-       ctx = GET_PMU_CTX();
-
-       if (ctx == NULL) return -EINVAL;
-
-       /*
-        * for now limit to current task, which is enough when calling
-        * from overflow handler
-        */
-       if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
-
-       return pfm_write_dbrs(ctx, req, nreq, regs);
-}
-EXPORT_SYMBOL(pfm_mod_write_dbrs);
-
-
-static int
-pfm_get_features(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       pfarg_features_t *req = (pfarg_features_t *)arg;
-
-       if (is_running_on_xen())
-               return HYPERVISOR_perfmon_op(PFM_GET_FEATURES, &arg, 0);
-       req->ft_version = PFM_VERSION;
-       return 0;
-}
-
-static int
-pfm_stop(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct pt_regs *tregs;
-       struct task_struct *task = PFM_CTX_TASK(ctx);
-       int state, is_system;
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_STOP, NULL, 0);
-               return 0;
-       }
-
-       state     = ctx->ctx_state;
-       is_system = ctx->ctx_fl_system;
-
-       /*
-        * context must be attached to issue the stop command (includes LOADED,MASKED,ZOMBIE)
-        */
-       if (state == PFM_CTX_UNLOADED) return -EINVAL;
-
-       /*
-        * In system wide and when the context is loaded, access can only happen
-        * when the caller is running on the CPU being monitored by the session.
-        * It does not have to be the owner (ctx_task) of the context per se.
-        */
-       if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-               DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-               return -EBUSY;
-       }
-       DPRINT(("task [%d] ctx_state=%d is_system=%d\n",
-               PFM_CTX_TASK(ctx)->pid,
-               state,
-               is_system));
-       /*
-        * in system mode, we need to update the PMU directly
-        * and the user level state of the caller, which may not
-        * necessarily be the creator of the context.
-        */
-       if (is_system) {
-               /*
-                * Update local PMU first
-                *
-                * disable dcr pp
-                */
-               ia64_setreg(_IA64_REG_CR_DCR, ia64_getreg(_IA64_REG_CR_DCR) & ~IA64_DCR_PP);
-               ia64_srlz_i();
-
-               /*
-                * update local cpuinfo
-                */
-               PFM_CPUINFO_CLEAR(PFM_CPUINFO_DCR_PP);
-
-               /*
-                * stop monitoring, does srlz.i
-                */
-               pfm_clear_psr_pp();
-
-               /*
-                * stop monitoring in the caller
-                */
-               ia64_psr(regs)->pp = 0;
-
-               return 0;
-       }
-       /*
-        * per-task mode
-        */
-
-       if (task == current) {
-               /* stop monitoring  at kernel level */
-               pfm_clear_psr_up();
-
-               /*
-                * stop monitoring at the user level
-                */
-               ia64_psr(regs)->up = 0;
-       } else {
-               tregs = task_pt_regs(task);
-
-               /*
-                * stop monitoring at the user level
-                */
-               ia64_psr(tregs)->up = 0;
-
-               /*
-                * monitoring disabled in kernel at next reschedule
-                */
-               ctx->ctx_saved_psr_up = 0;
-               DPRINT(("task=[%d]\n", task->pid));
-       }
-       return 0;
-}
-
-
-static int
-pfm_start(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct pt_regs *tregs;
-       int state, is_system;
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_START, NULL, 0);
-               return 0;
-       }
-       state     = ctx->ctx_state;
-       is_system = ctx->ctx_fl_system;
-
-       if (state != PFM_CTX_LOADED) return -EINVAL;
-
-       /*
-        * In system wide and when the context is loaded, access can only happen
-        * when the caller is running on the CPU being monitored by the session.
-        * It does not have to be the owner (ctx_task) of the context per se.
-        */
-       if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-               DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
-               return -EBUSY;
-       }
-
-       /*
-        * in system mode, we need to update the PMU directly
-        * and the user level state of the caller, which may not
-        * necessarily be the creator of the context.
-        */
-       if (is_system) {
-
-               /*
-                * set user level psr.pp for the caller
-                */
-               ia64_psr(regs)->pp = 1;
-
-               /*
-                * now update the local PMU and cpuinfo
-                */
-               PFM_CPUINFO_SET(PFM_CPUINFO_DCR_PP);
-
-               /*
-                * start monitoring at kernel level
-                */
-               pfm_set_psr_pp();
-
-               /* enable dcr pp */
-               ia64_setreg(_IA64_REG_CR_DCR, ia64_getreg(_IA64_REG_CR_DCR) | IA64_DCR_PP);
-               ia64_srlz_i();
-
-               return 0;
-       }
-
-       /*
-        * per-process mode
-        */
-
-       if (ctx->ctx_task == current) {
-
-               /* start monitoring at kernel level */
-               pfm_set_psr_up();
-
-               /*
-                * activate monitoring at user level
-                */
-               ia64_psr(regs)->up = 1;
-
-       } else {
-               tregs = task_pt_regs(ctx->ctx_task);
-
-               /*
-                * start monitoring at the kernel level the next
-                * time the task is scheduled
-                */
-               ctx->ctx_saved_psr_up = IA64_PSR_UP;
-
-               /*
-                * activate monitoring at user level
-                */
-               ia64_psr(tregs)->up = 1;
-       }
-       return 0;
-}
-
-static int
-pfm_get_pmc_reset(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       pfarg_reg_t *req = (pfarg_reg_t *)arg;
-       unsigned int cnum;
-       int i;
-       int ret = -EINVAL;
-       XEN_NOT_SUPPORTED_YET;
-
-       for (i = 0; i < count; i++, req++) {
-
-               cnum = req->reg_num;
-
-               if (!PMC_IS_IMPL(cnum)) goto abort_mission;
-
-               req->reg_value = PMC_DFL_VAL(cnum);
-
-               PFM_REG_RETFLAG_SET(req->reg_flags, 0);
-
-               DPRINT(("pmc_reset_val pmc[%u]=0x%lx\n", cnum, req->reg_value));
-       }
-       return 0;
-
-abort_mission:
-       PFM_REG_RETFLAG_SET(req->reg_flags, PFM_REG_RETFL_EINVAL);
-       return ret;
-}
-
-static int
-pfm_check_task_exist(pfm_context_t *ctx)
-{
-       struct task_struct *g, *t;
-       int ret = -ESRCH;
-
-       read_lock(&tasklist_lock);
-
-       do_each_thread (g, t) {
-               if (t->thread.pfm_context == ctx) {
-                       ret = 0;
-                       break;
-               }
-       } while_each_thread (g, t);
-
-       read_unlock(&tasklist_lock);
-
-       DPRINT(("pfm_check_task_exist: ret=%d ctx=%p\n", ret, ctx));
-
-       return ret;
-}
-
-static int
-pfm_context_load(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct task_struct *task;
-       struct thread_struct *thread;
-       struct pfm_context_t *old;
-       unsigned long flags;
-#ifndef CONFIG_SMP
-       struct task_struct *owner_task = NULL;
-#endif
-       pfarg_load_t *req = (pfarg_load_t *)arg;
-       unsigned long *pmcs_source, *pmds_source;
-       int the_cpu;
-       int ret = 0;
-       int state, is_system, set_dbregs = 0;
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_LOAD_CONTEXT, arg, 0);
-               return 0;
-       }
-       state     = ctx->ctx_state;
-       is_system = ctx->ctx_fl_system;
-       /*
-        * can only load from unloaded or terminated state
-        */
-       if (state != PFM_CTX_UNLOADED) {
-               DPRINT(("cannot load to [%d], invalid ctx_state=%d\n",
-                       req->load_pid,
-                       ctx->ctx_state));
-               return -EBUSY;
-       }
-
-       DPRINT(("load_pid [%d] using_dbreg=%d\n", req->load_pid, ctx->ctx_fl_using_dbreg));
-
-       if (CTX_OVFL_NOBLOCK(ctx) == 0 && req->load_pid == current->pid) {
-               DPRINT(("cannot use blocking mode on self\n"));
-               return -EINVAL;
-       }
-
-       ret = pfm_get_task(ctx, req->load_pid, &task);
-       if (ret) {
-               DPRINT(("load_pid [%d] get_task=%d\n", req->load_pid, ret));
-               return ret;
-       }
-
-       ret = -EINVAL;
-
-       /*
-        * system wide is self monitoring only
-        */
-       if (is_system && task != current) {
-               DPRINT(("system wide is self monitoring only load_pid=%d\n",
-                       req->load_pid));
-               goto error;
-       }
-
-       thread = &task->thread;
-
-       ret = 0;
-       /*
-        * cannot load a context which is using range restrictions,
-        * into a task that is being debugged.
-        */
-       if (ctx->ctx_fl_using_dbreg) {
-               if (thread->flags & IA64_THREAD_DBG_VALID) {
-                       ret = -EBUSY;
-                       DPRINT(("load_pid [%d] task is debugged, cannot load range restrictions\n", req->load_pid));
-                       goto error;
-               }
-               LOCK_PFS(flags);
-
-               if (is_system) {
-                       if (pfm_sessions.pfs_ptrace_use_dbregs) {
-                               DPRINT(("cannot load [%d] dbregs in use\n", task->pid));
-                               ret = -EBUSY;
-                       } else {
-                               pfm_sessions.pfs_sys_use_dbregs++;
-                               DPRINT(("load [%d] increased sys_use_dbreg=%u\n", task->pid, pfm_sessions.pfs_sys_use_dbregs));
-                               set_dbregs = 1;
-                       }
-               }
-
-               UNLOCK_PFS(flags);
-
-               if (ret) goto error;
-       }
-
-       /*
-        * SMP system-wide monitoring implies self-monitoring.
-        *
-        * The programming model expects the task to
-        * be pinned on a CPU throughout the session.
-        * Here we take note of the current CPU at the
-        * time the context is loaded. No call from
-        * another CPU will be allowed.
-        *
-        * The pinning via shed_setaffinity()
-        * must be done by the calling task prior
-        * to this call.
-        *
-        * systemwide: keep track of CPU this session is supposed to run on
-        */
-       the_cpu = ctx->ctx_cpu = smp_processor_id();
-
-       ret = -EBUSY;
-       /*
-        * now reserve the session
-        */
-       ret = pfm_reserve_session(current, is_system, the_cpu);
-       if (ret) goto error;
-
-       /*
-        * task is necessarily stopped at this point.
-        *
-        * If the previous context was zombie, then it got removed in
-        * pfm_save_regs(). Therefore we should not see it here.
-        * If we see a context, then this is an active context
-        *
-        * XXX: needs to be atomic
-        */
-       DPRINT(("before cmpxchg() old_ctx=%p new_ctx=%p\n",
-               thread->pfm_context, ctx));
-
-       ret = -EBUSY;
-       old = ia64_cmpxchg(acq, &thread->pfm_context, NULL, ctx, sizeof(pfm_context_t *));
-       if (old != NULL) {
-               DPRINT(("load_pid [%d] already has a context\n", req->load_pid));
-               goto error_unres;
-       }
-
-       pfm_reset_msgq(ctx);
-
-       ctx->ctx_state = PFM_CTX_LOADED;
-
-       /*
-        * link context to task
-        */
-       ctx->ctx_task = task;
-
-       if (is_system) {
-               /*
-                * we load as stopped
-                */
-               PFM_CPUINFO_SET(PFM_CPUINFO_SYST_WIDE);
-               PFM_CPUINFO_CLEAR(PFM_CPUINFO_DCR_PP);
-
-               if (ctx->ctx_fl_excl_idle) PFM_CPUINFO_SET(PFM_CPUINFO_EXCL_IDLE);
-       } else {
-               thread->flags |= IA64_THREAD_PM_VALID;
-       }
-
-       /*
-        * propagate into thread-state
-        */
-       pfm_copy_pmds(task, ctx);
-       pfm_copy_pmcs(task, ctx);
-
-       pmcs_source = thread->pmcs;
-       pmds_source = thread->pmds;
-
-       /*
-        * always the case for system-wide
-        */
-       if (task == current) {
-
-               if (is_system == 0) {
-
-                       /* allow user level control */
-                       ia64_psr(regs)->sp = 0;
-                       DPRINT(("clearing psr.sp for [%d]\n", task->pid));
-
-                       SET_LAST_CPU(ctx, smp_processor_id());
-                       INC_ACTIVATION();
-                       SET_ACTIVATION(ctx);
-#ifndef CONFIG_SMP
-                       /*
-                        * push the other task out, if any
-                        */
-                       owner_task = GET_PMU_OWNER();
-                       if (owner_task) pfm_lazy_save_regs(owner_task);
-#endif
-               }
-               /*
-                * load all PMD from ctx to PMU (as opposed to thread state)
-                * restore all PMC from ctx to PMU
-                */
-               pfm_restore_pmds(pmds_source, ctx->ctx_all_pmds[0]);
-               pfm_restore_pmcs(pmcs_source, ctx->ctx_all_pmcs[0]);
-
-               ctx->ctx_reload_pmcs[0] = 0UL;
-               ctx->ctx_reload_pmds[0] = 0UL;
-
-               /*
-                * guaranteed safe by earlier check against DBG_VALID
-                */
-               if (ctx->ctx_fl_using_dbreg) {
-                       pfm_restore_ibrs(ctx->ctx_ibrs, pmu_conf->num_ibrs);
-                       pfm_restore_dbrs(ctx->ctx_dbrs, pmu_conf->num_dbrs);
-               }
-               /*
-                * set new ownership
-                */
-               SET_PMU_OWNER(task, ctx);
-
-               DPRINT(("context loaded on PMU for [%d]\n", task->pid));
-       } else {
-               /*
-                * when not current, task MUST be stopped, so this is safe
-                */
-               regs = task_pt_regs(task);
-
-               /* force a full reload */
-               ctx->ctx_last_activation = PFM_INVALID_ACTIVATION;
-               SET_LAST_CPU(ctx, -1);
-
-               /* initial saved psr (stopped) */
-               ctx->ctx_saved_psr_up = 0UL;
-               ia64_psr(regs)->up = ia64_psr(regs)->pp = 0;
-       }
-
-       ret = 0;
-
-error_unres:
-       if (ret) pfm_unreserve_session(ctx, ctx->ctx_fl_system, the_cpu);
-error:
-       /*
-        * we must undo the dbregs setting (for system-wide)
-        */
-       if (ret && set_dbregs) {
-               LOCK_PFS(flags);
-               pfm_sessions.pfs_sys_use_dbregs--;
-               UNLOCK_PFS(flags);
-       }
-       /*
-        * release task, there is now a link with the context
-        */
-       if (is_system == 0 && task != current) {
-               pfm_put_task(task);
-
-               if (ret == 0) {
-                       ret = pfm_check_task_exist(ctx);
-                       if (ret) {
-                               ctx->ctx_state = PFM_CTX_UNLOADED;
-                               ctx->ctx_task  = NULL;
-                       }
-               }
-       }
-       return ret;
-}
-
-/*
- * in this function, we do not need to increase the use count
- * for the task via get_task_struct(), because we hold the
- * context lock. If the task were to disappear while having
- * a context attached, it would go through pfm_exit_thread()
- * which also grabs the context lock  and would therefore be blocked
- * until we are here.
- */
-static void pfm_flush_pmds(struct task_struct *, pfm_context_t *ctx);
-
-static int
-pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
-{
-       struct task_struct *task = PFM_CTX_TASK(ctx);
-       struct pt_regs *tregs;
-       int prev_state, is_system;
-       int ret;
-
-       if (is_running_on_xen()) {
-               if (is_xenoprof_primary())
-                       return HYPERVISOR_perfmon_op(PFM_UNLOAD_CONTEXT,
-                                                    NULL, 0);
-               return 0;
-       }
-       DPRINT(("ctx_state=%d task [%d]\n", ctx->ctx_state, task ? task->pid : -1));
-
-       prev_state = ctx->ctx_state;
-       is_system  = ctx->ctx_fl_system;
-
-       /*
-        * unload only when necessary
-        */
-       if (prev_state == PFM_CTX_UNLOADED) {
-               DPRINT(("ctx_state=%d, nothing to do\n", prev_state));
-               return 0;
-       }
-
-       /*
-        * clear psr and dcr bits
-        */
-       ret = pfm_stop(ctx, NULL, 0, regs);
-       if (ret) return ret;
-
-       ctx->ctx_state = PFM_CTX_UNLOADED;
-
-       /*
-        * in system mode, we need to update the PMU directly
-        * and the user level state of the caller, which may not
-        * necessarily be the creator of the context.
-        */
-       if (is_system) {
-
-               /*
-                * Update cpuinfo
-                *
-                * local PMU is taken care of in pfm_stop()
-                */
-               PFM_CPUINFO_CLEAR(PFM_CPUINFO_SYST_WIDE);
-               PFM_CPUINFO_CLEAR(PFM_CPUINFO_EXCL_IDLE);
-
-               /*
-                * save PMDs in context
-                * release ownership
-                */
-               pfm_flush_pmds(current, ctx);
-
-               /*
-                * at this point we are done with the PMU
-                * so we can unreserve the resource.
-                */
-               if (prev_state != PFM_CTX_ZOMBIE) 
-                       pfm_unreserve_session(ctx, 1 , ctx->ctx_cpu);
-
-               /*
-                * disconnect context from task
-                */
-               task->thread.pfm_context = NULL;
-               /*
-                * disconnect task from context
-                */
-               ctx->ctx_task = NULL;
-
-               /*
-                * There is nothing more to cleanup here.
-                */
-               return 0;
-       }
-
-       /*
-        * per-task mode
-        */
-       tregs = task == current ? regs : task_pt_regs(task);
-
-       if (task == current) {
-               /*
-                * cancel user level control
-                */
-               ia64_psr(regs)->sp = 1;
-
-               DPRINT(("setting psr.sp for [%d]\n", task->pid));
-       }
-       /*
-        * save PMDs to context
-        * release ownership
-        */
-       pfm_flush_pmds(task, ctx);
-
-       /*
-        * at this point we are done with the PMU
-        * so we can unreserve the resource.
-        *
-        * when state was ZOMBIE, we have already unreserved.
-        */
-       if (prev_state != PFM_CTX_ZOMBIE) 
-               pfm_unreserve_session(ctx, 0 , ctx->ctx_cpu);
-
-       /*
-        * reset activation counter and psr
-        */
-       ctx->ctx_last_activation = PFM_INVALID_ACTIVATION;
-       SET_LAST_CPU(ctx, -1);
-
-       /*
-        * PMU state will not be restored
-        */
-       task->thread.flags &= ~IA64_THREAD_PM_VALID;
-
-       /*
-        * break links between context and task
-        */
-       task->thread.pfm_context  = NULL;
-       ctx->ctx_task             = NULL;
-
-       PFM_SET_WORK_PENDING(task, 0);
-
-       ctx->ctx_fl_trap_reason  = PFM_TRAP_REASON_NONE;
-       ctx->ctx_fl_can_restart  = 0;
-       ctx->ctx_fl_going_zombie = 0;
-
-       DPRINT(("disconnected [%d] from context\n", task->pid));
-
-       return 0;
-}
-
-
-/*
- * called only from exit_thread(): task == current
- * we come here only if current has a context attached (loaded or masked)
- */
-void
-pfm_exit_thread(struct task_struct *task)
-{
-       pfm_context_t *ctx;
-       unsigned long flags;
-       struct pt_regs *regs = task_pt_regs(task);
-       int ret, state;
-       int free_ok = 0;
-
-       ctx = PFM_GET_CTX(task);
-
-       PROTECT_CTX(ctx, flags);
-
-       DPRINT(("state=%d task [%d]\n", ctx->ctx_state, task->pid));
-
-       state = ctx->ctx_state;
-       switch(state) {
-               case PFM_CTX_UNLOADED:
-                       /*
-                        * only comes to thios function if pfm_context is not NULL, i.e., cannot
-                        * be in unloaded state
-                        */
-                       printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid);
-                       break;
-               case PFM_CTX_LOADED:
-               case PFM_CTX_MASKED:
-                       ret = pfm_context_unload(ctx, NULL, 0, regs);
-                       if (ret) {
-                               printk(KERN_ERR "perfmon: pfm_exit_thread [%d] state=%d unload failed %d\n", task->pid, state, ret);
-                       }
-                       DPRINT(("ctx unloaded for current state was %d\n", state));
-
-                       pfm_end_notify_user(ctx);
-                       break;
-               case PFM_CTX_ZOMBIE:
-                       ret = pfm_context_unload(ctx, NULL, 0, regs);
-                       if (ret) {
-                               printk(KERN_ERR "perfmon: pfm_exit_thread [%d] state=%d unload failed %d\n", task->pid, state, ret);
-                       }
-                       free_ok = 1;
-                       break;
-               default:
-                       printk(KERN_ERR "perfmon: pfm_exit_thread [%d] unexpected state=%d\n", task->pid, state);
-                       break;
-       }
-       UNPROTECT_CTX(ctx, flags);
-
-       { u64 psr = pfm_get_psr();
-         BUG_ON(psr & (IA64_PSR_UP|IA64_PSR_PP));
-         BUG_ON(GET_PMU_OWNER());
-         BUG_ON(ia64_psr(regs)->up);
-         BUG_ON(ia64_psr(regs)->pp);
-       }
-
-       /*
-        * All memory free operations (especially for vmalloc'ed memory)
-        * MUST be done with interrupts ENABLED.
-        */
-       if (free_ok) pfm_context_free(ctx);
-}
-
-/*
- * functions MUST be listed in the increasing order of their index (see permfon.h)
- */
-#define PFM_CMD(name, flags, arg_count, arg_type, getsz) { name, #name, flags, arg_count, sizeof(arg_type), getsz }
-#define PFM_CMD_S(name, flags) { name, #name, flags, 0, 0, NULL }
-#define PFM_CMD_PCLRWS (PFM_CMD_FD|PFM_CMD_ARG_RW|PFM_CMD_STOP)
-#define PFM_CMD_PCLRW  (PFM_CMD_FD|PFM_CMD_ARG_RW)
-#define PFM_CMD_NONE   { NULL, "no-cmd", 0, 0, 0, NULL}
-
-static pfm_cmd_desc_t pfm_cmd_tab[]={
-/* 0  */PFM_CMD_NONE,
-/* 1  */PFM_CMD(pfm_write_pmcs, PFM_CMD_PCLRWS, PFM_CMD_ARG_MANY, pfarg_reg_t, NULL),
-/* 2  */PFM_CMD(pfm_write_pmds, PFM_CMD_PCLRWS, PFM_CMD_ARG_MANY, pfarg_reg_t, NULL),
-/* 3  */PFM_CMD(pfm_read_pmds, PFM_CMD_PCLRWS, PFM_CMD_ARG_MANY, pfarg_reg_t, NULL),
-/* 4  */PFM_CMD_S(pfm_stop, PFM_CMD_PCLRWS),
-/* 5  */PFM_CMD_S(pfm_start, PFM_CMD_PCLRWS),
-/* 6  */PFM_CMD_NONE,
-/* 7  */PFM_CMD_NONE,
-/* 8  */PFM_CMD(pfm_context_create, PFM_CMD_ARG_RW, 1, pfarg_context_t, pfm_ctx_getsize),
-/* 9  */PFM_CMD_NONE,
-/* 10 */PFM_CMD_S(pfm_restart, PFM_CMD_PCLRW),
-/* 11 */PFM_CMD_NONE,
-/* 12 */PFM_CMD(pfm_get_features, PFM_CMD_ARG_RW, 1, pfarg_features_t, NULL),
-/* 13 */PFM_CMD(pfm_debug, 0, 1, unsigned int, NULL),
-/* 14 */PFM_CMD_NONE,
-/* 15 */PFM_CMD(pfm_get_pmc_reset, PFM_CMD_ARG_RW, PFM_CMD_ARG_MANY, pfarg_reg_t, NULL),
-/* 16 */PFM_CMD(pfm_context_load, PFM_CMD_PCLRWS, 1, pfarg_load_t, NULL),
-/* 17 */PFM_CMD_S(pfm_context_unload, PFM_CMD_PCLRWS),
-/* 18 */PFM_CMD_NONE,
-/* 19 */PFM_CMD_NONE,
-/* 20 */PFM_CMD_NONE,
-/* 21 */PFM_CMD_NONE,
-/* 22 */PFM_CMD_NONE,
-/* 23 */PFM_CMD_NONE,
-/* 24 */PFM_CMD_NONE,
-/* 25 */PFM_CMD_NONE,
-/* 26 */PFM_CMD_NONE,
-/* 27 */PFM_CMD_NONE,
-/* 28 */PFM_CMD_NONE,
-/* 29 */PFM_CMD_NONE,
-/* 30 */PFM_CMD_NONE,
-/* 31 */PFM_CMD_NONE,
-/* 32 */PFM_CMD(pfm_write_ibrs, PFM_CMD_PCLRWS, PFM_CMD_ARG_MANY, pfarg_dbreg_t, NULL),
-/* 33 */PFM_CMD(pfm_write_dbrs, PFM_CMD_PCLRWS, PFM_CMD_ARG_MANY, pfarg_dbreg_t, NULL)
-};
-#define PFM_CMD_COUNT  (sizeof(pfm_cmd_tab)/sizeof(pfm_cmd_desc_t))
-
-static int
-pfm_check_task_state(pfm_context_t *ctx, int cmd, unsigned long flags)
-{
-       struct task_struct *task;
-       int state, old_state;
-
-recheck:
-       state = ctx->ctx_state;
-       task  = ctx->ctx_task;
-
-       if (task == NULL) {
-               DPRINT(("context %d no task, state=%d\n", ctx->ctx_fd, state));
-               return 0;
-       }
-
-       DPRINT(("context %d state=%d [%d] task_state=%ld must_stop=%d\n",
-               ctx->ctx_fd,
-               state,
-               task->pid,
-               task->state, PFM_CMD_STOPPED(cmd)));
-
-       /*
-        * self-monitoring always ok.
-        *
-        * for system-wide the caller can either be the creator of the
-        * context (to one to which the context is attached to) OR
-        * a task running on the same CPU as the session.
-        */
-       if (task == current || ctx->ctx_fl_system) return 0;
-
-       /*
-        * we are monitoring another thread
-        */
-       switch(state) {
-               case PFM_CTX_UNLOADED:
-                       /*
-                        * if context is UNLOADED we are safe to go
-                        */
-                       return 0;
-               case PFM_CTX_ZOMBIE:
-                       /*
-                        * no command can operate on a zombie context
-                        */
-                       DPRINT(("cmd %d state zombie cannot operate on context\n", cmd));
-                       return -EINVAL;
-               case PFM_CTX_MASKED:
-                       /*
-                        * PMU state has been saved to software even though
-                        * the thread may still be running.
-                        */
-                       if (cmd != PFM_UNLOAD_CONTEXT) return 0;
-       }
-
-       /*
-        * context is LOADED or MASKED. Some commands may need to have 
-        * the task stopped.
-        *
-        * We could lift this restriction for UP but it would mean that
-        * the user has no guarantee the task would not run between
-        * two successive calls to perfmonctl(). That's probably OK.
-        * If this user wants to ensure the task does not run, then
-        * the task must be stopped.
-        */
-       if (PFM_CMD_STOPPED(cmd)) {
-               if ((task->state != TASK_STOPPED) && (task->state != TASK_TRACED)) {
-                       DPRINT(("[%d] task not in stopped state\n", task->pid));
-                       return -EBUSY;
-               }
-               /*
-                * task is now stopped, wait for ctxsw out
-                *
-                * This is an interesting point in the code.
-                * We need to unprotect the context because
-                * the pfm_save_regs() routines needs to grab
-                * the same lock. There are danger in doing
-                * this because it leaves a window open for
-                * another task to get access to the context
-                * and possibly change its state. The one thing
-                * that is not possible is for the context to disappear
-                * because we are protected by the VFS layer, i.e.,
-                * get_fd()/put_fd().
-                */
-               old_state = state;
-
-               UNPROTECT_CTX(ctx, flags);
-
-               wait_task_inactive(task);
-
-               PROTECT_CTX(ctx, flags);
-
-               /*
-                * we must recheck to verify if state has changed
-                */
-               if (ctx->ctx_state != old_state) {
-                       DPRINT(("old_state=%d new_state=%d\n", old_state, ctx->ctx_state));
-                       goto recheck;
-               }
-       }
-       return 0;
-}
-
-/*
- * system-call entry point (must return long)
- */
-asmlinkage long
-sys_perfmonctl (int fd, int cmd, void __user *arg, int count)
-{
-       struct file *file = NULL;
-       pfm_context_t *ctx = NULL;
-       unsigned long flags = 0UL;
-       void *args_k = NULL;
-       long ret; /* will expand int return types */
-       size_t base_sz, sz, xtra_sz = 0;
-       int narg, completed_args = 0, call_made = 0, cmd_flags;
-       int (*func)(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
-       int (*getsize)(void *arg, size_t *sz);
-#define PFM_MAX_ARGSIZE        4096
-
-       /*
-        * reject any call if perfmon was disabled at initialization
-        */
-       if (unlikely(pmu_conf == NULL)) return -ENOSYS;
-
-       if (unlikely(cmd < 0 || cmd >= PFM_CMD_COUNT)) {
-               DPRINT(("invalid cmd=%d\n", cmd));
-               return -EINVAL;
-       }
-
-       func      = pfm_cmd_tab[cmd].cmd_func;
-       narg      = pfm_cmd_tab[cmd].cmd_narg;
-       base_sz   = pfm_cmd_tab[cmd].cmd_argsize;
-       getsize   = pfm_cmd_tab[cmd].cmd_getsize;
-       cmd_flags = pfm_cmd_tab[cmd].cmd_flags;
-
-       if (unlikely(func == NULL)) {
-               DPRINT(("invalid cmd=%d\n", cmd));
-               return -EINVAL;
-       }
-
-       DPRINT(("cmd=%s idx=%d narg=0x%x argsz=%lu count=%d\n",
-               PFM_CMD_NAME(cmd),
-               cmd,
-               narg,
-               base_sz,
-               count));
-
-       /*
-        * check if number of arguments matches what the command expects
-        */
-       if (unlikely((narg == PFM_CMD_ARG_MANY && count <= 0) || (narg > 0 && narg != count)))
-               return -EINVAL;
-
-restart_args:
-       sz = xtra_sz + base_sz*count;
-       /*
-        * limit abuse to min page size
-        */
-       if (unlikely(sz > PFM_MAX_ARGSIZE)) {
-               printk(KERN_ERR "perfmon: [%d] argument too big %lu\n", current->pid, sz);
-               return -E2BIG;
-       }
-
-       /*
-        * allocate default-sized argument buffer
-        */
-       if (likely(count && args_k == NULL)) {
-               args_k = kmalloc(PFM_MAX_ARGSIZE, GFP_KERNEL);
-               if (args_k == NULL) return -ENOMEM;
-       }
-
-       ret = -EFAULT;
-
-       /*
-        * copy arguments
-        *
-        * assume sz = 0 for command without parameters
-        */
-       if (sz && copy_from_user(args_k, arg, sz)) {
-               DPRINT(("cannot copy_from_user %lu bytes @%p\n", sz, arg));
-               goto error_args;
-       }
-
-       /*
-        * check if command supports extra parameters
-        */
-       if (completed_args == 0 && getsize) {
-               /*
-                * get extra parameters size (based on main argument)
-                */
-               ret = (*getsize)(args_k, &xtra_sz);
-               if (ret) goto error_args;
-
-               completed_args = 1;
-
-               DPRINT(("restart_args sz=%lu xtra_sz=%lu\n", sz, xtra_sz));
-
-               /* retry if necessary */
-               if (likely(xtra_sz)) goto restart_args;
-       }
-
-       if (unlikely((cmd_flags & PFM_CMD_FD) == 0)) goto skip_fd;
-
-       ret = -EBADF;
-
-       file = fget(fd);
-       if (unlikely(file == NULL)) {
-               DPRINT(("invalid fd %d\n", fd));
-               goto error_args;
-       }
-       if (unlikely(PFM_IS_FILE(file) == 0)) {
-               DPRINT(("fd %d not related to perfmon\n", fd));
-               goto error_args;
-       }
-
-       ctx = (pfm_context_t *)file->private_data;
-       if (unlikely(ctx == NULL)) {
-               DPRINT(("no context for fd %d\n", fd));
-               goto error_args;
-       }
-       prefetch(&ctx->ctx_state);
-
-       PROTECT_CTX(ctx, flags);
-
-       /*
-        * check task is stopped
-        */
-       ret = pfm_check_task_state(ctx, cmd, flags);
-       if (unlikely(ret)) goto abort_locked;
-
-skip_fd:
-       ret = (*func)(ctx, args_k, count, task_pt_regs(current));
-
-       call_made = 1;
-
-abort_locked:
-       if (likely(ctx)) {
-               DPRINT(("context unlocked\n"));
-               UNPROTECT_CTX(ctx, flags);
-       }
-
-       /* copy argument back to user, if needed */
-       if (call_made && PFM_CMD_RW_ARG(cmd) && copy_to_user(arg, args_k, base_sz*count)) ret = -EFAULT;
-
-error_args:
-       if (file)
-               fput(file);
-
-       kfree(args_k);
-
-       DPRINT(("cmd=%s ret=%ld\n", PFM_CMD_NAME(cmd), ret));
-
-       return ret;
-}
-
-static void
-pfm_resume_after_ovfl(pfm_context_t *ctx, unsigned long ovfl_regs, struct pt_regs *regs)
-{
-       pfm_buffer_fmt_t *fmt = ctx->ctx_buf_fmt;
-       pfm_ovfl_ctrl_t rst_ctrl;
-       int state;
-       int ret = 0;
-
-       state = ctx->ctx_state;
-       /*
-        * Unlock sampling buffer and reset index atomically
-        * XXX: not really needed when blocking
-        */
-       if (CTX_HAS_SMPL(ctx)) {
-
-               rst_ctrl.bits.mask_monitoring = 0;
-               rst_ctrl.bits.reset_ovfl_pmds = 0;
-
-               if (state == PFM_CTX_LOADED)
-                       ret = pfm_buf_fmt_restart_active(fmt, current, &rst_ctrl, ctx->ctx_smpl_hdr, regs);
-               else
-                       ret = pfm_buf_fmt_restart(fmt, current, &rst_ctrl, ctx->ctx_smpl_hdr, regs);
-       } else {
-               rst_ctrl.bits.mask_monitoring = 0;
-               rst_ctrl.bits.reset_ovfl_pmds = 1;
-       }
-
-       if (ret == 0) {
-               if (rst_ctrl.bits.reset_ovfl_pmds) {
-                       pfm_reset_regs(ctx, &ovfl_regs, PFM_PMD_LONG_RESET);
-               }
-               if (rst_ctrl.bits.mask_monitoring == 0) {
-                       DPRINT(("resuming monitoring\n"));
-                       if (ctx->ctx_state == PFM_CTX_MASKED) pfm_restore_monitoring(current);
-               } else {
-                       DPRINT(("stopping monitoring\n"));
-                       //pfm_stop_monitoring(current, regs);
-               }
-               ctx->ctx_state = PFM_CTX_LOADED;
-       }
-}
-
-/*
- * context MUST BE LOCKED when calling
- * can only be called for current
- */
-static void
-pfm_context_force_terminate(pfm_context_t *ctx, struct pt_regs *regs)
-{
-       int ret;
-
-       DPRINT(("entering for [%d]\n", current->pid));
-
-       ret = pfm_context_unload(ctx, NULL, 0, regs);
-       if (ret) {
-               printk(KERN_ERR "pfm_context_force_terminate: [%d] unloaded failed with %d\n", current->pid, ret);
-       }
-
-       /*
-        * and wakeup controlling task, indicating we are now disconnected
-        */
-       wake_up_interruptible(&ctx->ctx_zombieq);
-
-       /*
-        * given that context is still locked, the controlling
-        * task will only get access when we return from
-        * pfm_handle_work().
-        */
-}
-
-static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds);
- /*
-  * pfm_handle_work() can be called with interrupts enabled
-  * (TIF_NEED_RESCHED) or disabled. The down_interruptible
-  * call may sleep, therefore we must re-enable interrupts
-  * to avoid deadlocks. It is safe to do so because this function
-  * is called ONLY when returning to user level (PUStk=1), in which case
-  * there is no risk of kernel stack overflow due to deep
-  * interrupt nesting.
-  */
-void
-pfm_handle_work(void)
-{
-       pfm_context_t *ctx;
-       struct pt_regs *regs;
-       unsigned long flags, dummy_flags;
-       unsigned long ovfl_regs;
-       unsigned int reason;
-       int ret;
-
-       ctx = PFM_GET_CTX(current);
-       if (ctx == NULL) {
-               printk(KERN_ERR "perfmon: [%d] has no PFM context\n", current->pid);
-               return;
-       }
-
-       PROTECT_CTX(ctx, flags);
-
-       PFM_SET_WORK_PENDING(current, 0);
-
-       pfm_clear_task_notify();
-
-       regs = task_pt_regs(current);
-
-       /*
-        * extract reason for being here and clear
-        */
-       reason = ctx->ctx_fl_trap_reason;
-       ctx->ctx_fl_trap_reason = PFM_TRAP_REASON_NONE;
-       ovfl_regs = ctx->ctx_ovfl_regs[0];
-
-       DPRINT(("reason=%d state=%d\n", reason, ctx->ctx_state));
-
-       /*
-        * must be done before we check for simple-reset mode
-        */
-       if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie;
-
-
-       //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking;
-       if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking;
-
-       /*
-        * restore interrupt mask to what it was on entry.
-        * Could be enabled/diasbled.
-        */
-       UNPROTECT_CTX(ctx, flags);
-
-       /*
-        * force interrupt enable because of down_interruptible()
-        */
-       local_irq_enable();
-
-       DPRINT(("before block sleeping\n"));
-
-       /*
-        * may go through without blocking on SMP systems
-        * if restart has been received already by the time we call down()
-        */
-       ret = wait_for_completion_interruptible(&ctx->ctx_restart_done);
-
-       DPRINT(("after block sleeping ret=%d\n", ret));
-
-       /*
-        * lock context and mask interrupts again
-        * We save flags into a dummy because we may have
-        * altered interrupts mask compared to entry in this
-        * function.
-        */
-       PROTECT_CTX(ctx, dummy_flags);
-
-       /*
-        * we need to read the ovfl_regs only after wake-up
-        * because we may have had pfm_write_pmds() in between
-        * and that can changed PMD values and therefore 
-        * ovfl_regs is reset for these new PMD values.
-        */
-       ovfl_regs = ctx->ctx_ovfl_regs[0];
-
-       if (ctx->ctx_fl_going_zombie) {
-do_zombie:
-               DPRINT(("context is zombie, bailing out\n"));
-               pfm_context_force_terminate(ctx, regs);
-               goto nothing_to_do;
-       }
-       /*
-        * in case of interruption of down() we don't restart anything
-        */
-       if (ret < 0) goto nothing_to_do;
-
-skip_blocking:
-       pfm_resume_after_ovfl(ctx, ovfl_regs, regs);
-       ctx->ctx_ovfl_regs[0] = 0UL;
-
-nothing_to_do:
-       /*
-        * restore flags as they were upon entry
-        */
-       UNPROTECT_CTX(ctx, flags);
-}
-
-static int
-pfm_notify_user(pfm_context_t *ctx, pfm_msg_t *msg)
-{
-       if (ctx->ctx_state == PFM_CTX_ZOMBIE) {
-               DPRINT(("ignoring overflow notification, owner is zombie\n"));
-               return 0;
-       }
-
-       DPRINT(("waking up somebody\n"));
-
-       if (msg) wake_up_interruptible(&ctx->ctx_msgq_wait);
-
-       /*
-        * safe, we are not in intr handler, nor in ctxsw when
-        * we come here
-        */
-       kill_fasync (&ctx->ctx_async_queue, SIGIO, POLL_IN);
-
-       return 0;
-}
-
-static int
-pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds)
-{
-       pfm_msg_t *msg = NULL;
-
-       if (ctx->ctx_fl_no_msg == 0) {
-               msg = pfm_get_new_msg(ctx);
-               if (msg == NULL) {
-                       printk(KERN_ERR "perfmon: pfm_ovfl_notify_user no more notification msgs\n");
-                       return -1;
-               }
-
-               msg->pfm_ovfl_msg.msg_type         = PFM_MSG_OVFL;
-               msg->pfm_ovfl_msg.msg_ctx_fd       = ctx->ctx_fd;
-               msg->pfm_ovfl_msg.msg_active_set   = 0;
-               msg->pfm_ovfl_msg.msg_ovfl_pmds[0] = ovfl_pmds;
-               msg->pfm_ovfl_msg.msg_ovfl_pmds[1] = 0UL;
-               msg->pfm_ovfl_msg.msg_ovfl_pmds[2] = 0UL;
-               msg->pfm_ovfl_msg.msg_ovfl_pmds[3] = 0UL;
-               msg->pfm_ovfl_msg.msg_tstamp       = 0UL;
-       }
-
-       DPRINT(("ovfl msg: msg=%p no_msg=%d fd=%d ovfl_pmds=0x%lx\n",
-               msg,
-               ctx->ctx_fl_no_msg,
-               ctx->ctx_fd,
-               ovfl_pmds));
-
-       return pfm_notify_user(ctx, msg);
-}
-
-static int
-pfm_end_notify_user(pfm_context_t *ctx)
-{
-       pfm_msg_t *msg;
-
-       msg = pfm_get_new_msg(ctx);
-       if (msg == NULL) {
-               printk(KERN_ERR "perfmon: pfm_end_notify_user no more notification msgs\n");
-               return -1;
-       }
-       /* no leak */
-       memset(msg, 0, sizeof(*msg));
-
-       msg->pfm_end_msg.msg_type    = PFM_MSG_END;
-       msg->pfm_end_msg.msg_ctx_fd  = ctx->ctx_fd;
-       msg->pfm_ovfl_msg.msg_tstamp = 0UL;
-
-       DPRINT(("end msg: msg=%p no_msg=%d ctx_fd=%d\n",
-               msg,
-               ctx->ctx_fl_no_msg,
-               ctx->ctx_fd));
-
-       return pfm_notify_user(ctx, msg);
-}
-
-/*
- * main overflow processing routine.
- * it can be called from the interrupt path or explicitely during the context switch code
- */
-static void
-pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, struct pt_regs *regs)
-{
-       pfm_ovfl_arg_t *ovfl_arg;
-       unsigned long mask;
-       unsigned long old_val, ovfl_val, new_val;
-       unsigned long ovfl_notify = 0UL, ovfl_pmds = 0UL, smpl_pmds = 0UL, reset_pmds;
-       unsigned long tstamp;
-       pfm_ovfl_ctrl_t ovfl_ctrl;
-       unsigned int i, has_smpl;
-       int must_notify = 0;
-
-       if (unlikely(ctx->ctx_state == PFM_CTX_ZOMBIE)) goto stop_monitoring;
-
-       /*
-        * sanity test. Should never happen
-        */
-       if (unlikely((pmc0 & 0x1) == 0)) goto sanity_check;
-
-       tstamp   = ia64_get_itc();
-       mask     = pmc0 >> PMU_FIRST_COUNTER;
-       ovfl_val = pmu_conf->ovfl_val;
-       has_smpl = CTX_HAS_SMPL(ctx);
-
-       DPRINT_ovfl(("pmc0=0x%lx pid=%d iip=0x%lx, %s "
-                    "used_pmds=0x%lx\n",
-                       pmc0,
-                       task ? task->pid: -1,
-                       (regs ? regs->cr_iip : 0),
-                       CTX_OVFL_NOBLOCK(ctx) ? "nonblocking" : "blocking",
-                       ctx->ctx_used_pmds[0]));
-
-
-       /*
-        * first we update the virtual counters
-        * assume there was a prior ia64_srlz_d() issued
-        */
-       for (i = PMU_FIRST_COUNTER; mask ; i++, mask >>= 1) {
-
-               /* skip pmd which did not overflow */
-               if ((mask & 0x1) == 0) continue;
-
-               /*
-                * Note that the pmd is not necessarily 0 at this point as qualified events
-                * may have happened before the PMU was frozen. The residual count is not
-                * taken into consideration here but will be with any read of the pmd via
-                * pfm_read_pmds().
-                */
-               old_val              = new_val = ctx->ctx_pmds[i].val;
-               new_val             += 1 + ovfl_val;
-               ctx->ctx_pmds[i].val = new_val;
-
-               /*
-                * check for overflow condition
-                */
-               if (likely(old_val > new_val)) {
-                       ovfl_pmds |= 1UL << i;
-                       if (PMC_OVFL_NOTIFY(ctx, i)) ovfl_notify |= 1UL << i;
-               }
-
-               DPRINT_ovfl(("ctx_pmd[%d].val=0x%lx old_val=0x%lx pmd=0x%lx ovfl_pmds=0x%lx ovfl_notify=0x%lx\n",
-                       i,
-                       new_val,
-                       old_val,
-                       ia64_get_pmd(i) & ovfl_val,
-                       ovfl_pmds,
-                       ovfl_notify));
-       }
-
-       /*
-        * there was no 64-bit overflow, nothing else to do
-        */
-       if (ovfl_pmds == 0UL) return;
-
-       /* 
-        * reset all control bits
-        */
-       ovfl_ctrl.val = 0;
-       reset_pmds    = 0UL;
-
-       /*
-        * if a sampling format module exists, then we "cache" the overflow by 
-        * calling the module's handler() routine.
-        */
-       if (has_smpl) {
-               unsigned long start_cycles, end_cycles;
-               unsigned long pmd_mask;
-               int j, k, ret = 0;
-               int this_cpu = smp_processor_id();
-
-               pmd_mask = ovfl_pmds >> PMU_FIRST_COUNTER;
-               ovfl_arg = &ctx->ctx_ovfl_arg;
-
-               prefetch(ctx->ctx_smpl_hdr);
-
-               for(i=PMU_FIRST_COUNTER; pmd_mask && ret == 0; i++, pmd_mask >>=1) {
-
-                       mask = 1UL << i;
-
-                       if ((pmd_mask & 0x1) == 0) continue;
-
-                       ovfl_arg->ovfl_pmd      = (unsigned char )i;
-                       ovfl_arg->ovfl_notify   = ovfl_notify & mask ? 1 : 0;
-                       ovfl_arg->active_set    = 0;
-                       ovfl_arg->ovfl_ctrl.val = 0; /* module must fill in all fields */
-                       ovfl_arg->smpl_pmds[0]  = smpl_pmds = ctx->ctx_pmds[i].smpl_pmds[0];
-
-                       ovfl_arg->pmd_value      = ctx->ctx_pmds[i].val;
-                       ovfl_arg->pmd_last_reset = ctx->ctx_pmds[i].lval;
-                       ovfl_arg->pmd_eventid    = ctx->ctx_pmds[i].eventid;
-
-                       /*
-                        * copy values of pmds of interest. Sampling format may copy them
-                        * into sampling buffer.
-                        */
-                       if (smpl_pmds) {
-                               for(j=0, k=0; smpl_pmds; j++, smpl_pmds >>=1) {
-                                       if ((smpl_pmds & 0x1) == 0) continue;
-                                       ovfl_arg->smpl_pmds_values[k++] = PMD_IS_COUNTING(j) ?  pfm_read_soft_counter(ctx, j) : ia64_get_pmd(j);
-                                       DPRINT_ovfl(("smpl_pmd[%d]=pmd%u=0x%lx\n", k-1, j, ovfl_arg->smpl_pmds_values[k-1]));
-                               }
-                       }
-
-                       pfm_stats[this_cpu].pfm_smpl_handler_calls++;
-
-                       start_cycles = ia64_get_itc();
-
-                       /*
-                        * call custom buffer format record (handler) routine
-                        */
-                       ret = (*ctx->ctx_buf_fmt->fmt_handler)(task, ctx->ctx_smpl_hdr, ovfl_arg, regs, tstamp);
-
-                       end_cycles = ia64_get_itc();
-
-                       /*
-                        * For those controls, we take the union because they have
-                        * an all or nothing behavior.
-                        */
-                       ovfl_ctrl.bits.notify_user     |= ovfl_arg->ovfl_ctrl.bits.notify_user;
-                       ovfl_ctrl.bits.block_task      |= ovfl_arg->ovfl_ctrl.bits.block_task;
-                       ovfl_ctrl.bits.mask_monitoring |= ovfl_arg->ovfl_ctrl.bits.mask_monitoring;
-                       /*
-                        * build the bitmask of pmds to reset now
-                        */
-                       if (ovfl_arg->ovfl_ctrl.bits.reset_ovfl_pmds) reset_pmds |= mask;
-
-                       pfm_stats[this_cpu].pfm_smpl_handler_cycles += end_cycles - start_cycles;
-               }
-               /*
-                * when the module cannot handle the rest of the overflows, we abort right here
-                */
-               if (ret && pmd_mask) {
-                       DPRINT(("handler aborts leftover ovfl_pmds=0x%lx\n",
-                               pmd_mask<<PMU_FIRST_COUNTER));
-               }
-               /*
-                * remove the pmds we reset now from the set of pmds to reset in pfm_restart()
-                */
-               ovfl_pmds &= ~reset_pmds;
-       } else {
-               /*
-                * when no sampling module is used, then the default
-                * is to notify on overflow if requested by user
-                */
-               ovfl_ctrl.bits.notify_user     = ovfl_notify ? 1 : 0;
-               ovfl_ctrl.bits.block_task      = ovfl_notify ? 1 : 0;
-               ovfl_ctrl.bits.mask_monitoring = ovfl_notify ? 1 : 0; /* XXX: change for saturation */
-               ovfl_ctrl.bits.reset_ovfl_pmds = ovfl_notify ? 0 : 1;
-               /*
-                * if needed, we reset all overflowed pmds
-                */
-               if (ovfl_notify == 0) reset_pmds = ovfl_pmds;
-       }
-
-       DPRINT_ovfl(("ovfl_pmds=0x%lx reset_pmds=0x%lx\n", ovfl_pmds, reset_pmds));
-
-       /*
-        * reset the requested PMD registers using the short reset values
-        */
-       if (reset_pmds) {
-               unsigned long bm = reset_pmds;
-               pfm_reset_regs(ctx, &bm, PFM_PMD_SHORT_RESET);
-       }
-
-       if (ovfl_notify && ovfl_ctrl.bits.notify_user) {
-               /*
-                * keep track of what to reset when unblocking
-                */
-               ctx->ctx_ovfl_regs[0] = ovfl_pmds;
-
-               /*
-                * check for blocking context 
-                */
-               if (CTX_OVFL_NOBLOCK(ctx) == 0 && ovfl_ctrl.bits.block_task) {
-
-                       ctx->ctx_fl_trap_reason = PFM_TRAP_REASON_BLOCK;
-
-                       /*
-                        * set the perfmon specific checking pending work for the task
-                        */
-                       PFM_SET_WORK_PENDING(task, 1);
-
-                       /*
-                        * when coming from ctxsw, current still points to the
-                        * previous task, therefore we must work with task and not current.
-                        */
-                       pfm_set_task_notify(task);
-               }
-               /*
-                * defer until state is changed (shorten spin window). the context is locked
-                * anyway, so the signal receiver would come spin for nothing.
-                */
-               must_notify = 1;
-       }
-
-       DPRINT_ovfl(("owner [%d] pending=%ld reason=%u ovfl_pmds=0x%lx ovfl_notify=0x%lx masked=%d\n",
-                       GET_PMU_OWNER() ? GET_PMU_OWNER()->pid : -1,
-                       PFM_GET_WORK_PENDING(task),
-                       ctx->ctx_fl_trap_reason,
-                       ovfl_pmds,
-                       ovfl_notify,
-                       ovfl_ctrl.bits.mask_monitoring ? 1 : 0));
-       /*
-        * in case monitoring must be stopped, we toggle the psr bits
-        */
-       if (ovfl_ctrl.bits.mask_monitoring) {
-               pfm_mask_monitoring(task);
-               ctx->ctx_state = PFM_CTX_MASKED;
-               ctx->ctx_fl_can_restart = 1;
-       }
-
-       /*
-        * send notification now
-        */
-       if (must_notify) pfm_ovfl_notify_user(ctx, ovfl_notify);
-
-       return;
-
-sanity_check:
-       printk(KERN_ERR "perfmon: CPU%d overflow handler [%d] pmc0=0x%lx\n",
-                       smp_processor_id(),
-                       task ? task->pid : -1,
-                       pmc0);
-       return;
-
-stop_monitoring:
-       /*
-        * in SMP, zombie context is never restored but reclaimed in pfm_load_regs().
-        * Moreover, zombies are also reclaimed in pfm_save_regs(). Therefore we can
-        * come here as zombie only if the task is the current task. In which case, we
-        * can access the PMU  hardware directly.
-        *
-        * Note that zombies do have PM_VALID set. So here we do the minimal.
-        *
-        * In case the context was zombified it could not be reclaimed at the time
-        * the monitoring program exited. At this point, the PMU reservation has been
-        * returned, the sampiing buffer has been freed. We must convert this call
-        * into a spurious interrupt. However, we must also avoid infinite overflows
-        * by stopping monitoring for this task. We can only come here for a per-task
-        * context. All we need to do is to stop monitoring using the psr bits which
-        * are always task private. By re-enabling secure montioring, we ensure that
-        * the monitored task will not be able to re-activate monitoring.
-        * The task will eventually be context switched out, at which point the context
-        * will be reclaimed (that includes releasing ownership of the PMU).
-        *
-        * So there might be a window of time where the number of per-task session is zero
-        * yet one PMU might have a owner and get at most one overflow interrupt for a zombie
-        * context. This is safe because if a per-task session comes in, it will push this one
-        * out and by the virtue on pfm_save_regs(), this one will disappear. If a system wide
-        * session is force on that CPU, given that we use task pinning, pfm_save_regs() will
-        * also push our zombie context out.
-        *
-        * Overall pretty hairy stuff....
-        */
-       DPRINT(("ctx is zombie for [%d], converted to spurious\n", task ? task->pid: -1));
-       pfm_clear_psr_up();
-       ia64_psr(regs)->up = 0;
-       ia64_psr(regs)->sp = 1;
-       return;
-}
-
-static int
-pfm_do_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
-{
-       struct task_struct *task;
-       pfm_context_t *ctx;
-       unsigned long flags;
-       u64 pmc0;
-       int this_cpu = smp_processor_id();
-       int retval = 0;
-
-       pfm_stats[this_cpu].pfm_ovfl_intr_count++;
-
-       /*
-        * srlz.d done before arriving here
-        */
-       pmc0 = ia64_get_pmc(0);
-
-       task = GET_PMU_OWNER();
-       ctx  = GET_PMU_CTX();
-
-       /*
-        * if we have some pending bits set
-        * assumes : if any PMC0.bit[63-1] is set, then PMC0.fr = 1
-        */
-       if (PMC0_HAS_OVFL(pmc0) && task) {
-               /*
-                * we assume that pmc0.fr is always set here
-                */
-
-               /* sanity check */
-               if (!ctx) goto report_spurious1;
-
-               if (ctx->ctx_fl_system == 0 && (task->thread.flags & IA64_THREAD_PM_VALID) == 0) 
-                       goto report_spurious2;
-
-               PROTECT_CTX_NOPRINT(ctx, flags);
-
-               pfm_overflow_handler(task, ctx, pmc0, regs);
-
-               UNPROTECT_CTX_NOPRINT(ctx, flags);
-
-       } else {
-               pfm_stats[this_cpu].pfm_spurious_ovfl_intr_count++;
-               retval = -1;
-       }
-       /*
-        * keep it unfrozen at all times
-        */
-       pfm_unfreeze_pmu();
-
-       return retval;
-
-report_spurious1:
-       printk(KERN_INFO "perfmon: spurious overflow interrupt on CPU%d: process %d has no PFM context\n",
-               this_cpu, task->pid);
-       pfm_unfreeze_pmu();
-       return -1;
-report_spurious2:
-       printk(KERN_INFO "perfmon: spurious overflow interrupt on CPU%d: process %d, invalid flag\n", 
-               this_cpu, 
-               task->pid);
-       pfm_unfreeze_pmu();
-       return -1;
-}
-
-static irqreturn_t
-pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
-{
-       unsigned long start_cycles, total_cycles;
-       unsigned long min, max;
-       int this_cpu;
-       int ret;
-
-       this_cpu = get_cpu();
-       if (likely(!pfm_alt_intr_handler)) {
-               min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
-               max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
-
-               start_cycles = ia64_get_itc();
-
-               ret = pfm_do_interrupt_handler(irq, arg, regs);
-
-               total_cycles = ia64_get_itc();
-
-               /*
-                * don't measure spurious interrupts
-                */
-               if (likely(ret == 0)) {
-                       total_cycles -= start_cycles;
-
-                       if (total_cycles < min) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min = total_cycles;
-                       if (total_cycles > max) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max = total_cycles;
-
-                       pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles;
-               }
-       }
-       else {
-               (*pfm_alt_intr_handler->handler)(irq, arg, regs);
-       }
-
-       put_cpu_no_resched();
-       return IRQ_HANDLED;
-}
-
-/*
- * /proc/perfmon interface, for debug only
- */
-
-#define PFM_PROC_SHOW_HEADER   ((void *)NR_CPUS+1)
-
-static void *
-pfm_proc_start(struct seq_file *m, loff_t *pos)
-{
-       if (*pos == 0) {
-               return PFM_PROC_SHOW_HEADER;
-       }
-
-       while (*pos <= NR_CPUS) {
-               if (cpu_online(*pos - 1)) {
-                       return (void *)*pos;
-               }
-               ++*pos;
-       }
-       return NULL;
-}
-
-static void *
-pfm_proc_next(struct seq_file *m, void *v, loff_t *pos)
-{
-       ++*pos;
-       return pfm_proc_start(m, pos);
-}
-
-static void
-pfm_proc_stop(struct seq_file *m, void *v)
-{
-}
-
-static void
-pfm_proc_show_header(struct seq_file *m)
-{
-       struct list_head * pos;
-       pfm_buffer_fmt_t * entry;
-       unsigned long flags;
-
-       seq_printf(m,
-               "perfmon version           : %u.%u\n"
-               "model                     : %s\n"
-               "fastctxsw                 : %s\n"
-               "expert mode               : %s\n"
-               "ovfl_mask                 : 0x%lx\n"
-               "PMU flags                 : 0x%x\n",
-               PFM_VERSION_MAJ, PFM_VERSION_MIN,
-               pmu_conf->pmu_name,
-               pfm_sysctl.fastctxsw > 0 ? "Yes": "No",
-               pfm_sysctl.expert_mode > 0 ? "Yes": "No",
-               pmu_conf->ovfl_val,
-               pmu_conf->flags);
-
-       LOCK_PFS(flags);
-
-       seq_printf(m,
-               "proc_sessions             : %u\n"
-               "sys_sessions              : %u\n"
-               "sys_use_dbregs            : %u\n"
-               "ptrace_use_dbregs         : %u\n",
-               pfm_sessions.pfs_task_sessions,
-               pfm_sessions.pfs_sys_sessions,
-               pfm_sessions.pfs_sys_use_dbregs,
-               pfm_sessions.pfs_ptrace_use_dbregs);
-
-       UNLOCK_PFS(flags);
-
-       spin_lock(&pfm_buffer_fmt_lock);
-
-       list_for_each(pos, &pfm_buffer_fmt_list) {
-               entry = list_entry(pos, pfm_buffer_fmt_t, fmt_list);
-               seq_printf(m, "format                    : %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x %s\n",
-                       entry->fmt_uuid[0],
-                       entry->fmt_uuid[1],
-                       entry->fmt_uuid[2],
-                       entry->fmt_uuid[3],
-                       entry->fmt_uuid[4],
-                       entry->fmt_uuid[5],
-                       entry->fmt_uuid[6],
-                       entry->fmt_uuid[7],
-                       entry->fmt_uuid[8],
-                       entry->fmt_uuid[9],
-                       entry->fmt_uuid[10],
-                       entry->fmt_uuid[11],
-                       entry->fmt_uuid[12],
-                       entry->fmt_uuid[13],
-                       entry->fmt_uuid[14],
-                       entry->fmt_uuid[15],
-                       entry->fmt_name);
-       }
-       spin_unlock(&pfm_buffer_fmt_lock);
-
-}
-
-static int
-pfm_proc_show(struct seq_file *m, void *v)
-{
-       unsigned long psr;
-       unsigned int i;
-       int cpu;
-
-       if (v == PFM_PROC_SHOW_HEADER) {
-               pfm_proc_show_header(m);
-               return 0;
-       }
-
-       /* show info for CPU (v - 1) */
-
-       cpu = (long)v - 1;
-       seq_printf(m,
-               "CPU%-2d overflow intrs      : %lu\n"
-               "CPU%-2d overflow cycles     : %lu\n"
-               "CPU%-2d overflow min        : %lu\n"
-               "CPU%-2d overflow max        : %lu\n"
-               "CPU%-2d smpl handler calls  : %lu\n"
-               "CPU%-2d smpl handler cycles : %lu\n"
-               "CPU%-2d spurious intrs      : %lu\n"
-               "CPU%-2d replay   intrs      : %lu\n"
-               "CPU%-2d syst_wide           : %d\n"
-               "CPU%-2d dcr_pp              : %d\n"
-               "CPU%-2d exclude idle        : %d\n"
-               "CPU%-2d owner               : %d\n"
-               "CPU%-2d context             : %p\n"
-               "CPU%-2d activations         : %lu\n",
-               cpu, pfm_stats[cpu].pfm_ovfl_intr_count,
-               cpu, pfm_stats[cpu].pfm_ovfl_intr_cycles,
-               cpu, pfm_stats[cpu].pfm_ovfl_intr_cycles_min,
-               cpu, pfm_stats[cpu].pfm_ovfl_intr_cycles_max,
-               cpu, pfm_stats[cpu].pfm_smpl_handler_calls,
-               cpu, pfm_stats[cpu].pfm_smpl_handler_cycles,
-               cpu, pfm_stats[cpu].pfm_spurious_ovfl_intr_count,
-               cpu, pfm_stats[cpu].pfm_replay_ovfl_intr_count,
-               cpu, pfm_get_cpu_data(pfm_syst_info, cpu) & PFM_CPUINFO_SYST_WIDE ? 1 : 0,
-               cpu, pfm_get_cpu_data(pfm_syst_info, cpu) & PFM_CPUINFO_DCR_PP ? 1 : 0,
-               cpu, pfm_get_cpu_data(pfm_syst_info, cpu) & PFM_CPUINFO_EXCL_IDLE ? 1 : 0,
-               cpu, pfm_get_cpu_data(pmu_owner, cpu) ? pfm_get_cpu_data(pmu_owner, cpu)->pid: -1,
-               cpu, pfm_get_cpu_data(pmu_ctx, cpu),
-               cpu, pfm_get_cpu_data(pmu_activation_number, cpu));
-
-       if (num_online_cpus() == 1 && pfm_sysctl.debug > 0) {
-
-               psr = pfm_get_psr();
-
-               ia64_srlz_d();
-
-               seq_printf(m, 
-                       "CPU%-2d psr                 : 0x%lx\n"
-                       "CPU%-2d pmc0                : 0x%lx\n", 
-                       cpu, psr,
-                       cpu, ia64_get_pmc(0));
-
-               for (i=0; PMC_IS_LAST(i) == 0;  i++) {
-                       if (PMC_IS_COUNTING(i) == 0) continue;
-                       seq_printf(m, 
-                               "CPU%-2d pmc%u                : 0x%lx\n"
-                               "CPU%-2d pmd%u                : 0x%lx\n", 
-                               cpu, i, ia64_get_pmc(i),
-                               cpu, i, ia64_get_pmd(i));
-               }
-       }
-       return 0;
-}
-
-struct seq_operations pfm_seq_ops = {
-       .start =        pfm_proc_start,
-       .next =         pfm_proc_next,
-       .stop =         pfm_proc_stop,
-       .show =         pfm_proc_show
-};
-
-static int
-pfm_proc_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &pfm_seq_ops);
-}
-
-
-/*
- * we come here as soon as local_cpu_data->pfm_syst_wide is set. this happens
- * during pfm_enable() hence before pfm_start(). We cannot assume monitoring
- * is active or inactive based on mode. We must rely on the value in
- * local_cpu_data->pfm_syst_info
- */
-void
-pfm_syst_wide_update_task(struct task_struct *task, unsigned long info, int is_ctxswin)
-{
-       struct pt_regs *regs;
-       unsigned long dcr;
-       unsigned long dcr_pp;
-
-       dcr_pp = info & PFM_CPUINFO_DCR_PP ? 1 : 0;
-
-       /*
-        * pid 0 is guaranteed to be the idle task. There is one such task with pid 0
-        * on every CPU, so we can rely on the pid to identify the idle task.
-        */
-       if ((info & PFM_CPUINFO_EXCL_IDLE) == 0 || task->pid) {
-               regs = task_pt_regs(task);
-               ia64_psr(regs)->pp = is_ctxswin ? dcr_pp : 0;
-               return;
-       }
-       /*
-        * if monitoring has started
-        */
-       if (dcr_pp) {
-               dcr = ia64_getreg(_IA64_REG_CR_DCR);
-               /*
-                * context switching in?
-                */
-               if (is_ctxswin) {
-                       /* mask monitoring for the idle task */
-                       ia64_setreg(_IA64_REG_CR_DCR, dcr & ~IA64_DCR_PP);
-                       pfm_clear_psr_pp();
-                       ia64_srlz_i();
-                       return;
-               }
-               /*
-                * context switching out
-                * restore monitoring for next task
-                *
-                * Due to inlining this odd if-then-else construction generates
-                * better code.
-                */
-               ia64_setreg(_IA64_REG_CR_DCR, dcr |IA64_DCR_PP);
-               pfm_set_psr_pp();
-               ia64_srlz_i();
-       }
-}
-
-#ifdef CONFIG_SMP
-
-static void
-pfm_force_cleanup(pfm_context_t *ctx, struct pt_regs *regs)
-{
-       struct task_struct *task = ctx->ctx_task;
-
-       ia64_psr(regs)->up = 0;
-       ia64_psr(regs)->sp = 1;
-
-       if (GET_PMU_OWNER() == task) {
-               DPRINT(("cleared ownership for [%d]\n", ctx->ctx_task->pid));
-               SET_PMU_OWNER(NULL, NULL);
-       }
-
-       /*
-        * disconnect the task from the context and vice-versa
-        */
-       PFM_SET_WORK_PENDING(task, 0);
-
-       task->thread.pfm_context  = NULL;
-       task->thread.flags       &= ~IA64_THREAD_PM_VALID;
-
-       DPRINT(("force cleanup for [%d]\n",  task->pid));
-}
-
-
-/*
- * in 2.6, interrupts are masked when we come here and the runqueue lock is held
- */
-void
-pfm_save_regs(struct task_struct *task)
-{
-       pfm_context_t *ctx;
-       struct thread_struct *t;
-       unsigned long flags;
-       u64 psr;
-
-
-       ctx = PFM_GET_CTX(task);
-       if (ctx == NULL) return;
-       t = &task->thread;
-
-       /*
-        * we always come here with interrupts ALREADY disabled by
-        * the scheduler. So we simply need to protect against concurrent
-        * access, not CPU concurrency.
-        */
-       flags = pfm_protect_ctx_ctxsw(ctx);
-
-       if (ctx->ctx_state == PFM_CTX_ZOMBIE) {
-               struct pt_regs *regs = task_pt_regs(task);
-
-               pfm_clear_psr_up();
-
-               pfm_force_cleanup(ctx, regs);
-
-               BUG_ON(ctx->ctx_smpl_hdr);
-
-               pfm_unprotect_ctx_ctxsw(ctx, flags);
-
-               pfm_context_free(ctx);
-               return;
-       }
-
-       /*
-        * save current PSR: needed because we modify it
-        */
-       ia64_srlz_d();
-       psr = pfm_get_psr();
-
-       BUG_ON(psr & (IA64_PSR_I));
-
-       /*
-        * stop monitoring:
-        * This is the last instruction which may generate an overflow
-        *
-        * We do not need to set psr.sp because, it is irrelevant in kernel.
-        * It will be restored from ipsr when going back to user level
-        */
-       pfm_clear_psr_up();
-
-       /*
-        * keep a copy of psr.up (for reload)
-        */
-       ctx->ctx_saved_psr_up = psr & IA64_PSR_UP;
-
-       /*
-        * release ownership of this PMU.
-        * PM interrupts are masked, so nothing
-        * can happen.
-        */
-       SET_PMU_OWNER(NULL, NULL);
-
-       /*
-        * we systematically save the PMD as we have no
-        * guarantee we will be schedule at that same
-        * CPU again.
-        */
-       pfm_save_pmds(t->pmds, ctx->ctx_used_pmds[0]);
-
-       /*
-        * save pmc0 ia64_srlz_d() done in pfm_save_pmds()
-        * we will need it on the restore path to check
-        * for pending overflow.
-        */
-       t->pmcs[0] = ia64_get_pmc(0);
-
-       /*
-        * unfreeze PMU if had pending overflows
-        */
-       if (t->pmcs[0] & ~0x1UL) pfm_unfreeze_pmu();
-
-       /*
-        * finally, allow context access.
-        * interrupts will still be masked after this call.
-        */
-       pfm_unprotect_ctx_ctxsw(ctx, flags);
-}
-
-#else /* !CONFIG_SMP */
-void
-pfm_save_regs(struct task_struct *task)
-{
-       pfm_context_t *ctx;
-       u64 psr;
-
-       ctx = PFM_GET_CTX(task);
-       if (ctx == NULL) return;
-
-       /*
-        * save current PSR: needed because we modify it
-        */
-       psr = pfm_get_psr();
-
-       BUG_ON(psr & (IA64_PSR_I));
-
-       /*
-        * stop monitoring:
-        * This is the last instruction which may generate an overflow
-        *
-        * We do not need to set psr.sp because, it is irrelevant in kernel.
-        * It will be restored from ipsr when going back to user level
-        */
-       pfm_clear_psr_up();
-
-       /*
-        * keep a copy of psr.up (for reload)
-        */
-       ctx->ctx_saved_psr_up = psr & IA64_PSR_UP;
-}
-
-static void
-pfm_lazy_save_regs (struct task_struct *task)
-{
-       pfm_context_t *ctx;
-       struct thread_struct *t;
-       unsigned long flags;
-
-       { u64 psr  = pfm_get_psr();
-         BUG_ON(psr & IA64_PSR_UP);
-       }
-
-       ctx = PFM_GET_CTX(task);
-       t   = &task->thread;
-
-       /*
-        * we need to mask PMU overflow here to
-        * make sure that we maintain pmc0 until
-        * we save it. overflow interrupts are
-        * treated as spurious if there is no
-        * owner.
-        *
-        * XXX: I don't think this is necessary
-        */
-       PROTECT_CTX(ctx,flags);
-
-       /*
-        * release ownership of this PMU.
-        * must be done before we save the registers.
-        *
-        * after this call any PMU interrupt is treated
-        * as spurious.
-        */
-       SET_PMU_OWNER(NULL, NULL);
-
-       /*
-        * save all the pmds we use
-        */
-       pfm_save_pmds(t->pmds, ctx->ctx_used_pmds[0]);
-
-       /*
-        * save pmc0 ia64_srlz_d() done in pfm_save_pmds()
-        * it is needed to check for pended overflow
-        * on the restore path
-        */
-       t->pmcs[0] = ia64_get_pmc(0);
-
-       /*
-        * unfreeze PMU if had pending overflows
-        */
-       if (t->pmcs[0] & ~0x1UL) pfm_unfreeze_pmu();
-
-       /*
-        * now get can unmask PMU interrupts, they will
-        * be treated as purely spurious and we will not
-        * lose any information
-        */
-       UNPROTECT_CTX(ctx,flags);
-}
-#endif /* CONFIG_SMP */
-
-#ifdef CONFIG_SMP
-/*
- * in 2.6, interrupts are masked when we come here and the runqueue lock is held
- */
-void
-pfm_load_regs (struct task_struct *task)
-{
-       pfm_context_t *ctx;
-       struct thread_struct *t;
-       unsigned long pmc_mask = 0UL, pmd_mask = 0UL;
-       unsigned long flags;
-       u64 psr, psr_up;
-       int need_irq_resend;
-
-       ctx = PFM_GET_CTX(task);
-       if (unlikely(ctx == NULL)) return;
-
-       BUG_ON(GET_PMU_OWNER());
-
-       t     = &task->thread;
-       /*
-        * possible on unload
-        */
-       if (unlikely((t->flags & IA64_THREAD_PM_VALID) == 0)) return;
-
-       /*
-        * we always come here with interrupts ALREADY disabled by
-        * the scheduler. So we simply need to protect against concurrent
-        * access, not CPU concurrency.
-        */
-       flags = pfm_protect_ctx_ctxsw(ctx);
-       psr   = pfm_get_psr();
-
-       need_irq_resend = pmu_conf->flags & PFM_PMU_IRQ_RESEND;
-
-       BUG_ON(psr & (IA64_PSR_UP|IA64_PSR_PP));
-       BUG_ON(psr & IA64_PSR_I);
-
-       if (unlikely(ctx->ctx_state == PFM_CTX_ZOMBIE)) {
-               struct pt_regs *regs = task_pt_regs(task);
-
-               BUG_ON(ctx->ctx_smpl_hdr);
-
-               pfm_force_cleanup(ctx, regs);
-
-               pfm_unprotect_ctx_ctxsw(ctx, flags);
-
-               /*
-                * this one (kmalloc'ed) is fine with interrupts disabled
-                */
-               pfm_context_free(ctx);
-
-               return;
-       }
-
-       /*
-        * we restore ALL the debug registers to avoid picking up
-        * stale state.
-        */
-       if (ctx->ctx_fl_using_dbreg) {
-               pfm_restore_ibrs(ctx->ctx_ibrs, pmu_conf->num_ibrs);
-               pfm_restore_dbrs(ctx->ctx_dbrs, pmu_conf->num_dbrs);
-       }
-       /*
-        * retrieve saved psr.up
-        */
-       psr_up = ctx->ctx_saved_psr_up;
-
-       /*
-        * if we were the last user of the PMU on that CPU,
-        * then nothing to do except restore psr
-        */
-       if (GET_LAST_CPU(ctx) == smp_processor_id() && ctx->ctx_last_activation == GET_ACTIVATION()) {
-
-               /*
-                * retrieve partial reload masks (due to user modifications)
-                */
-               pmc_mask = ctx->ctx_reload_pmcs[0];
-               pmd_mask = ctx->ctx_reload_pmds[0];
-
-       } else {
-               /*
-                * To avoid leaking information to the user level when psr.sp=0,
-                * we must reload ALL implemented pmds (even the ones we don't use).
-                * In the kernel we only allow PFM_READ_PMDS on registers which
-                * we initialized or requested (sampling) so there is no risk there.
-                */
-               pmd_mask = pfm_sysctl.fastctxsw ?  ctx->ctx_used_pmds[0] : ctx->ctx_all_pmds[0];
-
-               /*
-                * ALL accessible PMCs are systematically reloaded, unused registers
-                * get their default (from pfm_reset_pmu_state()) values to avoid picking
-                * up stale configuration.
-                *
-                * PMC0 is never in the mask. It is always restored separately.
-                */
-               pmc_mask = ctx->ctx_all_pmcs[0];
-       }
-       /*
-        * when context is MASKED, we will restore PMC with plm=0
-        * and PMD with stale information, but that's ok, nothing
-        * will be captured.
-        *
-        * XXX: optimize here
-        */
-       if (pmd_mask) pfm_restore_pmds(t->pmds, pmd_mask);
-       if (pmc_mask) pfm_restore_pmcs(t->pmcs, pmc_mask);
-
-       /*
-        * check for pending overflow at the time the state
-        * was saved.
-        */
-       if (unlikely(PMC0_HAS_OVFL(t->pmcs[0]))) {
-               /*
-                * reload pmc0 with the overflow information
-                * On McKinley PMU, this will trigger a PMU interrupt
-                */
-               ia64_set_pmc(0, t->pmcs[0]);
-               ia64_srlz_d();
-               t->pmcs[0] = 0UL;
-
-               /*
-                * will replay the PMU interrupt
-                */
-               if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR);
-
-               pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++;
-       }
-
-       /*
-        * we just did a reload, so we reset the partial reload fields
-        */
-       ctx->ctx_reload_pmcs[0] = 0UL;
-       ctx->ctx_reload_pmds[0] = 0UL;
-
-       SET_LAST_CPU(ctx, smp_processor_id());
-
-       /*
-        * dump activation value for this PMU
-        */
-       INC_ACTIVATION();
-       /*
-        * record current activation for this context
-        */
-       SET_ACTIVATION(ctx);
-
-       /*
-        * establish new ownership. 
-        */
-       SET_PMU_OWNER(task, ctx);
-
-       /*
-        * restore the psr.up bit. measurement
-        * is active again.
-        * no PMU interrupt can happen at this point
-        * because we still have interrupts disabled.
-        */
-       if (likely(psr_up)) pfm_set_psr_up();
-
-       /*
-        * allow concurrent access to context
-        */
-       pfm_unprotect_ctx_ctxsw(ctx, flags);
-}
-#else /*  !CONFIG_SMP */
-/*
- * reload PMU state for UP kernels
- * in 2.5 we come here with interrupts disabled
- */
-void
-pfm_load_regs (struct task_struct *task)
-{
-       struct thread_struct *t;
-       pfm_context_t *ctx;
-       struct task_struct *owner;
-       unsigned long pmd_mask, pmc_mask;
-       u64 psr, psr_up;
-       int need_irq_resend;
-
-       owner = GET_PMU_OWNER();
-       ctx   = PFM_GET_CTX(task);
-       t     = &task->thread;
-       psr   = pfm_get_psr();
-
-       BUG_ON(psr & (IA64_PSR_UP|IA64_PSR_PP));
-       BUG_ON(psr & IA64_PSR_I);
-
-       /*
-        * we restore ALL the debug registers to avoid picking up
-        * stale state.
-        *
-        * This must be done even when the task is still the owner
-        * as the registers may have been modified via ptrace()
-        * (not perfmon) by the previous task.
-        */
-       if (ctx->ctx_fl_using_dbreg) {
-               pfm_restore_ibrs(ctx->ctx_ibrs, pmu_conf->num_ibrs);
-               pfm_restore_dbrs(ctx->ctx_dbrs, pmu_conf->num_dbrs);
-       }
-
-       /*
-        * retrieved saved psr.up
-        */
-       psr_up = ctx->ctx_saved_psr_up;
-       need_irq_resend = pmu_conf->flags & PFM_PMU_IRQ_RESEND;
-
-       /*
-        * short path, our state is still there, just
-        * need to restore psr and we go
-        *
-        * we do not touch either PMC nor PMD. the psr is not touched
-        * by the overflow_handler. So we are safe w.r.t. to interrupt
-        * concurrency even without interrupt masking.
-        */
-       if (likely(owner == task)) {
-               if (likely(psr_up)) pfm_set_psr_up();
-               return;
-       }
-
-       /*
-        * someone else is still using the PMU, first push it out and
-        * then we'll be able to install our stuff !
-        *
-        * Upon return, there will be no owner for the current PMU
-        */
-       if (owner) pfm_lazy_save_regs(owner);
-
-       /*
-        * To avoid leaking information to the user level when psr.sp=0,
-        * we must reload ALL implemented pmds (even the ones we don't use).
-        * In the kernel we only allow PFM_READ_PMDS on registers which
-        * we initialized or requested (sampling) so there is no risk there.
-        */
-       pmd_mask = pfm_sysctl.fastctxsw ?  ctx->ctx_used_pmds[0] : ctx->ctx_all_pmds[0];
-
-       /*
-        * ALL accessible PMCs are systematically reloaded, unused registers
-        * get their default (from pfm_reset_pmu_state()) values to avoid picking
-        * up stale configuration.
-        *
-        * PMC0 is never in the mask. It is always restored separately
-        */
-       pmc_mask = ctx->ctx_all_pmcs[0];
-
-       pfm_restore_pmds(t->pmds, pmd_mask);
-       pfm_restore_pmcs(t->pmcs, pmc_mask);
-
-       /*
-        * check for pending overflow at the time the state
-        * was saved.
-        */
-       if (unlikely(PMC0_HAS_OVFL(t->pmcs[0]))) {
-               /*
-                * reload pmc0 with the overflow information
-                * On McKinley PMU, this will trigger a PMU interrupt
-                */
-               ia64_set_pmc(0, t->pmcs[0]);
-               ia64_srlz_d();
-
-               t->pmcs[0] = 0UL;
-
-               /*
-                * will replay the PMU interrupt
-                */
-               if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR);
-
-               pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++;
-       }
-
-       /*
-        * establish new ownership. 
-        */
-       SET_PMU_OWNER(task, ctx);
-
-       /*
-        * restore the psr.up bit. measurement
-        * is active again.
-        * no PMU interrupt can happen at this point
-        * because we still have interrupts disabled.
-        */
-       if (likely(psr_up)) pfm_set_psr_up();
-}
-#endif /* CONFIG_SMP */
-
-/*
- * this function assumes monitoring is stopped
- */
-static void
-pfm_flush_pmds(struct task_struct *task, pfm_context_t *ctx)
-{
-       u64 pmc0;
-       unsigned long mask2, val, pmd_val, ovfl_val;
-       int i, can_access_pmu = 0;
-       int is_self;
-
-       /*
-        * is the caller the task being monitored (or which initiated the
-        * session for system wide measurements)
-        */
-       is_self = ctx->ctx_task == task ? 1 : 0;
-
-       /*
-        * can access PMU is task is the owner of the PMU state on the current CPU
-        * or if we are running on the CPU bound to the context in system-wide mode
-        * (that is not necessarily the task the context is attached to in this mode).
-        * In system-wide we always have can_access_pmu true because a task running on an
-        * invalid processor is flagged earlier in the call stack (see pfm_stop).
-        */
-       can_access_pmu = (GET_PMU_OWNER() == task) || (ctx->ctx_fl_system && ctx->ctx_cpu == smp_processor_id());
-       if (can_access_pmu) {
-               /*
-                * Mark the PMU as not owned
-                * This will cause the interrupt handler to do nothing in case an overflow
-                * interrupt was in-flight
-                * This also guarantees that pmc0 will contain the final state
-                * It virtually gives us full control on overflow processing from that point
-                * on.
-                */
-               SET_PMU_OWNER(NULL, NULL);
-               DPRINT(("releasing ownership\n"));
-
-               /*
-                * read current overflow status:
-                *
-                * we are guaranteed to read the final stable state
-                */
-               ia64_srlz_d();
-               pmc0 = ia64_get_pmc(0); /* slow */
-
-               /*
-                * reset freeze bit, overflow status information destroyed
-                */
-               pfm_unfreeze_pmu();
-       } else {
-               pmc0 = task->thread.pmcs[0];
-               /*
-                * clear whatever overflow status bits there were
-                */
-               task->thread.pmcs[0] = 0;
-       }
-       ovfl_val = pmu_conf->ovfl_val;
-       /*
-        * we save all the used pmds
-        * we take care of overflows for counting PMDs
-        *
-        * XXX: sampling situation is not taken into account here
-        */
-       mask2 = ctx->ctx_used_pmds[0];
-
-       DPRINT(("is_self=%d ovfl_val=0x%lx mask2=0x%lx\n", is_self, ovfl_val, mask2));
-
-       for (i = 0; mask2; i++, mask2>>=1) {
-
-               /* skip non used pmds */
-               if ((mask2 & 0x1) == 0) continue;
-
-               /*
-                * can access PMU always true in system wide mode
-                */
-               val = pmd_val = can_access_pmu ? ia64_get_pmd(i) : task->thread.pmds[i];
-
-               if (PMD_IS_COUNTING(i)) {
-                       DPRINT(("[%d] pmd[%d] ctx_pmd=0x%lx hw_pmd=0x%lx\n",
-                               task->pid,
-                               i,
-                               ctx->ctx_pmds[i].val,
-                               val & ovfl_val));
-
-                       /*
-                        * we rebuild the full 64 bit value of the counter
-                        */
-                       val = ctx->ctx_pmds[i].val + (val & ovfl_val);
-
-                       /*
-                        * now everything is in ctx_pmds[] and we need
-                        * to clear the saved context from save_regs() such that
-                        * pfm_read_pmds() gets the correct value
-                        */
-                       pmd_val = 0UL;
-
-                       /*
-                        * take care of overflow inline
-                        */
-                       if (pmc0 & (1UL << i)) {
-                               val += 1 + ovfl_val;
-                               DPRINT(("[%d] pmd[%d] overflowed\n", task->pid, i));
-                       }
-               }
-
-               DPRINT(("[%d] ctx_pmd[%d]=0x%lx  pmd_val=0x%lx\n", task->pid, i, val, pmd_val));
-
-               if (is_self) task->thread.pmds[i] = pmd_val;
-
-               ctx->ctx_pmds[i].val = val;
-       }
-}
-
-static struct irqaction perfmon_irqaction = {
-       .handler = pfm_interrupt_handler,
-       .flags   = IRQF_DISABLED,
-       .name    = "perfmon"
-};
-
-static void
-pfm_alt_save_pmu_state(void *data)
-{
-       struct pt_regs *regs;
-
-       regs = task_pt_regs(current);
-
-       DPRINT(("called\n"));
-
-       /*
-        * should not be necessary but
-        * let's take not risk
-        */
-       pfm_clear_psr_up();
-       pfm_clear_psr_pp();
-       ia64_psr(regs)->pp = 0;
-
-       /*
-        * This call is required
-        * May cause a spurious interrupt on some processors
-        */
-       pfm_freeze_pmu();
-
-       ia64_srlz_d();
-}
-
-void
-pfm_alt_restore_pmu_state(void *data)
-{
-       struct pt_regs *regs;
-
-       regs = task_pt_regs(current);
-
-       DPRINT(("called\n"));
-
-       /*
-        * put PMU back in state expected
-        * by perfmon
-        */
-       pfm_clear_psr_up();
-       pfm_clear_psr_pp();
-       ia64_psr(regs)->pp = 0;
-
-       /*
-        * perfmon runs with PMU unfrozen at all times
-        */
-       pfm_unfreeze_pmu();
-
-       ia64_srlz_d();
-}
-
-int
-pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
-{
-       int ret, i;
-       int reserve_cpu;
-
-       /* some sanity checks */
-       if (hdl == NULL || hdl->handler == NULL) return -EINVAL;
-
-       /* do the easy test first */
-       if (pfm_alt_intr_handler) return -EBUSY;
-
-       /* one at a time in the install or remove, just fail the others */
-       if (!spin_trylock(&pfm_alt_install_check)) {
-               return -EBUSY;
-       }
-
-       /* reserve our session */
-       for_each_online_cpu(reserve_cpu) {
-               ret = pfm_reserve_session(NULL, 1, reserve_cpu);
-               if (ret) goto cleanup_reserve;
-       }
-
-       /* save the current system wide pmu states */
-       ret = on_each_cpu(pfm_alt_save_pmu_state, NULL, 0, 1);
-       if (ret) {
-               DPRINT(("on_each_cpu() failed: %d\n", ret));
-               goto cleanup_reserve;
-       }
-
-       /* officially change to the alternate interrupt handler */
-       pfm_alt_intr_handler = hdl;
-
-       spin_unlock(&pfm_alt_install_check);
-
-       return 0;
-
-cleanup_reserve:
-       for_each_online_cpu(i) {
-               /* don't unreserve more than we reserved */
-               if (i >= reserve_cpu) break;
-
-               pfm_unreserve_session(NULL, 1, i);
-       }
-
-       spin_unlock(&pfm_alt_install_check);
-
-       return ret;
-}
-EXPORT_SYMBOL_GPL(pfm_install_alt_pmu_interrupt);
-
-int
-pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
-{
-       int i;
-       int ret;
-
-       if (hdl == NULL) return -EINVAL;
-
-       /* cannot remove someone else's handler! */
-       if (pfm_alt_intr_handler != hdl) return -EINVAL;
-
-       /* one at a time in the install or remove, just fail the others */
-       if (!spin_trylock(&pfm_alt_install_check)) {
-               return -EBUSY;
-       }
-
-       pfm_alt_intr_handler = NULL;
-
-       ret = on_each_cpu(pfm_alt_restore_pmu_state, NULL, 0, 1);
-       if (ret) {
-               DPRINT(("on_each_cpu() failed: %d\n", ret));
-       }
-
-       for_each_online_cpu(i) {
-               pfm_unreserve_session(NULL, 1, i);
-       }
-
-       spin_unlock(&pfm_alt_install_check);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(pfm_remove_alt_pmu_interrupt);
-
-/*
- * perfmon initialization routine, called from the initcall() table
- */
-static int init_pfm_fs(void);
-
-static int __init
-pfm_probe_pmu(void)
-{
-       pmu_config_t **p;
-       int family;
-
-       family = local_cpu_data->family;
-       p      = pmu_confs;
-
-       while(*p) {
-               if ((*p)->probe) {
-                       if ((*p)->probe() == 0) goto found;
-               } else if ((*p)->pmu_family == family || (*p)->pmu_family == 0xff) {
-                       goto found;
-               }
-               p++;
-       }
-       return -1;
-found:
-       pmu_conf = *p;
-       return 0;
-}
-
-static struct file_operations pfm_proc_fops = {
-       .open           = pfm_proc_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = seq_release,
-};
-
-int __init
-pfm_init(void)
-{
-       unsigned int n, n_counters, i;
-
-       printk("perfmon: version %u.%u IRQ %u\n",
-               PFM_VERSION_MAJ,
-               PFM_VERSION_MIN,
-               IA64_PERFMON_VECTOR);
-
-       if (pfm_probe_pmu()) {
-               printk(KERN_INFO "perfmon: disabled, there is no support for processor family %d\n", 
-                               local_cpu_data->family);
-               return -ENODEV;
-       }
-
-       /*
-        * compute the number of implemented PMD/PMC from the
-        * description tables
-        */
-       n = 0;
-       for (i=0; PMC_IS_LAST(i) == 0;  i++) {
-               if (PMC_IS_IMPL(i) == 0) continue;
-               pmu_conf->impl_pmcs[i>>6] |= 1UL << (i&63);
-               n++;
-       }
-       pmu_conf->num_pmcs = n;
-
-       n = 0; n_counters = 0;
-       for (i=0; PMD_IS_LAST(i) == 0;  i++) {
-               if (PMD_IS_IMPL(i) == 0) continue;
-               pmu_conf->impl_pmds[i>>6] |= 1UL << (i&63);
-               n++;
-               if (PMD_IS_COUNTING(i)) n_counters++;
-       }
-       pmu_conf->num_pmds      = n;
-       pmu_conf->num_counters  = n_counters;
-
-       /*
-        * sanity checks on the number of debug registers
-        */
-       if (pmu_conf->use_rr_dbregs) {
-               if (pmu_conf->num_ibrs > IA64_NUM_DBG_REGS) {
-                       printk(KERN_INFO "perfmon: unsupported number of code debug registers (%u)\n", pmu_conf->num_ibrs);
-                       pmu_conf = NULL;
-                       return -1;
-               }
-               if (pmu_conf->num_dbrs > IA64_NUM_DBG_REGS) {
-                       printk(KERN_INFO "perfmon: unsupported number of data debug registers (%u)\n", pmu_conf->num_ibrs);
-                       pmu_conf = NULL;
-                       return -1;
-               }
-       }
-
-       printk("perfmon: %s PMU detected, %u PMCs, %u PMDs, %u counters (%lu bits)\n",
-              pmu_conf->pmu_name,
-              pmu_conf->num_pmcs,
-              pmu_conf->num_pmds,
-              pmu_conf->num_counters,
-              ffz(pmu_conf->ovfl_val));
-
-       /* sanity check */
-       if (pmu_conf->num_pmds >= IA64_NUM_PMD_REGS || pmu_conf->num_pmcs >= IA64_NUM_PMC_REGS) {
-               printk(KERN_ERR "perfmon: not enough pmc/pmd, perfmon disabled\n");
-               pmu_conf = NULL;
-               return -1;
-       }
-
-       /*
-        * create /proc/perfmon (mostly for debugging purposes)
-        */
-       perfmon_dir = create_proc_entry("perfmon", S_IRUGO, NULL);
-       if (perfmon_dir == NULL) {
-               printk(KERN_ERR "perfmon: cannot create /proc entry, perfmon disabled\n");
-               pmu_conf = NULL;
-               return -1;
-       }
-       /*
-        * install customized file operations for /proc/perfmon entry
-        */
-       perfmon_dir->proc_fops = &pfm_proc_fops;
-
-       /*
-        * create /proc/sys/kernel/perfmon (for debugging purposes)
-        */
-       pfm_sysctl_header = register_sysctl_table(pfm_sysctl_root, 0);
-
-       /*
-        * initialize all our spinlocks
-        */
-       spin_lock_init(&pfm_sessions.pfs_lock);
-       spin_lock_init(&pfm_buffer_fmt_lock);
-
-       init_pfm_fs();
-
-       for(i=0; i < NR_CPUS; i++) pfm_stats[i].pfm_ovfl_intr_cycles_min = ~0UL;
-
-       return 0;
-}
-
-__initcall(pfm_init);
-
-/*
- * this function is called before pfm_init()
- */
-void
-pfm_init_percpu (void)
-{
-       static int first_time=1;
-       /*
-        * make sure no measurement is active
-        * (may inherit programmed PMCs from EFI).
-        */
-       pfm_clear_psr_pp();
-       pfm_clear_psr_up();
-
-       /*
-        * we run with the PMU not frozen at all times
-        */
-       pfm_unfreeze_pmu();
-
-       if (first_time) {
-               register_percpu_irq(IA64_PERFMON_VECTOR, &perfmon_irqaction);
-               first_time=0;
-       }
-
-       ia64_setreg(_IA64_REG_CR_PMV, IA64_PERFMON_VECTOR);
-       ia64_srlz_d();
-}
-
-/*
- * used for debug purposes only
- */
-void
-dump_pmu_state(const char *from)
-{
-       struct task_struct *task;
-       struct thread_struct *t;
-       struct pt_regs *regs;
-       pfm_context_t *ctx;
-       unsigned long psr, dcr, info, flags;
-       int i, this_cpu;
-
-       local_irq_save(flags);
-
-       this_cpu = smp_processor_id();
-       regs     = task_pt_regs(current);
-       info     = PFM_CPUINFO_GET();
-       dcr      = ia64_getreg(_IA64_REG_CR_DCR);
-
-       if (info == 0 && ia64_psr(regs)->pp == 0 && (dcr & IA64_DCR_PP) == 0) {
-               local_irq_restore(flags);
-               return;
-       }
-
-       printk("CPU%d from %s() current [%d] iip=0x%lx %s\n", 
-               this_cpu, 
-               from, 
-               current->pid, 
-               regs->cr_iip,
-               current->comm);
-
-       task = GET_PMU_OWNER();
-       ctx  = GET_PMU_CTX();
-
-       printk("->CPU%d owner [%d] ctx=%p\n", this_cpu, task ? task->pid : -1, ctx);
-
-       psr = pfm_get_psr();
-
-       printk("->CPU%d pmc0=0x%lx psr.pp=%d psr.up=%d dcr.pp=%d syst_info=0x%lx user_psr.up=%d user_psr.pp=%d\n", 
-               this_cpu,
-               ia64_get_pmc(0),
-               psr & IA64_PSR_PP ? 1 : 0,
-               psr & IA64_PSR_UP ? 1 : 0,
-               dcr & IA64_DCR_PP ? 1 : 0,
-               info,
-               ia64_psr(regs)->up,
-               ia64_psr(regs)->pp);
-
-       ia64_psr(regs)->up = 0;
-       ia64_psr(regs)->pp = 0;
-
-       t = &current->thread;
-
-       for (i=1; PMC_IS_LAST(i) == 0; i++) {
-               if (PMC_IS_IMPL(i) == 0) continue;
-               printk("->CPU%d pmc[%d]=0x%lx thread_pmc[%d]=0x%lx\n", this_cpu, i, ia64_get_pmc(i), i, t->pmcs[i]);
-       }
-
-       for (i=1; PMD_IS_LAST(i) == 0; i++) {
-               if (PMD_IS_IMPL(i) == 0) continue;
-               printk("->CPU%d pmd[%d]=0x%lx thread_pmd[%d]=0x%lx\n", this_cpu, i, ia64_get_pmd(i), i, t->pmds[i]);
-       }
-
-       if (ctx) {
-               printk("->CPU%d ctx_state=%d vaddr=%p addr=%p fd=%d ctx_task=[%d] saved_psr_up=0x%lx\n",
-                               this_cpu,
-                               ctx->ctx_state,
-                               ctx->ctx_smpl_vaddr,
-                               ctx->ctx_smpl_hdr,
-                               ctx->ctx_msgq_head,
-                               ctx->ctx_msgq_tail,
-                               ctx->ctx_saved_psr_up);
-       }
-       local_irq_restore(flags);
-}
-
-/*
- * called from process.c:copy_thread(). task is new child.
- */
-void
-pfm_inherit(struct task_struct *task, struct pt_regs *regs)
-{
-       struct thread_struct *thread;
-
-       DPRINT(("perfmon: pfm_inherit clearing state for [%d]\n", task->pid));
-
-       thread = &task->thread;
-
-       /*
-        * cut links inherited from parent (current)
-        */
-       thread->pfm_context = NULL;
-
-       PFM_SET_WORK_PENDING(task, 0);
-
-       /*
-        * the psr bits are already set properly in copy_threads()
-        */
-}
-#else  /* !CONFIG_PERFMON */
-asmlinkage long
-sys_perfmonctl (int fd, int cmd, void *arg, int count)
-{
-       return -ENOSYS;
-}
-#endif /* CONFIG_PERFMON */
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
deleted file mode 100644 (file)
index c7af364..0000000
+++ /dev/null
@@ -1,1030 +0,0 @@
-/*
- * Architecture-specific setup.
- *
- * Copyright (C) 1998-2001, 2003-2004 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 2000, 2004 Intel Corp
- *     Rohit Seth <rohit.seth@intel.com>
- *     Suresh Siddha <suresh.b.siddha@intel.com>
- *     Gordon Jin <gordon.jin@intel.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- *
- * 12/26/04 S.Siddha, G.Jin, R.Seth
- *                     Add multi-threading and multi-core detection
- * 11/12/01 D.Mosberger Convert get_cpuinfo() to seq_file based show_cpuinfo().
- * 04/04/00 D.Mosberger renamed cpu_initialized to cpu_online_map
- * 03/31/00 R.Seth     cpu_initialized and current->processor fixes
- * 02/04/00 D.Mosberger        some more get_cpuinfo fixes...
- * 02/01/00 R.Seth     fixed get_cpuinfo for SMP
- * 01/07/99 S.Eranian  added the support for command line argument
- * 06/24/99 W.Drummond added boot_cpu_data.
- * 05/28/05 Z. Menyhart        Dynamic stride size for "flush_icache_range()"
- */
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <linux/acpi.h>
-#include <linux/bootmem.h>
-#include <linux/console.h>
-#include <linux/delay.h>
-#include <linux/kernel.h>
-#include <linux/reboot.h>
-#include <linux/sched.h>
-#include <linux/seq_file.h>
-#include <linux/string.h>
-#include <linux/threads.h>
-#include <linux/screen_info.h>
-#include <linux/dmi.h>
-#include <linux/serial.h>
-#include <linux/serial_core.h>
-#include <linux/efi.h>
-#include <linux/initrd.h>
-#include <linux/pm.h>
-#include <linux/cpufreq.h>
-
-#include <asm/ia32.h>
-#include <asm/machvec.h>
-#include <asm/mca.h>
-#include <asm/meminit.h>
-#include <asm/page.h>
-#include <asm/patch.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/sal.h>
-#include <asm/sections.h>
-#include <asm/serial.h>
-#include <asm/setup.h>
-#include <asm/smp.h>
-#include <asm/system.h>
-#include <asm/unistd.h>
-#include <asm/system.h>
-#ifdef CONFIG_XEN
-#include <asm/hypervisor.h>
-#include <asm/xen/xencomm.h>
-#include <xen/xencons.h>
-#endif
-#include <linux/dma-mapping.h>
-
-#if defined(CONFIG_SMP) && (IA64_CPU_SIZE > PAGE_SIZE)
-# error "struct cpuinfo_ia64 too big!"
-#endif
-
-#ifdef CONFIG_SMP
-unsigned long __per_cpu_offset[NR_CPUS];
-EXPORT_SYMBOL(__per_cpu_offset);
-#endif
-
-#ifdef CONFIG_XEN
-static void
-xen_panic_hypercall(struct unw_frame_info *info, void *arg)
-{
-       current->thread.ksp = (__u64)info->sw - 16;
-       HYPERVISOR_shutdown(SHUTDOWN_crash);
-       /* we're never actually going to get here... */
-}
-
-static int
-xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-       unw_init_running(xen_panic_hypercall, NULL);
-       /* we're never actually going to get here... */
-       return NOTIFY_DONE;
-}
-
-static struct notifier_block xen_panic_block = {
-       xen_panic_event, NULL, 0 /* try to go last */
-};
-
-void xen_pm_power_off(void)
-{
-       local_irq_disable();
-       HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-}
-#endif
-
-extern void ia64_setup_printk_clock(void);
-
-DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
-DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
-DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
-unsigned long ia64_cycles_per_usec;
-struct ia64_boot_param *ia64_boot_param;
-struct screen_info screen_info;
-unsigned long vga_console_iobase;
-unsigned long vga_console_membase;
-
-static struct resource data_resource = {
-       .name   = "Kernel data",
-       .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-
-static struct resource code_resource = {
-       .name   = "Kernel code",
-       .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-extern void efi_initialize_iomem_resources(struct resource *,
-               struct resource *);
-extern char _text[], _end[], _etext[];
-
-unsigned long ia64_max_cacheline_size;
-
-int dma_get_cache_alignment(void)
-{
-        return ia64_max_cacheline_size;
-}
-EXPORT_SYMBOL(dma_get_cache_alignment);
-
-unsigned long ia64_iobase;     /* virtual address for I/O accesses */
-EXPORT_SYMBOL(ia64_iobase);
-struct io_space io_space[MAX_IO_SPACES];
-EXPORT_SYMBOL(io_space);
-unsigned int num_io_spaces;
-
-/*
- * "flush_icache_range()" needs to know what processor dependent stride size to use
- * when it makes i-cache(s) coherent with d-caches.
- */
-#define        I_CACHE_STRIDE_SHIFT    5       /* Safest way to go: 32 bytes by 32 bytes */
-unsigned long ia64_i_cache_stride_shift = ~0;
-
-/*
- * The merge_mask variable needs to be set to (max(iommu_page_size(iommu)) - 1).  This
- * mask specifies a mask of address bits that must be 0 in order for two buffers to be
- * mergeable by the I/O MMU (i.e., the end address of the first buffer and the start
- * address of the second buffer must be aligned to (merge_mask+1) in order to be
- * mergeable).  By default, we assume there is no I/O MMU which can merge physically
- * discontiguous buffers, so we set the merge_mask to ~0UL, which corresponds to a iommu
- * page-size of 2^64.
- */
-unsigned long ia64_max_iommu_merge_mask = ~0UL;
-EXPORT_SYMBOL(ia64_max_iommu_merge_mask);
-
-/*
- * We use a special marker for the end of memory and it uses the extra (+1) slot
- */
-struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1] __initdata;
-int num_rsvd_regions __initdata;
-
-
-/*
- * Filter incoming memory segments based on the primitive map created from the boot
- * parameters. Segments contained in the map are removed from the memory ranges. A
- * caller-specified function is called with the memory ranges that remain after filtering.
- * This routine does not assume the incoming segments are sorted.
- */
-int __init
-filter_rsvd_memory (unsigned long start, unsigned long end, void *arg)
-{
-       unsigned long range_start, range_end, prev_start;
-       void (*func)(unsigned long, unsigned long, int);
-       int i;
-
-#if IGNORE_PFN0
-       if (start == PAGE_OFFSET) {
-               printk(KERN_WARNING "warning: skipping physical page 0\n");
-               start += PAGE_SIZE;
-               if (start >= end) return 0;
-       }
-#endif
-       /*
-        * lowest possible address(walker uses virtual)
-        */
-       prev_start = PAGE_OFFSET;
-       func = arg;
-
-       for (i = 0; i < num_rsvd_regions; ++i) {
-               range_start = max(start, prev_start);
-               range_end   = min(end, rsvd_region[i].start);
-
-               if (range_start < range_end)
-                       call_pernode_memory(__pa(range_start), range_end - range_start, func);
-
-               /* nothing more available in this segment */
-               if (range_end == end) return 0;
-
-               prev_start = rsvd_region[i].end;
-       }
-       /* end of memory marker allows full processing inside loop body */
-       return 0;
-}
-
-static void __init
-sort_regions (struct rsvd_region *rsvd_region, int max)
-{
-       int j;
-
-       /* simple bubble sorting */
-       while (max--) {
-               for (j = 0; j < max; ++j) {
-                       if (rsvd_region[j].start > rsvd_region[j+1].start) {
-                               struct rsvd_region tmp;
-                               tmp = rsvd_region[j];
-                               rsvd_region[j] = rsvd_region[j + 1];
-                               rsvd_region[j + 1] = tmp;
-                       }
-               }
-       }
-}
-
-/*
- * Request address space for all standard resources
- */
-static int __init register_memory(void)
-{
-       code_resource.start = ia64_tpa(_text);
-       code_resource.end   = ia64_tpa(_etext) - 1;
-       data_resource.start = ia64_tpa(_etext);
-       data_resource.end   = ia64_tpa(_end) - 1;
-       efi_initialize_iomem_resources(&code_resource, &data_resource);
-
-       return 0;
-}
-
-__initcall(register_memory);
-
-/**
- * reserve_memory - setup reserved memory areas
- *
- * Setup the reserved memory areas set aside for the boot parameters,
- * initrd, etc.  There are currently %IA64_MAX_RSVD_REGIONS defined,
- * see include/asm-ia64/meminit.h if you need to define more.
- */
-void __init
-reserve_memory (void)
-{
-       int n = 0;
-
-       /*
-        * none of the entries in this table overlap
-        */
-       rsvd_region[n].start = (unsigned long) ia64_boot_param;
-       rsvd_region[n].end   = rsvd_region[n].start + sizeof(*ia64_boot_param);
-       n++;
-
-       rsvd_region[n].start = (unsigned long) __va(ia64_boot_param->efi_memmap);
-       rsvd_region[n].end   = rsvd_region[n].start + ia64_boot_param->efi_memmap_size;
-       n++;
-
-       rsvd_region[n].start = (unsigned long) __va(ia64_boot_param->command_line);
-       rsvd_region[n].end   = (rsvd_region[n].start
-                               + strlen(__va(ia64_boot_param->command_line)) + 1);
-       n++;
-
-       rsvd_region[n].start = (unsigned long) ia64_imva((void *)KERNEL_START);
-       rsvd_region[n].end   = (unsigned long) ia64_imva(_end);
-       n++;
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               rsvd_region[n].start = (unsigned long)__va((HYPERVISOR_shared_info->arch.start_info_pfn << PAGE_SHIFT));
-               rsvd_region[n].end   = rsvd_region[n].start + PAGE_SIZE;
-               n++;
-       }
-#endif
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (ia64_boot_param->initrd_start) {
-               rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start);
-               rsvd_region[n].end   = rsvd_region[n].start + ia64_boot_param->initrd_size;
-               n++;
-       }
-#endif
-
-       efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
-       n++;
-
-       /* end of memory marker */
-       rsvd_region[n].start = ~0UL;
-       rsvd_region[n].end   = ~0UL;
-       n++;
-
-       num_rsvd_regions = n;
-       BUG_ON(IA64_MAX_RSVD_REGIONS + 1 < n);
-
-       sort_regions(rsvd_region, num_rsvd_regions);
-}
-
-/**
- * find_initrd - get initrd parameters from the boot parameter structure
- *
- * Grab the initrd start and end from the boot parameter struct given us by
- * the boot loader.
- */
-void __init
-find_initrd (void)
-{
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (ia64_boot_param->initrd_start) {
-               initrd_start = (unsigned long)__va(ia64_boot_param->initrd_start);
-               initrd_end   = initrd_start+ia64_boot_param->initrd_size;
-
-               printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n",
-                      initrd_start, ia64_boot_param->initrd_size);
-       }
-#endif
-}
-
-static void __init
-io_port_init (void)
-{
-       unsigned long phys_iobase;
-
-       /*
-        * Set `iobase' based on the EFI memory map or, failing that, the
-        * value firmware left in ar.k0.
-        *
-        * Note that in ia32 mode, IN/OUT instructions use ar.k0 to compute
-        * the port's virtual address, so ia32_load_state() loads it with a
-        * user virtual address.  But in ia64 mode, glibc uses the
-        * *physical* address in ar.k0 to mmap the appropriate area from
-        * /dev/mem, and the inX()/outX() interfaces use MMIO.  In both
-        * cases, user-mode can only use the legacy 0-64K I/O port space.
-        *
-        * ar.k0 is not involved in kernel I/O port accesses, which can use
-        * any of the I/O port spaces and are done via MMIO using the
-        * virtual mmio_base from the appropriate io_space[].
-        */
-       phys_iobase = efi_get_iobase();
-       if (!phys_iobase) {
-               phys_iobase = ia64_get_kr(IA64_KR_IO_BASE);
-               printk(KERN_INFO "No I/O port range found in EFI memory map, "
-                       "falling back to AR.KR0 (0x%lx)\n", phys_iobase);
-       }
-       ia64_iobase = (unsigned long) ioremap(phys_iobase, 0);
-       ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase));
-
-       /* setup legacy IO port space */
-       io_space[0].mmio_base = ia64_iobase;
-       io_space[0].sparse = 1;
-       num_io_spaces = 1;
-}
-
-/**
- * early_console_setup - setup debugging console
- *
- * Consoles started here require little enough setup that we can start using
- * them very early in the boot process, either right after the machine
- * vector initialization, or even before if the drivers can detect their hw.
- *
- * Returns non-zero if a console couldn't be setup.
- */
-static inline int __init
-early_console_setup (char *cmdline)
-{
-       int earlycons = 0;
-
-#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
-       {
-               extern int sn_serial_console_early_setup(void);
-               if (!sn_serial_console_early_setup())
-                       earlycons++;
-       }
-#endif
-#ifdef CONFIG_EFI_PCDP
-       if (!efi_setup_pcdp_console(cmdline))
-               earlycons++;
-#endif
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-       if (!early_serial_console_init(cmdline))
-               earlycons++;
-#endif
-
-       return (earlycons) ? 0 : -1;
-}
-
-static inline void
-mark_bsp_online (void)
-{
-#ifdef CONFIG_SMP
-       /* If we register an early console, allow CPU 0 to printk */
-       cpu_set(smp_processor_id(), cpu_online_map);
-#endif
-}
-
-#ifdef CONFIG_SMP
-static void __init
-check_for_logical_procs (void)
-{
-       pal_logical_to_physical_t info;
-       s64 status;
-
-       status = ia64_pal_logical_to_phys(0, &info);
-       if (status == -1) {
-               printk(KERN_INFO "No logical to physical processor mapping "
-                      "available\n");
-               return;
-       }
-       if (status) {
-               printk(KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n",
-                      status);
-               return;
-       }
-       /*
-        * Total number of siblings that BSP has.  Though not all of them 
-        * may have booted successfully. The correct number of siblings 
-        * booted is in info.overview_num_log.
-        */
-       smp_num_siblings = info.overview_tpc;
-       smp_num_cpucores = info.overview_cpp;
-}
-#endif
-
-static __initdata int nomca;
-static __init int setup_nomca(char *s)
-{
-       nomca = 1;
-       return 0;
-}
-early_param("nomca", setup_nomca);
-
-void __init
-setup_arch (char **cmdline_p)
-{
-       unw_init();
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               /* Must be done before any hypercall.  */
-               xencomm_init();
-
-               setup_xen_features();
-               /* Register a call for panic conditions. */
-               atomic_notifier_chain_register(&panic_notifier_list,
-                                              &xen_panic_block);
-               pm_power_off = xen_pm_power_off;
-       }
-#endif
-
-       ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
-
-       *cmdline_p = __va(ia64_boot_param->command_line);
-       strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
-
-       efi_init();
-       io_port_init();
-
-       parse_early_param();
-
-#ifdef CONFIG_IA64_GENERIC
-       machvec_init(NULL);
-#endif
-
-       if (early_console_setup(*cmdline_p) == 0)
-               mark_bsp_online();
-
-#ifdef CONFIG_ACPI
-       /* Initialize the ACPI boot-time table parser */
-       acpi_table_init();
-# ifdef CONFIG_ACPI_NUMA
-       acpi_numa_init();
-# endif
-#else
-# ifdef CONFIG_SMP
-       smp_build_cpu_map();    /* happens, e.g., with the Ski simulator */
-# endif
-#endif /* CONFIG_APCI_BOOT */
-
-       find_memory();
-
-       /* process SAL system table: */
-       ia64_sal_init(__va(efi.sal_systab));
-
-       ia64_setup_printk_clock();
-
-#ifdef CONFIG_SMP
-       cpu_physical_id(0) = hard_smp_processor_id();
-
-       cpu_set(0, cpu_sibling_map[0]);
-       cpu_set(0, cpu_core_map[0]);
-
-       check_for_logical_procs();
-       if (smp_num_cpucores > 1)
-               printk(KERN_INFO
-                      "cpu package is Multi-Core capable: number of cores=%d\n",
-                      smp_num_cpucores);
-       if (smp_num_siblings > 1)
-               printk(KERN_INFO
-                      "cpu package is Multi-Threading capable: number of siblings=%d\n",
-                      smp_num_siblings);
-#endif
-
-       cpu_init();     /* initialize the bootstrap CPU */
-       mmu_context_init();     /* initialize context_id bitmap */
-
-#ifdef CONFIG_ACPI
-       acpi_boot_init();
-#endif
-
-#ifdef CONFIG_VT
-       if (!conswitchp) {
-# if defined(CONFIG_DUMMY_CONSOLE)
-               conswitchp = &dummy_con;
-# endif
-# if defined(CONFIG_VGA_CONSOLE)
-               /*
-                * Non-legacy systems may route legacy VGA MMIO range to system
-                * memory.  vga_con probes the MMIO hole, so memory looks like
-                * a VGA device to it.  The EFI memory map can tell us if it's
-                * memory so we can avoid this problem.
-                */
-               if (efi_mem_type(0xA0000) != EFI_CONVENTIONAL_MEMORY)
-                       conswitchp = &vga_con;
-# endif
-       }
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               shared_info_t *s = HYPERVISOR_shared_info;
-
-               xen_start_info = __va(s->arch.start_info_pfn << PAGE_SHIFT);
-
-               printk("Running on Xen! start_info_pfn=0x%lx nr_pages=%ld "
-                      "flags=0x%x\n", s->arch.start_info_pfn,
-                      xen_start_info->nr_pages, xen_start_info->flags);
-
-               if (!is_initial_xendomain()) {
-#if !defined(CONFIG_VT) || !defined(CONFIG_DUMMY_CONSOLE)
-                       conswitchp = NULL;
-#endif
-               }
-               
-               /*
-                * If a console= is NOT specified, we assume using the
-                * xencons console is desired.  By default, this is ttyS0
-                * for dom0 and tty0 for domU.
-                */
-               if (!strstr(*cmdline_p, "console=")) {
-                       char *p, *q, name[5];
-                       int offset = 0;
-
-                       if (is_initial_xendomain())
-                               strncpy(name, "ttyS", 4);
-                       else
-                               strncpy(name, "tty", 3);
-
-                       p = strstr(*cmdline_p, "xencons=");
-
-                       if (p) {
-                               p += 8;
-                               if (!strncmp(p, "ttyS", 4)) {
-                                       strncpy(name, p, 4);
-                                       p += 4;
-                                       offset = simple_strtol(p, &q, 10);
-                                       if (p == q)
-                                               offset = 0;
-                               } else if (!strncmp(p, "tty", 3) ||
-                                          !strncmp(p, "xvc", 3)) {
-                                       strncpy(name, p, 3);
-                                       p += 3;
-                                       offset = simple_strtol(p, &q, 10);
-                                       if (p == q)
-                                               offset = 0;
-                               } else if (!strncmp(p, "off", 3))
-                                       offset = -1;
-                       }
-
-                       if (offset >= 0)
-                               add_preferred_console(name, offset, NULL);
-               }
-       }
-       xencons_early_setup();
-#endif
-#endif
-
-
-       /* enable IA-64 Machine Check Abort Handling unless disabled */
-#ifdef CONFIG_XEN
-       if (is_running_on_xen() && !is_initial_xendomain())
-               nomca = 1;
-#endif
-       if (!nomca)
-               ia64_mca_init();
-
-       platform_setup(cmdline_p);
-#ifdef CONFIG_XEN
-       if (!is_running_on_xen() && !ia64_platform_is("xen")) {
-               extern ia64_mv_setup_t xen_setup;
-               xen_setup(cmdline_p);
-       }
-#endif
-       paging_init();
-#ifdef CONFIG_XEN
-       contiguous_bitmap_init(max_pfn);
-#endif
-}
-
-/*
- * Display cpu info for all cpu's.
- */
-static int
-show_cpuinfo (struct seq_file *m, void *v)
-{
-#ifdef CONFIG_SMP
-#      define lpj      c->loops_per_jiffy
-#      define cpunum   c->cpu
-#else
-#      define lpj      loops_per_jiffy
-#      define cpunum   0
-#endif
-       static struct {
-               unsigned long mask;
-               const char *feature_name;
-       } feature_bits[] = {
-               { 1UL << 0, "branchlong" },
-               { 1UL << 1, "spontaneous deferral"},
-               { 1UL << 2, "16-byte atomic ops" }
-       };
-       char family[32], features[128], *cp, sep;
-       struct cpuinfo_ia64 *c = v;
-       unsigned long mask;
-       unsigned long proc_freq;
-       int i;
-
-       mask = c->features;
-
-       switch (c->family) {
-             case 0x07:        memcpy(family, "Itanium", 8); break;
-             case 0x1f:        memcpy(family, "Itanium 2", 10); break;
-             default:          sprintf(family, "%u", c->family); break;
-       }
-
-       /* build the feature string: */
-       memcpy(features, " standard", 10);
-       cp = features;
-       sep = 0;
-       for (i = 0; i < (int) ARRAY_SIZE(feature_bits); ++i) {
-               if (mask & feature_bits[i].mask) {
-                       if (sep)
-                               *cp++ = sep;
-                       sep = ',';
-                       *cp++ = ' ';
-                       strcpy(cp, feature_bits[i].feature_name);
-                       cp += strlen(feature_bits[i].feature_name);
-                       mask &= ~feature_bits[i].mask;
-               }
-       }
-       if (mask) {
-               /* print unknown features as a hex value: */
-               if (sep)
-                       *cp++ = sep;
-               sprintf(cp, " 0x%lx", mask);
-       }
-
-       proc_freq = cpufreq_quick_get(cpunum);
-       if (!proc_freq)
-               proc_freq = c->proc_freq / 1000;
-
-       seq_printf(m,
-                  "processor  : %d\n"
-                  "vendor     : %s\n"
-                  "arch       : IA-64\n"
-                  "family     : %s\n"
-                  "model      : %u\n"
-                  "revision   : %u\n"
-                  "archrev    : %u\n"
-                  "features   :%s\n"   /* don't change this---it _is_ right! */
-                  "cpu number : %lu\n"
-                  "cpu regs   : %u\n"
-                  "cpu MHz    : %lu.%06lu\n"
-                  "itc MHz    : %lu.%06lu\n"
-                  "BogoMIPS   : %lu.%02lu\n",
-                  cpunum, c->vendor, family, c->model, c->revision, c->archrev,
-                  features, c->ppn, c->number,
-                  proc_freq / 1000, proc_freq % 1000,
-                  c->itc_freq / 1000000, c->itc_freq % 1000000,
-                  lpj*HZ/500000, (lpj*HZ/5000) % 100);
-#ifdef CONFIG_SMP
-       seq_printf(m, "siblings   : %u\n", cpus_weight(cpu_core_map[cpunum]));
-       if (c->threads_per_core > 1 || c->cores_per_socket > 1)
-               seq_printf(m,
-                          "physical id: %u\n"
-                          "core id    : %u\n"
-                          "thread id  : %u\n",
-                          c->socket_id, c->core_id, c->thread_id);
-#endif
-       seq_printf(m,"\n");
-
-       return 0;
-}
-
-static void *
-c_start (struct seq_file *m, loff_t *pos)
-{
-#ifdef CONFIG_SMP
-       while (*pos < NR_CPUS && !cpu_isset(*pos, cpu_online_map))
-               ++*pos;
-#endif
-       return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
-}
-
-static void *
-c_next (struct seq_file *m, void *v, loff_t *pos)
-{
-       ++*pos;
-       return c_start(m, pos);
-}
-
-static void
-c_stop (struct seq_file *m, void *v)
-{
-}
-
-struct seq_operations cpuinfo_op = {
-       .start =        c_start,
-       .next =         c_next,
-       .stop =         c_stop,
-       .show =         show_cpuinfo
-};
-
-static void __cpuinit
-identify_cpu (struct cpuinfo_ia64 *c)
-{
-       union {
-               unsigned long bits[5];
-               struct {
-                       /* id 0 & 1: */
-                       char vendor[16];
-
-                       /* id 2 */
-                       u64 ppn;                /* processor serial number */
-
-                       /* id 3: */
-                       unsigned number         :  8;
-                       unsigned revision       :  8;
-                       unsigned model          :  8;
-                       unsigned family         :  8;
-                       unsigned archrev        :  8;
-                       unsigned reserved       : 24;
-
-                       /* id 4: */
-                       u64 features;
-               } field;
-       } cpuid;
-       pal_vm_info_1_u_t vm1;
-       pal_vm_info_2_u_t vm2;
-       pal_status_t status;
-       unsigned long impl_va_msb = 50, phys_addr_size = 44;    /* Itanium defaults */
-       int i;
-
-       for (i = 0; i < 5; ++i)
-               cpuid.bits[i] = ia64_get_cpuid(i);
-
-       memcpy(c->vendor, cpuid.field.vendor, 16);
-#ifdef CONFIG_SMP
-       c->cpu = smp_processor_id();
-
-       /* below default values will be overwritten  by identify_siblings() 
-        * for Multi-Threading/Multi-Core capable cpu's
-        */
-       c->threads_per_core = c->cores_per_socket = c->num_log = 1;
-       c->socket_id = -1;
-
-       identify_siblings(c);
-#endif
-       c->ppn = cpuid.field.ppn;
-       c->number = cpuid.field.number;
-       c->revision = cpuid.field.revision;
-       c->model = cpuid.field.model;
-       c->family = cpuid.field.family;
-       c->archrev = cpuid.field.archrev;
-       c->features = cpuid.field.features;
-
-       status = ia64_pal_vm_summary(&vm1, &vm2);
-       if (status == PAL_STATUS_SUCCESS) {
-               impl_va_msb = vm2.pal_vm_info_2_s.impl_va_msb;
-               phys_addr_size = vm1.pal_vm_info_1_s.phys_add_size;
-       }
-       c->unimpl_va_mask = ~((7L<<61) | ((1L << (impl_va_msb + 1)) - 1));
-       c->unimpl_pa_mask = ~((1L<<63) | ((1L << phys_addr_size) - 1));
-}
-
-void
-setup_per_cpu_areas (void)
-{
-       /* start_kernel() requires this... */
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-       prefill_possible_map();
-#endif
-}
-
-/*
- * Calculate the max. cache line size.
- *
- * In addition, the minimum of the i-cache stride sizes is calculated for
- * "flush_icache_range()".
- */
-static void __cpuinit
-get_max_cacheline_size (void)
-{
-       unsigned long line_size, max = 1;
-       unsigned int cache_size = 0;
-       u64 l, levels, unique_caches;
-        pal_cache_config_info_t cci;
-        s64 status;
-
-        status = ia64_pal_cache_summary(&levels, &unique_caches);
-        if (status != 0) {
-                printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n",
-                       __FUNCTION__, status);
-                max = SMP_CACHE_BYTES;
-               /* Safest setup for "flush_icache_range()" */
-               ia64_i_cache_stride_shift = I_CACHE_STRIDE_SHIFT;
-               goto out;
-        }
-
-       for (l = 0; l < levels; ++l) {
-               status = ia64_pal_cache_config_info(l, /* cache_type (data_or_unified)= */ 2,
-                                                   &cci);
-               if (status != 0) {
-                       printk(KERN_ERR
-                              "%s: ia64_pal_cache_config_info(l=%lu, 2) failed (status=%ld)\n",
-                              __FUNCTION__, l, status);
-                       max = SMP_CACHE_BYTES;
-                       /* The safest setup for "flush_icache_range()" */
-                       cci.pcci_stride = I_CACHE_STRIDE_SHIFT;
-                       cci.pcci_unified = 1;
-               }
-               line_size = 1 << cci.pcci_line_size;
-               if (line_size > max)
-                       max = line_size;
-               if (cache_size < cci.pcci_cache_size)
-                       cache_size = cci.pcci_cache_size;
-               if (!cci.pcci_unified) {
-                       status = ia64_pal_cache_config_info(l,
-                                                   /* cache_type (instruction)= */ 1,
-                                                   &cci);
-                       if (status != 0) {
-                               printk(KERN_ERR
-                               "%s: ia64_pal_cache_config_info(l=%lu, 1) failed (status=%ld)\n",
-                                       __FUNCTION__, l, status);
-                               /* The safest setup for "flush_icache_range()" */
-                               cci.pcci_stride = I_CACHE_STRIDE_SHIFT;
-                       }
-               }
-               if (cci.pcci_stride < ia64_i_cache_stride_shift)
-                       ia64_i_cache_stride_shift = cci.pcci_stride;
-       }
-  out:
-#ifdef CONFIG_SMP
-       max_cache_size = max(max_cache_size, cache_size);
-#endif
-       if (max > ia64_max_cacheline_size)
-               ia64_max_cacheline_size = max;
-}
-
-/*
- * cpu_init() initializes state that is per-CPU.  This function acts
- * as a 'CPU state barrier', nothing should get across.
- */
-void __cpuinit
-cpu_init (void)
-{
-       extern void __cpuinit ia64_mmu_init (void *);
-       unsigned long num_phys_stacked;
-       pal_vm_info_2_u_t vmi;
-       unsigned int max_ctx;
-       struct cpuinfo_ia64 *cpu_info;
-       void *cpu_data;
-
-       cpu_data = per_cpu_init();
-
-       /*
-        * We set ar.k3 so that assembly code in MCA handler can compute
-        * physical addresses of per cpu variables with a simple:
-        *   phys = ar.k3 + &per_cpu_var
-        */
-       ia64_set_kr(IA64_KR_PER_CPU_DATA,
-                   ia64_tpa(cpu_data) - (long) __per_cpu_start);
-
-       get_max_cacheline_size();
-
-       /*
-        * We can't pass "local_cpu_data" to identify_cpu() because we haven't called
-        * ia64_mmu_init() yet.  And we can't call ia64_mmu_init() first because it
-        * depends on the data returned by identify_cpu().  We break the dependency by
-        * accessing cpu_data() through the canonical per-CPU address.
-        */
-       cpu_info = cpu_data + ((char *) &__ia64_per_cpu_var(cpu_info) - __per_cpu_start);
-       identify_cpu(cpu_info);
-
-#ifdef CONFIG_MCKINLEY
-       {
-#              define FEATURE_SET 16
-               struct ia64_pal_retval iprv;
-
-               if (cpu_info->family == 0x1f) {
-                       PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, FEATURE_SET, 0);
-                       if ((iprv.status == 0) && (iprv.v0 & 0x80) && (iprv.v2 & 0x80))
-                               PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES,
-                                             (iprv.v1 | 0x80), FEATURE_SET, 0);
-               }
-       }
-#endif
-
-       /* Clear the stack memory reserved for pt_regs: */
-       memset(task_pt_regs(current), 0, sizeof(struct pt_regs));
-
-       ia64_set_kr(IA64_KR_FPU_OWNER, 0);
-
-       /*
-        * Initialize the page-table base register to a global
-        * directory with all zeroes.  This ensure that we can handle
-        * TLB-misses to user address-space even before we created the
-        * first user address-space.  This may happen, e.g., due to
-        * aggressive use of lfetch.fault.
-        */
-       ia64_set_kr(IA64_KR_PT_BASE, __pa(ia64_imva(empty_zero_page)));
-
-       /*
-        * Initialize default control register to defer speculative faults except
-        * for those arising from TLB misses, which are not deferred.  The
-        * kernel MUST NOT depend on a particular setting of these bits (in other words,
-        * the kernel must have recovery code for all speculative accesses).  Turn on
-        * dcr.lc as per recommendation by the architecture team.  Most IA-32 apps
-        * shouldn't be affected by this (moral: keep your ia32 locks aligned and you'll
-        * be fine).
-        */
-       ia64_setreg(_IA64_REG_CR_DCR,  (  IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
-                                       | IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
-       atomic_inc(&init_mm.mm_count);
-       current->active_mm = &init_mm;
-       if (current->mm)
-               BUG();
-
-       ia64_mmu_init(ia64_imva(cpu_data));
-       ia64_mca_cpu_init(ia64_imva(cpu_data));
-
-#ifdef CONFIG_IA32_SUPPORT
-       ia32_cpu_init();
-#endif
-
-       /* Clear ITC to eliminiate sched_clock() overflows in human time.  */
-       ia64_set_itc(0);
-
-       /* disable all local interrupt sources: */
-       ia64_set_itv(1 << 16);
-       ia64_set_lrr0(1 << 16);
-       ia64_set_lrr1(1 << 16);
-       ia64_setreg(_IA64_REG_CR_PMV, 1 << 16);
-       ia64_setreg(_IA64_REG_CR_CMCV, 1 << 16);
-
-       /* clear TPR & XTP to enable all interrupt classes: */
-       ia64_setreg(_IA64_REG_CR_TPR, 0);
-#ifdef CONFIG_SMP
-       normal_xtp();
-#endif
-
-       /* set ia64_ctx.max_rid to the maximum RID that is supported by all CPUs: */
-       if (ia64_pal_vm_summary(NULL, &vmi) == 0)
-               max_ctx = (1U << (vmi.pal_vm_info_2_s.rid_size - 3)) - 1;
-       else {
-               printk(KERN_WARNING "cpu_init: PAL VM summary failed, assuming 18 RID bits\n");
-               max_ctx = (1U << 15) - 1;       /* use architected minimum */
-       }
-       while (max_ctx < ia64_ctx.max_ctx) {
-               unsigned int old = ia64_ctx.max_ctx;
-               if (cmpxchg(&ia64_ctx.max_ctx, old, max_ctx) == old)
-                       break;
-       }
-
-       if (ia64_pal_rse_info(&num_phys_stacked, NULL) != 0) {
-               printk(KERN_WARNING "cpu_init: PAL RSE info failed; assuming 96 physical "
-                      "stacked regs\n");
-               num_phys_stacked = 96;
-       }
-       /* size of physical stacked register partition plus 8 bytes: */
-       __get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
-       platform_cpu_init();
-#ifdef CONFIG_XEN
-       if (is_running_on_xen() && !ia64_platform_is("xen")) {
-               extern ia64_mv_cpu_init_t xen_cpu_init;
-               xen_cpu_init();
-       }
-#endif
-
-       pm_idle = default_idle;
-}
-
-/*
- * On SMP systems, when the scheduler does migration-cost autodetection,
- * it needs a way to flush as much of the CPU's caches as possible.
- */
-void sched_cacheflush(void)
-{
-       ia64_sal_cache_flush(3);
-}
-
-void __init
-check_bugs (void)
-{
-       ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles,
-                              (unsigned long) __end___mckinley_e9_bundles);
-}
-
-static int __init run_dmi_scan(void)
-{
-       dmi_scan_machine();
-       return 0;
-}
-core_initcall(run_dmi_scan);
diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c
deleted file mode 100644 (file)
index b73cffa..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * linux/arch/ia64/kernel/time.c
- *
- * Copyright (C) 1998-2003 Hewlett-Packard Co
- *     Stephane Eranian <eranian@hpl.hp.com>
- *     David Mosberger <davidm@hpl.hp.com>
- * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
- * Copyright (C) 1999-2000 VA Linux Systems
- * Copyright (C) 1999-2000 Walt Drummond <drummond@valinux.com>
- */
-
-#include <linux/cpu.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/profile.h>
-#include <linux/sched.h>
-#include <linux/time.h>
-#include <linux/interrupt.h>
-#include <linux/efi.h>
-#include <linux/profile.h>
-#include <linux/timex.h>
-
-#include <asm/machvec.h>
-#include <asm/delay.h>
-#include <asm/hw_irq.h>
-#include <asm/ptrace.h>
-#include <asm/sal.h>
-#include <asm/sections.h>
-#include <asm/system.h>
-
-#ifdef CONFIG_XEN
-#include <linux/kernel_stat.h>
-#include <linux/posix-timers.h>
-#include <xen/interface/vcpu.h>
-#include <asm/percpu.h>
-#endif
-
-extern unsigned long wall_jiffies;
-
-volatile int time_keeper_id = 0; /* smp_processor_id() of time-keeper */
-
-#ifdef CONFIG_IA64_DEBUG_IRQ
-
-unsigned long last_cli_ip;
-EXPORT_SYMBOL(last_cli_ip);
-
-#endif
-
-#ifdef CONFIG_XEN
-DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
-DEFINE_PER_CPU(unsigned long, processed_stolen_time);
-DEFINE_PER_CPU(unsigned long, processed_blocked_time);
-#define NS_PER_TICK (1000000000LL/HZ)
-#endif
-
-static struct time_interpolator itc_interpolator = {
-       .shift = 16,
-       .mask = 0xffffffffffffffffLL,
-       .source = TIME_SOURCE_CPU
-};
-
-#ifdef CONFIG_XEN
-static unsigned long 
-consider_steal_time(unsigned long new_itm, struct pt_regs *regs)
-{
-       unsigned long stolen, blocked, sched_time;
-       unsigned long delta_itm = 0, stolentick = 0;
-       int i, cpu = smp_processor_id();
-       struct vcpu_runstate_info *runstate;
-       struct task_struct *p = current;
-
-       runstate = &per_cpu(runstate, smp_processor_id());
-
-       do {
-               sched_time = runstate->state_entry_time;
-               mb();
-               stolen = runstate->time[RUNSTATE_runnable] + 
-                        runstate->time[RUNSTATE_offline] -
-                        per_cpu(processed_stolen_time, cpu);
-               blocked = runstate->time[RUNSTATE_blocked] -
-                         per_cpu(processed_blocked_time, cpu);
-               mb();
-       } while (sched_time != runstate->state_entry_time);
-
-       /*
-        * Check for vcpu migration effect
-        * In this case, itc value is reversed.
-        * This causes huge stolen value.  
-        * This function just checks and reject this effect.
-        */
-       if (!time_after_eq(runstate->time[RUNSTATE_blocked],
-                          per_cpu(processed_blocked_time, cpu)))
-               blocked = 0;
-
-       if (!time_after_eq(runstate->time[RUNSTATE_runnable] +
-                          runstate->time[RUNSTATE_offline],
-                          per_cpu(processed_stolen_time, cpu)))
-               stolen = 0;
-
-       if (!time_after(delta_itm + new_itm, ia64_get_itc()))
-               stolentick = ia64_get_itc() - delta_itm - new_itm;
-
-       do_div(stolentick, NS_PER_TICK);
-       stolentick++;
-
-       do_div(stolen, NS_PER_TICK);
-
-       if (stolen > stolentick)
-               stolen = stolentick;
-
-       stolentick -= stolen;
-       do_div(blocked, NS_PER_TICK);
-
-       if (blocked > stolentick)
-               blocked = stolentick;
-
-       if (stolen > 0 || blocked > 0) {
-               account_steal_time(NULL, jiffies_to_cputime(stolen)); 
-               account_steal_time(idle_task(cpu), jiffies_to_cputime(blocked)); 
-               run_local_timers();
-
-               if (rcu_pending(cpu))
-                       rcu_check_callbacks(cpu, user_mode(regs));
-
-               scheduler_tick();
-               run_posix_cpu_timers(p);
-               delta_itm += local_cpu_data->itm_delta * (stolen + blocked);
-
-               if (cpu == time_keeper_id) {
-                       write_seqlock(&xtime_lock);
-                       for(i = 0; i < stolen + blocked; i++)
-                               do_timer(regs);
-                       local_cpu_data->itm_next = delta_itm + new_itm;
-                       write_sequnlock(&xtime_lock);
-               } else {
-                       local_cpu_data->itm_next = delta_itm + new_itm;
-               }
-               per_cpu(processed_stolen_time,cpu) += NS_PER_TICK * stolen;
-               per_cpu(processed_blocked_time,cpu) += NS_PER_TICK * blocked;
-       }
-       return delta_itm; 
-}
-#else
-#define consider_steal_time(new_itm, regs) (0)
-#endif
-
-static irqreturn_t
-timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
-{
-       unsigned long new_itm;
-       unsigned long delta_itm; /* XEN */
-
-       if (unlikely(cpu_is_offline(smp_processor_id()))) {
-               return IRQ_HANDLED;
-       }
-
-       platform_timer_interrupt(irq, dev_id, regs);
-
-       new_itm = local_cpu_data->itm_next;
-
-       if (!time_after(ia64_get_itc(), new_itm))
-               printk(KERN_ERR "Oops: timer tick before it's due (itc=%lx,itm=%lx)\n",
-                      ia64_get_itc(), new_itm);
-
-       profile_tick(CPU_PROFILING, regs);
-
-       if (is_running_on_xen()) {
-               delta_itm = consider_steal_time(new_itm, regs);
-               new_itm += delta_itm;
-               if (time_after(new_itm, ia64_get_itc()) && delta_itm)
-                       goto skip_process_time_accounting;
-       }
-
-       while (1) {
-               update_process_times(user_mode(regs));
-
-               new_itm += local_cpu_data->itm_delta;
-
-               if (smp_processor_id() == time_keeper_id) {
-                       /*
-                        * Here we are in the timer irq handler. We have irqs locally
-                        * disabled, but we don't know if the timer_bh is running on
-                        * another CPU. We need to avoid to SMP race by acquiring the
-                        * xtime_lock.
-                        */
-                       write_seqlock(&xtime_lock);
-                       do_timer(regs);
-                       local_cpu_data->itm_next = new_itm;
-                       write_sequnlock(&xtime_lock);
-               } else
-                       local_cpu_data->itm_next = new_itm;
-
-               if (time_after(new_itm, ia64_get_itc()))
-                       break;
-       }
-
-skip_process_time_accounting:  /* XEN */
-
-       do {
-               /*
-                * If we're too close to the next clock tick for
-                * comfort, we increase the safety margin by
-                * intentionally dropping the next tick(s).  We do NOT
-                * update itm.next because that would force us to call
-                * do_timer() which in turn would let our clock run
-                * too fast (with the potentially devastating effect
-                * of losing monotony of time).
-                */
-               while (!time_after(new_itm, ia64_get_itc() + local_cpu_data->itm_delta/2))
-                       new_itm += local_cpu_data->itm_delta;
-               ia64_set_itm(new_itm);
-               /* double check, in case we got hit by a (slow) PMI: */
-       } while (time_after_eq(ia64_get_itc(), new_itm));
-       return IRQ_HANDLED;
-}
-
-/*
- * Encapsulate access to the itm structure for SMP.
- */
-void
-ia64_cpu_local_tick (void)
-{
-       int cpu = smp_processor_id();
-       unsigned long shift = 0, delta;
-
-       /* arrange for the cycle counter to generate a timer interrupt: */
-       ia64_set_itv(IA64_TIMER_VECTOR);
-
-       delta = local_cpu_data->itm_delta;
-       /*
-        * Stagger the timer tick for each CPU so they don't occur all at (almost) the
-        * same time:
-        */
-       if (cpu) {
-               unsigned long hi = 1UL << ia64_fls(cpu);
-               shift = (2*(cpu - hi) + 1) * delta/hi/2;
-       }
-       local_cpu_data->itm_next = ia64_get_itc() + delta + shift;
-       ia64_set_itm(local_cpu_data->itm_next);
-}
-
-static int nojitter;
-
-static int __init nojitter_setup(char *str)
-{
-       nojitter = 1;
-       printk("Jitter checking for ITC timers disabled\n");
-       return 1;
-}
-
-__setup("nojitter", nojitter_setup);
-
-#ifdef CONFIG_XEN
-/* taken from i386/kernel/time-xen.c */
-static void init_missing_ticks_accounting(int cpu)
-{
-       struct vcpu_register_runstate_memory_area area;
-       struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
-       int rc;
-
-       memset(runstate, 0, sizeof(*runstate));
-
-       area.addr.v = runstate;
-       rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area);
-       WARN_ON(rc && rc != -ENOSYS);
-
-       per_cpu(processed_blocked_time, cpu) = runstate->time[RUNSTATE_blocked];
-       per_cpu(processed_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
-                                           + runstate->time[RUNSTATE_offline];
-}
-
-static int xen_ia64_settimefoday_after_resume;
-
-static int __init __xen_ia64_settimeofday_after_resume(char *str)
-{
-       xen_ia64_settimefoday_after_resume = 1;
-       return 1;
-}
-
-__setup("xen_ia64_settimefoday_after_resume",
-        __xen_ia64_settimeofday_after_resume);
-
-/* Called after suspend, to resume time.  */
-void
-time_resume(void)
-{
-       unsigned int cpu;
-       
-       /* Just trigger a tick.  */
-       ia64_cpu_local_tick();
-
-       if (xen_ia64_settimefoday_after_resume) {
-               /* do_settimeofday() resets timer interplator */
-               struct timespec xen_time;
-               int ret;
-               efi_gettimeofday(&xen_time);
-
-               ret = do_settimeofday(&xen_time);
-               WARN_ON(ret);
-       } else {
-#if 0
-               /* adjust EFI time */
-               struct timespec my_time = CURRENT_TIME;
-               struct timespec xen_time;
-               static timespec diff;
-               struct xen_domctl domctl;
-               int ret;
-
-               efi_gettimeofday(&xen_time);
-               diff = timespec_sub(&xen_time, &my_time);
-               domctl.cmd = XEN_DOMCTL_settimeoffset;
-               domctl.domain = DOMID_SELF;
-               domctl.u.settimeoffset.timeoffset_seconds = diff.tv_sec;
-               ret = HYPERVISOR_domctl_op(&domctl);
-               WARN_ON(ret);
-#endif
-               /* Time interpolator remembers the last timer status.
-                  Forget it */
-               write_seqlock_irq(&xtime_lock);
-               time_interpolator_reset();
-               write_sequnlock_irq(&xtime_lock);
-       }
-
-       for_each_online_cpu(cpu)
-               init_missing_ticks_accounting(cpu);
-
-       touch_softlockup_watchdog();
-}
-#else
-#define init_missing_ticks_accounting(cpu) do {} while (0)
-#endif
-
-void __devinit
-ia64_init_itm (void)
-{
-       unsigned long platform_base_freq, itc_freq;
-       struct pal_freq_ratio itc_ratio, proc_ratio;
-       long status, platform_base_drift, itc_drift;
-
-       /*
-        * According to SAL v2.6, we need to use a SAL call to determine the platform base
-        * frequency and then a PAL call to determine the frequency ratio between the ITC
-        * and the base frequency.
-        */
-       status = ia64_sal_freq_base(SAL_FREQ_BASE_PLATFORM,
-                                   &platform_base_freq, &platform_base_drift);
-       if (status != 0) {
-               printk(KERN_ERR "SAL_FREQ_BASE_PLATFORM failed: %s\n", ia64_sal_strerror(status));
-       } else {
-               status = ia64_pal_freq_ratios(&proc_ratio, NULL, &itc_ratio);
-               if (status != 0)
-                       printk(KERN_ERR "PAL_FREQ_RATIOS failed with status=%ld\n", status);
-       }
-       if (status != 0) {
-               /* invent "random" values */
-               printk(KERN_ERR
-                      "SAL/PAL failed to obtain frequency info---inventing reasonable values\n");
-               platform_base_freq = 100000000;
-               platform_base_drift = -1;       /* no drift info */
-               itc_ratio.num = 3;
-               itc_ratio.den = 1;
-       }
-       if (platform_base_freq < 40000000) {
-               printk(KERN_ERR "Platform base frequency %lu bogus---resetting to 75MHz!\n",
-                      platform_base_freq);
-               platform_base_freq = 75000000;
-               platform_base_drift = -1;
-       }
-       if (!proc_ratio.den)
-               proc_ratio.den = 1;     /* avoid division by zero */
-       if (!itc_ratio.den)
-               itc_ratio.den = 1;      /* avoid division by zero */
-
-       itc_freq = (platform_base_freq*itc_ratio.num)/itc_ratio.den;
-
-       local_cpu_data->itm_delta = (itc_freq + HZ/2) / HZ;
-       printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%u/%u, "
-              "ITC freq=%lu.%03luMHz", smp_processor_id(),
-              platform_base_freq / 1000000, (platform_base_freq / 1000) % 1000,
-              itc_ratio.num, itc_ratio.den, itc_freq / 1000000, (itc_freq / 1000) % 1000);
-
-       if (platform_base_drift != -1) {
-               itc_drift = platform_base_drift*itc_ratio.num/itc_ratio.den;
-               printk("+/-%ldppm\n", itc_drift);
-       } else {
-               itc_drift = -1;
-               printk("\n");
-       }
-
-       local_cpu_data->proc_freq = (platform_base_freq*proc_ratio.num)/proc_ratio.den;
-       local_cpu_data->itc_freq = itc_freq;
-       local_cpu_data->cyc_per_usec = (itc_freq + USEC_PER_SEC/2) / USEC_PER_SEC;
-       local_cpu_data->nsec_per_cyc = ((NSEC_PER_SEC<<IA64_NSEC_PER_CYC_SHIFT)
-                                       + itc_freq/2)/itc_freq;
-
-       if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) {
-               itc_interpolator.frequency = local_cpu_data->itc_freq;
-               itc_interpolator.drift = itc_drift;
-#ifdef CONFIG_SMP
-               /* On IA64 in an SMP configuration ITCs are never accurately synchronized.
-                * Jitter compensation requires a cmpxchg which may limit
-                * the scalability of the syscalls for retrieving time.
-                * The ITC synchronization is usually successful to within a few
-                * ITC ticks but this is not a sure thing. If you need to improve
-                * timer performance in SMP situations then boot the kernel with the
-                * "nojitter" option. However, doing so may result in time fluctuating (maybe
-                * even going backward) if the ITC offsets between the individual CPUs
-                * are too large.
-                */
-               if (!nojitter) itc_interpolator.jitter = 1;
-#endif
-               register_time_interpolator(&itc_interpolator);
-       }
-
-       if (is_running_on_xen())
-               init_missing_ticks_accounting(smp_processor_id());
-
-       /* avoid softlock up message when cpu is unplug and plugged again. */
-       touch_softlockup_watchdog();
-
-       /* Setup the CPU local timer tick */
-       ia64_cpu_local_tick();
-}
-
-static struct irqaction timer_irqaction = {
-       .handler =      timer_interrupt,
-       .flags =        IRQF_DISABLED,
-       .name =         "timer"
-};
-
-void __devinit ia64_disable_timer(void)
-{
-       ia64_set_itv(1 << 16);
-}
-
-void __init
-time_init (void)
-{
-       register_percpu_irq(IA64_TIMER_VECTOR, &timer_irqaction);
-       efi_gettimeofday(&xtime);
-       ia64_init_itm();
-
-       /*
-        * Initialize wall_to_monotonic such that adding it to xtime will yield zero, the
-        * tv_nsec field must be normalized (i.e., 0 <= nsec < NSEC_PER_SEC).
-        */
-       set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
-}
-
-/*
- * Generic udelay assumes that if preemption is allowed and the thread
- * migrates to another CPU, that the ITC values are synchronized across
- * all CPUs.
- */
-static void
-ia64_itc_udelay (unsigned long usecs)
-{
-       unsigned long start = ia64_get_itc();
-       unsigned long end = start + usecs*local_cpu_data->cyc_per_usec;
-
-       while (time_before(ia64_get_itc(), end))
-               cpu_relax();
-}
-
-void (*ia64_udelay)(unsigned long usecs) = &ia64_itc_udelay;
-
-void
-udelay (unsigned long usecs)
-{
-       (*ia64_udelay)(usecs);
-}
-EXPORT_SYMBOL(udelay);
-
-static unsigned long long ia64_itc_printk_clock(void)
-{
-       if (ia64_get_kr(IA64_KR_PER_CPU_DATA))
-               return sched_clock();
-       return 0;
-}
-
-static unsigned long long ia64_default_printk_clock(void)
-{
-       return (unsigned long long)(jiffies_64 - INITIAL_JIFFIES) *
-               (1000000000/HZ);
-}
-
-unsigned long long (*ia64_printk_clock)(void) = &ia64_default_printk_clock;
-
-unsigned long long printk_clock(void)
-{
-       return ia64_printk_clock();
-}
-
-void __init
-ia64_setup_printk_clock(void)
-{
-       if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT))
-               ia64_printk_clock = ia64_itc_printk_clock;
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/mm/ioremap.c b/linux-2.6-xen-sparse/arch/ia64/mm/ioremap.c
deleted file mode 100644 (file)
index c14ac66..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * (c) Copyright 2006 Hewlett-Packard Development Company, L.P.
- *     Bjorn Helgaas <bjorn.helgaas@hp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/compiler.h>
-#include <linux/module.h>
-#include <linux/efi.h>
-#include <asm/io.h>
-#include <asm/meminit.h>
-
-static inline void __iomem *
-__ioremap (unsigned long offset, unsigned long size)
-{
-       offset = HYPERVISOR_ioremap(offset, size);
-       if (IS_ERR_VALUE(offset))
-               return (void __iomem*)offset;
-       return (void __iomem *) (__IA64_UNCACHED_OFFSET | offset);
-}
-
-void __iomem *
-ioremap (unsigned long offset, unsigned long size)
-{
-       u64 attr;
-       unsigned long gran_base, gran_size;
-
-       /*
-        * For things in kern_memmap, we must use the same attribute
-        * as the rest of the kernel.  For more details, see
-        * Documentation/ia64/aliasing.txt.
-        */
-       attr = kern_mem_attribute(offset, size);
-       if (attr & EFI_MEMORY_WB)
-               return (void __iomem *) phys_to_virt(offset);
-       else if (attr & EFI_MEMORY_UC)
-               return __ioremap(offset, size);
-
-       /*
-        * Some chipsets don't support UC access to memory.  If
-        * WB is supported for the whole granule, we prefer that.
-        */
-       gran_base = GRANULEROUNDDOWN(offset);
-       gran_size = GRANULEROUNDUP(offset + size) - gran_base;
-       if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB)
-               return (void __iomem *) phys_to_virt(offset);
-
-       return __ioremap(offset, size);
-}
-EXPORT_SYMBOL(ioremap);
-
-void __iomem *
-ioremap_nocache (unsigned long offset, unsigned long size)
-{
-       if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB)
-               return NULL;
-
-       return __ioremap(offset, size);
-}
-EXPORT_SYMBOL(ioremap_nocache);
diff --git a/linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile b/linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile
deleted file mode 100644 (file)
index 555d4a9..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-obj-$(CONFIG_OPROFILE) += oprofile.o
-
-DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \
-               oprof.o cpu_buffer.o buffer_sync.o \
-               event_buffer.o oprofile_files.o \
-               oprofilefs.o oprofile_stats.o \
-               timer_int.o )
-
-oprofile-y := $(DRIVER_OBJS) init.o backtrace.o
-oprofile-$(CONFIG_PERFMON) += perfmon.o
-ifeq ($(CONFIG_XEN), y)
-oprofile-$(CONFIG_PERFMON) += xenoprof.o \
-       ../../../drivers/xen/xenoprof/xenoprofile.o
-endif
diff --git a/linux-2.6-xen-sparse/arch/ia64/oprofile/init.c b/linux-2.6-xen-sparse/arch/ia64/oprofile/init.c
deleted file mode 100644 (file)
index f218b7e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * @file init.c
- *
- * @remark Copyright 2002 OProfile authors
- * @remark Read the file COPYING
- *
- * @author John Levon <levon@movementarian.org>
- */
-
-#include <linux/kernel.h>
-#include <linux/oprofile.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include "oprofile_perfmon.h"
-extern int perfmon_init(struct oprofile_operations * ops);
-extern void perfmon_exit(void);
-extern void ia64_backtrace(struct pt_regs * const regs, unsigned int depth);
-
-int __init oprofile_arch_init(struct oprofile_operations * ops)
-{
-       int ret = -ENODEV;
-
-       if (is_running_on_xen()) {
-               ret = xen_perfmon_init();
-               if (ret)
-                       return ret;
-               return xenoprofile_init(ops);
-       }
-
-#ifdef CONFIG_PERFMON
-       /* perfmon_init() can fail, but we have no way to report it */
-       ret = perfmon_init(ops);
-#endif
-       ops->backtrace = ia64_backtrace;
-
-       return ret;
-}
-
-
-void oprofile_arch_exit(void)
-{
-       if (is_running_on_xen()) {
-               xenoprofile_exit();
-               xen_perfmon_exit();
-               return;
-       }
-
-#ifdef CONFIG_PERFMON
-       perfmon_exit();
-#endif
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h b/linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h
deleted file mode 100644 (file)
index 6ba1170..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef OPROFILE_PERFMON_H
-#define OPROFILE_PERFMON_H
-
-#ifdef CONFIG_PERFMON
-int __perfmon_init(void);
-void __perfmon_exit(void);
-int perfmon_start(void);
-void perfmon_stop(void);
-#else
-#define __perfmon_init()       (-ENOSYS)
-#define __perfmon_exit()       do {} while (0)
-#endif /* CONFIG_PERFMON */
-
-#ifdef CONFIG_XEN
-#define STATIC_IF_NO_XEN       /* nothing */
-#define xen_perfmon_init()     __perfmon_init()
-#define xen_perfmon_exit()     __perfmon_exit()
-extern int xenoprofile_init(struct oprofile_operations * ops);
-extern void xenoprofile_exit(void);
-#else
-#define STATIC_IF_NO_XEN       static
-#define xen_perfmon_init()     (-ENOSYS)
-#define xen_perfmon_exit()     do {} while (0)
-#define xenoprofile_init()     (-ENOSYS)
-#define xenoprofile_exit()     do {} while (0)
-#endif /* CONFIG_XEN */
-
-#endif /* OPROFILE_PERFMON_H */
diff --git a/linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c b/linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c
deleted file mode 100644 (file)
index 89dc71f..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * @file perfmon.c
- *
- * @remark Copyright 2003 OProfile authors
- * @remark Read the file COPYING
- *
- * @author John Levon <levon@movementarian.org>
- */
-
-#include <linux/kernel.h>
-#include <linux/oprofile.h>
-#include <linux/sched.h>
-#include <asm/perfmon.h>
-#include <asm/ptrace.h>
-#include <asm/errno.h>
-#include "oprofile_perfmon.h"
-
-static int allow_ints;
-
-static int
-perfmon_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg,
-                struct pt_regs *regs, unsigned long stamp)
-{
-       int event = arg->pmd_eventid;
-       arg->ovfl_ctrl.bits.reset_ovfl_pmds = 1;
-
-       /* the owner of the oprofile event buffer may have exited
-        * without perfmon being shutdown (e.g. SIGSEGV)
-        */
-       if (allow_ints)
-               oprofile_add_sample(regs, event);
-       return 0;
-}
-
-
-STATIC_IF_NO_XEN
-int perfmon_start(void)
-{
-       allow_ints = 1;
-       return 0;
-}
-
-
-STATIC_IF_NO_XEN
-void perfmon_stop(void)
-{
-       allow_ints = 0;
-}
-
-
-#define OPROFILE_FMT_UUID { \
-       0x77, 0x7a, 0x6e, 0x61, 0x20, 0x65, 0x73, 0x69, 0x74, 0x6e, 0x72, 0x20, 0x61, 0x65, 0x0a, 0x6c }
-
-static pfm_buffer_fmt_t oprofile_fmt = {
-       .fmt_name           = "oprofile_format",
-       .fmt_uuid           = OPROFILE_FMT_UUID,
-       .fmt_handler        = perfmon_handler,
-};
-
-
-static char * get_cpu_type(void)
-{
-       __u8 family = local_cpu_data->family;
-
-       switch (family) {
-               case 0x07:
-                       return "ia64/itanium";
-               case 0x1f:
-                       return "ia64/itanium2";
-               default:
-                       return "ia64/ia64";
-       }
-}
-
-
-/* all the ops are handled via userspace for IA64 perfmon */
-
-static int using_perfmon;
-
-STATIC_IF_NO_XEN
-int __perfmon_init(void)
-{
-       int ret = pfm_register_buffer_fmt(&oprofile_fmt);
-       if (ret)
-               return -ENODEV;
-
-       using_perfmon = 1;
-       return 0;
-}
-
-STATIC_IF_NO_XEN
-void __perfmon_exit(void)
-{
-       if (!using_perfmon)
-               return;
-
-       pfm_unregister_buffer_fmt(oprofile_fmt.fmt_uuid);
-}
-
-int perfmon_init(struct oprofile_operations * ops)
-{
-       int ret = __perfmon_init();
-       if (ret)
-               return -ENODEV;
-
-       ops->cpu_type = get_cpu_type();
-       ops->start = perfmon_start;
-       ops->stop = perfmon_stop;
-       printk(KERN_INFO "oprofile: using perfmon.\n");
-       return 0;
-}
-
-
-void perfmon_exit(void)
-{
-       __perfmon_exit();
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c b/linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c
deleted file mode 100644 (file)
index 998be3e..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/******************************************************************************
- * xenoprof ia64 specific part
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-#include <linux/init.h>
-#include <linux/oprofile.h>
-#include <linux/ioport.h>
-
-#include <xen/driver_util.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/xenoprof.h>
-#include <xen/xenoprof.h>
-
-#include "oprofile_perfmon.h"
-
-void __init xenoprof_arch_init_counter(struct xenoprof_init *init)
-{
-       init->num_events = 0; /* perfmon manages. */
-}
-
-void xenoprof_arch_counter(void)
-{
-       /* nothing. perfmon does. */
-}
-
-void xenoprof_arch_start(void) 
-{
-       perfmon_start();
-}
-
-void xenoprof_arch_stop(void)
-{
-       perfmon_stop();
-}
-
-/* XXX move them to an appropriate header file. */
-struct resource* xen_ia64_allocate_resource(unsigned long size); 
-void xen_ia64_release_resource(struct resource* res); 
-void xen_ia64_unmap_resource(struct resource* res); 
-
-struct resource*
-xenoprof_ia64_allocate_resource(int32_t max_samples)
-{
-       unsigned long bufsize;
-
-       /* XXX add hypercall to get bufsize? */
-       /*     this value is taken from alloc_xenoprof_struct(). */
-#if 0
-       bufsize = NR_CPUS * (sizeof(struct xenoprof_buf) +
-                            (max_samples - 1) * sizeof(struct event_log));
-       bufsize = PAGE_ALIGN(bufsize) + PAGE_SIZE;
-#else
-#define MAX_OPROF_SHARED_PAGES 32
-       bufsize = (MAX_OPROF_SHARED_PAGES + 1) * PAGE_SIZE;
-#endif
-       return xen_ia64_allocate_resource(bufsize);
-}
-
-void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf)
-{
-       if (sbuf->buffer) {
-               xen_ia64_unmap_resource(sbuf->arch.res);
-               sbuf->buffer = NULL;
-               sbuf->arch.res = NULL;
-       }
-}
-
-int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer,
-                                    struct xenoprof_shared_buffer* sbuf)
-{
-       int ret;
-       struct resource* res;
-
-       sbuf->buffer = NULL;
-       sbuf->arch.res = NULL;
-
-       res = xenoprof_ia64_allocate_resource(get_buffer->max_samples);
-       if (IS_ERR(res))
-               return PTR_ERR(res);
-
-       get_buffer->buf_gmaddr = res->start;
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_get_buffer, get_buffer);
-       if (ret) {
-               xen_ia64_release_resource(res);
-               return ret;
-       }
-
-       BUG_ON((res->end - res->start + 1) <
-              get_buffer->bufsize * get_buffer->nbuf);
-
-       sbuf->buffer = __va(res->start);
-       sbuf->arch.res = res;
-
-       return ret;
-}
-
-int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain,
-                              struct xenoprof_shared_buffer* sbuf)
-{
-       int ret;
-       struct resource* res;
-
-       sbuf->buffer = NULL;
-       sbuf->arch.res = NULL;
-
-       res = xenoprof_ia64_allocate_resource(pdomain->max_samples);
-       if (IS_ERR(res))
-               return PTR_ERR(res);
-
-       pdomain->buf_gmaddr = res->start;
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_set_passive, pdomain);
-       if (ret) {
-               xen_ia64_release_resource(res);
-               return ret;
-       }
-
-       BUG_ON((res->end - res->start + 1) < pdomain->bufsize * pdomain->nbuf);
-
-       sbuf->buffer = __va(res->start);
-       sbuf->arch.res = res;
-
-       return ret;
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/pci/pci.c b/linux-2.6-xen-sparse/arch/ia64/pci/pci.c
deleted file mode 100644 (file)
index 4d36841..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-/*
- * pci.c - Low-Level PCI Access in IA-64
- *
- * Derived from bios32.c of i386 tree.
- *
- * (c) Copyright 2002, 2005 Hewlett-Packard Development Company, L.P.
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Bjorn Helgaas <bjorn.helgaas@hp.com>
- * Copyright (C) 2004 Silicon Graphics, Inc.
- *
- * Note: Above list of copyright holders is incomplete...
- */
-
-#include <linux/acpi.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
-#include <linux/spinlock.h>
-
-#include <asm/machvec.h>
-#include <asm/page.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/sal.h>
-#include <asm/smp.h>
-#include <asm/irq.h>
-#include <asm/hw_irq.h>
-
-/*
- * Low-level SAL-based PCI configuration access functions. Note that SAL
- * calls are already serialized (via sal_lock), so we don't need another
- * synchronization mechanism here.
- */
-
-#define PCI_SAL_ADDRESS(seg, bus, devfn, reg)          \
-       (((u64) seg << 24) | (bus << 16) | (devfn << 8) | (reg))
-
-/* SAL 3.2 adds support for extended config space. */
-
-#define PCI_SAL_EXT_ADDRESS(seg, bus, devfn, reg)      \
-       (((u64) seg << 28) | (bus << 20) | (devfn << 12) | (reg))
-
-static int
-pci_sal_read (unsigned int seg, unsigned int bus, unsigned int devfn,
-             int reg, int len, u32 *value)
-{
-       u64 addr, data = 0;
-       int mode, result;
-
-       if (!value || (seg > 65535) || (bus > 255) || (devfn > 255) || (reg > 4095))
-               return -EINVAL;
-
-       if ((seg | reg) <= 255) {
-               addr = PCI_SAL_ADDRESS(seg, bus, devfn, reg);
-               mode = 0;
-       } else {
-               addr = PCI_SAL_EXT_ADDRESS(seg, bus, devfn, reg);
-               mode = 1;
-       }
-       result = ia64_sal_pci_config_read(addr, mode, len, &data);
-       if (result != 0)
-               return -EINVAL;
-
-       *value = (u32) data;
-       return 0;
-}
-
-static int
-pci_sal_write (unsigned int seg, unsigned int bus, unsigned int devfn,
-              int reg, int len, u32 value)
-{
-       u64 addr;
-       int mode, result;
-
-       if ((seg > 65535) || (bus > 255) || (devfn > 255) || (reg > 4095))
-               return -EINVAL;
-
-       if ((seg | reg) <= 255) {
-               addr = PCI_SAL_ADDRESS(seg, bus, devfn, reg);
-               mode = 0;
-       } else {
-               addr = PCI_SAL_EXT_ADDRESS(seg, bus, devfn, reg);
-               mode = 1;
-       }
-       result = ia64_sal_pci_config_write(addr, mode, len, value);
-       if (result != 0)
-               return -EINVAL;
-       return 0;
-}
-
-static struct pci_raw_ops pci_sal_ops = {
-       .read =         pci_sal_read,
-       .write =        pci_sal_write
-};
-
-struct pci_raw_ops *raw_pci_ops = &pci_sal_ops;
-
-static int
-pci_read (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
-{
-       return raw_pci_ops->read(pci_domain_nr(bus), bus->number,
-                                devfn, where, size, value);
-}
-
-static int
-pci_write (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
-{
-       return raw_pci_ops->write(pci_domain_nr(bus), bus->number,
-                                 devfn, where, size, value);
-}
-
-struct pci_ops pci_root_ops = {
-       .read = pci_read,
-       .write = pci_write,
-};
-
-/* Called by ACPI when it finds a new root bus.  */
-
-static struct pci_controller * __devinit
-alloc_pci_controller (int seg)
-{
-       struct pci_controller *controller;
-
-       controller = kmalloc(sizeof(*controller), GFP_KERNEL);
-       if (!controller)
-               return NULL;
-
-       memset(controller, 0, sizeof(*controller));
-       controller->segment = seg;
-       controller->node = -1;
-       return controller;
-}
-
-struct pci_root_info {
-       struct pci_controller *controller;
-       char *name;
-};
-
-static unsigned int
-new_space (u64 phys_base, int sparse)
-{
-       u64 mmio_base;
-       int i;
-
-       if (phys_base == 0)
-               return 0;       /* legacy I/O port space */
-
-       mmio_base = (u64) ioremap(phys_base, 0);
-       for (i = 0; i < num_io_spaces; i++)
-               if (io_space[i].mmio_base == mmio_base &&
-                   io_space[i].sparse == sparse)
-                       return i;
-
-       if (num_io_spaces == MAX_IO_SPACES) {
-               printk(KERN_ERR "PCI: Too many IO port spaces "
-                       "(MAX_IO_SPACES=%lu)\n", MAX_IO_SPACES);
-               return ~0;
-       }
-
-       i = num_io_spaces++;
-       io_space[i].mmio_base = mmio_base;
-       io_space[i].sparse = sparse;
-
-       return i;
-}
-
-static u64 __devinit
-add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
-{
-       struct resource *resource;
-       char *name;
-       u64 base, min, max, base_port;
-       unsigned int sparse = 0, space_nr, len;
-
-       resource = kzalloc(sizeof(*resource), GFP_KERNEL);
-       if (!resource) {
-               printk(KERN_ERR "PCI: No memory for %s I/O port space\n",
-                       info->name);
-               goto out;
-       }
-
-       len = strlen(info->name) + 32;
-       name = kzalloc(len, GFP_KERNEL);
-       if (!name) {
-               printk(KERN_ERR "PCI: No memory for %s I/O port space name\n",
-                       info->name);
-               goto free_resource;
-       }
-
-       min = addr->minimum;
-       max = min + addr->address_length - 1;
-       if (addr->info.io.translation_type == ACPI_SPARSE_TRANSLATION)
-               sparse = 1;
-
-       space_nr = new_space(addr->translation_offset, sparse);
-       if (space_nr == ~0)
-               goto free_name;
-
-       base = __pa(io_space[space_nr].mmio_base);
-       base_port = IO_SPACE_BASE(space_nr);
-       snprintf(name, len, "%s I/O Ports %08lx-%08lx", info->name,
-               base_port + min, base_port + max);
-
-       /*
-        * The SDM guarantees the legacy 0-64K space is sparse, but if the
-        * mapping is done by the processor (not the bridge), ACPI may not
-        * mark it as sparse.
-        */
-       if (space_nr == 0)
-               sparse = 1;
-
-       resource->name  = name;
-       resource->flags = IORESOURCE_MEM;
-       resource->start = base + (sparse ? IO_SPACE_SPARSE_ENCODING(min) : min);
-       resource->end   = base + (sparse ? IO_SPACE_SPARSE_ENCODING(max) : max);
-       insert_resource(&iomem_resource, resource);
-
-       return base_port;
-
-free_name:
-       kfree(name);
-free_resource:
-       kfree(resource);
-out:
-       return ~0;
-}
-
-static acpi_status __devinit resource_to_window(struct acpi_resource *resource,
-       struct acpi_resource_address64 *addr)
-{
-       acpi_status status;
-
-       /*
-        * We're only interested in _CRS descriptors that are
-        *      - address space descriptors for memory or I/O space
-        *      - non-zero size
-        *      - producers, i.e., the address space is routed downstream,
-        *        not consumed by the bridge itself
-        */
-       status = acpi_resource_to_address64(resource, addr);
-       if (ACPI_SUCCESS(status) &&
-           (addr->resource_type == ACPI_MEMORY_RANGE ||
-            addr->resource_type == ACPI_IO_RANGE) &&
-           addr->address_length &&
-           addr->producer_consumer == ACPI_PRODUCER)
-               return AE_OK;
-
-       return AE_ERROR;
-}
-
-static acpi_status __devinit
-count_window (struct acpi_resource *resource, void *data)
-{
-       unsigned int *windows = (unsigned int *) data;
-       struct acpi_resource_address64 addr;
-       acpi_status status;
-
-       status = resource_to_window(resource, &addr);
-       if (ACPI_SUCCESS(status))
-               (*windows)++;
-
-       return AE_OK;
-}
-
-static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
-{
-       struct pci_root_info *info = data;
-       struct pci_window *window;
-       struct acpi_resource_address64 addr;
-       acpi_status status;
-       unsigned long flags, offset = 0;
-       struct resource *root;
-
-       /* Return AE_OK for non-window resources to keep scanning for more */
-       status = resource_to_window(res, &addr);
-       if (!ACPI_SUCCESS(status))
-               return AE_OK;
-
-       if (addr.resource_type == ACPI_MEMORY_RANGE) {
-               flags = IORESOURCE_MEM;
-               root = &iomem_resource;
-               offset = addr.translation_offset;
-       } else if (addr.resource_type == ACPI_IO_RANGE) {
-               flags = IORESOURCE_IO;
-               root = &ioport_resource;
-               offset = add_io_space(info, &addr);
-               if (offset == ~0)
-                       return AE_OK;
-       } else
-               return AE_OK;
-
-       window = &info->controller->window[info->controller->windows++];
-       window->resource.name = info->name;
-       window->resource.flags = flags;
-       window->resource.start = addr.minimum + offset;
-       window->resource.end = window->resource.start + addr.address_length - 1;
-       window->resource.child = NULL;
-       window->offset = offset;
-
-       if (insert_resource(root, &window->resource)) {
-               printk(KERN_ERR "alloc 0x%lx-0x%lx from %s for %s failed\n",
-                       window->resource.start, window->resource.end,
-                       root->name, info->name);
-       }
-
-       return AE_OK;
-}
-
-static void __devinit
-pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
-{
-       int i, j;
-
-       j = 0;
-       for (i = 0; i < ctrl->windows; i++) {
-               struct resource *res = &ctrl->window[i].resource;
-               /* HP's firmware has a hack to work around a Windows bug.
-                * Ignore these tiny memory ranges */
-               if ((res->flags & IORESOURCE_MEM) &&
-                   (res->end - res->start < 16))
-                       continue;
-               if (j >= PCI_BUS_NUM_RESOURCES) {
-                       printk("Ignoring range [%lx-%lx] (%lx)\n", res->start,
-                                       res->end, res->flags);
-                       continue;
-               }
-               bus->resource[j++] = res;
-       }
-}
-
-struct pci_bus * __devinit
-pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
-{
-       struct pci_root_info info;
-       struct pci_controller *controller;
-       unsigned int windows = 0;
-       struct pci_bus *pbus;
-       char *name;
-       int pxm;
-
-       controller = alloc_pci_controller(domain);
-       if (!controller)
-               goto out1;
-
-       controller->acpi_handle = device->handle;
-
-       pxm = acpi_get_pxm(controller->acpi_handle);
-#ifdef CONFIG_NUMA
-       if (pxm >= 0)
-               controller->node = pxm_to_node(pxm);
-#endif
-
-       acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
-                       &windows);
-       controller->window = kmalloc_node(sizeof(*controller->window) * windows,
-                       GFP_KERNEL, controller->node);
-       if (!controller->window)
-               goto out2;
-
-       name = kmalloc(16, GFP_KERNEL);
-       if (!name)
-               goto out3;
-
-       sprintf(name, "PCI Bus %04x:%02x", domain, bus);
-       info.controller = controller;
-       info.name = name;
-       acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window,
-                       &info);
-
-       pbus = pci_scan_bus_parented(NULL, bus, &pci_root_ops, controller);
-       if (pbus)
-               pcibios_setup_root_windows(pbus, controller);
-
-       return pbus;
-
-out3:
-       kfree(controller->window);
-out2:
-       kfree(controller);
-out1:
-       return NULL;
-}
-
-void pcibios_resource_to_bus(struct pci_dev *dev,
-               struct pci_bus_region *region, struct resource *res)
-{
-       struct pci_controller *controller = PCI_CONTROLLER(dev);
-       unsigned long offset = 0;
-       int i;
-
-       for (i = 0; i < controller->windows; i++) {
-               struct pci_window *window = &controller->window[i];
-               if (!(window->resource.flags & res->flags))
-                       continue;
-               if (window->resource.start > res->start)
-                       continue;
-               if (window->resource.end < res->end)
-                       continue;
-               offset = window->offset;
-               break;
-       }
-
-       region->start = res->start - offset;
-       region->end = res->end - offset;
-}
-EXPORT_SYMBOL(pcibios_resource_to_bus);
-
-void pcibios_bus_to_resource(struct pci_dev *dev,
-               struct resource *res, struct pci_bus_region *region)
-{
-       struct pci_controller *controller = PCI_CONTROLLER(dev);
-       unsigned long offset = 0;
-       int i;
-
-       for (i = 0; i < controller->windows; i++) {
-               struct pci_window *window = &controller->window[i];
-               if (!(window->resource.flags & res->flags))
-                       continue;
-               if (window->resource.start - window->offset > region->start)
-                       continue;
-               if (window->resource.end - window->offset < region->end)
-                       continue;
-               offset = window->offset;
-               break;
-       }
-
-       res->start = region->start + offset;
-       res->end = region->end + offset;
-}
-EXPORT_SYMBOL(pcibios_bus_to_resource);
-
-static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
-{
-       unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
-       struct resource *devr = &dev->resource[idx];
-
-       if (!dev->bus)
-               return 0;
-       for (i=0; i<PCI_BUS_NUM_RESOURCES; i++) {
-               struct resource *busr = dev->bus->resource[i];
-
-               if (!busr || ((busr->flags ^ devr->flags) & type_mask))
-                       continue;
-               if ((devr->start) && (devr->start >= busr->start) &&
-                               (devr->end <= busr->end))
-                       return 1;
-       }
-       return 0;
-}
-
-static void __devinit
-pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
-{
-       struct pci_bus_region region;
-       int i;
-
-       for (i = start; i < limit; i++) {
-               if (!dev->resource[i].flags)
-                       continue;
-               region.start = dev->resource[i].start;
-               region.end = dev->resource[i].end;
-               pcibios_bus_to_resource(dev, &dev->resource[i], &region);
-               if ((is_valid_resource(dev, i)))
-                       pci_claim_resource(dev, i);
-       }
-}
-
-static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
-{
-       pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);
-}
-
-static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev)
-{
-       pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);
-}
-
-/*
- *  Called after each bus is probed, but before its children are examined.
- */
-void __devinit
-pcibios_fixup_bus (struct pci_bus *b)
-{
-       struct pci_dev *dev;
-
-       if (b->self) {
-               pci_read_bridge_bases(b);
-               pcibios_fixup_bridge_resources(b->self);
-       }
-       list_for_each_entry(dev, &b->devices, bus_list)
-               pcibios_fixup_device_resources(dev);
-
-       return;
-}
-
-void __devinit
-pcibios_update_irq (struct pci_dev *dev, int irq)
-{
-       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
-
-       /* ??? FIXME -- record old value for shutdown.  */
-}
-
-static inline int
-pcibios_enable_resources (struct pci_dev *dev, int mask)
-{
-       u16 cmd, old_cmd;
-       int idx;
-       struct resource *r;
-       unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
-
-       if (!dev)
-               return -EINVAL;
-
-       pci_read_config_word(dev, PCI_COMMAND, &cmd);
-       old_cmd = cmd;
-       for (idx=0; idx<PCI_NUM_RESOURCES; idx++) {
-               /* Only set up the desired resources.  */
-               if (!(mask & (1 << idx)))
-                       continue;
-
-               r = &dev->resource[idx];
-               if (!(r->flags & type_mask))
-                       continue;
-               if ((idx == PCI_ROM_RESOURCE) &&
-                               (!(r->flags & IORESOURCE_ROM_ENABLE)))
-                       continue;
-               if (!r->start && r->end) {
-                       printk(KERN_ERR
-                              "PCI: Device %s not available because of resource collisions\n",
-                              pci_name(dev));
-                       return -EINVAL;
-               }
-               if (r->flags & IORESOURCE_IO)
-                       cmd |= PCI_COMMAND_IO;
-               if (r->flags & IORESOURCE_MEM)
-                       cmd |= PCI_COMMAND_MEMORY;
-       }
-       if (cmd != old_cmd) {
-               printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
-               pci_write_config_word(dev, PCI_COMMAND, cmd);
-       }
-       return 0;
-}
-
-int
-pcibios_enable_device (struct pci_dev *dev, int mask)
-{
-       int ret;
-
-       ret = pcibios_enable_resources(dev, mask);
-       if (ret < 0)
-               return ret;
-
-       return acpi_pci_irq_enable(dev);
-}
-
-void
-pcibios_disable_device (struct pci_dev *dev)
-{
-       acpi_pci_irq_disable(dev);
-}
-
-void
-pcibios_align_resource (void *data, struct resource *res,
-                       resource_size_t size, resource_size_t align)
-{
-}
-
-/*
- * PCI BIOS setup, always defaults to SAL interface
- */
-char * __init
-pcibios_setup (char *str)
-{
-       return str;
-}
-
-int
-pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,
-                    enum pci_mmap_state mmap_state, int write_combine)
-{
-       /*
-        * I/O space cannot be accessed via normal processor loads and
-        * stores on this platform.
-        */
-       if (mmap_state == pci_mmap_io)
-               /*
-                * XXX we could relax this for I/O spaces for which ACPI
-                * indicates that the space is 1-to-1 mapped.  But at the
-                * moment, we don't support multiple PCI address spaces and
-                * the legacy I/O space is not 1-to-1 mapped, so this is moot.
-                */
-               return -EINVAL;
-
-       /*
-        * Leave vm_pgoff as-is, the PCI space address is the physical
-        * address on this platform.
-        */
-       if (write_combine && efi_range_is_wc(vma->vm_start,
-                                            vma->vm_end - vma->vm_start))
-               vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-       else
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
-       if (is_initial_xendomain()) {
-               unsigned long addr = vma->vm_pgoff << PAGE_SHIFT;
-               size_t size = vma->vm_end - vma->vm_start;
-               unsigned long offset = HYPERVISOR_ioremap(addr, size);
-               if (IS_ERR_VALUE(offset))
-                       return offset;
-       }
-
-       if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-                            vma->vm_end - vma->vm_start, vma->vm_page_prot))
-               return -EAGAIN;
-
-       return 0;
-}
-
-/**
- * ia64_pci_get_legacy_mem - generic legacy mem routine
- * @bus: bus to get legacy memory base address for
- *
- * Find the base of legacy memory for @bus.  This is typically the first
- * megabyte of bus address space for @bus or is simply 0 on platforms whose
- * chipsets support legacy I/O and memory routing.  Returns the base address
- * or an error pointer if an error occurred.
- *
- * This is the ia64 generic version of this routine.  Other platforms
- * are free to override it with a machine vector.
- */
-char *ia64_pci_get_legacy_mem(struct pci_bus *bus)
-{
-       return (char *)__IA64_UNCACHED_OFFSET;
-}
-
-/**
- * pci_mmap_legacy_page_range - map legacy memory space to userland
- * @bus: bus whose legacy space we're mapping
- * @vma: vma passed in by mmap
- *
- * Map legacy memory space for this device back to userspace using a machine
- * vector to get the base address.
- */
-int
-pci_mmap_legacy_page_range(struct pci_bus *bus, struct vm_area_struct *vma)
-{
-       unsigned long size = vma->vm_end - vma->vm_start;
-       pgprot_t prot;
-       char *addr;
-
-       /*
-        * Avoid attribute aliasing.  See Documentation/ia64/aliasing.txt
-        * for more details.
-        */
-       if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size))
-               return -EINVAL;
-       prot = phys_mem_access_prot(NULL, vma->vm_pgoff, size,
-                                   vma->vm_page_prot);
-       if (pgprot_val(prot) != pgprot_val(pgprot_noncached(vma->vm_page_prot)))
-               return -EINVAL;
-
-       addr = pci_get_legacy_mem(bus);
-       if (IS_ERR(addr))
-               return PTR_ERR(addr);
-
-       vma->vm_pgoff += (unsigned long)addr >> PAGE_SHIFT;
-       vma->vm_page_prot = prot;
-
-       if (is_initial_xendomain()) {
-               unsigned long addr = vma->vm_pgoff << PAGE_SHIFT;
-               size_t size = vma->vm_end - vma->vm_start;
-               unsigned long offset = HYPERVISOR_ioremap(addr, size);
-               if (IS_ERR_VALUE(offset))
-                       return offset;
-       }
-
-       if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-                           size, vma->vm_page_prot))
-               return -EAGAIN;
-
-       return 0;
-}
-
-/**
- * ia64_pci_legacy_read - read from legacy I/O space
- * @bus: bus to read
- * @port: legacy port value
- * @val: caller allocated storage for returned value
- * @size: number of bytes to read
- *
- * Simply reads @size bytes from @port and puts the result in @val.
- *
- * Again, this (and the write routine) are generic versions that can be
- * overridden by the platform.  This is necessary on platforms that don't
- * support legacy I/O routing or that hard fail on legacy I/O timeouts.
- */
-int ia64_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size)
-{
-       int ret = size;
-
-       switch (size) {
-       case 1:
-               *val = inb(port);
-               break;
-       case 2:
-               *val = inw(port);
-               break;
-       case 4:
-               *val = inl(port);
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/**
- * ia64_pci_legacy_write - perform a legacy I/O write
- * @bus: bus pointer
- * @port: port to write
- * @val: value to write
- * @size: number of bytes to write from @val
- *
- * Simply writes @size bytes of @val to @port.
- */
-int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size)
-{
-       int ret = size;
-
-       switch (size) {
-       case 1:
-               outb(val, port);
-               break;
-       case 2:
-               outw(val, port);
-               break;
-       case 4:
-               outl(val, port);
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/**
- * pci_cacheline_size - determine cacheline size for PCI devices
- * @dev: void
- *
- * We want to use the line-size of the outer-most cache.  We assume
- * that this line-size is the same for all CPUs.
- *
- * Code mostly taken from arch/ia64/kernel/palinfo.c:cache_info().
- *
- * RETURNS: An appropriate -ERRNO error value on eror, or zero for success.
- */
-static unsigned long
-pci_cacheline_size (void)
-{
-       u64 levels, unique_caches;
-       s64 status;
-       pal_cache_config_info_t cci;
-       static u8 cacheline_size;
-
-       if (cacheline_size)
-               return cacheline_size;
-
-       status = ia64_pal_cache_summary(&levels, &unique_caches);
-       if (status != 0) {
-               printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n",
-                      __FUNCTION__, status);
-               return SMP_CACHE_BYTES;
-       }
-
-       status = ia64_pal_cache_config_info(levels - 1, /* cache_type (data_or_unified)= */ 2,
-                                           &cci);
-       if (status != 0) {
-               printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed (status=%ld)\n",
-                      __FUNCTION__, status);
-               return SMP_CACHE_BYTES;
-       }
-       cacheline_size = 1 << cci.pcci_line_size;
-       return cacheline_size;
-}
-
-/**
- * pcibios_prep_mwi - helper function for drivers/pci/pci.c:pci_set_mwi()
- * @dev: the PCI device for which MWI is enabled
- *
- * For ia64, we can get the cacheline sizes from PAL.
- *
- * RETURNS: An appropriate -ERRNO error value on eror, or zero for success.
- */
-int
-pcibios_prep_mwi (struct pci_dev *dev)
-{
-       unsigned long desired_linesize, current_linesize;
-       int rc = 0;
-       u8 pci_linesize;
-
-       desired_linesize = pci_cacheline_size();
-
-       pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &pci_linesize);
-       current_linesize = 4 * pci_linesize;
-       if (desired_linesize != current_linesize) {
-               printk(KERN_WARNING "PCI: slot %s has incorrect PCI cache line size of %lu bytes,",
-                      pci_name(dev), current_linesize);
-               if (current_linesize > desired_linesize) {
-                       printk(" expected %lu bytes instead\n", desired_linesize);
-                       rc = -EINVAL;
-               } else {
-                       printk(" correcting to %lu\n", desired_linesize);
-                       pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, desired_linesize / 4);
-               }
-       }
-       return rc;
-}
-
-int pci_vector_resources(int last, int nr_released)
-{
-       int count = nr_released;
-
-       count += (IA64_LAST_DEVICE_VECTOR - last);
-
-       return count;
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/Makefile b/linux-2.6-xen-sparse/arch/ia64/xen/Makefile
deleted file mode 100644 (file)
index 6d19da2..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Makefile for Xen components
-#
-
-obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o \
-        hypervisor.o util.o xencomm.o xcom_hcall.o xcom_mini.o \
-        xcom_privcmd.o mem.o xen_dma.o
-
-obj-$(CONFIG_IA64_GENERIC) += machvec.o
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S b/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S
deleted file mode 100644 (file)
index dc59778..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Support routines for Xen hypercalls
- *
- * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
- */
-
-#include <asm/processor.h>
-#include <asm/asmmacro.h>
-
-GLOBAL_ENTRY(xen_get_psr)
-       XEN_HYPER_GET_PSR
-       br.ret.sptk.many rp
-    ;;
-END(xen_get_psr)
-
-GLOBAL_ENTRY(xen_get_ivr)
-       XEN_HYPER_GET_IVR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_ivr)
-
-GLOBAL_ENTRY(xen_get_tpr)
-       XEN_HYPER_GET_TPR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_tpr)
-
-GLOBAL_ENTRY(xen_set_tpr)
-       mov r8=r32
-       XEN_HYPER_SET_TPR
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_tpr)
-
-GLOBAL_ENTRY(xen_eoi)
-       mov r8=r32
-       XEN_HYPER_EOI
-       br.ret.sptk.many rp
-       ;;
-END(xen_eoi)
-
-GLOBAL_ENTRY(xen_thash)
-       mov r8=r32
-       XEN_HYPER_THASH
-       br.ret.sptk.many rp
-       ;;
-END(xen_thash)
-
-GLOBAL_ENTRY(xen_set_itm)
-       mov r8=r32
-       XEN_HYPER_SET_ITM
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_itm)
-
-GLOBAL_ENTRY(xen_ptcga)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_PTC_GA
-       br.ret.sptk.many rp
-       ;;
-END(xen_ptcga)
-
-GLOBAL_ENTRY(xen_get_rr)
-       mov r8=r32
-       XEN_HYPER_GET_RR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_rr)
-
-GLOBAL_ENTRY(xen_set_rr)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_SET_RR
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_rr)
-
-GLOBAL_ENTRY(xen_set_kr)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_SET_KR
-       br.ret.sptk.many rp
-END(xen_set_kr)
-
-GLOBAL_ENTRY(xen_fc)
-       mov r8=r32
-       XEN_HYPER_FC
-       br.ret.sptk.many rp
-END(xen_fc)
-
-GLOBAL_ENTRY(xen_get_cpuid)
-       mov r8=r32
-       XEN_HYPER_GET_CPUID
-       br.ret.sptk.many rp
-END(xen_get_cpuid)
-
-GLOBAL_ENTRY(xen_get_pmd)
-       mov r8=r32
-       XEN_HYPER_GET_PMD
-       br.ret.sptk.many rp
-END(xen_get_pmd)
-
-#ifdef CONFIG_IA32_SUPPORT
-GLOBAL_ENTRY(xen_get_eflag)
-       XEN_HYPER_GET_EFLAG
-       br.ret.sptk.many rp
-END(xen_get_eflag)
-       
-// some bits aren't set if pl!=0, see SDM vol1 3.1.8
-GLOBAL_ENTRY(xen_set_eflag)
-       mov r8=r32
-       XEN_HYPER_SET_EFLAG
-       br.ret.sptk.many rp
-END(xen_set_eflag)
-#endif
-
-GLOBAL_ENTRY(xen_send_ipi)
-        mov r14=r32
-        mov r15=r33
-        mov r2=0x400
-        break 0x1000
-        ;;
-        br.ret.sptk.many rp
-        ;;
-END(xen_send_ipi)
-
-#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
-// Those are vdso specialized.
-// In fsys mode, call, ret can't be used.
-
-       // see xen_ssm_i() in privop.h
-       // r22 = &vcpu->vcpu_info->evtchn_upcall_mask
-       // r23 = &vpsr.ic
-       // r24 = &vcpu->vcpu_info->evtchn_upcall_pending
-       // r25 = tmp
-       // r31 = tmp
-       // p11 = tmp
-       // p14 = tmp
-#define XEN_SET_PSR_I                  \
-       ld1 r31=[r22];                  \
-       ld1 r25=[r24];                  \
-       ;;                              \
-       st1 [r22]=r0;                   \
-       cmp.ne.unc p14,p0=r0,r31;       \
-       ;;                              \
-(p14)  cmp.ne.unc p11,p0=r0,r25;       \
-       ;;                              \
-(p11)  st1 [r22]=r20;                  \
-(p11)  XEN_HYPER_SSM_I;
-               
-GLOBAL_ENTRY(xen_ssm_i_0)
-       XEN_SET_PSR_I
-       brl.cond.sptk   .vdso_ssm_i_0_ret
-       ;; 
-END(xen_ssm_i_0)
-
-GLOBAL_ENTRY(xen_ssm_i_1)
-       XEN_SET_PSR_I
-       brl.cond.sptk   .vdso_ssm_i_1_ret
-       ;; 
-END(xen_ssm_i_1)
-
-GLOBAL_ENTRY(__hypercall)
-       mov r2=r37
-       break 0x1000
-       br.ret.sptk.many b0
-       ;; 
-END(__hypercall)
-#endif
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
deleted file mode 100644 (file)
index e895ef0..0000000
+++ /dev/null
@@ -1,1264 +0,0 @@
-/******************************************************************************
- * include/asm-ia64/shadow.h
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-//#include <linux/kernel.h>
-#include <linux/spinlock.h>
-#include <linux/bootmem.h>
-#include <linux/module.h>
-#include <linux/vmalloc.h>
-#include <linux/efi.h>
-#include <asm/page.h>
-#include <asm/pgalloc.h>
-#include <asm/meminit.h>
-#include <asm/hypervisor.h>
-#include <asm/hypercall.h>
-#include <xen/interface/memory.h>
-#include <xen/xencons.h>
-#include <xen/balloon.h>
-
-shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)XSI_BASE;
-EXPORT_SYMBOL(HYPERVISOR_shared_info);
-
-start_info_t *xen_start_info;
-EXPORT_SYMBOL(xen_start_info);
-
-int running_on_xen;
-EXPORT_SYMBOL(running_on_xen);
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
-static int p2m_expose_init(void);
-#else
-#define p2m_expose_init() (-ENOSYS)
-#define p2m_expose_resume() ((void)0)
-#endif
-
-EXPORT_SYMBOL(__hypercall);
-
-void __init
-xen_setup(char **cmdline_p)
-{
-       extern void dig_setup(char **cmdline_p);
-       if (ia64_platform_is("xen"))
-               dig_setup(cmdline_p);
-       
-       if (!is_running_on_xen() || !is_initial_xendomain())
-               return;
-
-       if (xen_start_info->console.dom0.info_size >=
-           sizeof(struct dom0_vga_console_info)) {
-               const struct dom0_vga_console_info *info =
-                       (struct dom0_vga_console_info *)(
-                               (char *)xen_start_info +
-                               xen_start_info->console.dom0.info_off);
-               dom0_init_screen_info(info);
-       }
-       xen_start_info->console.domU.mfn = 0;
-       xen_start_info->console.domU.evtchn = 0;
-}
-
-void __cpuinit
-xen_cpu_init(void)
-{
-       extern void xen_smp_intr_init(void);
-       xen_smp_intr_init();
-}
-
-//XXX same as i386, x86_64 contiguous_bitmap_set(), contiguous_bitmap_clear()
-// move those to lib/contiguous_bitmap?
-//XXX discontigmem/sparsemem
-
-/*
- * Bitmap is indexed by page number. If bit is set, the page is part of a
- * xen_create_contiguous_region() area of memory.
- */
-unsigned long *contiguous_bitmap;
-
-#ifdef CONFIG_VIRTUAL_MEM_MAP
-/* Following logic is stolen from create_mem_map_table() for virtual memmap */
-static int
-create_contiguous_bitmap(u64 start, u64 end, void *arg)
-{
-       unsigned long address, start_page, end_page;
-       unsigned long bitmap_start, bitmap_end;
-       unsigned char *bitmap;
-       int node;
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       bitmap_start = (unsigned long)contiguous_bitmap +
-                      ((__pa(start) >> PAGE_SHIFT) >> 3);
-       bitmap_end = (unsigned long)contiguous_bitmap +
-                    (((__pa(end) >> PAGE_SHIFT) + 2 * BITS_PER_LONG) >> 3);
-
-       start_page = bitmap_start & PAGE_MASK;
-       end_page = PAGE_ALIGN(bitmap_end);
-       node = paddr_to_nid(__pa(start));
-
-       bitmap = alloc_bootmem_pages_node(NODE_DATA(node),
-                                         end_page - start_page);
-       BUG_ON(!bitmap);
-       memset(bitmap, 0, end_page - start_page);
-
-       for (address = start_page; address < end_page; address += PAGE_SIZE) {
-               pgd = pgd_offset_k(address);
-               if (pgd_none(*pgd))
-                       pgd_populate(&init_mm, pgd,
-                                    alloc_bootmem_pages_node(NODE_DATA(node),
-                                                             PAGE_SIZE));
-               pud = pud_offset(pgd, address);
-
-               if (pud_none(*pud))
-                       pud_populate(&init_mm, pud,
-                                    alloc_bootmem_pages_node(NODE_DATA(node),
-                                                             PAGE_SIZE));
-               pmd = pmd_offset(pud, address);
-
-               if (pmd_none(*pmd))
-                       pmd_populate_kernel(&init_mm, pmd,
-                                           alloc_bootmem_pages_node
-                                           (NODE_DATA(node), PAGE_SIZE));
-               pte = pte_offset_kernel(pmd, address);
-
-               if (pte_none(*pte))
-                       set_pte(pte,
-                               pfn_pte(__pa(bitmap + (address - start_page))
-                                       >> PAGE_SHIFT, PAGE_KERNEL));
-       }
-       return 0;
-}
-#endif
-
-static void
-__contiguous_bitmap_init(unsigned long size)
-{
-       contiguous_bitmap = alloc_bootmem_pages(size);
-       BUG_ON(!contiguous_bitmap);
-       memset(contiguous_bitmap, 0, size);
-}
-
-void
-contiguous_bitmap_init(unsigned long end_pfn)
-{
-       unsigned long size = (end_pfn + 2 * BITS_PER_LONG) >> 3;
-#ifndef CONFIG_VIRTUAL_MEM_MAP
-       __contiguous_bitmap_init(size);
-#else
-       unsigned long max_gap = 0;
-
-       efi_memmap_walk(find_largest_hole, (u64*)&max_gap);
-       if (max_gap < LARGE_GAP) {
-               __contiguous_bitmap_init(size);
-       } else {
-               unsigned long map_size = PAGE_ALIGN(size);
-               vmalloc_end -= map_size;
-               contiguous_bitmap = (unsigned long*)vmalloc_end;
-               efi_memmap_walk(create_contiguous_bitmap, NULL);
-       }
-#endif
-}
-
-#if 0
-int
-contiguous_bitmap_test(void* p)
-{
-       return test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap);
-}
-#endif
-
-static void contiguous_bitmap_set(
-       unsigned long first_page, unsigned long nr_pages)
-{
-       unsigned long start_off, end_off, curr_idx, end_idx;
-
-       curr_idx  = first_page / BITS_PER_LONG;
-       start_off = first_page & (BITS_PER_LONG-1);
-       end_idx   = (first_page + nr_pages) / BITS_PER_LONG;
-       end_off   = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
-       if (curr_idx == end_idx) {
-               contiguous_bitmap[curr_idx] |=
-                       ((1UL<<end_off)-1) & -(1UL<<start_off);
-       } else {
-               contiguous_bitmap[curr_idx] |= -(1UL<<start_off);
-               while ( ++curr_idx < end_idx )
-                       contiguous_bitmap[curr_idx] = ~0UL;
-               contiguous_bitmap[curr_idx] |= (1UL<<end_off)-1;
-       }
-}
-
-static void contiguous_bitmap_clear(
-       unsigned long first_page, unsigned long nr_pages)
-{
-       unsigned long start_off, end_off, curr_idx, end_idx;
-
-       curr_idx  = first_page / BITS_PER_LONG;
-       start_off = first_page & (BITS_PER_LONG-1);
-       end_idx   = (first_page + nr_pages) / BITS_PER_LONG;
-       end_off   = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
-       if (curr_idx == end_idx) {
-               contiguous_bitmap[curr_idx] &=
-                       -(1UL<<end_off) | ((1UL<<start_off)-1);
-       } else {
-               contiguous_bitmap[curr_idx] &= (1UL<<start_off)-1;
-               while ( ++curr_idx != end_idx )
-                       contiguous_bitmap[curr_idx] = 0;
-               contiguous_bitmap[curr_idx] &= -(1UL<<end_off);
-       }
-}
-
-// __xen_create_contiguous_region(), __xen_destroy_contiguous_region()
-// are based on i386 xen_create_contiguous_region(),
-// xen_destroy_contiguous_region()
-
-/* Protected by balloon_lock. */
-#define MAX_CONTIG_ORDER 7
-static unsigned long discontig_frames[1<<MAX_CONTIG_ORDER];
-
-/* Ensure multi-page extents are contiguous in machine memory. */
-int
-__xen_create_contiguous_region(unsigned long vstart,
-                              unsigned int order, unsigned int address_bits)
-{
-       unsigned long error = 0;
-       unsigned long gphys = __pa(vstart);
-       unsigned long start_gpfn = gphys >> PAGE_SHIFT;
-       unsigned long num_gpfn = 1 << order;
-       unsigned long i;
-       unsigned long flags;
-
-       unsigned long *in_frames = discontig_frames, out_frame;
-       int success;
-       struct xen_memory_exchange exchange = {
-               .in = {
-                       .nr_extents   = num_gpfn,
-                       .extent_order = 0,
-                       .domid        = DOMID_SELF
-               },
-               .out = {
-                        .nr_extents   = 1,
-                        .extent_order = order,
-                        .address_bits = address_bits,
-                        .domid        = DOMID_SELF
-                },
-               .nr_exchanged = 0
-       };
-
-       if (unlikely(order > MAX_CONTIG_ORDER))
-               return -ENOMEM;
-       
-       set_xen_guest_handle(exchange.in.extent_start, in_frames);
-       set_xen_guest_handle(exchange.out.extent_start, &out_frame);
-
-       scrub_pages(vstart, num_gpfn);
-
-       balloon_lock(flags);
-
-       /* Get a new contiguous memory extent. */
-       for (i = 0; i < num_gpfn; i++) {
-               in_frames[i] = start_gpfn + i;
-       }
-       out_frame = start_gpfn;
-       error = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-       success = (exchange.nr_exchanged == num_gpfn);
-       BUG_ON(!success && ((exchange.nr_exchanged != 0) || (error == 0)));
-       BUG_ON(success && (error != 0));
-       if (unlikely(error == -ENOSYS)) {
-               /* Compatibility when XENMEM_exchange is unsupported. */
-               error = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                            &exchange.in);
-               BUG_ON(error != num_gpfn);
-               error = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                            &exchange.out);
-               if (error != 1) {
-                       /* Couldn't get special memory: fall back to normal. */
-                       for (i = 0; i < num_gpfn; i++) {
-                               in_frames[i] = start_gpfn + i;
-                       }
-                       error = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                                    &exchange.in);
-                       BUG_ON(error != num_gpfn);
-                       success = 0;
-               } else
-                       success = 1;
-       }
-       if (success)
-               contiguous_bitmap_set(start_gpfn, num_gpfn);
-#if 0
-       if (success) {
-               unsigned long mfn;
-               unsigned long mfn_prev = ~0UL;
-               for (i = 0; i < num_gpfn; i++) {
-                       mfn = pfn_to_mfn_for_dma(start_gpfn + i);
-                       if (mfn_prev != ~0UL && mfn != mfn_prev + 1) {
-                               xprintk("\n");
-                               xprintk("%s:%d order %d "
-                                       "start 0x%lx bus 0x%lx "
-                                       "machine 0x%lx\n",
-                                       __func__, __LINE__, order,
-                                       vstart, virt_to_bus((void*)vstart),
-                                       phys_to_machine_for_dma(gphys));
-                               xprintk("mfn: ");
-                               for (i = 0; i < num_gpfn; i++) {
-                                       mfn = pfn_to_mfn_for_dma(
-                                               start_gpfn + i);
-                                       xprintk("0x%lx ", mfn);
-                               }
-                               xprintk("\n");
-                               break;
-                       }
-                       mfn_prev = mfn;
-               }
-       }
-#endif
-       balloon_unlock(flags);
-       return success? 0: -ENOMEM;
-}
-
-void
-__xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
-{
-       unsigned long flags;
-       unsigned long error = 0;
-       unsigned long start_gpfn = __pa(vstart) >> PAGE_SHIFT;
-       unsigned long num_gpfn = 1UL << order;
-       unsigned long i;
-
-       unsigned long *out_frames = discontig_frames, in_frame;
-       int            success;
-       struct xen_memory_exchange exchange = {
-               .in = {
-                       .nr_extents   = 1,
-                       .extent_order = order,
-                       .domid        = DOMID_SELF
-               },
-               .out = {
-                        .nr_extents   = num_gpfn,
-                        .extent_order = 0,
-                        .address_bits = 0,
-                        .domid        = DOMID_SELF
-                },
-               .nr_exchanged = 0
-        };
-       
-
-       if (!test_bit(start_gpfn, contiguous_bitmap))
-               return;
-
-       if (unlikely(order > MAX_CONTIG_ORDER))
-               return;
-
-       set_xen_guest_handle(exchange.in.extent_start, &in_frame);
-       set_xen_guest_handle(exchange.out.extent_start, out_frames);
-
-       scrub_pages(vstart, num_gpfn);
-
-       balloon_lock(flags);
-
-       contiguous_bitmap_clear(start_gpfn, num_gpfn);
-
-        /* Do the exchange for non-contiguous MFNs. */
-       in_frame = start_gpfn;
-       for (i = 0; i < num_gpfn; i++) {
-               out_frames[i] = start_gpfn + i;
-       }
-       error = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-       success = (exchange.nr_exchanged == 1);
-       BUG_ON(!success && ((exchange.nr_exchanged != 0) || (error == 0)));
-       BUG_ON(success && (error != 0));
-       if (unlikely(error == -ENOSYS)) {
-                /* Compatibility when XENMEM_exchange is unsupported. */
-               error = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                            &exchange.in);
-               BUG_ON(error != 1);
-
-               error = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                            &exchange.out);
-               BUG_ON(error != num_gpfn);
-       }
-       balloon_unlock(flags);
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-// grant table hack
-// cmd: GNTTABOP_xxx
-
-#include <linux/mm.h>
-#include <xen/interface/xen.h>
-#include <xen/gnttab.h>
-
-static void
-gnttab_map_grant_ref_pre(struct gnttab_map_grant_ref *uop)
-{
-       uint32_t flags;
-
-       flags = uop->flags;
-
-       if (flags & GNTMAP_host_map) {
-               if (flags & GNTMAP_application_map) {
-                       xprintd("GNTMAP_application_map is not supported yet: flags 0x%x\n", flags);
-                       BUG();
-               }
-               if (flags & GNTMAP_contains_pte) {
-                       xprintd("GNTMAP_contains_pte is not supported yet flags 0x%x\n", flags);
-                       BUG();
-               }
-       } else if (flags & GNTMAP_device_map) {
-               xprintd("GNTMAP_device_map is not supported yet 0x%x\n", flags);
-               BUG();//XXX not yet. actually this flag is not used.
-       } else {
-               BUG();
-       }
-}
-
-int
-HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
-{
-       if (cmd == GNTTABOP_map_grant_ref) {
-               unsigned int i;
-               for (i = 0; i < count; i++) {
-                       gnttab_map_grant_ref_pre(
-                               (struct gnttab_map_grant_ref*)uop + i);
-               }
-       }
-       return xencomm_mini_hypercall_grant_table_op(cmd, uop, count);
-}
-EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
-
-///////////////////////////////////////////////////////////////////////////
-// foreign mapping
-#include <linux/efi.h>
-#include <asm/meminit.h> // for IA64_GRANULE_SIZE, GRANULEROUND{UP,DOWN}()
-
-static unsigned long privcmd_resource_min = 0;
-// Xen/ia64 currently can handle pseudo physical address bits up to
-// (PAGE_SHIFT * 3)
-static unsigned long privcmd_resource_max = GRANULEROUNDDOWN((1UL << (PAGE_SHIFT * 3)) - 1);
-static unsigned long privcmd_resource_align = IA64_GRANULE_SIZE;
-
-static unsigned long
-md_end_addr(const efi_memory_desc_t *md)
-{
-       return md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
-}
-
-#define XEN_IA64_PRIVCMD_LEAST_GAP_SIZE        (1024 * 1024 * 1024UL)
-static int
-xen_ia64_privcmd_check_size(unsigned long start, unsigned long end)
-{
-       return (start < end &&
-               (end - start) > XEN_IA64_PRIVCMD_LEAST_GAP_SIZE);
-}
-
-static int __init
-xen_ia64_privcmd_init(void)
-{
-       void *efi_map_start, *efi_map_end, *p;
-       u64 efi_desc_size;
-       efi_memory_desc_t *md;
-       unsigned long tmp_min;
-       unsigned long tmp_max;
-       unsigned long gap_size;
-       unsigned long prev_end;
-
-       if (!is_running_on_xen())
-               return -1;
-
-       efi_map_start = __va(ia64_boot_param->efi_memmap);
-       efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-       efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-       // at first check the used highest address
-       for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-               // nothing
-       }
-       md = p - efi_desc_size;
-       privcmd_resource_min = GRANULEROUNDUP(md_end_addr(md));
-       if (xen_ia64_privcmd_check_size(privcmd_resource_min,
-                                       privcmd_resource_max)) {
-               goto out;
-       }
-
-       // the used highest address is too large. try to find the largest gap.
-       tmp_min = privcmd_resource_max;
-       tmp_max = 0;
-       gap_size = 0;
-       prev_end = 0;
-       for (p = efi_map_start;
-            p < efi_map_end - efi_desc_size;
-            p += efi_desc_size) {
-               unsigned long end;
-               efi_memory_desc_t* next;
-               unsigned long next_start;
-
-               md = p;
-               end = md_end_addr(md);
-               if (end > privcmd_resource_max) {
-                       break;
-               }
-               if (end < prev_end) {
-                       // work around. 
-                       // Xen may pass incompletely sorted memory
-                       // descriptors like
-                       // [x, x + length]
-                       // [x, x]
-                       // this order should be reversed.
-                       continue;
-               }
-               next = p + efi_desc_size;
-               next_start = next->phys_addr;
-               if (next_start > privcmd_resource_max) {
-                       next_start = privcmd_resource_max;
-               }
-               if (end < next_start && gap_size < (next_start - end)) {
-                       tmp_min = end;
-                       tmp_max = next_start;
-                       gap_size = tmp_max - tmp_min;
-               }
-               prev_end = end;
-       }
-
-       privcmd_resource_min = GRANULEROUNDUP(tmp_min);
-       if (xen_ia64_privcmd_check_size(privcmd_resource_min, tmp_max)) {
-               privcmd_resource_max = tmp_max;
-               goto out;
-       }
-
-       privcmd_resource_min = tmp_min;
-       privcmd_resource_max = tmp_max;
-       if (!xen_ia64_privcmd_check_size(privcmd_resource_min,
-                                        privcmd_resource_max)) {
-               // Any large enough gap isn't found.
-               // go ahead anyway with the warning hoping that large region
-               // won't be requested.
-               printk(KERN_WARNING "xen privcmd: large enough region for privcmd mmap is not found.\n");
-       }
-
-out:
-       printk(KERN_INFO "xen privcmd uses pseudo physical addr range [0x%lx, 0x%lx] (%ldMB)\n",
-              privcmd_resource_min, privcmd_resource_max, 
-              (privcmd_resource_max - privcmd_resource_min) >> 20);
-       BUG_ON(privcmd_resource_min >= privcmd_resource_max);
-
-       // XXX this should be somewhere appropriate
-       (void)p2m_expose_init();
-
-       return 0;
-}
-late_initcall(xen_ia64_privcmd_init);
-
-struct xen_ia64_privcmd_entry {
-       atomic_t        map_count;
-#define INVALID_GPFN   (~0UL)
-       unsigned long   gpfn;
-};
-
-struct xen_ia64_privcmd_range {
-       atomic_t                        ref_count;
-       unsigned long                   pgoff; // in PAGE_SIZE
-       struct resource*                res;
-
-       unsigned long                   num_entries;
-       struct xen_ia64_privcmd_entry   entries[0];
-};
-
-struct xen_ia64_privcmd_vma {
-       int                             is_privcmd_mmapped;
-       struct xen_ia64_privcmd_range*  range;
-
-       unsigned long                   num_entries;
-       struct xen_ia64_privcmd_entry*  entries;
-};
-
-static void
-xen_ia64_privcmd_init_entry(struct xen_ia64_privcmd_entry* entry)
-{
-       atomic_set(&entry->map_count, 0);
-       entry->gpfn = INVALID_GPFN;
-}
-
-static int
-xen_ia64_privcmd_entry_mmap(struct vm_area_struct* vma,
-                           unsigned long addr,
-                           struct xen_ia64_privcmd_range* privcmd_range,
-                           int i,
-                           unsigned long gmfn,
-                           pgprot_t prot,
-                           domid_t domid)
-{
-       int error = 0;
-       struct xen_ia64_privcmd_entry* entry = &privcmd_range->entries[i];
-       unsigned long gpfn;
-       unsigned long flags;
-
-       if ((addr & ~PAGE_MASK) != 0 || gmfn == INVALID_MFN) {
-               error = -EINVAL;
-               goto out;
-       }
-
-       if (entry->gpfn != INVALID_GPFN) {
-               error = -EBUSY;
-               goto out;
-       }
-       gpfn = (privcmd_range->res->start >> PAGE_SHIFT) + i;
-
-       flags = ASSIGN_writable;
-       if (pgprot_val(prot) == PROT_READ) {
-               flags = ASSIGN_readonly;
-       }
-       error = HYPERVISOR_add_physmap_with_gmfn(gpfn, gmfn, flags, domid);
-       if (error != 0) {
-               goto out;
-       }
-
-       prot = vma->vm_page_prot;
-       error = remap_pfn_range(vma, addr, gpfn, 1 << PAGE_SHIFT, prot);
-       if (error != 0) {
-               error = HYPERVISOR_zap_physmap(gpfn, 0);
-               if (error) {
-                       BUG();//XXX
-               }
-       } else {
-               atomic_inc(&entry->map_count);
-               entry->gpfn = gpfn;
-       }
-
-out:
-       return error;
-}
-
-static void
-xen_ia64_privcmd_entry_munmap(struct xen_ia64_privcmd_range* privcmd_range,
-                             int i)
-{
-       struct xen_ia64_privcmd_entry* entry = &privcmd_range->entries[i];
-       unsigned long gpfn = entry->gpfn;
-       //gpfn = (privcmd_range->res->start >> PAGE_SHIFT) +
-       //      (vma->vm_pgoff - privcmd_range->pgoff);
-       int error;
-
-       error = HYPERVISOR_zap_physmap(gpfn, 0);
-       if (error) {
-               BUG();//XXX
-       }
-       entry->gpfn = INVALID_GPFN;
-}
-
-static void
-xen_ia64_privcmd_entry_open(struct xen_ia64_privcmd_range* privcmd_range,
-                           int i)
-{
-       struct xen_ia64_privcmd_entry* entry = &privcmd_range->entries[i];
-       if (entry->gpfn != INVALID_GPFN) {
-               atomic_inc(&entry->map_count);
-       } else {
-               BUG_ON(atomic_read(&entry->map_count) != 0);
-       }
-}
-
-static void
-xen_ia64_privcmd_entry_close(struct xen_ia64_privcmd_range* privcmd_range,
-                            int i)
-{
-       struct xen_ia64_privcmd_entry* entry = &privcmd_range->entries[i];
-       if (entry->gpfn != INVALID_GPFN &&
-           atomic_dec_and_test(&entry->map_count)) {
-               xen_ia64_privcmd_entry_munmap(privcmd_range, i);
-       }
-}
-
-static void xen_ia64_privcmd_vma_open(struct vm_area_struct* vma);
-static void xen_ia64_privcmd_vma_close(struct vm_area_struct* vma);
-
-struct vm_operations_struct xen_ia64_privcmd_vm_ops = {
-       .open = &xen_ia64_privcmd_vma_open,
-       .close = &xen_ia64_privcmd_vma_close,
-};
-
-static void
-__xen_ia64_privcmd_vma_open(struct vm_area_struct* vma,
-                           struct xen_ia64_privcmd_vma* privcmd_vma,
-                           struct xen_ia64_privcmd_range* privcmd_range)
-{
-       unsigned long entry_offset = vma->vm_pgoff - privcmd_range->pgoff;
-       unsigned long num_entries = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-       unsigned long i;
-
-       BUG_ON(entry_offset < 0);
-       BUG_ON(entry_offset + num_entries > privcmd_range->num_entries);
-
-       privcmd_vma->range = privcmd_range;
-       privcmd_vma->num_entries = num_entries;
-       privcmd_vma->entries = &privcmd_range->entries[entry_offset];
-       vma->vm_private_data = privcmd_vma;
-       for (i = 0; i < privcmd_vma->num_entries; i++) {
-               xen_ia64_privcmd_entry_open(privcmd_range, entry_offset + i);
-       }
-
-       vma->vm_private_data = privcmd_vma;
-       vma->vm_ops = &xen_ia64_privcmd_vm_ops;
-}
-
-static void
-xen_ia64_privcmd_vma_open(struct vm_area_struct* vma)
-{
-       struct xen_ia64_privcmd_vma* old_privcmd_vma = (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
-       struct xen_ia64_privcmd_vma* privcmd_vma = (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
-       struct xen_ia64_privcmd_range* privcmd_range = privcmd_vma->range;
-
-       atomic_inc(&privcmd_range->ref_count);
-       // vm_op->open() can't fail.
-       privcmd_vma = kmalloc(sizeof(*privcmd_vma), GFP_KERNEL | __GFP_NOFAIL);
-       // copy original value if necessary
-       privcmd_vma->is_privcmd_mmapped = old_privcmd_vma->is_privcmd_mmapped;
-
-       __xen_ia64_privcmd_vma_open(vma, privcmd_vma, privcmd_range);
-}
-
-static void
-xen_ia64_privcmd_vma_close(struct vm_area_struct* vma)
-{
-       struct xen_ia64_privcmd_vma* privcmd_vma =
-               (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
-       struct xen_ia64_privcmd_range* privcmd_range = privcmd_vma->range;
-       unsigned long entry_offset = vma->vm_pgoff - privcmd_range->pgoff;
-       unsigned long i;
-
-       for (i = 0; i < privcmd_vma->num_entries; i++) {
-               xen_ia64_privcmd_entry_close(privcmd_range, entry_offset + i);
-       }
-       vma->vm_private_data = NULL;
-       kfree(privcmd_vma);
-
-       if (atomic_dec_and_test(&privcmd_range->ref_count)) {
-#if 1
-               for (i = 0; i < privcmd_range->num_entries; i++) {
-                       struct xen_ia64_privcmd_entry* entry =
-                               &privcmd_range->entries[i];
-                       BUG_ON(atomic_read(&entry->map_count) != 0);
-                       BUG_ON(entry->gpfn != INVALID_GPFN);
-               }
-#endif
-               release_resource(privcmd_range->res);
-               kfree(privcmd_range->res);
-               vfree(privcmd_range);
-       }
-}
-
-int
-privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
-{
-       struct xen_ia64_privcmd_vma* privcmd_vma =
-               (struct xen_ia64_privcmd_vma *)vma->vm_private_data;
-       return (xchg(&privcmd_vma->is_privcmd_mmapped, 1) == 0);
-}
-
-int
-privcmd_mmap(struct file * file, struct vm_area_struct * vma)
-{
-       int error;
-       unsigned long size = vma->vm_end - vma->vm_start;
-       unsigned long num_entries = size >> PAGE_SHIFT;
-       struct xen_ia64_privcmd_range* privcmd_range = NULL;
-       struct xen_ia64_privcmd_vma* privcmd_vma = NULL;
-       struct resource* res = NULL;
-       unsigned long i;
-       BUG_ON(!is_running_on_xen());
-
-       BUG_ON(file->private_data != NULL);
-
-       error = -ENOMEM;
-       privcmd_range =
-               vmalloc(sizeof(*privcmd_range) +
-                       sizeof(privcmd_range->entries[0]) * num_entries);
-       if (privcmd_range == NULL) {
-               goto out_enomem0;
-       }
-       privcmd_vma = kmalloc(sizeof(*privcmd_vma), GFP_KERNEL);
-       if (privcmd_vma == NULL) {
-               goto out_enomem1;
-       }
-       privcmd_vma->is_privcmd_mmapped = 0;
-
-       res = kzalloc(sizeof(*res), GFP_KERNEL);
-       if (res == NULL) {
-               goto out_enomem1;
-       }
-       res->name = "Xen privcmd mmap";
-       error = allocate_resource(&iomem_resource, res, size,
-                                 privcmd_resource_min, privcmd_resource_max,
-                                 privcmd_resource_align, NULL, NULL);
-       if (error) {
-               goto out_enomem1;
-       }
-       privcmd_range->res = res;
-
-       /* DONTCOPY is essential for Xen as copy_page_range is broken. */
-       vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP;
-
-       atomic_set(&privcmd_range->ref_count, 1);
-       privcmd_range->pgoff = vma->vm_pgoff;
-       privcmd_range->num_entries = num_entries;
-       for (i = 0; i < privcmd_range->num_entries; i++) {
-               xen_ia64_privcmd_init_entry(&privcmd_range->entries[i]);
-       }
-
-       __xen_ia64_privcmd_vma_open(vma, privcmd_vma, privcmd_range);
-       return 0;
-
-out_enomem1:
-       kfree(res);
-       kfree(privcmd_vma);
-out_enomem0:
-       vfree(privcmd_range);
-       return error;
-}
-
-int
-direct_remap_pfn_range(struct vm_area_struct *vma,
-                      unsigned long address,   // process virtual address
-                      unsigned long gmfn,      // gmfn, gmfn + 1, ... gmfn + size/PAGE_SIZE
-                      unsigned long size,
-                      pgprot_t prot,
-                      domid_t  domid)          // target domain
-{
-       struct xen_ia64_privcmd_vma* privcmd_vma =
-               (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
-       struct xen_ia64_privcmd_range* privcmd_range = privcmd_vma->range;
-       unsigned long entry_offset = vma->vm_pgoff - privcmd_range->pgoff;
-
-       unsigned long i;
-       unsigned long offset;
-       int error = 0;
-       BUG_ON(!is_running_on_xen());
-
-#if 0
-       if (prot != vm->vm_page_prot) {
-               return -EINVAL;
-       }
-#endif
-
-       i = (address - vma->vm_start) >> PAGE_SHIFT;
-       for (offset = 0; offset < size; offset += PAGE_SIZE) {
-               error = xen_ia64_privcmd_entry_mmap(vma, (address + offset) & PAGE_MASK, privcmd_range, entry_offset + i, gmfn, prot, domid);
-               if (error != 0) {
-                       break;
-               }
-
-               i++;
-               gmfn++;
-        }
-
-       return error;
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-// expose p2m table
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
-#include <linux/cpu.h>
-#include <asm/uaccess.h>
-
-int p2m_initialized __read_mostly = 0;
-
-unsigned long p2m_min_low_pfn __read_mostly;
-unsigned long p2m_max_low_pfn __read_mostly;
-unsigned long p2m_convert_min_pfn __read_mostly;
-unsigned long p2m_convert_max_pfn __read_mostly;
-
-static struct resource p2m_resource = {
-       .name    = "Xen p2m table",
-       .flags   = IORESOURCE_MEM,
-};
-static unsigned long p2m_assign_start_pfn __read_mostly;
-static unsigned long p2m_assign_end_pfn __read_mostly;
-static unsigned long p2m_expose_size;  // this is referenced only when resume.
-                                       // so __read_mostly doesn't make sense.
-volatile const pte_t* p2m_pte __read_mostly;
-
-#define GRNULE_PFN     PTRS_PER_PTE
-static unsigned long p2m_granule_pfn __read_mostly = GRNULE_PFN;
-
-#define ROUNDDOWN(x, y)  ((x) & ~((y) - 1))
-#define ROUNDUP(x, y)    (((x) + (y) - 1) & ~((y) - 1))
-
-#define P2M_PREFIX     "Xen p2m: "
-
-static int xen_ia64_p2m_expose __read_mostly = 1;
-module_param(xen_ia64_p2m_expose, int, 0);
-MODULE_PARM_DESC(xen_ia64_p2m_expose,
-                 "enable/disable xen/ia64 p2m exposure optimization\n");
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-static int xen_ia64_p2m_expose_use_dtr __read_mostly = 1;
-module_param(xen_ia64_p2m_expose_use_dtr, int, 0);
-MODULE_PARM_DESC(xen_ia64_p2m_expose_use_dtr,
-                 "use/unuse dtr to map exposed p2m table\n");
-
-static const int p2m_page_shifts[] = {
-       _PAGE_SIZE_4K,
-       _PAGE_SIZE_8K,
-       _PAGE_SIZE_16K,
-       _PAGE_SIZE_64K,
-       _PAGE_SIZE_256K,
-       _PAGE_SIZE_1M,
-       _PAGE_SIZE_4M,
-       _PAGE_SIZE_16M,
-       _PAGE_SIZE_64M,
-       _PAGE_SIZE_256M,
-};
-
-struct p2m_itr_arg {
-       unsigned long vaddr;
-       unsigned long pteval;
-       unsigned long log_page_size;
-};
-static struct p2m_itr_arg p2m_itr_arg __read_mostly;
-
-// This should be in asm-ia64/kregs.h
-#define IA64_TR_P2M_TABLE      3
-
-static void
-p2m_itr(void* info)
-{
-       struct p2m_itr_arg* arg = (struct p2m_itr_arg*)info;
-       ia64_itr(0x2, IA64_TR_P2M_TABLE,
-                arg->vaddr, arg->pteval, arg->log_page_size);
-       ia64_srlz_d();
-}
-
-static int
-p2m_expose_dtr_call(struct notifier_block *self,
-                    unsigned long event, void* ptr)
-{
-       unsigned int cpu = (unsigned int)(long)ptr;
-       if (event != CPU_ONLINE)
-               return 0;
-       if (p2m_initialized && xen_ia64_p2m_expose_use_dtr) {
-               unsigned int me = get_cpu();
-               if (cpu == me)
-                       p2m_itr(&p2m_itr_arg);
-               else
-                       smp_call_function_single(cpu, &p2m_itr, &p2m_itr_arg,
-                                                1, 1);
-               put_cpu();
-       }
-       return 0;
-}
-
-static struct notifier_block p2m_expose_dtr_hotplug_notifier = {
-       .notifier_call = p2m_expose_dtr_call,
-       .next          = NULL,
-       .priority      = 0
-};
-#endif
-
-static int
-p2m_expose_init(void)
-{
-       unsigned long num_pfn;
-       unsigned long p2m_size = 0;
-       unsigned long align = ~0UL;
-       int error = 0;
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-       int i;
-       unsigned long page_size;
-       unsigned long log_page_size = 0;
-#endif
-
-       if (!xen_ia64_p2m_expose)
-               return -ENOSYS;
-       if (p2m_initialized)
-               return 0;
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-       error = register_cpu_notifier(&p2m_expose_dtr_hotplug_notifier);
-       if (error < 0)
-               return error;
-#endif
-
-       lock_cpu_hotplug();
-       if (p2m_initialized)
-               goto out;
-
-#ifdef CONFIG_DISCONTIGMEM
-       p2m_min_low_pfn = min_low_pfn;
-       p2m_max_low_pfn = max_low_pfn;
-#else
-       p2m_min_low_pfn = 0;
-       p2m_max_low_pfn = max_pfn;
-#endif
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-       if (xen_ia64_p2m_expose_use_dtr) {
-               unsigned long granule_pfn = 0;
-               p2m_size = p2m_max_low_pfn - p2m_min_low_pfn;
-               for (i = 0;
-                    i < sizeof(p2m_page_shifts)/sizeof(p2m_page_shifts[0]);
-                    i++) {
-                       log_page_size = p2m_page_shifts[i];
-                       page_size = 1UL << log_page_size;
-                       if (page_size < p2m_size)
-                               continue;
-
-                       granule_pfn = max(page_size >> PAGE_SHIFT,
-                                         p2m_granule_pfn);
-                       p2m_convert_min_pfn = ROUNDDOWN(p2m_min_low_pfn,
-                                                       granule_pfn);
-                       p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn,
-                                                     granule_pfn);
-                       num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
-                       p2m_expose_size = num_pfn << PAGE_SHIFT;
-                       p2m_size = num_pfn / PTRS_PER_PTE;
-                       p2m_size = ROUNDUP(p2m_size, granule_pfn << PAGE_SHIFT);
-                       if (p2m_size == page_size)
-                               break;
-               }
-               if (p2m_size != page_size) {
-                       printk(KERN_ERR "p2m_size != page_size\n");
-                       error = -EINVAL;
-                       goto out;
-               }
-               align = max(privcmd_resource_align, granule_pfn << PAGE_SHIFT);
-       } else
-#endif
-       {
-               BUG_ON(p2m_granule_pfn & (p2m_granule_pfn - 1));
-               p2m_convert_min_pfn = ROUNDDOWN(p2m_min_low_pfn,
-                                               p2m_granule_pfn);
-               p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn, p2m_granule_pfn);
-               num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
-               p2m_expose_size = num_pfn << PAGE_SHIFT;
-               p2m_size = num_pfn / PTRS_PER_PTE;
-               p2m_size = ROUNDUP(p2m_size, p2m_granule_pfn << PAGE_SHIFT);
-               align = max(privcmd_resource_align,
-                           p2m_granule_pfn << PAGE_SHIFT);
-       }
-       
-       // use privcmd region
-       error = allocate_resource(&iomem_resource, &p2m_resource, p2m_size,
-                                 privcmd_resource_min, privcmd_resource_max,
-                                 align, NULL, NULL);
-       if (error) {
-               printk(KERN_ERR P2M_PREFIX
-                      "can't allocate region for p2m exposure "
-                      "[0x%016lx, 0x%016lx) 0x%016lx\n",
-                      p2m_convert_min_pfn, p2m_convert_max_pfn, p2m_size);
-               goto out;
-       }
-
-       p2m_assign_start_pfn = p2m_resource.start >> PAGE_SHIFT;
-       p2m_assign_end_pfn = p2m_resource.end >> PAGE_SHIFT;
-       
-       error = HYPERVISOR_expose_p2m(p2m_convert_min_pfn,
-                                     p2m_assign_start_pfn,
-                                     p2m_expose_size, p2m_granule_pfn);
-       if (error) {
-               printk(KERN_ERR P2M_PREFIX "failed expose p2m hypercall %d\n",
-                      error);
-               printk(KERN_ERR P2M_PREFIX "conv 0x%016lx assign 0x%016lx "
-                      "expose_size 0x%016lx granule 0x%016lx\n",
-                      p2m_convert_min_pfn, p2m_assign_start_pfn,
-                      p2m_expose_size, p2m_granule_pfn);;
-               release_resource(&p2m_resource);
-               goto out;
-       }
-       p2m_pte = (volatile const pte_t*)pfn_to_kaddr(p2m_assign_start_pfn);
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-       if (xen_ia64_p2m_expose_use_dtr) {
-               p2m_itr_arg.vaddr = (unsigned long)__va(p2m_assign_start_pfn
-                                                       << PAGE_SHIFT);
-               p2m_itr_arg.pteval = pte_val(pfn_pte(p2m_assign_start_pfn,
-                                                    PAGE_KERNEL));
-               p2m_itr_arg.log_page_size = log_page_size;
-               smp_mb();
-               smp_call_function(&p2m_itr, &p2m_itr_arg, 1, 1);
-               p2m_itr(&p2m_itr_arg);
-       }
-#endif 
-       smp_mb();
-       p2m_initialized = 1;
-       printk(P2M_PREFIX "assign p2m table of [0x%016lx, 0x%016lx)\n",
-              p2m_convert_min_pfn << PAGE_SHIFT,
-              p2m_convert_max_pfn << PAGE_SHIFT);
-       printk(P2M_PREFIX "to [0x%016lx, 0x%016lx) (%ld KBytes)\n",
-              p2m_assign_start_pfn << PAGE_SHIFT,
-              p2m_assign_end_pfn << PAGE_SHIFT,
-              p2m_size / 1024);
-out:
-       unlock_cpu_hotplug();
-       return error;
-}
-
-#ifdef notyet
-void
-p2m_expose_cleanup(void)
-{
-       BUG_ON(!p2m_initialized);
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-       unregister_cpu_notifier(&p2m_expose_dtr_hotplug_notifier);
-#endif
-       release_resource(&p2m_resource);
-}
-#endif
-
-static void
-p2m_expose_resume(void)
-{
-       int error;
-
-       if (!xen_ia64_p2m_expose || !p2m_initialized)
-               return;
-
-       /*
-        * We can't call {lock, unlock}_cpu_hotplug() because
-        * they require process context.
-        * We don't need them because we're the only one cpu and
-        * interrupts are masked when resume.
-        */
-       error = HYPERVISOR_expose_p2m(p2m_convert_min_pfn,
-                                     p2m_assign_start_pfn,
-                                     p2m_expose_size, p2m_granule_pfn);
-       if (error) {
-               printk(KERN_ERR P2M_PREFIX "failed expose p2m hypercall %d\n",
-                      error);
-               printk(KERN_ERR P2M_PREFIX "conv 0x%016lx assign 0x%016lx "
-                      "expose_size 0x%016lx granule 0x%016lx\n",
-                      p2m_convert_min_pfn, p2m_assign_start_pfn,
-                      p2m_expose_size, p2m_granule_pfn);;
-               p2m_initialized = 0;
-               smp_mb();
-               ia64_ptr(0x2, p2m_itr_arg.vaddr, p2m_itr_arg.log_page_size);
-               
-               /*
-                * We can't call those clean up functions because they
-                * require process context.
-                */
-#if 0
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
-               if (xen_ia64_p2m_expose_use_dtr)
-                       unregister_cpu_notifier(
-                               &p2m_expose_dtr_hotplug_notifier);
-#endif
-               release_resource(&p2m_resource);
-#endif
-       }
-}
-
-//XXX inlinize?
-unsigned long
-p2m_phystomach(unsigned long gpfn)
-{
-       volatile const pte_t* pte;
-       unsigned long mfn;
-       unsigned long pteval;
-       
-       if (!p2m_initialized ||
-           gpfn < p2m_min_low_pfn || gpfn > p2m_max_low_pfn
-           /* || !pfn_valid(gpfn) */)
-               return INVALID_MFN;
-       pte = p2m_pte + (gpfn - p2m_convert_min_pfn);
-
-       mfn = INVALID_MFN;
-       if (likely(__get_user(pteval, (unsigned long __user *)pte) == 0 &&
-                  pte_present(__pte(pteval)) &&
-                  pte_pfn(__pte(pteval)) != (INVALID_MFN >> PAGE_SHIFT)))
-               mfn = (pteval & _PFN_MASK) >> PAGE_SHIFT;
-
-       return mfn;
-}
-
-EXPORT_SYMBOL_GPL(p2m_initialized);
-EXPORT_SYMBOL_GPL(p2m_min_low_pfn);
-EXPORT_SYMBOL_GPL(p2m_max_low_pfn);
-EXPORT_SYMBOL_GPL(p2m_convert_min_pfn);
-EXPORT_SYMBOL_GPL(p2m_convert_max_pfn);
-EXPORT_SYMBOL_GPL(p2m_pte);
-EXPORT_SYMBOL_GPL(p2m_phystomach);
-#endif
-
-///////////////////////////////////////////////////////////////////////////
-// for xenoprof
-
-struct resource*
-xen_ia64_allocate_resource(unsigned long size)
-{
-       struct resource* res;
-       int error;
-       
-       res = kmalloc(sizeof(*res), GFP_KERNEL);
-       if (res == NULL)
-               return ERR_PTR(-ENOMEM);
-
-       res->name = "Xen";
-       res->flags = IORESOURCE_MEM;
-       error = allocate_resource(&iomem_resource, res, PAGE_ALIGN(size),
-                                 privcmd_resource_min, privcmd_resource_max,
-                                 IA64_GRANULE_SIZE, NULL, NULL);
-       if (error) {
-               kfree(res);
-               return ERR_PTR(error);
-       }
-       return res;
-}
-EXPORT_SYMBOL_GPL(xen_ia64_allocate_resource);
-
-void
-xen_ia64_release_resource(struct resource* res)
-{
-       release_resource(res);
-       kfree(res);
-}
-EXPORT_SYMBOL_GPL(xen_ia64_release_resource);
-
-void
-xen_ia64_unmap_resource(struct resource* res)
-{
-       unsigned long gpfn = res->start >> PAGE_SHIFT;
-       unsigned long nr_pages = (res->end - res->start) >> PAGE_SHIFT;
-       unsigned long i;
-       
-       for (i = 0; i < nr_pages; i++) {
-               int error = HYPERVISOR_zap_physmap(gpfn + i, 0);
-               if (error)
-                       printk(KERN_ERR
-                              "%s:%d zap_phsymap failed %d gpfn %lx\n",
-                              __func__, __LINE__, error, gpfn + i);
-       }
-       xen_ia64_release_resource(res);
-}
-EXPORT_SYMBOL_GPL(xen_ia64_unmap_resource);
-
-///////////////////////////////////////////////////////////////////////////
-// suspend/resume
-void
-xen_post_suspend(int suspend_cancelled)
-{
-       if (suspend_cancelled)
-               return;
-       
-       p2m_expose_resume();
-       /* add more if necessary */
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/machvec.c b/linux-2.6-xen-sparse/arch/ia64/xen/machvec.c
deleted file mode 100644 (file)
index 4ad588a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#define MACHVEC_PLATFORM_NAME           xen
-#define MACHVEC_PLATFORM_HEADER         <asm/machvec_xen.h>
-#include <asm/machvec_init.h>
-
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/mem.c b/linux-2.6-xen-sparse/arch/ia64/xen/mem.c
deleted file mode 100644 (file)
index dc93097..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Originally from linux/drivers/char/mem.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Added devfs support. 
- *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
- *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
- */
-/*
- * taken from
- * linux/drivers/char/mem.c and linux-2.6-xen-sparse/drivers/xen/char/mem.c.
- * adjusted for IA64 and made transparent.
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- */
-
-#include <linux/mm.h>
-#include <linux/efi.h>
-
-/*
- * Architectures vary in how they handle caching for addresses
- * outside of main memory.
- *
- */
-static inline int uncached_access(struct file *file, unsigned long addr)
-{
-       /*
-        * On ia64, we ignore O_SYNC because we cannot tolerate memory attribute aliases.
-        */
-       return !(efi_mem_attributes(addr) & EFI_MEMORY_WB);
-}
-
-int xen_mmap_mem(struct file * file, struct vm_area_struct * vma)
-{
-       unsigned long addr = vma->vm_pgoff << PAGE_SHIFT;
-       size_t size = vma->vm_end - vma->vm_start;
-
-
-#if 0
-       /*
-        *XXX FIXME: linux-2.6.16.29, linux-2.6.17
-        *    valid_mmap_phys_addr_range() in linux/arch/ia64/kernel/efi.c
-        *    fails checks.
-        *    linux-2.6.18.1's returns always 1. 
-        *    Its comments says
-        *
-         * MMIO regions are often missing from the EFI memory map.
-         * We must allow mmap of them for programs like X, so we
-         * currently can't do any useful validation.
-         */
-       if (!valid_mmap_phys_addr_range(addr, &size))
-               return -EINVAL;
-       if (size < vma->vm_end - vma->vm_start)
-               return -EINVAL;
-#endif
-
-       if (is_running_on_xen()) {
-               unsigned long offset = HYPERVISOR_ioremap(addr, size);
-               if (IS_ERR_VALUE(offset))
-                       return offset;
-       }
-
-       if (uncached_access(file, vma->vm_pgoff << PAGE_SHIFT))
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
-        /* Remap-pfn-range will mark the range VM_IO and VM_RESERVED */
-        if (remap_pfn_range(vma,
-                            vma->vm_start,
-                            vma->vm_pgoff,
-                            size,
-                            vma->vm_page_prot))
-                return -EAGAIN;
-        return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/swiotlb.c b/linux-2.6-xen-sparse/arch/ia64/xen/swiotlb.c
deleted file mode 100644 (file)
index fbc4664..0000000
+++ /dev/null
@@ -1,882 +0,0 @@
-/*
- * Dynamic DMA mapping support.
- *
- * This implementation is for IA-64 and EM64T platforms that do not support
- * I/O TLBs (aka DMA address translation hardware).
- * Copyright (C) 2000 Asit Mallick <Asit.K.Mallick@intel.com>
- * Copyright (C) 2000 Goutham Rao <goutham.rao@intel.com>
- * Copyright (C) 2000, 2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *
- * 03/05/07 davidm     Switch from PCI-DMA to generic device DMA API.
- * 00/12/13 davidm     Rename to swiotlb.c and add mark_clean() to avoid
- *                     unnecessary i-cache flushing.
- * 04/07/.. ak         Better overflow handling. Assorted fixes.
- * 05/09/10 linville   Add support for syncing ranges, support syncing for
- *                     DMA_BIDIRECTIONAL mappings, miscellaneous cleanup.
- */
-
-#include <linux/cache.h>
-#include <linux/dma-mapping.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ctype.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/scatterlist.h>
-
-#include <linux/init.h>
-#include <linux/bootmem.h>
-
-#ifdef CONFIG_XEN
-/*
- * What DMA mask should Xen use to remap the bounce buffer pool?  Most
- * reports seem to indicate 30 bits is sufficient, except maybe for old
- * sound cards that we probably don't care about anyway.  If we need to,
- * we could put in some smarts to try to lower, but hopefully it's not
- * necessary.
- */
-#define DMA_BITS       (30)
-#endif
-
-#define OFFSET(val,align) ((unsigned long)     \
-                          ( (val) & ( (align) - 1)))
-
-#define SG_ENT_VIRT_ADDRESS(sg)        (page_address((sg)->page) + (sg)->offset)
-#define SG_ENT_PHYS_ADDRESS(SG)        virt_to_bus(SG_ENT_VIRT_ADDRESS(SG))
-
-/*
- * Maximum allowable number of contiguous slabs to map,
- * must be a power of 2.  What is the appropriate value ?
- * The complexity of {map,unmap}_single is linearly dependent on this value.
- */
-#define IO_TLB_SEGSIZE 128
-
-/*
- * log of the size of each IO TLB slab.  The number of slabs is command line
- * controllable.
- */
-#define IO_TLB_SHIFT 11
-
-#define SLABS_PER_PAGE (1 << (PAGE_SHIFT - IO_TLB_SHIFT))
-
-/*
- * Minimum IO TLB size to bother booting with.  Systems with mainly
- * 64bit capable cards will only lightly use the swiotlb.  If we can't
- * allocate a contiguous 1MB, we're probably in trouble anyway.
- */
-#define IO_TLB_MIN_SLABS ((1<<20) >> IO_TLB_SHIFT)
-
-/*
- * Enumeration for sync targets
- */
-enum dma_sync_target {
-       SYNC_FOR_CPU = 0,
-       SYNC_FOR_DEVICE = 1,
-};
-
-int swiotlb_force;
-
-/*
- * Used to do a quick range check in swiotlb_unmap_single and
- * swiotlb_sync_single_*, to see if the memory was in fact allocated by this
- * API.
- */
-static char *io_tlb_start, *io_tlb_end;
-
-/*
- * The number of IO TLB blocks (in groups of 64) betweeen io_tlb_start and
- * io_tlb_end.  This is command line adjustable via setup_io_tlb_npages.
- */
-static unsigned long io_tlb_nslabs;
-
-/*
- * When the IOMMU overflows we return a fallback buffer. This sets the size.
- */
-static unsigned long io_tlb_overflow = 32*1024;
-
-void *io_tlb_overflow_buffer;
-
-/*
- * This is a free list describing the number of free entries available from
- * each index
- */
-static unsigned int *io_tlb_list;
-static unsigned int io_tlb_index;
-
-/*
- * We need to save away the original address corresponding to a mapped entry
- * for the sync operations.
- */
-static unsigned char **io_tlb_orig_addr;
-
-/*
- * Protect the above data structures in the map and unmap calls
- */
-static DEFINE_SPINLOCK(io_tlb_lock);
-
-static int __init
-setup_io_tlb_npages(char *str)
-{
-       if (isdigit(*str)) {
-               io_tlb_nslabs = simple_strtoul(str, &str, 0);
-               /* avoid tail segment of size < IO_TLB_SEGSIZE */
-               io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
-       }
-       if (*str == ',')
-               ++str;
-       if (!strcmp(str, "force"))
-               swiotlb_force = 1;
-       return 1;
-}
-__setup("swiotlb=", setup_io_tlb_npages);
-/* make io_tlb_overflow tunable too? */
-
-/*
- * Statically reserve bounce buffer space and initialize bounce buffer data
- * structures for the software IO TLB used to implement the DMA API.
- */
-void
-swiotlb_init_with_default_size (size_t default_size)
-{
-       unsigned long i;
-
-       if (!io_tlb_nslabs) {
-               io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
-               io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
-       }
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen())
-               io_tlb_nslabs = roundup_pow_of_two(io_tlb_nslabs);
-#endif
-       /*
-        * Get IO TLB memory from the low pages
-        */
-       io_tlb_start = alloc_bootmem_low_pages(io_tlb_nslabs * (1 << IO_TLB_SHIFT));
-       if (!io_tlb_start)
-               panic("Cannot allocate SWIOTLB buffer");
-       io_tlb_end = io_tlb_start + io_tlb_nslabs * (1 << IO_TLB_SHIFT);
-
-#ifdef CONFIG_XEN
-       for (i = 0 ; i < io_tlb_nslabs ; i += IO_TLB_SEGSIZE) {
-               if (xen_create_contiguous_region(
-                               (unsigned long)io_tlb_start +
-                               (i << IO_TLB_SHIFT),
-                               get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
-                               DMA_BITS))
-                       panic("Failed to setup Xen contiguous region");
-       }
-#endif
-
-       /*
-        * Allocate and initialize the free list array.  This array is used
-        * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE
-        * between io_tlb_start and io_tlb_end.
-        */
-       io_tlb_list = alloc_bootmem(io_tlb_nslabs * sizeof(int));
-       for (i = 0; i < io_tlb_nslabs; i++)
-               io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
-       io_tlb_index = 0;
-       io_tlb_orig_addr = alloc_bootmem(io_tlb_nslabs * sizeof(char *));
-
-       /*
-        * Get the overflow emergency buffer
-        */
-       io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow);
-#ifdef CONFIG_XEN
-       if (xen_create_contiguous_region((unsigned long)io_tlb_overflow_buffer,
-                                        get_order(io_tlb_overflow), DMA_BITS))
-               panic("Failed to setup Xen contiguous region for overflow");
-#endif
-       printk(KERN_INFO "Placing software IO TLB between 0x%lx - 0x%lx\n",
-              virt_to_phys(io_tlb_start), virt_to_phys(io_tlb_end));
-}
-
-void
-swiotlb_init (void)
-{
-       swiotlb_init_with_default_size(64 * (1<<20));   /* default to 64MB */
-}
-
-/*
- * Systems with larger DMA zones (those that don't support ISA) can
- * initialize the swiotlb later using the slab allocator if needed.
- * This should be just like above, but with some error catching.
- */
-int
-swiotlb_late_init_with_default_size (size_t default_size)
-{
-       unsigned long i, req_nslabs = io_tlb_nslabs;
-       unsigned int order;
-
-       if (!io_tlb_nslabs) {
-               io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
-               io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
-       }
-
-#ifdef CONFIG_XEN
-       if (is_running_on_xen())
-               io_tlb_nslabs = roundup_pow_of_two(io_tlb_nslabs);
-#endif
-       /*
-        * Get IO TLB memory from the low pages
-        */
-       order = get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT));
-       io_tlb_nslabs = SLABS_PER_PAGE << order;
-
-       while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) {
-               io_tlb_start = (char *)__get_free_pages(GFP_DMA | __GFP_NOWARN,
-                                                       order);
-               if (io_tlb_start)
-                       break;
-               order--;
-       }
-
-       if (!io_tlb_start)
-               goto cleanup1;
-
-       if (order != get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT))) {
-               printk(KERN_WARNING "Warning: only able to allocate %ld MB "
-                      "for software IO TLB\n", (PAGE_SIZE << order) >> 20);
-               io_tlb_nslabs = SLABS_PER_PAGE << order;
-       }
-       io_tlb_end = io_tlb_start + io_tlb_nslabs * (1 << IO_TLB_SHIFT);
-       memset(io_tlb_start, 0, io_tlb_nslabs * (1 << IO_TLB_SHIFT));
-
-#ifdef CONFIG_XEN
-       for (i = 0 ; i < io_tlb_nslabs ; i += IO_TLB_SEGSIZE) {
-               if (xen_create_contiguous_region(
-                               (unsigned long)io_tlb_start +
-                               (i << IO_TLB_SHIFT),
-                               get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
-                               DMA_BITS))
-                       panic("Failed to setup Xen contiguous region");
-       }
-#endif
-       /*
-        * Allocate and initialize the free list array.  This array is used
-        * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE
-        * between io_tlb_start and io_tlb_end.
-        */
-       io_tlb_list = (unsigned int *)__get_free_pages(GFP_KERNEL,
-                                     get_order(io_tlb_nslabs * sizeof(int)));
-       if (!io_tlb_list)
-               goto cleanup2;
-
-       for (i = 0; i < io_tlb_nslabs; i++)
-               io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
-       io_tlb_index = 0;
-
-       io_tlb_orig_addr = (unsigned char **)__get_free_pages(GFP_KERNEL,
-                                  get_order(io_tlb_nslabs * sizeof(char *)));
-       if (!io_tlb_orig_addr)
-               goto cleanup3;
-
-       memset(io_tlb_orig_addr, 0, io_tlb_nslabs * sizeof(char *));
-
-       /*
-        * Get the overflow emergency buffer
-        */
-       io_tlb_overflow_buffer = (void *)__get_free_pages(GFP_DMA,
-                                                 get_order(io_tlb_overflow));
-       if (!io_tlb_overflow_buffer)
-               goto cleanup4;
-
-#ifdef CONFIG_XEN
-       if (xen_create_contiguous_region((unsigned long)io_tlb_overflow_buffer,
-                                        get_order(io_tlb_overflow), DMA_BITS))
-               panic("Failed to setup Xen contiguous region for overflow");
-#endif
-       printk(KERN_INFO "Placing %ldMB software IO TLB between 0x%lx - "
-              "0x%lx\n", (io_tlb_nslabs * (1 << IO_TLB_SHIFT)) >> 20,
-              virt_to_phys(io_tlb_start), virt_to_phys(io_tlb_end));
-
-       return 0;
-
-cleanup4:
-       free_pages((unsigned long)io_tlb_orig_addr, get_order(io_tlb_nslabs *
-                                                             sizeof(char *)));
-       io_tlb_orig_addr = NULL;
-cleanup3:
-       free_pages((unsigned long)io_tlb_list, get_order(io_tlb_nslabs *
-                                                        sizeof(int)));
-       io_tlb_list = NULL;
-       io_tlb_end = NULL;
-cleanup2:
-       free_pages((unsigned long)io_tlb_start, order);
-       io_tlb_start = NULL;
-cleanup1:
-       io_tlb_nslabs = req_nslabs;
-       return -ENOMEM;
-}
-
-static inline int
-address_needs_mapping(struct device *hwdev, dma_addr_t addr)
-{
-       dma_addr_t mask = 0xffffffff;
-       /* If the device has a mask, use it, otherwise default to 32 bits */
-       if (hwdev && hwdev->dma_mask)
-               mask = *hwdev->dma_mask;
-       return (addr & ~mask) != 0;
-}
-
-/*
- * Allocates bounce buffer and returns its kernel virtual address.
- */
-static void *
-map_single(struct device *hwdev, char *buffer, size_t size, int dir)
-{
-       unsigned long flags;
-       char *dma_addr;
-       unsigned int nslots, stride, index, wrap;
-       int i;
-
-       /*
-        * For mappings greater than a page, we limit the stride (and
-        * hence alignment) to a page size.
-        */
-       nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-       if (size > PAGE_SIZE)
-               stride = (1 << (PAGE_SHIFT - IO_TLB_SHIFT));
-       else
-               stride = 1;
-
-       BUG_ON(!nslots);
-
-       /*
-        * Find suitable number of IO TLB entries size that will fit this
-        * request and allocate a buffer from that IO TLB pool.
-        */
-       spin_lock_irqsave(&io_tlb_lock, flags);
-       {
-               wrap = index = ALIGN(io_tlb_index, stride);
-
-               if (index >= io_tlb_nslabs)
-                       wrap = index = 0;
-
-               do {
-                       /*
-                        * If we find a slot that indicates we have 'nslots'
-                        * number of contiguous buffers, we allocate the
-                        * buffers from that slot and mark the entries as '0'
-                        * indicating unavailable.
-                        */
-                       if (io_tlb_list[index] >= nslots) {
-                               int count = 0;
-
-                               for (i = index; i < (int) (index + nslots); i++)
-                                       io_tlb_list[i] = 0;
-                               for (i = index - 1; (OFFSET(i, IO_TLB_SEGSIZE) != IO_TLB_SEGSIZE -1) && io_tlb_list[i]; i--)
-                                       io_tlb_list[i] = ++count;
-                               dma_addr = io_tlb_start + (index << IO_TLB_SHIFT);
-
-                               /*
-                                * Update the indices to avoid searching in
-                                * the next round.
-                                */
-                               io_tlb_index = ((index + nslots) < io_tlb_nslabs
-                                               ? (index + nslots) : 0);
-
-                               goto found;
-                       }
-                       index += stride;
-                       if (index >= io_tlb_nslabs)
-                               index = 0;
-               } while (index != wrap);
-
-               spin_unlock_irqrestore(&io_tlb_lock, flags);
-               return NULL;
-       }
-  found:
-       spin_unlock_irqrestore(&io_tlb_lock, flags);
-
-       /*
-        * Save away the mapping from the original address to the DMA address.
-        * This is needed when we sync the memory.  Then we sync the buffer if
-        * needed.
-        */
-       io_tlb_orig_addr[index] = buffer;
-       if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL)
-               memcpy(dma_addr, buffer, size);
-
-       return dma_addr;
-}
-
-/*
- * dma_addr is the kernel virtual address of the bounce buffer to unmap.
- */
-static void
-unmap_single(struct device *hwdev, char *dma_addr, size_t size, int dir)
-{
-       unsigned long flags;
-       int i, count, nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-       int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT;
-       char *buffer = io_tlb_orig_addr[index];
-
-       /*
-        * First, sync the memory before unmapping the entry
-        */
-       if (buffer && ((dir == DMA_FROM_DEVICE) || (dir == DMA_BIDIRECTIONAL)))
-               /*
-                * bounce... copy the data back into the original buffer * and
-                * delete the bounce buffer.
-                */
-               memcpy(buffer, dma_addr, size);
-
-       /*
-        * Return the buffer to the free list by setting the corresponding
-        * entries to indicate the number of contigous entries available.
-        * While returning the entries to the free list, we merge the entries
-        * with slots below and above the pool being returned.
-        */
-       spin_lock_irqsave(&io_tlb_lock, flags);
-       {
-               count = ((index + nslots) < ALIGN(index + 1, IO_TLB_SEGSIZE) ?
-                        io_tlb_list[index + nslots] : 0);
-               /*
-                * Step 1: return the slots to the free list, merging the
-                * slots with superceeding slots
-                */
-               for (i = index + nslots - 1; i >= index; i--)
-                       io_tlb_list[i] = ++count;
-               /*
-                * Step 2: merge the returned slots with the preceding slots,
-                * if available (non zero)
-                */
-               for (i = index - 1; (OFFSET(i, IO_TLB_SEGSIZE) != IO_TLB_SEGSIZE -1) && io_tlb_list[i]; i--)
-                       io_tlb_list[i] = ++count;
-       }
-       spin_unlock_irqrestore(&io_tlb_lock, flags);
-}
-
-static void
-sync_single(struct device *hwdev, char *dma_addr, size_t size,
-           int dir, int target)
-{
-       int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT;
-       char *buffer = io_tlb_orig_addr[index];
-
-       switch (target) {
-       case SYNC_FOR_CPU:
-               if (likely(dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL))
-                       memcpy(buffer, dma_addr, size);
-               else
-                       BUG_ON(dir != DMA_TO_DEVICE);
-               break;
-       case SYNC_FOR_DEVICE:
-               if (likely(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL))
-                       memcpy(dma_addr, buffer, size);
-               else
-                       BUG_ON(dir != DMA_FROM_DEVICE);
-               break;
-       default:
-               BUG();
-       }
-}
-
-void *
-swiotlb_alloc_coherent(struct device *hwdev, size_t size,
-                      dma_addr_t *dma_handle, gfp_t flags)
-{
-       unsigned long dev_addr;
-       void *ret;
-       int order = get_order(size);
-
-       /*
-        * XXX fix me: the DMA API should pass us an explicit DMA mask
-        * instead, or use ZONE_DMA32 (ia64 overloads ZONE_DMA to be a ~32
-        * bit range instead of a 16MB one).
-        */
-       flags |= GFP_DMA;
-
-       ret = (void *)__get_free_pages(flags, order);
-#ifdef CONFIG_XEN
-       if (ret && is_running_on_xen()) {
-               if (xen_create_contiguous_region((unsigned long)ret, order,
-                                       fls64(hwdev->coherent_dma_mask))) {
-                       free_pages((unsigned long)ret, order);
-                       ret = NULL;
-               } else {
-                       /*
-                        * Short circuit the rest, xen_create_contiguous_region
-                        * should fail if it didn't give us an address within
-                        * the mask requested.  
-                        */
-                       memset(ret, 0, size);
-                       *dma_handle = virt_to_bus(ret);
-                       return ret;
-               }
-       }
-#endif
-       if (ret && address_needs_mapping(hwdev, virt_to_bus(ret))) {
-               /*
-                * The allocated memory isn't reachable by the device.
-                * Fall back on swiotlb_map_single().
-                */
-               free_pages((unsigned long) ret, order);
-               ret = NULL;
-       }
-       if (!ret) {
-               /*
-                * We are either out of memory or the device can't DMA
-                * to GFP_DMA memory; fall back on
-                * swiotlb_map_single(), which will grab memory from
-                * the lowest available address range.
-                */
-               dma_addr_t handle;
-               handle = swiotlb_map_single(NULL, NULL, size, DMA_FROM_DEVICE);
-               if (swiotlb_dma_mapping_error(handle))
-                       return NULL;
-
-               ret = bus_to_virt(handle);
-       }
-
-       memset(ret, 0, size);
-       dev_addr = virt_to_bus(ret);
-
-       /* Confirm address can be DMA'd by device */
-       if (address_needs_mapping(hwdev, dev_addr)) {
-               printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016lx\n",
-                      (unsigned long long)*hwdev->dma_mask, dev_addr);
-               panic("swiotlb_alloc_coherent: allocated memory is out of "
-                     "range for device");
-       }
-       *dma_handle = dev_addr;
-       return ret;
-}
-
-void
-swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr,
-                     dma_addr_t dma_handle)
-{
-       if (!(vaddr >= (void *)io_tlb_start
-                    && vaddr < (void *)io_tlb_end)) {
-#ifdef CONFIG_XEN
-               xen_destroy_contiguous_region((unsigned long)vaddr,
-                                             get_order(size));
-#endif
-               free_pages((unsigned long) vaddr, get_order(size));
-       } else
-               /* DMA_TO_DEVICE to avoid memcpy in unmap_single */
-               swiotlb_unmap_single (hwdev, dma_handle, size, DMA_TO_DEVICE);
-}
-
-static void
-swiotlb_full(struct device *dev, size_t size, int dir, int do_panic)
-{
-       /*
-        * Ran out of IOMMU space for this operation. This is very bad.
-        * Unfortunately the drivers cannot handle this operation properly.
-        * unless they check for dma_mapping_error (most don't)
-        * When the mapping is small enough return a static buffer to limit
-        * the damage, or panic when the transfer is too big.
-        */
-       printk(KERN_ERR "DMA: Out of SW-IOMMU space for %lu bytes at "
-              "device %s\n", size, dev ? dev->bus_id : "?");
-
-       if (size > io_tlb_overflow && do_panic) {
-               if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL)
-                       panic("DMA: Memory would be corrupted\n");
-               if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL)
-                       panic("DMA: Random memory would be DMAed\n");
-       }
-}
-
-/*
- * Map a single buffer of the indicated size for DMA in streaming mode.  The
- * physical address to use is returned.
- *
- * Once the device is given the dma address, the device owns this memory until
- * either swiotlb_unmap_single or swiotlb_dma_sync_single is performed.
- */
-dma_addr_t
-swiotlb_map_single(struct device *hwdev, void *ptr, size_t size, int dir)
-{
-       unsigned long dev_addr = virt_to_bus(ptr);
-       void *map;
-
-       BUG_ON(dir == DMA_NONE);
-       /*
-        * If the pointer passed in happens to be in the device's DMA window,
-        * we can safely return the device addr and not worry about bounce
-        * buffering it.
-        */
-       if (!range_straddles_page_boundary(ptr, size) &&
-           !address_needs_mapping(hwdev, dev_addr) && !swiotlb_force)
-               return dev_addr;
-
-       /*
-        * Oh well, have to allocate and map a bounce buffer.
-        */
-       map = map_single(hwdev, ptr, size, dir);
-       if (!map) {
-               swiotlb_full(hwdev, size, dir, 1);
-               map = io_tlb_overflow_buffer;
-       }
-
-       dev_addr = virt_to_bus(map);
-
-       /*
-        * Ensure that the address returned is DMA'ble
-        */
-       if (address_needs_mapping(hwdev, dev_addr))
-               panic("map_single: bounce buffer is not DMA'ble");
-
-       return dev_addr;
-}
-
-/*
- * Since DMA is i-cache coherent, any (complete) pages that were written via
- * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to
- * flush them when they get mapped into an executable vm-area.
- */
-static void
-mark_clean(void *addr, size_t size)
-{
-       unsigned long pg_addr, end;
-
-#ifdef CONFIG_XEN
-       /* XXX: Bad things happen when starting domUs if this is enabled. */
-       if (is_running_on_xen())
-               return;
-#endif
-
-       pg_addr = PAGE_ALIGN((unsigned long) addr);
-       end = (unsigned long) addr + size;
-       while (pg_addr + PAGE_SIZE <= end) {
-               struct page *page = virt_to_page(pg_addr);
-               set_bit(PG_arch_1, &page->flags);
-               pg_addr += PAGE_SIZE;
-       }
-}
-
-/*
- * Unmap a single streaming mode DMA translation.  The dma_addr and size must
- * match what was provided for in a previous swiotlb_map_single call.  All
- * other usages are undefined.
- *
- * After this call, reads by the cpu to the buffer are guaranteed to see
- * whatever the device wrote there.
- */
-void
-swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, size_t size,
-                    int dir)
-{
-       char *dma_addr = bus_to_virt(dev_addr);
-
-       BUG_ON(dir == DMA_NONE);
-       if (dma_addr >= io_tlb_start && dma_addr < io_tlb_end)
-               unmap_single(hwdev, dma_addr, size, dir);
-       else if (dir == DMA_FROM_DEVICE)
-               mark_clean(dma_addr, size);
-}
-
-/*
- * Make physical memory consistent for a single streaming mode DMA translation
- * after a transfer.
- *
- * If you perform a swiotlb_map_single() but wish to interrogate the buffer
- * using the cpu, yet do not wish to teardown the dma mapping, you must
- * call this function before doing so.  At the next point you give the dma
- * address back to the card, you must first perform a
- * swiotlb_dma_sync_for_device, and then the device again owns the buffer
- */
-static inline void
-swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr,
-                   size_t size, int dir, int target)
-{
-       char *dma_addr = bus_to_virt(dev_addr);
-
-       BUG_ON(dir == DMA_NONE);
-       if (dma_addr >= io_tlb_start && dma_addr < io_tlb_end)
-               sync_single(hwdev, dma_addr, size, dir, target);
-       else if (dir == DMA_FROM_DEVICE)
-               mark_clean(dma_addr, size);
-}
-
-void
-swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr,
-                           size_t size, int dir)
-{
-       swiotlb_sync_single(hwdev, dev_addr, size, dir, SYNC_FOR_CPU);
-}
-
-void
-swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr,
-                              size_t size, int dir)
-{
-       swiotlb_sync_single(hwdev, dev_addr, size, dir, SYNC_FOR_DEVICE);
-}
-
-/*
- * Same as above, but for a sub-range of the mapping.
- */
-static inline void
-swiotlb_sync_single_range(struct device *hwdev, dma_addr_t dev_addr,
-                         unsigned long offset, size_t size,
-                         int dir, int target)
-{
-       char *dma_addr = bus_to_virt(dev_addr) + offset;
-
-       BUG_ON(dir == DMA_NONE);
-       if (dma_addr >= io_tlb_start && dma_addr < io_tlb_end)
-               sync_single(hwdev, dma_addr, size, dir, target);
-       else if (dir == DMA_FROM_DEVICE)
-               mark_clean(dma_addr, size);
-}
-
-void
-swiotlb_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dev_addr,
-                                 unsigned long offset, size_t size, int dir)
-{
-       swiotlb_sync_single_range(hwdev, dev_addr, offset, size, dir,
-                                 SYNC_FOR_CPU);
-}
-
-void
-swiotlb_sync_single_range_for_device(struct device *hwdev, dma_addr_t dev_addr,
-                                    unsigned long offset, size_t size, int dir)
-{
-       swiotlb_sync_single_range(hwdev, dev_addr, offset, size, dir,
-                                 SYNC_FOR_DEVICE);
-}
-
-/*
- * Map a set of buffers described by scatterlist in streaming mode for DMA.
- * This is the scatter-gather version of the above swiotlb_map_single
- * interface.  Here the scatter gather list elements are each tagged with the
- * appropriate dma address and length.  They are obtained via
- * sg_dma_{address,length}(SG).
- *
- * NOTE: An implementation may be able to use a smaller number of
- *       DMA address/length pairs than there are SG table elements.
- *       (for example via virtual mapping capabilities)
- *       The routine returns the number of addr/length pairs actually
- *       used, at most nents.
- *
- * Device ownership issues as mentioned above for swiotlb_map_single are the
- * same here.
- */
-int
-swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-              int dir)
-{
-       void *addr;
-       unsigned long dev_addr;
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++) {
-               addr = SG_ENT_VIRT_ADDRESS(sg);
-               dev_addr = virt_to_bus(addr);
-               if (swiotlb_force || address_needs_mapping(hwdev, dev_addr)) {
-                       void *map = map_single(hwdev, addr, sg->length, dir);
-                       sg->dma_address = virt_to_bus(map);
-                       if (!map) {
-                               /* Don't panic here, we expect map_sg users
-                                  to do proper error handling. */
-                               swiotlb_full(hwdev, sg->length, dir, 0);
-                               swiotlb_unmap_sg(hwdev, sg - i, i, dir);
-                               sg[0].dma_length = 0;
-                               return 0;
-                       }
-               } else
-                       sg->dma_address = dev_addr;
-               sg->dma_length = sg->length;
-       }
-       return nelems;
-}
-
-/*
- * Unmap a set of streaming mode DMA translations.  Again, cpu read rules
- * concerning calls here are the same as for swiotlb_unmap_single() above.
- */
-void
-swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-                int dir)
-{
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++)
-               if (sg->dma_address != SG_ENT_PHYS_ADDRESS(sg))
-                       unmap_single(hwdev, (void *) bus_to_virt(sg->dma_address), sg->dma_length, dir);
-               else if (dir == DMA_FROM_DEVICE)
-                       mark_clean(SG_ENT_VIRT_ADDRESS(sg), sg->dma_length);
-}
-
-/*
- * Make physical memory consistent for a set of streaming mode DMA translations
- * after a transfer.
- *
- * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
- * and usage.
- */
-static inline void
-swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sg,
-               int nelems, int dir, int target)
-{
-       int i;
-
-       BUG_ON(dir == DMA_NONE);
-
-       for (i = 0; i < nelems; i++, sg++)
-               if (sg->dma_address != SG_ENT_PHYS_ADDRESS(sg))
-                       sync_single(hwdev, (void *) sg->dma_address,
-                                   sg->dma_length, dir, target);
-}
-
-void
-swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg,
-                       int nelems, int dir)
-{
-       swiotlb_sync_sg(hwdev, sg, nelems, dir, SYNC_FOR_CPU);
-}
-
-void
-swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
-                          int nelems, int dir)
-{
-       swiotlb_sync_sg(hwdev, sg, nelems, dir, SYNC_FOR_DEVICE);
-}
-
-int
-swiotlb_dma_mapping_error(dma_addr_t dma_addr)
-{
-       return (dma_addr == virt_to_bus(io_tlb_overflow_buffer));
-}
-
-/*
- * Return whether the given device DMA address mask can be supported
- * properly.  For example, if your device can only drive the low 24-bits
- * during bus mastering, then you would pass 0x00ffffff as the mask to
- * this function.
- */
-int
-swiotlb_dma_supported (struct device *hwdev, u64 mask)
-{
-       return (virt_to_bus(io_tlb_end) - 1) <= mask;
-}
-
-EXPORT_SYMBOL(swiotlb_init);
-EXPORT_SYMBOL(swiotlb_map_single);
-EXPORT_SYMBOL(swiotlb_unmap_single);
-EXPORT_SYMBOL(swiotlb_map_sg);
-EXPORT_SYMBOL(swiotlb_unmap_sg);
-EXPORT_SYMBOL(swiotlb_sync_single_for_cpu);
-EXPORT_SYMBOL(swiotlb_sync_single_for_device);
-EXPORT_SYMBOL_GPL(swiotlb_sync_single_range_for_cpu);
-EXPORT_SYMBOL_GPL(swiotlb_sync_single_range_for_device);
-EXPORT_SYMBOL(swiotlb_sync_sg_for_cpu);
-EXPORT_SYMBOL(swiotlb_sync_sg_for_device);
-EXPORT_SYMBOL(swiotlb_dma_mapping_error);
-EXPORT_SYMBOL(swiotlb_alloc_coherent);
-EXPORT_SYMBOL(swiotlb_free_coherent);
-EXPORT_SYMBOL(swiotlb_dma_supported);
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/util.c b/linux-2.6-xen-sparse/arch/ia64/xen/util.c
deleted file mode 100644 (file)
index 387a1c3..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/******************************************************************************
- * arch/ia64/xen/util.c
- * This file is the ia64 counterpart of drivers/xen/util.c
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <asm/uaccess.h>
-#include <xen/driver_util.h>
-#include <xen/interface/memory.h>
-#include <asm/hypercall.h>
-
-struct vm_struct *alloc_vm_area(unsigned long size)
-{
-       int order;
-       unsigned long virt;
-       unsigned long nr_pages;
-       struct vm_struct* area;
-       
-       order = get_order(size);
-       virt = __get_free_pages(GFP_KERNEL, order);
-       if (virt == 0) {
-               goto err0;
-       }
-       nr_pages = 1 << order;
-       scrub_pages(virt, nr_pages);
-       
-       area = kmalloc(sizeof(*area), GFP_KERNEL);
-       if (area == NULL) {
-               goto err1;
-       }
-       
-        area->flags = VM_IOREMAP;//XXX
-        area->addr = (void*)virt;
-        area->size = size;
-        area->pages = NULL; //XXX
-        area->nr_pages = nr_pages;
-        area->phys_addr = 0;   /* xenbus_map_ring_valloc uses this field!  */
-
-       return area;
-
-err1:
-       free_pages(virt, order);
-err0:
-       return NULL;
-       
-}
-EXPORT_SYMBOL_GPL(alloc_vm_area);
-
-void free_vm_area(struct vm_struct *area)
-{
-       unsigned int order = get_order(area->size);
-       unsigned long i;
-       unsigned long phys_addr = __pa(area->addr);
-
-       // This area is used for foreign page mappping.
-       // So underlying machine page may not be assigned.
-       for (i = 0; i < (1 << order); i++) {
-               unsigned long ret;
-               unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i;
-               struct xen_memory_reservation reservation = {
-                       .nr_extents   = 1,
-                       .address_bits = 0,
-                       .extent_order = 0,
-                       .domid        = DOMID_SELF
-               };
-               set_xen_guest_handle(reservation.extent_start, &gpfn);
-               ret = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-                                          &reservation);
-               BUG_ON(ret != 1);
-       }
-       free_pages((unsigned long)area->addr, order);
-       kfree(area);
-}
-EXPORT_SYMBOL_GPL(free_vm_area);
-
-/*
- * Local variables:
- *  c-file-style: "linux"
- *  indent-tabs-mode: t
- *  c-indent-level: 8
- *  c-basic-offset: 8
- *  tab-width: 8
- * End:
- */
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c
deleted file mode 100644 (file)
index 4c90b5b..0000000
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- *          Tristan Gingold <tristan.gingold@bull.net>
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/gfp.h>
-#include <linux/module.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/memory.h>
-#include <xen/interface/xencomm.h>
-#include <xen/interface/version.h>
-#include <xen/interface/sched.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/callback.h>
-#include <xen/interface/acm_ops.h>
-#include <xen/interface/hvm/params.h>
-#include <xen/interface/xenoprof.h>
-#include <xen/interface/vcpu.h>
-#include <asm/hypercall.h>
-#include <asm/page.h>
-#include <asm/uaccess.h>
-#include <asm/xen/xencomm.h>
-#include <asm/perfmon.h>
-
-/* Xencomm notes:
- * This file defines hypercalls to be used by xencomm.  The hypercalls simply
- * create inlines descriptors for pointers and then call the raw arch hypercall
- * xencomm_arch_hypercall_XXX
- *
- * If the arch wants to directly use these hypercalls, simply define macros
- * in asm/hypercall.h, eg:
- *  #define HYPERVISOR_sched_op xencomm_hypercall_sched_op
- * 
- * The arch may also define HYPERVISOR_xxx as a function and do more operations
- * before/after doing the hypercall.
- *
- * Note: because only inline descriptors are created these functions must only
- * be called with in kernel memory parameters.
- */
-
-int
-xencomm_hypercall_console_io(int cmd, int count, char *str)
-{
-       return xencomm_arch_hypercall_console_io
-               (cmd, count, xencomm_create_inline(str));
-}
-
-int
-xencomm_hypercall_event_channel_op(int cmd, void *op)
-{
-       return xencomm_arch_hypercall_event_channel_op
-               (cmd, xencomm_create_inline(op));
-}
-
-int
-xencomm_hypercall_xen_version(int cmd, void *arg)
-{
-       switch (cmd) {
-       case XENVER_version:
-       case XENVER_extraversion:
-       case XENVER_compile_info:
-       case XENVER_capabilities:
-       case XENVER_changeset:
-       case XENVER_platform_parameters:
-       case XENVER_pagesize:
-       case XENVER_get_features:
-               break;
-       default:
-               printk("%s: unknown version cmd %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_xen_version
-               (cmd, xencomm_create_inline(arg));
-}
-
-int
-xencomm_hypercall_physdev_op(int cmd, void *op)
-{
-       return xencomm_arch_hypercall_physdev_op
-               (cmd, xencomm_create_inline(op));
-}
-
-static void *
-xencommize_grant_table_op(unsigned int cmd, void *op, unsigned int count)
-{
-       switch (cmd) {
-       case GNTTABOP_map_grant_ref:
-       case GNTTABOP_unmap_grant_ref:
-               break;
-       case GNTTABOP_setup_table:
-       {
-               struct gnttab_setup_table *setup = op;
-               struct xencomm_handle *frame_list;
-
-               frame_list = xencomm_create_inline
-                       (xen_guest_handle(setup->frame_list));
-
-               set_xen_guest_handle(setup->frame_list, (void *)frame_list);
-               break;
-       }
-       case GNTTABOP_dump_table:
-       case GNTTABOP_transfer:
-       case GNTTABOP_copy:
-               break;
-       default:
-               printk("%s: unknown grant table op %d\n", __func__, cmd);
-               BUG();
-       }
-
-       return  xencomm_create_inline(op);
-}
-
-int
-xencomm_hypercall_grant_table_op(unsigned int cmd, void *op, unsigned int count)
-{
-       void *desc = xencommize_grant_table_op (cmd, op, count);
-
-       return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
-}
-
-int
-xencomm_hypercall_sched_op(int cmd, void *arg)
-{
-       switch (cmd) {
-       case SCHEDOP_yield:
-       case SCHEDOP_block:
-       case SCHEDOP_shutdown:
-       case SCHEDOP_remote_shutdown:
-               break;
-       case SCHEDOP_poll:
-       {
-               sched_poll_t *poll = arg;
-               struct xencomm_handle *ports;
-
-               ports = xencomm_create_inline(xen_guest_handle(poll->ports));
-
-               set_xen_guest_handle(poll->ports, (void *)ports);
-               break;
-       }
-       default:
-               printk("%s: unknown sched op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-       
-       return xencomm_arch_hypercall_sched_op(cmd, xencomm_create_inline(arg));
-}
-
-int
-xencomm_hypercall_multicall(void *call_list, int nr_calls)
-{
-       int i;
-       multicall_entry_t *mce;
-
-       for (i = 0; i < nr_calls; i++) {
-               mce = (multicall_entry_t *)call_list + i;
-
-               switch (mce->op) {
-               case __HYPERVISOR_update_va_mapping:
-               case __HYPERVISOR_mmu_update:
-                       /* No-op on ia64.  */
-                       break;
-               case __HYPERVISOR_grant_table_op:
-                       mce->args[1] = (unsigned long)xencommize_grant_table_op
-                               (mce->args[0], (void *)mce->args[1],
-                                mce->args[2]);
-                       break;
-               case __HYPERVISOR_memory_op:
-               default:
-                       printk("%s: unhandled multicall op entry op %lu\n",
-                              __func__, mce->op);
-                       return -ENOSYS;
-               }
-       }
-
-       return xencomm_arch_hypercall_multicall
-               (xencomm_create_inline(call_list), nr_calls);
-}
-
-int
-xencomm_hypercall_callback_op(int cmd, void *arg)
-{
-       switch (cmd)
-       {
-       case CALLBACKOP_register:
-       case CALLBACKOP_unregister:
-               break;
-       default:
-               printk("%s: unknown callback op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_callback_op
-               (cmd, xencomm_create_inline(arg));
-}
-
-static void
-xencommize_memory_reservation (xen_memory_reservation_t *mop)
-{
-       struct xencomm_handle *desc;
-
-       desc = xencomm_create_inline(xen_guest_handle(mop->extent_start));
-       set_xen_guest_handle(mop->extent_start, (void *)desc);
-}
-
-int
-xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
-{
-       XEN_GUEST_HANDLE(xen_pfn_t) extent_start_va[2];
-       xen_memory_reservation_t *xmr = NULL, *xme_in = NULL, *xme_out = NULL;
-       xen_memory_map_t *memmap = NULL;
-       XEN_GUEST_HANDLE(void) buffer;
-       int rc;
-
-       switch (cmd) {
-       case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation:
-       case XENMEM_populate_physmap:
-               xmr = (xen_memory_reservation_t *)arg;
-               xen_guest_handle(extent_start_va[0]) =
-                       xen_guest_handle(xmr->extent_start);
-               xencommize_memory_reservation((xen_memory_reservation_t *)arg);
-               break;
-               
-       case XENMEM_maximum_ram_page:
-               break;
-
-       case XENMEM_exchange:
-               xme_in  = &((xen_memory_exchange_t *)arg)->in;
-               xme_out = &((xen_memory_exchange_t *)arg)->out;
-               xen_guest_handle(extent_start_va[0]) =
-                       xen_guest_handle(xme_in->extent_start);
-               xen_guest_handle(extent_start_va[1]) =
-                       xen_guest_handle(xme_out->extent_start);
-               xencommize_memory_reservation
-                       (&((xen_memory_exchange_t *)arg)->in);
-               xencommize_memory_reservation
-                       (&((xen_memory_exchange_t *)arg)->out);
-               break;
-
-       case XENMEM_machine_memory_map:
-               memmap = (xen_memory_map_t *)arg;
-               xen_guest_handle(buffer) = xen_guest_handle(memmap->buffer);
-               set_xen_guest_handle(memmap->buffer,
-                       (void *)xencomm_create_inline(
-                               xen_guest_handle(memmap->buffer)));
-               break;
-
-       default:
-               printk("%s: unknown memory op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc =  xencomm_arch_hypercall_memory_op(cmd, xencomm_create_inline(arg));
-
-       switch (cmd) {
-       case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation:
-       case XENMEM_populate_physmap:
-               xen_guest_handle(xmr->extent_start) =
-                       xen_guest_handle(extent_start_va[0]);
-               break;
-
-       case XENMEM_exchange:
-               xen_guest_handle(xme_in->extent_start) =
-                       xen_guest_handle(extent_start_va[0]);
-               xen_guest_handle(xme_out->extent_start) =
-                       xen_guest_handle(extent_start_va[1]);
-               break;
-
-       case XENMEM_machine_memory_map:
-               xen_guest_handle(memmap->buffer) = xen_guest_handle(buffer);
-               break;
-       }
-
-       return rc;
-}
-
-unsigned long
-xencomm_hypercall_hvm_op(int cmd, void *arg)
-{
-       switch (cmd) {
-       case HVMOP_set_param:
-       case HVMOP_get_param:
-               break;
-       default:
-               printk("%s: unknown hvm op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_hvm_op(cmd, xencomm_create_inline(arg));
-}
-
-int
-xencomm_hypercall_suspend(unsigned long srec)
-{
-       struct sched_shutdown arg;
-
-       arg.reason = SHUTDOWN_suspend;
-
-       return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg));
-}
-
-int
-xencomm_hypercall_xenoprof_op(int op, void *arg)
-{
-       switch (op) {
-       case XENOPROF_init:
-       case XENOPROF_set_active:
-       case XENOPROF_set_passive:
-       case XENOPROF_counter:
-       case XENOPROF_get_buffer:
-               break;
-
-       case XENOPROF_reset_active_list:
-       case XENOPROF_reset_passive_list:
-       case XENOPROF_reserve_counters:
-       case XENOPROF_setup_events:
-       case XENOPROF_enable_virq:
-       case XENOPROF_start:
-       case XENOPROF_stop:
-       case XENOPROF_disable_virq:
-       case XENOPROF_release_counters:
-       case XENOPROF_shutdown:
-               return xencomm_arch_hypercall_xenoprof_op(op, arg);
-               break;
-
-       default:
-               printk("%s: op %d isn't supported\n", __func__, op);
-               return -ENOSYS;
-       }
-       return xencomm_arch_hypercall_xenoprof_op(op,
-                                                 xencomm_create_inline(arg));
-}
-
-int
-xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg, unsigned long count)
-{
-       switch (cmd) {
-       case PFM_GET_FEATURES:
-       case PFM_CREATE_CONTEXT:
-       case PFM_WRITE_PMCS:
-       case PFM_WRITE_PMDS:
-       case PFM_LOAD_CONTEXT:
-               break;
-
-       case PFM_DESTROY_CONTEXT:
-       case PFM_UNLOAD_CONTEXT:
-       case PFM_START:
-       case PFM_STOP:
-               return xencomm_arch_hypercall_perfmon_op(cmd, arg, count);
-
-       default:
-               printk("%s:%d cmd %ld isn't supported\n",
-                      __func__,__LINE__, cmd);
-               BUG();
-       }
-
-       return xencomm_arch_hypercall_perfmon_op(cmd,
-                                                xencomm_create_inline(arg),
-                                                count);
-}
-
-long
-xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg)
-{
-       switch (cmd) {
-       case VCPUOP_register_runstate_memory_area:
-               xencommize_memory_reservation((xen_memory_reservation_t *)arg);
-               break;
-
-       default:
-               printk("%s: unknown vcpu op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_vcpu_op(cmd, cpu,
-                                             xencomm_create_inline(arg));
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c
deleted file mode 100644 (file)
index 3c0baff..0000000
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- *          Tristan Gingold <tristan.gingold@bull.net>
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/memory.h>
-#include <xen/interface/xencomm.h>
-#include <xen/interface/version.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/hvm/params.h>
-#include <xen/interface/xenoprof.h>
-#ifdef CONFIG_VMX_GUEST
-#include <asm/hypervisor.h>
-#else
-#include <asm/hypercall.h>
-#endif
-#include <asm/xen/xencomm.h>
-#include <asm/perfmon.h>
-
-int
-xencomm_mini_hypercall_event_channel_op(int cmd, void *op)
-{
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       rc = xencomm_create_mini(xc_area, &nbr_area,
-                                op, sizeof(evtchn_op_t), &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_event_channel_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_event_channel_op);
-
-static int
-xencommize_mini_grant_table_op(struct xencomm_mini *xc_area, int *nbr_area,
-                               unsigned int cmd, void *op, unsigned int count,
-                               struct xencomm_handle **desc)
-{
-       struct xencomm_handle *desc1;
-       unsigned int argsize;
-       int rc;
-
-       switch (cmd) {
-       case GNTTABOP_map_grant_ref:
-               argsize = sizeof(struct gnttab_map_grant_ref);
-               break;
-       case GNTTABOP_unmap_grant_ref:
-               argsize = sizeof(struct gnttab_unmap_grant_ref);
-               break;
-       case GNTTABOP_setup_table:
-       {
-               struct gnttab_setup_table *setup = op;
-
-               argsize = sizeof(*setup);
-
-               if (count != 1)
-                       return -EINVAL;
-               rc = xencomm_create_mini
-                       (xc_area, nbr_area,
-                        xen_guest_handle(setup->frame_list),
-                        setup->nr_frames 
-                        * sizeof(*xen_guest_handle(setup->frame_list)),
-                        &desc1);
-               if (rc)
-                       return rc;
-               set_xen_guest_handle(setup->frame_list, (void *)desc1);
-               break;
-       }
-       case GNTTABOP_dump_table:
-               argsize = sizeof(struct gnttab_dump_table);
-               break;
-       case GNTTABOP_transfer:
-               argsize = sizeof(struct gnttab_transfer);
-               break;
-       case GNTTABOP_copy:
-               argsize = sizeof(struct gnttab_copy);
-               break;
-       case GNTTABOP_query_size:
-               argsize = sizeof(struct gnttab_query_size);
-               break;
-       default:
-               printk("%s: unknown mini grant table op %d\n", __func__, cmd);
-               BUG();
-       }
-
-       rc = xencomm_create_mini(xc_area, nbr_area, op, count * argsize, desc);
-       if (rc)
-               return rc;
-
-       return 0;
-}
-
-int
-xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
-                                      unsigned int count)
-{
-       int rc;
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-
-       rc = xencommize_mini_grant_table_op(xc_area, &nbr_area,
-                                           cmd, op, count, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_grant_table_op);
-
-int
-xencomm_mini_hypercall_multicall(void *call_list, int nr_calls)
-{
-       int i;
-       multicall_entry_t *mce;
-       int nbr_area = 2 + nr_calls * 3;
-       struct xencomm_mini xc_area[nbr_area];
-       struct xencomm_handle *desc;
-       int rc;
-
-       for (i = 0; i < nr_calls; i++) {
-               mce = (multicall_entry_t *)call_list + i;
-
-               switch (mce->op) {
-               case __HYPERVISOR_update_va_mapping:
-               case __HYPERVISOR_mmu_update:
-                       /* No-op on ia64.  */
-                       break;
-               case __HYPERVISOR_grant_table_op:
-                       rc = xencommize_mini_grant_table_op
-                               (xc_area, &nbr_area,
-                                mce->args[0], (void *)mce->args[1],
-                                mce->args[2], &desc);
-                       if (rc)
-                               return rc;
-                       mce->args[1] = (unsigned long)desc;
-                       break;
-               case __HYPERVISOR_memory_op:
-               default:
-                       printk("%s: unhandled multicall op entry op %lu\n",
-                              __func__, mce->op);
-                       return -ENOSYS;
-               }
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, call_list,
-                                nr_calls * sizeof(multicall_entry_t), &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_multicall(desc, nr_calls);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_multicall);
-
-static int
-xencommize_mini_memory_reservation(struct xencomm_mini *area, int *nbr_area,
-                                   xen_memory_reservation_t *mop)
-{
-       struct xencomm_handle *desc;
-       int rc;
-
-       rc = xencomm_create_mini
-               (area, nbr_area,
-                xen_guest_handle(mop->extent_start),
-                mop->nr_extents 
-                * sizeof(*xen_guest_handle(mop->extent_start)),
-                &desc);
-       if (rc)
-               return rc;
-
-       set_xen_guest_handle(mop->extent_start, (void *)desc);
-
-       return 0;
-}
-
-int
-xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg)
-{
-       int nbr_area = 4;
-       struct xencomm_mini xc_area[4];
-       struct xencomm_handle *desc;
-       int rc;
-       unsigned int argsize;
-
-       switch (cmd) {
-       case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation:
-       case XENMEM_populate_physmap:
-               argsize = sizeof(xen_memory_reservation_t);
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area, (xen_memory_reservation_t *)arg);
-               if (rc)
-                       return rc;
-               break;
-               
-       case XENMEM_maximum_ram_page:
-               argsize = 0;
-               break;
-
-       case XENMEM_exchange:
-               argsize = sizeof(xen_memory_exchange_t);
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area,
-                        &((xen_memory_exchange_t *)arg)->in);
-               if (rc)
-                       return rc;
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area,
-                        &((xen_memory_exchange_t *)arg)->out);
-               if (rc)
-                       return rc;
-               break;
-
-       case XENMEM_add_to_physmap:
-               argsize = sizeof (xen_add_to_physmap_t);
-               break;
-
-       case XENMEM_machine_memory_map:
-       {
-               xen_memory_map_t *memmap = (xen_memory_map_t *)arg;
-               argsize = sizeof(*memmap);
-               rc = xencomm_create_mini(xc_area, &nbr_area,
-                                        xen_guest_handle(memmap->buffer),
-                                        memmap->nr_entries, &desc);
-               if (rc)
-                       return rc;
-               set_xen_guest_handle(memmap->buffer, (void *)desc);
-               break;
-       }
-
-       default:
-               printk("%s: unknown mini memory op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_memory_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_memory_op);
-
-unsigned long
-xencomm_mini_hypercall_hvm_op(int cmd, void *arg)
-{
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       unsigned int argsize;
-       int rc;
-
-       switch (cmd) {
-       case HVMOP_get_param:
-       case HVMOP_set_param:
-               argsize = sizeof(xen_hvm_param_t);
-               break;
-       default:
-               printk("%s: unknown HVMOP %d\n", __func__, cmd);
-               return -EINVAL;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_hvm_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_hvm_op);
-
-int
-xencomm_mini_hypercall_xen_version(int cmd, void *arg)
-{
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       unsigned int argsize;
-       int rc;
-
-       switch (cmd) {
-       case XENVER_version:
-               /* do not actually pass an argument */
-               return xencomm_arch_hypercall_xen_version(cmd, 0);
-       case XENVER_extraversion:
-               argsize = sizeof(xen_extraversion_t);
-               break;
-       case XENVER_compile_info:
-               argsize = sizeof(xen_compile_info_t);
-               break;
-       case XENVER_capabilities:
-               argsize = sizeof(xen_capabilities_info_t);
-               break;
-       case XENVER_changeset:
-               argsize = sizeof(xen_changeset_info_t);
-               break;
-       case XENVER_platform_parameters:
-               argsize = sizeof(xen_platform_parameters_t);
-               break;
-       case XENVER_pagesize:
-               argsize = (arg == NULL) ? 0 : sizeof(void *);
-               break;
-       case XENVER_get_features:
-               argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t);
-               break;
-
-       default:
-               printk("%s: unknown version op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_xen_version(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_xen_version);
-
-int
-xencomm_mini_hypercall_xenoprof_op(int op, void *arg)
-{
-       unsigned int argsize;
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       switch (op) {
-       case XENOPROF_init:
-               argsize = sizeof(xenoprof_init_t);
-               break;
-       case XENOPROF_set_active:
-               argsize = sizeof(domid_t);
-               break;
-       case XENOPROF_set_passive:
-               argsize = sizeof(xenoprof_passive_t);
-               break;
-       case XENOPROF_counter:
-               argsize = sizeof(xenoprof_counter_t);
-               break;
-       case XENOPROF_get_buffer:
-               argsize = sizeof(xenoprof_get_buffer_t);
-               break;
-
-       case XENOPROF_reset_active_list:
-       case XENOPROF_reset_passive_list:
-       case XENOPROF_reserve_counters:
-       case XENOPROF_setup_events:
-       case XENOPROF_enable_virq:
-       case XENOPROF_start:
-       case XENOPROF_stop:
-       case XENOPROF_disable_virq:
-       case XENOPROF_release_counters:
-       case XENOPROF_shutdown:
-               return xencomm_arch_hypercall_xenoprof_op(op, arg);
-
-       default:
-               printk("%s: op %d isn't supported\n", __func__, op);
-               return -ENOSYS;
-       }
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-       return xencomm_arch_hypercall_xenoprof_op(op, desc);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_xenoprof_op);
-
-int
-xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
-                                  unsigned long count)
-{
-       unsigned int argsize;
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       switch (cmd) {
-       case PFM_GET_FEATURES:
-               argsize = sizeof(pfarg_features_t);
-               break;
-       case PFM_CREATE_CONTEXT:
-               argsize = sizeof(pfarg_context_t);
-               break;
-       case PFM_LOAD_CONTEXT:
-               argsize = sizeof(pfarg_load_t);
-               break;
-       case PFM_WRITE_PMCS:
-       case PFM_WRITE_PMDS:
-               argsize = sizeof(pfarg_reg_t) * count;
-               break;
-
-       case PFM_DESTROY_CONTEXT:
-       case PFM_UNLOAD_CONTEXT:
-       case PFM_START:
-       case PFM_STOP:
-               return xencomm_arch_hypercall_perfmon_op(cmd, arg, count);
-
-       default:
-               printk("%s:%d cmd %ld isn't supported\n",
-                      __func__, __LINE__, cmd);
-               BUG();
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-       return xencomm_arch_hypercall_perfmon_op(cmd, desc, count);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_perfmon_op);
-
-int
-xencomm_mini_hypercall_sched_op(int cmd, void *arg)
-{
-       int rc, nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       struct xencomm_handle *desc;
-       unsigned int argsize;
-
-       switch (cmd) {
-       case SCHEDOP_yield:
-       case SCHEDOP_block:
-               argsize = 0;
-               break;
-       case SCHEDOP_shutdown:
-               argsize = sizeof(sched_shutdown_t);
-               break;
-       case SCHEDOP_poll:
-               argsize = sizeof(sched_poll_t);
-               break;
-       case SCHEDOP_remote_shutdown:
-               argsize = sizeof(sched_remote_shutdown_t);
-               break;
-
-       default:
-               printk("%s: unknown sched op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_sched_op(cmd, desc);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_sched_op);
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c
deleted file mode 100644 (file)
index 7c67373..0000000
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- *          Tristan Gingold <tristan.gingold@bull.net>
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/gfp.h>
-#include <linux/module.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#define __XEN__
-#include <xen/interface/domctl.h>
-#include <xen/interface/sysctl.h>
-#include <xen/interface/memory.h>
-#include <xen/interface/version.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/acm_ops.h>
-#include <xen/interface/hvm/params.h>
-#include <xen/public/privcmd.h>
-#include <asm/hypercall.h>
-#include <asm/page.h>
-#include <asm/uaccess.h>
-#include <asm/xen/xencomm.h>
-
-#define ROUND_DIV(v,s) (((v) + (s) - 1) / (s))
-
-static int
-xencomm_privcmd_platform_op(privcmd_hypercall_t *hypercall)
-{
-       struct xen_platform_op kern_op;
-       struct xen_platform_op __user *user_op = (struct xen_platform_op __user *)hypercall->arg[0];
-       struct xencomm_handle *op_desc;
-       struct xencomm_handle *desc = NULL;
-       int ret = 0;
-
-       if (copy_from_user(&kern_op, user_op, sizeof(struct xen_platform_op)))
-               return -EFAULT;
-
-       if (kern_op.interface_version != XENPF_INTERFACE_VERSION)
-               return -EACCES;
-
-       op_desc = xencomm_create_inline(&kern_op);
-
-       switch (kern_op.cmd) {
-       default:
-               printk("%s: unknown platform cmd %d\n", __func__, kern_op.cmd);
-               return -ENOSYS;
-       }
-
-       if (ret) {
-               /* error mapping the nested pointer */
-               return ret;
-       }
-
-       ret = xencomm_arch_hypercall_platform_op(op_desc);
-
-       /* FIXME: should we restore the handle?  */
-       if (copy_to_user(user_op, &kern_op, sizeof(struct xen_platform_op)))
-               ret = -EFAULT;
-
-       if (desc)
-               xencomm_free(desc);
-       return ret;
-}
-
-/*
- * Temporarily disable the NUMA PHYSINFO code until the rest of the
- * changes are upstream.
- */
-#undef IA64_NUMA_PHYSINFO
-
-static int
-xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
-{
-       xen_sysctl_t kern_op;
-       xen_sysctl_t __user *user_op;
-       struct xencomm_handle *op_desc;
-       struct xencomm_handle *desc = NULL;
-       struct xencomm_handle *desc1 = NULL;
-       int ret = 0;
-
-       user_op = (xen_sysctl_t __user *)hypercall->arg[0];
-
-       if (copy_from_user(&kern_op, user_op, sizeof(xen_sysctl_t)))
-               return -EFAULT;
-
-       if (kern_op.interface_version != XEN_SYSCTL_INTERFACE_VERSION)
-               return -EACCES;
-
-       op_desc = xencomm_create_inline(&kern_op);
-
-       switch (kern_op.cmd) {
-       case XEN_SYSCTL_readconsole:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.readconsole.buffer),
-                       kern_op.u.readconsole.count,
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.readconsole.buffer,
-                                    (void *)desc);
-               break;
-       case XEN_SYSCTL_tbuf_op:
-#ifndef IA64_NUMA_PHYSINFO
-       case XEN_SYSCTL_physinfo:
-#endif
-       case XEN_SYSCTL_sched_id:
-               break;
-       case XEN_SYSCTL_perfc_op:
-       {
-               struct xencomm_handle *tmp_desc;
-               xen_sysctl_t tmp_op = {
-                       .cmd = XEN_SYSCTL_perfc_op,
-                       .interface_version = XEN_SYSCTL_INTERFACE_VERSION,
-                       .u.perfc_op = {
-                               .cmd = XEN_SYSCTL_PERFCOP_query,
-                               // .desc.p = NULL,
-                               // .val.p = NULL,
-                       },
-               };
-
-               if (xen_guest_handle(kern_op.u.perfc_op.desc) == NULL) {
-                       if (xen_guest_handle(kern_op.u.perfc_op.val) != NULL)
-                               return -EINVAL;
-                       break;
-               }
-
-               /* query the buffer size for xencomm */
-               tmp_desc = xencomm_create_inline(&tmp_op);
-               ret = xencomm_arch_hypercall_sysctl(tmp_desc);
-               if (ret)
-                       return ret;
-
-               ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.desc),
-                                    tmp_op.u.perfc_op.nr_counters *
-                                    sizeof(xen_sysctl_perfc_desc_t),
-                                    &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
-
-               set_xen_guest_handle(kern_op.u.perfc_op.desc, (void *)desc);
-
-               ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.val),
-                                    tmp_op.u.perfc_op.nr_vals *
-                                    sizeof(xen_sysctl_perfc_val_t),
-                                    &desc1, GFP_KERNEL);
-               if (ret)
-                       xencomm_free(desc);
-
-               set_xen_guest_handle(kern_op.u.perfc_op.val, (void *)desc1);
-               break;
-       }
-       case XEN_SYSCTL_getdomaininfolist:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.getdomaininfolist.buffer),
-                       kern_op.u.getdomaininfolist.max_domains *
-                       sizeof(xen_domctl_getdomaininfo_t),
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.getdomaininfolist.buffer,
-                                    (void *)desc);
-               break;
-       case XEN_SYSCTL_debug_keys:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.debug_keys.keys),
-                       kern_op.u.debug_keys.nr_keys,
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.debug_keys.keys,
-                                    (void *)desc);
-               break;
-
-#ifdef IA64_NUMA_PHYSINFO
-       case XEN_SYSCTL_physinfo:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.physinfo.memory_chunks),
-                       PUBLIC_MAXCHUNKS * sizeof(node_data_t),
-                       &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
-               set_xen_guest_handle(kern_op.u.physinfo.memory_chunks,
-                                    (void *)desc);
-
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.physinfo.cpu_to_node),
-                       PUBLIC_MAX_NUMNODES * sizeof(u64),
-                       &desc1, GFP_KERNEL);
-               if (ret)
-                       xencomm_free(desc);
-               set_xen_guest_handle(kern_op.u.physinfo.cpu_to_node,
-                                    (void *)desc1);
-               break;
-#endif
-       default:
-               printk("%s: unknown sysctl cmd %d\n", __func__, kern_op.cmd);
-               return -ENOSYS;
-       }
-
-       if (ret) {
-               /* error mapping the nested pointer */
-               return ret;
-       }
-
-       ret = xencomm_arch_hypercall_sysctl(op_desc);
-
-       /* FIXME: should we restore the handles?  */
-       if (copy_to_user(user_op, &kern_op, sizeof(xen_sysctl_t)))
-               ret = -EFAULT;
-
-       if (desc)
-               xencomm_free(desc);
-       if (desc1)
-               xencomm_free(desc1);
-       return ret;
-}
-
-static int
-xencomm_privcmd_domctl(privcmd_hypercall_t *hypercall)
-{
-       xen_domctl_t kern_op;
-       xen_domctl_t __user *user_op;
-       struct xencomm_handle *op_desc;
-       struct xencomm_handle *desc = NULL;
-       int ret = 0;
-
-       user_op = (xen_domctl_t __user *)hypercall->arg[0];
-
-       if (copy_from_user(&kern_op, user_op, sizeof(xen_domctl_t)))
-               return -EFAULT;
-
-       if (kern_op.interface_version != XEN_DOMCTL_INTERFACE_VERSION)
-               return -EACCES;
-
-       op_desc = xencomm_create_inline(&kern_op);
-
-       switch (kern_op.cmd) {
-       case XEN_DOMCTL_createdomain:
-       case XEN_DOMCTL_destroydomain:
-       case XEN_DOMCTL_pausedomain:
-       case XEN_DOMCTL_unpausedomain:
-       case XEN_DOMCTL_getdomaininfo:
-               break;
-       case XEN_DOMCTL_getmemlist:
-       {
-               unsigned long nr_pages = kern_op.u.getmemlist.max_pfns;
-
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.getmemlist.buffer),
-                       nr_pages * sizeof(unsigned long),
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.getmemlist.buffer,
-                                    (void *)desc);
-               break;
-       }
-       case XEN_DOMCTL_getpageframeinfo:
-               break;
-       case XEN_DOMCTL_getpageframeinfo2:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.getpageframeinfo2.array),
-                       kern_op.u.getpageframeinfo2.num,
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.getpageframeinfo2.array,
-                                    (void *)desc);
-               break;
-       case XEN_DOMCTL_shadow_op:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap),
-                       ROUND_DIV(kern_op.u.shadow_op.pages, 8),
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap,
-                                    (void *)desc);
-               break;
-       case XEN_DOMCTL_max_mem:
-               break;
-       case XEN_DOMCTL_setvcpucontext:
-       case XEN_DOMCTL_getvcpucontext:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.vcpucontext.ctxt),
-                       sizeof(vcpu_guest_context_t),
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.vcpucontext.ctxt, (void *)desc);
-               break;
-       case XEN_DOMCTL_getvcpuinfo:
-               break;
-       case XEN_DOMCTL_setvcpuaffinity:
-       case XEN_DOMCTL_getvcpuaffinity:
-               ret = xencomm_create(
-                       xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap),
-                       ROUND_DIV(kern_op.u.vcpuaffinity.cpumap.nr_cpus, 8),
-                       &desc, GFP_KERNEL);
-               set_xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap,
-                                    (void *)desc);
-               break;
-       case XEN_DOMCTL_max_vcpus:
-       case XEN_DOMCTL_scheduler_op:
-       case XEN_DOMCTL_setdomainhandle:
-       case XEN_DOMCTL_setdebugging:
-       case XEN_DOMCTL_irq_permission:
-       case XEN_DOMCTL_iomem_permission:
-       case XEN_DOMCTL_ioport_permission:
-       case XEN_DOMCTL_hypercall_init:
-       case XEN_DOMCTL_arch_setup:
-       case XEN_DOMCTL_settimeoffset:
-       case XEN_DOMCTL_sendtrigger:
-               break;
-       default:
-               printk("%s: unknown domctl cmd %d\n", __func__, kern_op.cmd);
-               return -ENOSYS;
-       }
-
-       if (ret) {
-               /* error mapping the nested pointer */
-               return ret;
-       }
-
-       ret = xencomm_arch_hypercall_domctl (op_desc);
-
-       /* FIXME: should we restore the handle?  */
-       if (copy_to_user(user_op, &kern_op, sizeof(xen_domctl_t)))
-               ret = -EFAULT;
-
-       if (desc)
-               xencomm_free(desc);
-       return ret;
-}
-
-static int
-xencomm_privcmd_acm_op(privcmd_hypercall_t *hypercall)
-{
-       int cmd = hypercall->arg[0];
-       void __user *arg = (void __user *)hypercall->arg[1];
-       struct xencomm_handle *op_desc;
-       struct xencomm_handle *desc = NULL;
-       int ret;
-
-       switch (cmd) {
-       case ACMOP_getssid:
-       {
-               struct acm_getssid kern_arg;
-
-               if (copy_from_user(&kern_arg, arg, sizeof (kern_arg)))
-                       return -EFAULT;
-
-               op_desc = xencomm_create_inline(&kern_arg);
-
-               ret = xencomm_create(xen_guest_handle(kern_arg.ssidbuf),
-                                    kern_arg.ssidbuf_size, &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
-
-               set_xen_guest_handle(kern_arg.ssidbuf, (void *)desc);
-
-               ret = xencomm_arch_hypercall_acm_op(cmd, op_desc);
-
-               xencomm_free(desc);
-
-               if (copy_to_user(arg, &kern_arg, sizeof (kern_arg)))
-                       return -EFAULT;
-
-               return ret;
-       }
-       default:
-               printk("%s: unknown acm_op cmd %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return ret;
-}
-
-static int
-xencomm_privcmd_memory_op(privcmd_hypercall_t *hypercall)
-{
-       const unsigned long cmd = hypercall->arg[0];
-       int ret = 0;
-
-       switch (cmd) {
-       case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation:
-       case XENMEM_populate_physmap:
-       {
-               xen_memory_reservation_t kern_op;
-               xen_memory_reservation_t __user *user_op;
-               struct xencomm_handle *desc = NULL;
-               struct xencomm_handle *desc_op;
-
-               user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
-               if (copy_from_user(&kern_op, user_op,
-                                  sizeof(xen_memory_reservation_t)))
-                       return -EFAULT;
-               desc_op = xencomm_create_inline(&kern_op);
-
-               if (xen_guest_handle(kern_op.extent_start)) {
-                       void * addr;
-
-                       addr = xen_guest_handle(kern_op.extent_start);
-                       ret = xencomm_create
-                               (addr,
-                                kern_op.nr_extents *
-                                sizeof(*xen_guest_handle
-                                       (kern_op.extent_start)),
-                                &desc, GFP_KERNEL);
-                       if (ret)
-                               return ret;
-                       set_xen_guest_handle(kern_op.extent_start,
-                                            (void *)desc);
-               }
-
-               ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
-
-               if (desc)
-                       xencomm_free(desc);
-
-               if (ret != 0)
-                       return ret;
-
-               if (copy_to_user(user_op, &kern_op,
-                                sizeof(xen_memory_reservation_t)))
-                       return -EFAULT;
-
-               return ret;
-       }
-       case XENMEM_translate_gpfn_list:
-       {
-               xen_translate_gpfn_list_t kern_op;
-               xen_translate_gpfn_list_t __user *user_op;
-               struct xencomm_handle *desc_gpfn = NULL;
-               struct xencomm_handle *desc_mfn = NULL;
-               struct xencomm_handle *desc_op;
-               void *addr;
-
-               user_op = (xen_translate_gpfn_list_t __user *)
-                       hypercall->arg[1];
-               if (copy_from_user(&kern_op, user_op,
-                                  sizeof(xen_translate_gpfn_list_t)))
-                       return -EFAULT;
-               desc_op = xencomm_create_inline(&kern_op);
-
-               if (kern_op.nr_gpfns) {
-                       /* gpfn_list.  */
-                       addr = xen_guest_handle(kern_op.gpfn_list);
-
-                       ret = xencomm_create(addr, kern_op.nr_gpfns *
-                                            sizeof(*xen_guest_handle
-                                                   (kern_op.gpfn_list)),
-                                            &desc_gpfn, GFP_KERNEL);
-                       if (ret)
-                               return ret;
-                       set_xen_guest_handle(kern_op.gpfn_list,
-                                            (void *)desc_gpfn);
-
-                       /* mfn_list.  */
-                       addr = xen_guest_handle(kern_op.mfn_list);
-
-                       ret = xencomm_create(addr, kern_op.nr_gpfns *
-                                            sizeof(*xen_guest_handle
-                                                   (kern_op.mfn_list)),
-                                            &desc_mfn, GFP_KERNEL);
-                       if (ret)
-                               return ret;
-                       set_xen_guest_handle(kern_op.mfn_list,
-                                            (void *)desc_mfn);
-               }
-
-               ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
-
-               if (desc_gpfn)
-                       xencomm_free(desc_gpfn);
-
-               if (desc_mfn)
-                       xencomm_free(desc_mfn);
-
-               if (ret != 0)
-                       return ret;
-
-               return ret;
-       }
-       default:
-               printk("%s: unknown memory op %lu\n", __func__, cmd);
-               ret = -ENOSYS;
-       }
-       return ret;
-}
-
-static int
-xencomm_privcmd_xen_version(privcmd_hypercall_t *hypercall)
-{
-       int cmd = hypercall->arg[0];
-       void __user *arg = (void __user *)hypercall->arg[1];
-       struct xencomm_handle *desc;
-       size_t argsize;
-       int rc;
-
-       switch (cmd) {
-       case XENVER_version:
-               /* do not actually pass an argument */
-               return xencomm_arch_hypercall_xen_version(cmd, 0);
-       case XENVER_extraversion:
-               argsize = sizeof(xen_extraversion_t);
-               break;
-       case XENVER_compile_info:
-               argsize = sizeof(xen_compile_info_t);
-               break;
-       case XENVER_capabilities:
-               argsize = sizeof(xen_capabilities_info_t);
-               break;
-       case XENVER_changeset:
-               argsize = sizeof(xen_changeset_info_t);
-               break;
-       case XENVER_platform_parameters:
-               argsize = sizeof(xen_platform_parameters_t);
-               break;
-       case XENVER_pagesize:
-               argsize = (arg == NULL) ? 0 : sizeof(void *);
-               break;
-       case XENVER_get_features:
-               argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t);
-               break;
-
-       default:
-               printk("%s: unknown version op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL);
-       if (rc)
-               return rc;
-
-       rc = xencomm_arch_hypercall_xen_version(cmd, desc);
-
-       xencomm_free(desc);
-
-       return rc;
-}
-
-static int
-xencomm_privcmd_event_channel_op(privcmd_hypercall_t *hypercall)
-{
-       int cmd = hypercall->arg[0];
-       struct xencomm_handle *desc;
-       unsigned int argsize;
-       int ret;
-
-       switch (cmd) {
-       case EVTCHNOP_alloc_unbound:
-               argsize = sizeof(evtchn_alloc_unbound_t);
-               break;
-
-       case EVTCHNOP_status:
-               argsize = sizeof(evtchn_status_t);
-               break;
-
-       default:
-               printk("%s: unknown EVTCHNOP %d\n", __func__, cmd);
-               return -EINVAL;
-       }
-
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
-
-       ret = xencomm_arch_hypercall_event_channel_op(cmd, desc);
-
-       xencomm_free(desc);
-       return ret;
-}
-
-static int
-xencomm_privcmd_hvm_op(privcmd_hypercall_t *hypercall)
-{
-       int cmd = hypercall->arg[0];
-       struct xencomm_handle *desc;
-       unsigned int argsize;
-       int ret;
-
-       switch (cmd) {
-       case HVMOP_get_param:
-       case HVMOP_set_param:
-               argsize = sizeof(xen_hvm_param_t);
-               break;
-       case HVMOP_set_pci_intx_level:
-               argsize = sizeof(xen_hvm_set_pci_intx_level_t);
-               break;
-       case HVMOP_set_isa_irq_level:
-               argsize = sizeof(xen_hvm_set_isa_irq_level_t);
-               break;
-       case HVMOP_set_pci_link_route:
-               argsize = sizeof(xen_hvm_set_pci_link_route_t);
-               break;
-
-       default:
-               printk("%s: unknown HVMOP %d\n", __func__, cmd);
-               return -EINVAL;
-       }
-
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
-
-       ret = xencomm_arch_hypercall_hvm_op(cmd, desc);
-
-       xencomm_free(desc);
-       return ret;
-}
-
-static int
-xencomm_privcmd_sched_op(privcmd_hypercall_t *hypercall)
-{
-       int cmd = hypercall->arg[0];
-       struct xencomm_handle *desc;
-       unsigned int argsize;
-       int ret;
-
-       switch (cmd) {
-       case SCHEDOP_remote_shutdown:
-               argsize = sizeof(sched_remote_shutdown_t);
-               break;
-       default:
-               printk("%s: unknown SCHEDOP %d\n", __func__, cmd);
-               return -EINVAL;
-       }
-
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
-
-       ret = xencomm_arch_hypercall_sched_op(cmd, desc);
-
-       xencomm_free(desc);
-       return ret;
-}
-
-int
-privcmd_hypercall(privcmd_hypercall_t *hypercall)
-{
-       switch (hypercall->op) {
-       case __HYPERVISOR_platform_op:
-               return xencomm_privcmd_platform_op(hypercall);
-       case __HYPERVISOR_domctl:
-               return xencomm_privcmd_domctl(hypercall);
-       case __HYPERVISOR_sysctl:
-               return xencomm_privcmd_sysctl(hypercall);
-        case __HYPERVISOR_acm_op:
-               return xencomm_privcmd_acm_op(hypercall);
-       case __HYPERVISOR_xen_version:
-               return xencomm_privcmd_xen_version(hypercall);
-       case __HYPERVISOR_memory_op:
-               return xencomm_privcmd_memory_op(hypercall);
-       case __HYPERVISOR_event_channel_op:
-               return xencomm_privcmd_event_channel_op(hypercall);
-       case __HYPERVISOR_hvm_op:
-               return xencomm_privcmd_hvm_op(hypercall);
-       case __HYPERVISOR_sched_op:
-               return xencomm_privcmd_sched_op(hypercall);
-       default:
-               printk("%s: unknown hcall (%ld)\n", __func__, hypercall->op);
-               return -ENOSYS;
-       }
-}
-
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xen_dma.c b/linux-2.6-xen-sparse/arch/ia64/xen/xen_dma.c
deleted file mode 100644 (file)
index 5962e73..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
- *     Alex Williamson <alex.williamson@hp.com>
- *
- * Basic DMA mapping services for Xen guests.
- * Based on arch/i386/kernel/pci-dma-xen.c.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/mm.h>
-#include <asm/scatterlist.h>
-
-#define IOMMU_BUG_ON(test)                                     \
-do {                                                           \
-       if (unlikely(test)) {                                   \
-               printk(KERN_ALERT "Fatal DMA error!\n");        \
-               BUG();                                          \
-       }                                                       \
-} while (0)
-
-
-/*
- * This should be broken out of swiotlb and put in a common place
- * when merged with upstream Linux.
- */
-static inline int
-address_needs_mapping(struct device *hwdev, dma_addr_t addr)
-{
-       dma_addr_t mask = 0xffffffff;
-
-       /* If the device has a mask, use it, otherwise default to 32 bits */
-       if (hwdev && hwdev->dma_mask)
-               mask = *hwdev->dma_mask;
-       return (addr & ~mask) != 0;
-}
-
-int
-xen_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-          int direction)
-{
-       int i;
-
-       for (i = 0 ; i < nents ; i++) {
-               sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset;
-               sg[i].dma_length  = sg[i].length;
-
-               IOMMU_BUG_ON(address_needs_mapping(hwdev, sg[i].dma_address));
-       }
-
-       return nents;
-}
-EXPORT_SYMBOL(xen_map_sg);
-
-void
-xen_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-            int direction)
-{
-}
-EXPORT_SYMBOL(xen_unmap_sg);
-
-int
-xen_dma_mapping_error(dma_addr_t dma_addr)
-{
-       return 0;
-}
-EXPORT_SYMBOL(xen_dma_mapping_error);
-
-int
-xen_dma_supported(struct device *dev, u64 mask)
-{
-       return 1;
-}
-EXPORT_SYMBOL(xen_dma_supported);
-
-void *
-xen_alloc_coherent(struct device *dev, size_t size,
-                  dma_addr_t *dma_handle, gfp_t gfp)
-{
-       unsigned long vaddr;
-       unsigned int order = get_order(size);
-
-       vaddr = __get_free_pages(gfp, order);
-
-       if (!vaddr)
-               return NULL;
-
-       if (xen_create_contiguous_region(vaddr, order,
-                                        dev->coherent_dma_mask)) {
-               free_pages(vaddr, order);
-               return NULL;
-       }
-
-       memset((void *)vaddr, 0, size);
-       *dma_handle = virt_to_bus((void *)vaddr);
-
-       return (void *)vaddr;
-}
-EXPORT_SYMBOL(xen_alloc_coherent);
-
-void
-xen_free_coherent(struct device *dev, size_t size,
-                     void *vaddr, dma_addr_t dma_handle)
-{
-       unsigned int order =  get_order(size);
-
-       xen_destroy_contiguous_region((unsigned long)vaddr, order);
-       free_pages((unsigned long)vaddr, order);
-}
-EXPORT_SYMBOL(xen_free_coherent);
-
-dma_addr_t
-xen_map_single(struct device *dev, void *ptr, size_t size,
-              int direction)
-{
-       dma_addr_t dma_addr = virt_to_bus(ptr);
-
-       IOMMU_BUG_ON(range_straddles_page_boundary(ptr, size));
-       IOMMU_BUG_ON(address_needs_mapping(dev, dma_addr));
-
-       return dma_addr;
-}
-EXPORT_SYMBOL(xen_map_single);
-
-void
-xen_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                int direction)
-{
-}
-EXPORT_SYMBOL(xen_unmap_single);
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xencomm.c b/linux-2.6-xen-sparse/arch/ia64/xen/xencomm.c
deleted file mode 100644 (file)
index 367b6b3..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-
-#include <linux/gfp.h>
-#include <linux/mm.h>
-#include <xen/interface/xen.h>
-#include <asm/page.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#include <asm/xen/xencomm.h>
-
-static int xencomm_debug = 0;
-
-static unsigned long kernel_start_pa;
-
-void
-xencomm_init (void)
-{
-       kernel_start_pa = KERNEL_START - ia64_tpa(KERNEL_START);
-}
-
-/* Translate virtual address to physical address.  */
-unsigned long
-xencomm_vaddr_to_paddr(unsigned long vaddr)
-{
-#ifndef CONFIG_VMX_GUEST
-       struct page *page;
-       struct vm_area_struct *vma;
-#endif
-
-       if (vaddr == 0)
-               return 0;
-
-#ifdef __ia64__
-       if (REGION_NUMBER(vaddr) == 5) {
-               pgd_t *pgd;
-               pud_t *pud;
-               pmd_t *pmd;
-               pte_t *ptep;
-
-               /* On ia64, TASK_SIZE refers to current.  It is not initialized
-                  during boot.
-                  Furthermore the kernel is relocatable and __pa() doesn't
-                  work on  addresses.  */
-               if (vaddr >= KERNEL_START
-                   && vaddr < (KERNEL_START + KERNEL_TR_PAGE_SIZE)) {
-                       return vaddr - kernel_start_pa;
-               }
-
-               /* In kernel area -- virtually mapped.  */
-               pgd = pgd_offset_k(vaddr);
-               if (pgd_none(*pgd) || pgd_bad(*pgd))
-                       return ~0UL;
-
-               pud = pud_offset(pgd, vaddr);
-               if (pud_none(*pud) || pud_bad(*pud))
-                       return ~0UL;
-
-               pmd = pmd_offset(pud, vaddr);
-               if (pmd_none(*pmd) || pmd_bad(*pmd))
-                       return ~0UL;
-
-               ptep = pte_offset_kernel(pmd, vaddr);
-               if (!ptep)
-                       return ~0UL;
-
-               return (pte_val(*ptep) & _PFN_MASK) | (vaddr & ~PAGE_MASK);
-       }
-#endif
-
-       if (vaddr > TASK_SIZE) {
-               /* kernel address */
-               return __pa(vaddr);
-       }
-
-
-#ifdef CONFIG_VMX_GUEST
-       /* No privcmd within vmx guest.  */
-       return ~0UL;
-#else
-       /* XXX double-check (lack of) locking */
-       vma = find_extend_vma(current->mm, vaddr);
-       if (!vma)
-               return ~0UL;
-
-       /* We assume the page is modified.  */
-       page = follow_page(vma, vaddr, FOLL_WRITE | FOLL_TOUCH);
-       if (!page)
-               return ~0UL;
-
-       return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK);
-#endif
-}
-
-static int
-xencomm_init_desc(struct xencomm_desc *desc, void *buffer, unsigned long bytes)
-{
-       unsigned long recorded = 0;
-       int i = 0;
-
-       BUG_ON((buffer == NULL) && (bytes > 0));
-
-       /* record the physical pages used */
-       if (buffer == NULL)
-               desc->nr_addrs = 0;
-
-       while ((recorded < bytes) && (i < desc->nr_addrs)) {
-               unsigned long vaddr = (unsigned long)buffer + recorded;
-               unsigned long paddr;
-               int offset;
-               int chunksz;
-
-               offset = vaddr % PAGE_SIZE; /* handle partial pages */
-               chunksz = min(PAGE_SIZE - offset, bytes - recorded);
-
-               paddr = xencomm_vaddr_to_paddr(vaddr);
-               if (paddr == ~0UL) {
-                       printk("%s: couldn't translate vaddr %lx\n",
-                              __func__, vaddr);
-                       return -EINVAL;
-               }
-
-               desc->address[i++] = paddr;
-               recorded += chunksz;
-       }
-
-       if (recorded < bytes) {
-               printk("%s: could only translate %ld of %ld bytes\n",
-                      __func__, recorded, bytes);
-               return -ENOSPC;
-       }
-
-       /* mark remaining addresses invalid (just for safety) */
-       while (i < desc->nr_addrs)
-               desc->address[i++] = XENCOMM_INVALID;
-
-       desc->magic = XENCOMM_MAGIC;
-
-       return 0;
-}
-
-static struct xencomm_desc *
-xencomm_alloc(gfp_t gfp_mask)
-{
-       struct xencomm_desc *desc;
-
-       desc = (struct xencomm_desc *)__get_free_page(gfp_mask);
-       if (desc == NULL)
-               panic("%s: page allocation failed\n", __func__);
-
-       desc->nr_addrs = (PAGE_SIZE - sizeof(struct xencomm_desc)) /
-                        sizeof(*desc->address);
-
-       return desc;
-}
-
-void
-xencomm_free(struct xencomm_handle *desc)
-{
-       if (desc)
-               free_page((unsigned long)__va(desc));
-}
-
-int
-xencomm_create(void *buffer, unsigned long bytes,
-               struct xencomm_handle **ret, gfp_t gfp_mask)
-{
-       struct xencomm_desc *desc;
-       struct xencomm_handle *handle;
-       int rc;
-
-       if (xencomm_debug)
-               printk("%s: %p[%ld]\n", __func__, buffer, bytes);
-
-       if (buffer == NULL || bytes == 0) {
-               *ret = (struct xencomm_handle *)NULL;
-               return 0;
-       }
-
-       desc = xencomm_alloc(gfp_mask);
-       if (!desc) {
-               printk("%s failure\n", "xencomm_alloc");
-               return -ENOMEM;
-       }
-       handle = (struct xencomm_handle *)__pa(desc);
-
-       rc = xencomm_init_desc(desc, buffer, bytes);
-       if (rc) {
-               printk("%s failure: %d\n", "xencomm_init_desc", rc);
-               xencomm_free(handle);
-               return rc;
-       }
-
-       *ret = handle;
-       return 0;
-}
-
-/* "mini" routines, for stack-based communications: */
-
-static void *
-xencomm_alloc_mini(struct xencomm_mini *area, int *nbr_area)
-{
-       unsigned long base;
-       unsigned int pageoffset;
-
-       while (*nbr_area >= 0) {
-               /* Allocate an area.  */
-               (*nbr_area)--;
-
-               base = (unsigned long)(area + *nbr_area);
-               pageoffset = base % PAGE_SIZE;
-
-               /* If the area does not cross a page, use it.  */
-               if ((PAGE_SIZE - pageoffset) >= sizeof(struct xencomm_mini))
-                       return &area[*nbr_area];
-       }
-       /* No more area.  */
-       return NULL;
-}
-
-int
-xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
-                    void *buffer, unsigned long bytes,
-                    struct xencomm_handle **ret)
-{
-       struct xencomm_desc *desc;
-       int rc;
-       unsigned long res;
-
-       desc = xencomm_alloc_mini(area, nbr_area);
-       if (!desc)
-               return -ENOMEM;
-       desc->nr_addrs = XENCOMM_MINI_ADDRS;
-
-       rc = xencomm_init_desc(desc, buffer, bytes);
-       if (rc)
-               return rc;
-
-       res = xencomm_vaddr_to_paddr((unsigned long)desc);
-       if (res == ~0UL)
-               return -EINVAL;
-
-       *ret = (struct xencomm_handle*)res;
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S b/linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S
deleted file mode 100644 (file)
index b9394ab..0000000
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- * ia64/xen/entry.S
- *
- * Alternate kernel routines for Xen.  Heavily leveraged from
- *   ia64/kernel/entry.S
- *
- * Copyright (C) 2005 Hewlett-Packard Co
- *     Dan Magenheimer <dan.magenheimer@.hp.com>
- */
-
-#include <asm/asmmacro.h>
-#include <asm/cache.h>
-#include <asm/errno.h>
-#include <asm/kregs.h>
-#include <asm/asm-offsets.h>
-#include <asm/pgtable.h>
-#include <asm/percpu.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/unistd.h>
-
-#ifdef CONFIG_XEN
-#include "xenminstate.h"
-#else
-#include "minstate.h"
-#endif
-
-/*
- * prev_task <- ia64_switch_to(struct task_struct *next)
- *     With Ingo's new scheduler, interrupts are disabled when this routine gets
- *     called.  The code starting at .map relies on this.  The rest of the code
- *     doesn't care about the interrupt masking status.
- */
-#ifdef CONFIG_XEN
-GLOBAL_ENTRY(xen_switch_to)
-       .prologue
-       alloc r16=ar.pfs,1,0,0,0
-       movl r22=running_on_xen;;
-       ld4 r22=[r22];;
-       cmp.eq p7,p0=r22,r0
-(p7)   br.cond.sptk.many __ia64_switch_to;;
-#else
-GLOBAL_ENTRY(ia64_switch_to)
-       .prologue
-       alloc r16=ar.pfs,1,0,0,0
-#endif
-       DO_SAVE_SWITCH_STACK
-       .body
-
-       adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
-       movl r25=init_task
-       mov r27=IA64_KR(CURRENT_STACK)
-       adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
-       dep r20=0,in0,61,3              // physical address of "next"
-       ;;
-       st8 [r22]=sp                    // save kernel stack pointer of old task
-       shr.u r26=r20,IA64_GRANULE_SHIFT
-       cmp.eq p7,p6=r25,in0
-       ;;
-       /*
-        * If we've already mapped this task's page, we can skip doing it again.
-        */
-(p6)   cmp.eq p7,p6=r26,r27
-(p6)   br.cond.dpnt .map
-       ;;
-.done:
-       ld8 sp=[r21]                    // load kernel stack pointer of new task
-#ifdef CONFIG_XEN
-       // update "current" application register
-       mov r8=IA64_KR_CURRENT
-       mov r9=in0;;
-       XEN_HYPER_SET_KR
-#else
-       mov IA64_KR(CURRENT)=in0        // update "current" application register
-#endif
-       mov r8=r13                      // return pointer to previously running task
-       mov r13=in0                     // set "current" pointer
-       ;;
-       DO_LOAD_SWITCH_STACK
-
-#ifdef CONFIG_SMP
-       sync.i                          // ensure "fc"s done by this CPU are visible on other CPUs
-#endif
-       br.ret.sptk.many rp             // boogie on out in new context
-
-.map:
-#ifdef CONFIG_XEN
-    movl r25=XSI_PSR_IC                        // clear psr.ic
-    ;;
-    st4 [r25]=r0
-    ;;
-#else
-       rsm psr.ic                      // interrupts (psr.i) are already disabled here
-#endif
-       movl r25=PAGE_KERNEL
-       ;;
-       srlz.d
-       or r23=r25,r20                  // construct PA | page properties
-       mov r25=IA64_GRANULE_SHIFT<<2
-       ;;
-#ifdef CONFIG_XEN
-       movl r8=XSI_ITIR
-       ;;
-       st8 [r8]=r25
-       ;;
-       movl r8=XSI_IFA
-       ;;
-       st8 [r8]=in0                     // VA of next task...
-       ;;
-       mov r25=IA64_TR_CURRENT_STACK
-       // remember last page we mapped...
-       mov r8=IA64_KR_CURRENT_STACK
-       mov r9=r26;;
-       XEN_HYPER_SET_KR;;
-#else
-       mov cr.itir=r25
-       mov cr.ifa=in0                  // VA of next task...
-       ;;
-       mov r25=IA64_TR_CURRENT_STACK
-       mov IA64_KR(CURRENT_STACK)=r26  // remember last page we mapped...
-#endif
-       ;;
-       itr.d dtr[r25]=r23              // wire in new mapping...
-#ifdef CONFIG_XEN
-       ;;
-       srlz.d
-       mov r9=1
-       movl r8=XSI_PSR_IC
-       ;;
-       st4 [r8]=r9
-       ;;
-#else    
-       ssm psr.ic                      // reenable the psr.ic bit
-       ;;
-       srlz.d
-#endif
-       br.cond.sptk .done
-#ifdef CONFIG_XEN
-END(xen_switch_to)
-#else
-END(ia64_switch_to)
-#endif
-
-       /*
-        * Invoke a system call, but do some tracing before and after the call.
-        * We MUST preserve the current register frame throughout this routine
-        * because some system calls (such as ia64_execve) directly
-        * manipulate ar.pfs.
-        */
-#ifdef CONFIG_XEN
-GLOBAL_ENTRY(xen_trace_syscall)
-       PT_REGS_UNWIND_INFO(0)
-       movl r16=running_on_xen;;
-       ld4 r16=[r16];;
-       cmp.eq p7,p0=r16,r0
-(p7)   br.cond.sptk.many __ia64_trace_syscall;;
-#else
-GLOBAL_ENTRY(ia64_trace_syscall)
-       PT_REGS_UNWIND_INFO(0)
-#endif
-       /*
-        * We need to preserve the scratch registers f6-f11 in case the system
-        * call is sigreturn.
-        */
-       adds r16=PT(F6)+16,sp
-       adds r17=PT(F7)+16,sp
-       ;;
-       stf.spill [r16]=f6,32
-       stf.spill [r17]=f7,32
-       ;;
-       stf.spill [r16]=f8,32
-       stf.spill [r17]=f9,32
-       ;;
-       stf.spill [r16]=f10
-       stf.spill [r17]=f11
-       br.call.sptk.many rp=syscall_trace_enter // give parent a chance to catch syscall args
-       adds r16=PT(F6)+16,sp
-       adds r17=PT(F7)+16,sp
-       ;;
-       ldf.fill f6=[r16],32
-       ldf.fill f7=[r17],32
-       ;;
-       ldf.fill f8=[r16],32
-       ldf.fill f9=[r17],32
-       ;;
-       ldf.fill f10=[r16]
-       ldf.fill f11=[r17]
-       // the syscall number may have changed, so re-load it and re-calculate the
-       // syscall entry-point:
-       adds r15=PT(R15)+16,sp                  // r15 = &pt_regs.r15 (syscall #)
-       ;;
-       ld8 r15=[r15]
-       mov r3=NR_syscalls - 1
-       ;;
-       adds r15=-1024,r15
-       movl r16=sys_call_table
-       ;;
-       shladd r20=r15,3,r16                    // r20 = sys_call_table + 8*(syscall-1024)
-       cmp.leu p6,p7=r15,r3
-       ;;
-(p6)   ld8 r20=[r20]                           // load address of syscall entry point
-(p7)   movl r20=sys_ni_syscall
-       ;;
-       mov b6=r20
-       br.call.sptk.many rp=b6                 // do the syscall
-.strace_check_retval:
-       cmp.lt p6,p0=r8,r0                      // syscall failed?
-       adds r2=PT(R8)+16,sp                    // r2 = &pt_regs.r8
-       adds r3=PT(R10)+16,sp                   // r3 = &pt_regs.r10
-       mov r10=0
-(p6)   br.cond.sptk strace_error               // syscall failed ->
-       ;;                                      // avoid RAW on r10
-.strace_save_retval:
-.mem.offset 0,0; st8.spill [r2]=r8             // store return value in slot for r8
-.mem.offset 8,0; st8.spill [r3]=r10            // clear error indication in slot for r10
-       br.call.sptk.many rp=syscall_trace_leave // give parent a chance to catch return value
-.ret3:
-(pUStk)        cmp.eq.unc p6,p0=r0,r0                  // p6 <- pUStk
-       br.cond.sptk .work_pending_syscall_end
-
-strace_error:
-       ld8 r3=[r2]                             // load pt_regs.r8
-       sub r9=0,r8                             // negate return value to get errno value
-       ;;
-       cmp.ne p6,p0=r3,r0                      // is pt_regs.r8!=0?
-       adds r3=16,r2                           // r3=&pt_regs.r10
-       ;;
-(p6)   mov r10=-1
-(p6)   mov r8=r9
-       br.cond.sptk .strace_save_retval
-#ifdef CONFIG_XEN
-END(xen_trace_syscall)
-#else
-END(ia64_trace_syscall)
-#endif
-
-#ifdef CONFIG_XEN
-GLOBAL_ENTRY(xen_ret_from_clone)
-       PT_REGS_UNWIND_INFO(0)
-       movl r16=running_on_xen;;
-       ld4 r16=[r16];;
-       cmp.eq p7,p0=r16,r0
-(p7)   br.cond.sptk.many __ia64_ret_from_clone;;
-#else  
-GLOBAL_ENTRY(ia64_ret_from_clone)
-       PT_REGS_UNWIND_INFO(0)
-#endif 
-{      /*
-        * Some versions of gas generate bad unwind info if the first instruction of a
-        * procedure doesn't go into the first slot of a bundle.  This is a workaround.
-        */
-       nop.m 0
-       nop.i 0
-       /*
-        * We need to call schedule_tail() to complete the scheduling process.
-        * Called by ia64_switch_to() after do_fork()->copy_thread().  r8 contains the
-        * address of the previously executing task.
-        */
-       br.call.sptk.many rp=ia64_invoke_schedule_tail
-}
-.ret8:
-       adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-       ld4 r2=[r2]
-       ;;
-       mov r8=0
-       and r2=_TIF_SYSCALL_TRACEAUDIT,r2
-       ;;
-       cmp.ne p6,p0=r2,r0
-(p6)   br.cond.spnt .strace_check_retval
-       ;;                                      // added stop bits to prevent r8 dependency
-#ifdef CONFIG_XEN
-       br.cond.sptk ia64_ret_from_syscall
-END(xen_ret_from_clone)
-#else
-END(ia64_ret_from_clone)
-#endif         
-/*
- * ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't
- *     need to switch to bank 0 and doesn't restore the scratch registers.
- *     To avoid leaking kernel bits, the scratch registers are set to
- *     the following known-to-be-safe values:
- *
- *               r1: restored (global pointer)
- *               r2: cleared
- *               r3: 1 (when returning to user-level)
- *           r8-r11: restored (syscall return value(s))
- *              r12: restored (user-level stack pointer)
- *              r13: restored (user-level thread pointer)
- *              r14: set to __kernel_syscall_via_epc
- *              r15: restored (syscall #)
- *          r16-r17: cleared
- *              r18: user-level b6
- *              r19: cleared
- *              r20: user-level ar.fpsr
- *              r21: user-level b0
- *              r22: cleared
- *              r23: user-level ar.bspstore
- *              r24: user-level ar.rnat
- *              r25: user-level ar.unat
- *              r26: user-level ar.pfs
- *              r27: user-level ar.rsc
- *              r28: user-level ip
- *              r29: user-level psr
- *              r30: user-level cfm
- *              r31: user-level pr
- *           f6-f11: cleared
- *               pr: restored (user-level pr)
- *               b0: restored (user-level rp)
- *               b6: restored
- *               b7: set to __kernel_syscall_via_epc
- *          ar.unat: restored (user-level ar.unat)
- *           ar.pfs: restored (user-level ar.pfs)
- *           ar.rsc: restored (user-level ar.rsc)
- *          ar.rnat: restored (user-level ar.rnat)
- *      ar.bspstore: restored (user-level ar.bspstore)
- *          ar.fpsr: restored (user-level ar.fpsr)
- *           ar.ccv: cleared
- *           ar.csd: cleared
- *           ar.ssd: cleared
- */
-#ifdef CONFIG_XEN
-GLOBAL_ENTRY(xen_leave_syscall)
-       PT_REGS_UNWIND_INFO(0)
-       movl r22=running_on_xen;;
-       ld4 r22=[r22];;
-       cmp.eq p7,p0=r22,r0
-(p7)   br.cond.sptk.many __ia64_leave_syscall;;
-#else
-ENTRY(ia64_leave_syscall)
-       PT_REGS_UNWIND_INFO(0)
-#endif
-       /*
-        * work.need_resched etc. mustn't get changed by this CPU before it returns to
-        * user- or fsys-mode, hence we disable interrupts early on.
-        *
-        * p6 controls whether current_thread_info()->flags needs to be check for
-        * extra work.  We always check for extra work when returning to user-level.
-        * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-        * is 0.  After extra work processing has been completed, execution
-        * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-        * needs to be redone.
-        */
-#ifdef CONFIG_PREEMPT
-       rsm psr.i                               // disable interrupts
-       cmp.eq pLvSys,p0=r0,r0                  // pLvSys=1: leave from syscall
-(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-       .pred.rel.mutex pUStk,pKStk
-(pKStk) ld4 r21=[r20]                  // r21 <- preempt_count
-(pUStk)        mov r21=0                       // r21 <- 0
-       ;;
-       cmp.eq p6,p0=r21,r0             // p6 <- pUStk || (preempt_count == 0)
-#else /* !CONFIG_PREEMPT */
-#ifdef CONFIG_XEN
-       movl r2=XSI_PSR_I_ADDR
-       mov r18=1
-       ;;
-       ld8 r2=[r2]
-       ;;
-(pUStk)        st1 [r2]=r18
-#else
-(pUStk)        rsm psr.i
-#endif
-       cmp.eq pLvSys,p0=r0,r0          // pLvSys=1: leave from syscall
-(pUStk)        cmp.eq.unc p6,p0=r0,r0          // p6 <- pUStk
-#endif
-.work_processed_syscall:
-       adds r2=PT(LOADRS)+16,r12
-       adds r3=PT(AR_BSPSTORE)+16,r12
-       adds r18=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-(p6)   ld4 r31=[r18]                           // load current_thread_info()->flags
-       ld8 r19=[r2],PT(B6)-PT(LOADRS)          // load ar.rsc value for "loadrs"
-       nop.i 0
-       ;;
-       mov r16=ar.bsp                          // M2  get existing backing store pointer
-       ld8 r18=[r2],PT(R9)-PT(B6)              // load b6
-(p6)   and r15=TIF_WORK_MASK,r31               // any work other than TIF_SYSCALL_TRACE?
-       ;;
-       ld8 r23=[r3],PT(R11)-PT(AR_BSPSTORE)    // load ar.bspstore (may be garbage)
-(p6)   cmp4.ne.unc p6,p0=r15, r0               // any special work pending?
-(p6)   br.cond.spnt .work_pending_syscall
-       ;;
-       // start restoring the state saved on the kernel stack (struct pt_regs):
-       ld8 r9=[r2],PT(CR_IPSR)-PT(R9)
-       ld8 r11=[r3],PT(CR_IIP)-PT(R11)
-(pNonSys) break 0              //      bug check: we shouldn't be here if pNonSys is TRUE!
-       ;;
-       invala                  // M0|1 invalidate ALAT
-#ifdef CONFIG_XEN
-       movl r28=XSI_PSR_I_ADDR
-       movl r29=XSI_PSR_IC
-       ;;
-       ld8 r28=[r28]
-       mov r30=1
-       ;;
-       st1     [r28]=r30
-       st4     [r29]=r0        // note: clears both vpsr.i and vpsr.ic!
-       ;;
-#else
-       rsm psr.i | psr.ic      // M2   turn off interrupts and interruption collection
-#endif
-       cmp.eq p9,p0=r0,r0      // A    set p9 to indicate that we should restore cr.ifs
-
-       ld8 r29=[r2],16         // M0|1 load cr.ipsr
-       ld8 r28=[r3],16         // M0|1 load cr.iip
-       mov r22=r0              // A    clear r22
-       ;;
-       ld8 r30=[r2],16         // M0|1 load cr.ifs
-       ld8 r25=[r3],16         // M0|1 load ar.unat
-(pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
-       ;;
-       ld8 r26=[r2],PT(B0)-PT(AR_PFS)  // M0|1 load ar.pfs
-#ifdef CONFIG_XEN
-(pKStk)        mov r21=r8
-(pKStk)        XEN_HYPER_GET_PSR
-       ;;
-(pKStk)        mov r22=r8
-(pKStk)        mov r8=r21
-       ;;
-#else    
-(pKStk)        mov r22=psr                     // M2   read PSR now that interrupts are disabled
-#endif
-       nop 0
-       ;;
-       ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
-       ld8 r27=[r3],PT(PR)-PT(AR_RSC)  // M0|1 load ar.rsc
-       mov f6=f0                       // F    clear f6
-       ;;
-       ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT)    // M0|1 load ar.rnat (may be garbage)
-       ld8 r31=[r3],PT(R1)-PT(PR)              // M0|1 load predicates
-       mov f7=f0                               // F    clear f7
-       ;;
-       ld8 r20=[r2],PT(R12)-PT(AR_FPSR)        // M0|1 load ar.fpsr
-       ld8.fill r1=[r3],16                     // M0|1 load r1
-(pUStk) mov r17=1                              // A
-       ;;
-(pUStk) st1 [r14]=r17                          // M2|3
-       ld8.fill r13=[r3],16                    // M0|1
-       mov f8=f0                               // F    clear f8
-       ;;
-       ld8.fill r12=[r2]                       // M0|1 restore r12 (sp)
-       ld8.fill r15=[r3]                       // M0|1 restore r15
-       mov b6=r18                              // I0   restore b6
-
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A
-       mov f9=f0                                       // F    clear f9
-(pKStk) br.cond.dpnt.many skip_rbs_switch              // B
-
-       srlz.d                          // M0   ensure interruption collection is off (for cover)
-       shr.u r18=r19,16                // I0|1 get byte size of existing "dirty" partition
-#ifdef CONFIG_XEN
-       XEN_HYPER_COVER;
-#else
-       cover                           // B    add current frame into dirty partition & set cr.ifs
-#endif
-       ;;
-(pUStk) ld4 r17=[r17]                  // M0|1 r17 = cpu_data->phys_stacked_size_p8
-       mov r19=ar.bsp                  // M2   get new backing store pointer
-       mov f10=f0                      // F    clear f10
-
-       nop.m 0
-       movl r14=__kernel_syscall_via_epc // X
-       ;;
-       mov.m ar.csd=r0                 // M2   clear ar.csd
-       mov.m ar.ccv=r0                 // M2   clear ar.ccv
-       mov b7=r14                      // I0   clear b7 (hint with __kernel_syscall_via_epc)
-
-       mov.m ar.ssd=r0                 // M2   clear ar.ssd
-       mov f11=f0                      // F    clear f11
-       br.cond.sptk.many rbs_switch    // B
-#ifdef CONFIG_XEN
-END(xen_leave_syscall)
-#else
-END(ia64_leave_syscall)
-#endif
-
-#ifdef CONFIG_XEN
-GLOBAL_ENTRY(xen_leave_kernel)
-       PT_REGS_UNWIND_INFO(0)
-       movl r22=running_on_xen;;
-       ld4 r22=[r22];;
-       cmp.eq p7,p0=r22,r0
-(p7)   br.cond.sptk.many __ia64_leave_kernel;;
-#else
-GLOBAL_ENTRY(ia64_leave_kernel)
-       PT_REGS_UNWIND_INFO(0)
-#endif
-       /*
-        * work.need_resched etc. mustn't get changed by this CPU before it returns to
-        * user- or fsys-mode, hence we disable interrupts early on.
-        *
-        * p6 controls whether current_thread_info()->flags needs to be check for
-        * extra work.  We always check for extra work when returning to user-level.
-        * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-        * is 0.  After extra work processing has been completed, execution
-        * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-        * needs to be redone.
-        */
-#ifdef CONFIG_PREEMPT
-       rsm psr.i                               // disable interrupts
-       cmp.eq p0,pLvSys=r0,r0                  // pLvSys=0: leave from kernel
-(pKStk)        adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-       .pred.rel.mutex pUStk,pKStk
-(pKStk)        ld4 r21=[r20]                   // r21 <- preempt_count
-(pUStk)        mov r21=0                       // r21 <- 0
-       ;;
-       cmp.eq p6,p0=r21,r0             // p6 <- pUStk || (preempt_count == 0)
-#else
-#ifdef CONFIG_XEN
-(pUStk)        movl r17=XSI_PSR_I_ADDR
-(pUStk)        mov r31=1
-               ;;
-(pUStk)        ld8 r17=[r17]
-               ;;
-(pUStk)        st1 [r17]=r31
-       ;;
-#else
-(pUStk)        rsm psr.i
-#endif
-       cmp.eq p0,pLvSys=r0,r0          // pLvSys=0: leave from kernel
-(pUStk)        cmp.eq.unc p6,p0=r0,r0          // p6 <- pUStk
-#endif
-.work_processed_kernel:
-       adds r17=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-(p6)   ld4 r31=[r17]                           // load current_thread_info()->flags
-       adds r21=PT(PR)+16,r12
-       ;;
-
-       lfetch [r21],PT(CR_IPSR)-PT(PR)
-       adds r2=PT(B6)+16,r12
-       adds r3=PT(R16)+16,r12
-       ;;
-       lfetch [r21]
-       ld8 r28=[r2],8          // load b6
-       adds r29=PT(R24)+16,r12
-
-       ld8.fill r16=[r3],PT(AR_CSD)-PT(R16)
-       adds r30=PT(AR_CCV)+16,r12
-(p6)   and r19=TIF_WORK_MASK,r31               // any work other than TIF_SYSCALL_TRACE?
-       ;;
-       ld8.fill r24=[r29]
-       ld8 r15=[r30]           // load ar.ccv
-(p6)   cmp4.ne.unc p6,p0=r19, r0               // any special work pending?
-       ;;
-       ld8 r29=[r2],16         // load b7
-       ld8 r30=[r3],16         // load ar.csd
-(p6)   br.cond.spnt .work_pending
-       ;;
-       ld8 r31=[r2],16         // load ar.ssd
-       ld8.fill r8=[r3],16
-       ;;
-       ld8.fill r9=[r2],16
-       ld8.fill r10=[r3],PT(R17)-PT(R10)
-       ;;
-       ld8.fill r11=[r2],PT(R18)-PT(R11)
-       ld8.fill r17=[r3],16
-       ;;
-       ld8.fill r18=[r2],16
-       ld8.fill r19=[r3],16
-       ;;
-       ld8.fill r20=[r2],16
-       ld8.fill r21=[r3],16
-       mov ar.csd=r30
-       mov ar.ssd=r31
-       ;;
-#ifdef CONFIG_XEN
-       movl r23=XSI_PSR_I_ADDR
-       movl r22=XSI_PSR_IC
-       ;;
-       ld8 r23=[r23]
-       mov r25=1
-       ;;
-       st1 [r23]=r25
-       st4 [r22]=r0            // note: clears both vpsr.i and vpsr.ic!
-       ;;
-#else
-       rsm psr.i | psr.ic      // initiate turning off of interrupt and interruption collection
-#endif
-       invala                  // invalidate ALAT
-       ;;
-       ld8.fill r22=[r2],24
-       ld8.fill r23=[r3],24
-       mov b6=r28
-       ;;
-       ld8.fill r25=[r2],16
-       ld8.fill r26=[r3],16
-       mov b7=r29
-       ;;
-       ld8.fill r27=[r2],16
-       ld8.fill r28=[r3],16
-       ;;
-       ld8.fill r29=[r2],16
-       ld8.fill r30=[r3],24
-       ;;
-       ld8.fill r31=[r2],PT(F9)-PT(R31)
-       adds r3=PT(F10)-PT(F6),r3
-       ;;
-       ldf.fill f9=[r2],PT(F6)-PT(F9)
-       ldf.fill f10=[r3],PT(F8)-PT(F10)
-       ;;
-       ldf.fill f6=[r2],PT(F7)-PT(F6)
-       ;;
-       ldf.fill f7=[r2],PT(F11)-PT(F7)
-       ldf.fill f8=[r3],32
-       ;;
-       srlz.d  // ensure that inter. collection is off (VHPT is don't care, since text is pinned)
-       mov ar.ccv=r15
-       ;;
-       ldf.fill f11=[r2]
-#ifdef CONFIG_XEN
-       ;;
-       // r16-r31 all now hold bank1 values
-       mov r15=ar.unat
-       movl r2=XSI_BANK1_R16
-       movl r3=XSI_BANK1_R16+8
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r16,16
-.mem.offset 8,0; st8.spill [r3]=r17,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r18,16
-.mem.offset 8,0; st8.spill [r3]=r19,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r20,16
-.mem.offset 8,0; st8.spill [r3]=r21,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r22,16
-.mem.offset 8,0; st8.spill [r3]=r23,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r24,16
-.mem.offset 8,0; st8.spill [r3]=r25,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r26,16
-.mem.offset 8,0; st8.spill [r3]=r27,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r28,16
-.mem.offset 8,0; st8.spill [r3]=r29,16
-       ;;
-.mem.offset 0,0; st8.spill [r2]=r30,16
-.mem.offset 8,0; st8.spill [r3]=r31,16
-       ;;
-       mov r3=ar.unat
-       movl r2=XSI_B1NAT
-       ;;
-       st8 [r2]=r3
-       mov ar.unat=r15
-       movl r2=XSI_BANKNUM;;
-       st4 [r2]=r0;
-#else
-       bsw.0                   // switch back to bank 0 (no stop bit required beforehand...)
-#endif
-       ;;
-(pUStk)        mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
-       adds r16=PT(CR_IPSR)+16,r12
-       adds r17=PT(CR_IIP)+16,r12
-
-#ifdef CONFIG_XEN    
-(pKStk)        mov r29=r8
-(pKStk)        XEN_HYPER_GET_PSR
-       ;;
-(pKStk)        mov r22=r8
-(pKStk)        mov r8=r29
-       ;;
-#else
-(pKStk)        mov r22=psr             // M2 read PSR now that interrupts are disabled
-#endif
-       nop.i 0
-       nop.i 0
-       ;;
-       ld8 r29=[r16],16        // load cr.ipsr
-       ld8 r28=[r17],16        // load cr.iip
-       ;;
-       ld8 r30=[r16],16        // load cr.ifs
-       ld8 r25=[r17],16        // load ar.unat
-       ;;
-       ld8 r26=[r16],16        // load ar.pfs
-       ld8 r27=[r17],16        // load ar.rsc
-       cmp.eq p9,p0=r0,r0      // set p9 to indicate that we should restore cr.ifs
-       ;;
-       ld8 r24=[r16],16        // load ar.rnat (may be garbage)
-       ld8 r23=[r17],16        // load ar.bspstore (may be garbage)
-       ;;
-       ld8 r31=[r16],16        // load predicates
-       ld8 r21=[r17],16        // load b0
-       ;;
-       ld8 r19=[r16],16        // load ar.rsc value for "loadrs"
-       ld8.fill r1=[r17],16    // load r1
-       ;;
-       ld8.fill r12=[r16],16
-       ld8.fill r13=[r17],16
-(pUStk)        adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18
-       ;;
-       ld8 r20=[r16],16        // ar.fpsr
-       ld8.fill r15=[r17],16
-       ;;
-       ld8.fill r14=[r16],16
-       ld8.fill r2=[r17]
-(pUStk)        mov r17=1
-       ;;
-       ld8.fill r3=[r16]
-(pUStk)        st1 [r18]=r17           // restore current->thread.on_ustack
-       shr.u r18=r19,16        // get byte size of existing "dirty" partition
-       ;;
-       mov r16=ar.bsp          // get existing backing store pointer
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
-       ;;
-       ld4 r17=[r17]           // r17 = cpu_data->phys_stacked_size_p8
-(pKStk)        br.cond.dpnt skip_rbs_switch
-
-       /*
-        * Restore user backing store.
-        *
-        * NOTE: alloc, loadrs, and cover can't be predicated.
-        */
-(pNonSys) br.cond.dpnt dont_preserve_current_frame
-
-#ifdef CONFIG_XEN
-       XEN_HYPER_COVER;
-#else
-       cover                           // add current frame into dirty partition and set cr.ifs
-#endif
-       ;;
-       mov r19=ar.bsp                  // get new backing store pointer
-rbs_switch:
-       sub r16=r16,r18                 // krbs = old bsp - size of dirty partition
-       cmp.ne p9,p0=r0,r0              // clear p9 to skip restore of cr.ifs
-       ;;
-       sub r19=r19,r16                 // calculate total byte size of dirty partition
-       add r18=64,r18                  // don't force in0-in7 into memory...
-       ;;
-       shl r19=r19,16                  // shift size of dirty partition into loadrs position
-       ;;
-dont_preserve_current_frame:
-       /*
-        * To prevent leaking bits between the kernel and user-space,
-        * we must clear the stacked registers in the "invalid" partition here.
-        * Not pretty, but at least it's fast (3.34 registers/cycle on Itanium,
-        * 5 registers/cycle on McKinley).
-        */
-#      define pRecurse p6
-#      define pReturn  p7
-#ifdef CONFIG_ITANIUM
-#      define Nregs    10
-#else
-#      define Nregs    14
-#endif
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       shr.u loc1=r18,9                // RNaTslots <= floor(dirtySize / (64*8))
-       sub r17=r17,r18                 // r17 = (physStackedSize + 8) - dirtySize
-       ;;
-       mov ar.rsc=r19                  // load ar.rsc to be used for "loadrs"
-       shladd in0=loc1,3,r17
-       mov in1=0
-       ;;
-       TEXT_ALIGN(32)
-rse_clear_invalid:
-#ifdef CONFIG_ITANIUM
-       // cycle 0
- { .mii
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       cmp.lt pRecurse,p0=Nregs*8,in0  // if more than Nregs regs left to clear, (re)curse
-       add out0=-Nregs*8,in0
-}{ .mfb
-       add out1=1,in1                  // increment recursion count
-       nop.f 0
-       nop.b 0                         // can't do br.call here because of alloc (WAW on CFM)
-       ;;
-}{ .mfi        // cycle 1
-       mov loc1=0
-       nop.f 0
-       mov loc2=0
-}{ .mib
-       mov loc3=0
-       mov loc4=0
-(pRecurse) br.call.sptk.many b0=rse_clear_invalid
-
-}{ .mfi        // cycle 2
-       mov loc5=0
-       nop.f 0
-       cmp.ne pReturn,p0=r0,in1        // if recursion count != 0, we need to do a br.ret
-}{ .mib
-       mov loc6=0
-       mov loc7=0
-(pReturn) br.ret.sptk.many b0
-}
-#else /* !CONFIG_ITANIUM */
-       alloc loc0=ar.pfs,2,Nregs-2,2,0
-       cmp.lt pRecurse,p0=Nregs*8,in0  // if more than Nregs regs left to clear, (re)curse
-       add out0=-Nregs*8,in0
-       add out1=1,in1                  // increment recursion count
-       mov loc1=0
-       mov loc2=0
-       ;;
-       mov loc3=0
-       mov loc4=0
-       mov loc5=0
-       mov loc6=0
-       mov loc7=0
-(pRecurse) br.call.dptk.few b0=rse_clear_invalid
-       ;;
-       mov loc8=0
-       mov loc9=0
-       cmp.ne pReturn,p0=r0,in1        // if recursion count != 0, we need to do a br.ret
-       mov loc10=0
-       mov loc11=0
-(pReturn) br.ret.dptk.many b0
-#endif /* !CONFIG_ITANIUM */
-#      undef pRecurse
-#      undef pReturn
-       ;;
-       alloc r17=ar.pfs,0,0,0,0        // drop current register frame
-       ;;
-       loadrs
-       ;;
-skip_rbs_switch:
-       mov ar.unat=r25         // M2
-(pKStk)        extr.u r22=r22,21,1     // I0 extract current value of psr.pp from r22
-(pLvSys)mov r19=r0             // A  clear r19 for leave_syscall, no-op otherwise
-       ;;
-(pUStk)        mov ar.bspstore=r23     // M2
-(pKStk)        dep r29=r22,r29,21,1    // I0 update ipsr.pp with psr.pp
-(pLvSys)mov r16=r0             // A  clear r16 for leave_syscall, no-op otherwise
-       ;;
-#ifdef CONFIG_XEN
-       movl r25=XSI_IPSR
-       ;;
-       st8[r25]=r29,XSI_IFS_OFS-XSI_IPSR_OFS
-       ;;
-#else
-       mov cr.ipsr=r29         // M2
-#endif
-       mov ar.pfs=r26          // I0
-(pLvSys)mov r17=r0             // A  clear r17 for leave_syscall, no-op otherwise
-
-#ifdef CONFIG_XEN
-(p9)   st8 [r25]=r30
-       ;;
-       adds r25=XSI_IIP_OFS-XSI_IFS_OFS,r25
-       ;;
-#else
-(p9)   mov cr.ifs=r30          // M2
-#endif
-       mov b0=r21              // I0
-(pLvSys)mov r18=r0             // A  clear r18 for leave_syscall, no-op otherwise
-
-       mov ar.fpsr=r20         // M2
-#ifdef CONFIG_XEN
-       st8     [r25]=r28
-#else
-       mov cr.iip=r28          // M2
-#endif
-       nop 0
-       ;;
-(pUStk)        mov ar.rnat=r24         // M2 must happen with RSE in lazy mode
-       nop 0
-(pLvSys)mov r2=r0
-
-       mov ar.rsc=r27          // M2
-       mov pr=r31,-1           // I0
-#ifdef CONFIG_XEN
-       ;;
-       XEN_HYPER_RFI;
-#else
-       rfi                     // B
-#endif
-
-       /*
-        * On entry:
-        *      r20 = &current->thread_info->pre_count (if CONFIG_PREEMPT)
-        *      r31 = current->thread_info->flags
-        * On exit:
-        *      p6 = TRUE if work-pending-check needs to be redone
-        */
-.work_pending_syscall:
-       add r2=-8,r2
-       add r3=-8,r3
-       ;;
-       st8 [r2]=r8
-       st8 [r3]=r10
-.work_pending:
-       tbit.z p6,p0=r31,TIF_NEED_RESCHED               // current_thread_info()->need_resched==0?
-(p6)   br.cond.sptk.few .notify
-#ifdef CONFIG_PREEMPT
-(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1
-       ;;
-(pKStk) st4 [r20]=r21
-       ssm psr.i               // enable interrupts
-#endif
-       br.call.spnt.many rp=schedule
-.ret9: cmp.eq p6,p0=r0,r0                              // p6 <- 1
-#ifdef CONFIG_XEN
-       movl r2=XSI_PSR_I_ADDR
-       mov r20=1
-       ;;
-       ld8 r2=[r2]
-       ;;
-       st1 [r2]=r20
-#else
-       rsm psr.i               // disable interrupts
-#endif
-       ;;
-#ifdef CONFIG_PREEMPT
-(pKStk)        adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-       ;;
-(pKStk)        st4 [r20]=r0            // preempt_count() <- 0
-#endif
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-       br.cond.sptk.many .work_processed_kernel        // re-check
-
-.notify:
-(pUStk)        br.call.spnt.many rp=notify_resume_user
-.ret10:        cmp.ne p6,p0=r0,r0                              // p6 <- 0
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-       br.cond.sptk.many .work_processed_kernel        // don't re-check
-
-.work_pending_syscall_end:
-       adds r2=PT(R8)+16,r12
-       adds r3=PT(R10)+16,r12
-       ;;
-       ld8 r8=[r2]
-       ld8 r10=[r3]
-       br.cond.sptk.many .work_processed_syscall       // re-check
-
-#ifdef CONFIG_XEN
-END(xen_leave_kernel)
-#else
-END(ia64_leave_kernel)
-#endif
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenhpski.c b/linux-2.6-xen-sparse/arch/ia64/xen/xenhpski.c
deleted file mode 100644 (file)
index 3bc6cdb..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-
-extern unsigned long xen_get_cpuid(int);
-
-int
-running_on_sim(void)
-{
-       int i;
-       long cpuid[6];
-
-       for (i = 0; i < 5; ++i)
-               cpuid[i] = xen_get_cpuid(i);
-       if ((cpuid[0] & 0xff) != 'H') return 0;
-       if ((cpuid[3] & 0xff) != 0x4) return 0;
-       if (((cpuid[3] >> 8) & 0xff) != 0x0) return 0;
-       if (((cpuid[3] >> 16) & 0xff) != 0x0) return 0;
-       if (((cpuid[3] >> 24) & 0x7) != 0x7) return 0;
-       return 1;
-}
-
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S b/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S
deleted file mode 100644 (file)
index a411bb3..0000000
+++ /dev/null
@@ -1,2177 +0,0 @@
-/*
- * arch/ia64/xen/ivt.S
- *
- * Copyright (C) 2005 Hewlett-Packard Co
- *     Dan Magenheimer <dan.magenheimer@hp.com>
- */
-/*
- * This file defines the interruption vector table used by the CPU.
- * It does not include one entry per possible cause of interruption.
- *
- * The first 20 entries of the table contain 64 bundles each while the
- * remaining 48 entries contain only 16 bundles each.
- *
- * The 64 bundles are used to allow inlining the whole handler for critical
- * interruptions like TLB misses.
- *
- *  For each entry, the comment is as follows:
- *
- *             // 0x1c00 Entry 7 (size 64 bundles) Data Key Miss (12,51)
- *  entry offset ----/     /         /                  /          /
- *  entry number ---------/         /                  /          /
- *  size of the entry -------------/                  /          /
- *  vector name -------------------------------------/          /
- *  interruptions triggering this vector ----------------------/
- *
- * The table is 32KB in size and must be aligned on 32KB boundary.
- * (The CPU ignores the 15 lower bits of the address)
- *
- * Table is based upon EAS2.6 (Oct 1999)
- */
-
-#include <asm/asmmacro.h>
-#include <asm/break.h>
-#include <asm/ia32.h>
-#include <asm/kregs.h>
-#include <asm/asm-offsets.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-#include <asm/thread_info.h>
-#include <asm/unistd.h>
-#include <asm/errno.h>
-
-#ifdef CONFIG_XEN
-#define ia64_ivt xen_ivt
-#endif
-
-#if 1
-# define PSR_DEFAULT_BITS      psr.ac
-#else
-# define PSR_DEFAULT_BITS      0
-#endif
-
-#if 0
-  /*
-   * This lets you track the last eight faults that occurred on the CPU.  Make sure ar.k2 isn't
-   * needed for something else before enabling this...
-   */
-# define DBG_FAULT(i)  mov r16=ar.k2;; shl r16=r16,8;; add r16=(i),r16;;mov ar.k2=r16
-#else
-# define DBG_FAULT(i)
-#endif
-
-#define MINSTATE_VIRT  /* needed by minstate.h */
-#include "xenminstate.h"
-
-#define FAULT(n)                                                                       \
-       mov r31=pr;                                                                     \
-       mov r19=n;;                     /* prepare to save predicates */                \
-       br.sptk.many dispatch_to_fault_handler
-
-       .section .text.ivt,"ax"
-
-       .align 32768    // align on 32KB boundary
-       .global ia64_ivt
-ia64_ivt:
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x0000 Entry 0 (size 64 bundles) VHPT Translation (8,20,47)
-ENTRY(vhpt_miss)
-       DBG_FAULT(0)
-       /*
-        * The VHPT vector is invoked when the TLB entry for the virtual page table
-        * is missing.  This happens only as a result of a previous
-        * (the "original") TLB miss, which may either be caused by an instruction
-        * fetch or a data access (or non-access).
-        *
-        * What we do here is normal TLB miss handing for the _original_ miss,
-        * followed by inserting the TLB entry for the virtual page table page
-        * that the VHPT walker was attempting to access.  The latter gets
-        * inserted as long as page table entry above pte level have valid
-        * mappings for the faulting address.  The TLB entry for the original
-        * miss gets inserted only if the pte entry indicates that the page is
-        * present.
-        *
-        * do_page_fault gets invoked in the following cases:
-        *      - the faulting virtual address uses unimplemented address bits
-        *      - the faulting virtual address has no valid page table mapping
-        */
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-#ifdef CONFIG_HUGETLB_PAGE
-       movl r18=PAGE_SHIFT
-       movl r25=XSI_ITIR
-       ;;
-       ld8 r25=[r25]
-#endif
-       ;;
-#else
-       mov r16=cr.ifa                          // get address that caused the TLB miss
-#ifdef CONFIG_HUGETLB_PAGE
-       movl r18=PAGE_SHIFT
-       mov r25=cr.itir
-#endif
-#endif
-       ;;
-#ifdef CONFIG_XEN
-       XEN_HYPER_RSM_PSR_DT;
-#else
-       rsm psr.dt                              // use physical addressing for data
-#endif
-       mov r31=pr                              // save the predicate registers
-       mov r19=IA64_KR(PT_BASE)                // get page table base address
-       shl r21=r16,3                           // shift bit 60 into sign bit
-       shr.u r17=r16,61                        // get the region number into r17
-       ;;
-       shr.u r22=r21,3
-#ifdef CONFIG_HUGETLB_PAGE
-       extr.u r26=r25,2,6
-       ;;
-       cmp.ne p8,p0=r18,r26
-       sub r27=r26,r18
-       ;;
-(p8)   dep r25=r18,r25,2,6
-(p8)   shr r22=r22,r27
-#endif
-       ;;
-       cmp.eq p6,p7=5,r17                      // is IFA pointing into to region 5?
-       shr.u r18=r22,PGDIR_SHIFT               // get bottom portion of pgd index bit
-       ;;
-(p7)   dep r17=r17,r19,(PAGE_SHIFT-3),3        // put region number bits in place
-
-       srlz.d
-       LOAD_PHYSICAL(p6, r19, swapper_pg_dir)  // region 5 is rooted at swapper_pg_dir
-
-       .pred.rel "mutex", p6, p7
-(p6)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
-(p7)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
-       ;;
-(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=pgd_offset for region 5
-(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=pgd_offset for region[0-4]
-       cmp.eq p7,p6=0,r21                      // unused address bits all zeroes?
-#ifdef CONFIG_PGTABLE_4
-       shr.u r28=r22,PUD_SHIFT                 // shift pud index into position
-#else
-       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
-#endif
-       ;;
-       ld8 r17=[r17]                           // get *pgd (may be 0)
-       ;;
-(p7)   cmp.eq p6,p7=r17,r0                     // was pgd_present(*pgd) == NULL?
-#ifdef CONFIG_PGTABLE_4
-       dep r28=r28,r17,3,(PAGE_SHIFT-3)        // r28=pud_offset(pgd,addr)
-       ;;
-       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
-(p7)   ld8 r29=[r28]                           // get *pud (may be 0)
-       ;;
-(p7)   cmp.eq.or.andcm p6,p7=r29,r0            // was pud_present(*pud) == NULL?
-       dep r17=r18,r29,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pud,addr)
-#else
-       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pgd,addr)
-#endif
-       ;;
-(p7)   ld8 r20=[r17]                           // get *pmd (may be 0)
-       shr.u r19=r22,PAGE_SHIFT                // shift pte index into position
-       ;;
-(p7)   cmp.eq.or.andcm p6,p7=r20,r0            // was pmd_present(*pmd) == NULL?
-       dep r21=r19,r20,3,(PAGE_SHIFT-3)        // r21=pte_offset(pmd,addr)
-       ;;
-(p7)   ld8 r18=[r21]                           // read *pte
-#ifdef CONFIG_XEN
-       movl r19=XSI_ISR
-       ;;
-       ld8 r19=[r19]
-#else
-       mov r19=cr.isr                          // cr.isr bit 32 tells us if this is an insn miss
-#endif
-       ;;
-(p7)   tbit.z p6,p7=r18,_PAGE_P_BIT            // page present bit cleared?
-#ifdef CONFIG_XEN
-       movl r22=XSI_IHA
-       ;;
-       ld8 r22=[r22]
-#else
-       mov r22=cr.iha                          // get the VHPT address that caused the TLB miss
-#endif
-       ;;                                      // avoid RAW on p7
-(p7)   tbit.nz.unc p10,p11=r19,32              // is it an instruction TLB miss?
-       dep r23=0,r20,0,PAGE_SHIFT              // clear low bits to get page address
-       ;;
-#ifdef CONFIG_XEN
-       mov r24=r8
-       mov r8=r18
-       ;;
-(p10)  XEN_HYPER_ITC_I
-       ;;
-(p11)  XEN_HYPER_ITC_D
-       ;;
-       mov r8=r24
-       ;;
-#else
-(p10)  itc.i r18                               // insert the instruction TLB entry
-(p11)  itc.d r18                               // insert the data TLB entry
-#endif
-(p6)   br.cond.spnt.many page_fault            // handle bad address/page not present (page fault)
-#ifdef CONFIG_XEN
-       movl r24=XSI_IFA
-       ;;
-       st8 [r24]=r22
-       ;;
-#else
-       mov cr.ifa=r22
-#endif
-
-#ifdef CONFIG_HUGETLB_PAGE
-(p8)   mov cr.itir=r25                         // change to default page-size for VHPT
-#endif
-
-       /*
-        * Now compute and insert the TLB entry for the virtual page table.  We never
-        * execute in a page table page so there is no need to set the exception deferral
-        * bit.
-        */
-       adds r24=__DIRTY_BITS_NO_ED|_PAGE_PL_0|_PAGE_AR_RW,r23
-       ;;
-#ifdef CONFIG_XEN
-(p7)   mov r25=r8
-(p7)   mov r8=r24
-       ;;
-(p7)   XEN_HYPER_ITC_D
-       ;;
-(p7)   mov r8=r25
-       ;;
-#else
-(p7)   itc.d r24
-#endif
-       ;;
-#ifdef CONFIG_SMP
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-
-       /*
-        * Re-check pagetable entry.  If they changed, we may have received a ptc.g
-        * between reading the pagetable and the "itc".  If so, flush the entry we
-        * inserted and retry.  At this point, we have:
-        *
-        * r28 = equivalent of pud_offset(pgd, ifa)
-        * r17 = equivalent of pmd_offset(pud, ifa)
-        * r21 = equivalent of pte_offset(pmd, ifa)
-        *
-        * r29 = *pud
-        * r20 = *pmd
-        * r18 = *pte
-        */
-       ld8 r25=[r21]                           // read *pte again
-       ld8 r26=[r17]                           // read *pmd again
-#ifdef CONFIG_PGTABLE_4
-       ld8 r19=[r28]                           // read *pud again
-#endif
-       cmp.ne p6,p7=r0,r0
-       ;;
-       cmp.ne.or.andcm p6,p7=r26,r20           // did *pmd change
-#ifdef CONFIG_PGTABLE_4
-       cmp.ne.or.andcm p6,p7=r19,r29           // did *pud change
-#endif
-       mov r27=PAGE_SHIFT<<2
-       ;;
-(p6)   ptc.l r22,r27                           // purge PTE page translation
-(p7)   cmp.ne.or.andcm p6,p7=r25,r18           // did *pte change
-       ;;
-(p6)   ptc.l r16,r27                           // purge translation
-#endif
-
-       mov pr=r31,-1                           // restore predicate registers
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(vhpt_miss)
-
-       .org ia64_ivt+0x400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x0400 Entry 1 (size 64 bundles) ITLB (21)
-ENTRY(itlb_miss)
-       DBG_FAULT(1)
-       /*
-        * The ITLB handler accesses the PTE via the virtually mapped linear
-        * page table.  If a nested TLB miss occurs, we switch into physical
-        * mode, walk the page table, and then re-execute the PTE read and
-        * go on normally after that.
-        */
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-#else
-       mov r16=cr.ifa                          // get virtual address
-#endif
-       mov r29=b0                              // save b0
-       mov r31=pr                              // save predicates
-.itlb_fault:
-#ifdef CONFIG_XEN
-       movl r17=XSI_IHA
-       ;;
-       ld8 r17=[r17]                           // get virtual address of L3 PTE
-#else
-       mov r17=cr.iha                          // get virtual address of PTE
-#endif
-       movl r30=1f                             // load nested fault continuation point
-       ;;
-1:     ld8 r18=[r17]                           // read *pte
-       ;;
-       mov b0=r29
-       tbit.z p6,p0=r18,_PAGE_P_BIT            // page present bit cleared?
-(p6)   br.cond.spnt page_fault
-       ;;
-#ifdef CONFIG_XEN
-       mov r19=r8
-       mov r8=r18
-       ;;
-       XEN_HYPER_ITC_I
-       ;;
-       mov r8=r19
-#else
-       itc.i r18
-#endif
-       ;;
-#ifdef CONFIG_SMP
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-
-       ld8 r19=[r17]                           // read *pte again and see if same
-       mov r20=PAGE_SHIFT<<2                   // setup page size for purge
-       ;;
-       cmp.ne p7,p0=r18,r19
-       ;;
-(p7)   ptc.l r16,r20
-#endif
-       mov pr=r31,-1
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(itlb_miss)
-
-       .org ia64_ivt+0x0800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x0800 Entry 2 (size 64 bundles) DTLB (9,48)
-ENTRY(dtlb_miss)
-       DBG_FAULT(2)
-       /*
-        * The DTLB handler accesses the PTE via the virtually mapped linear
-        * page table.  If a nested TLB miss occurs, we switch into physical
-        * mode, walk the page table, and then re-execute the PTE read and
-        * go on normally after that.
-        */
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-#else
-       mov r16=cr.ifa                          // get virtual address
-#endif
-       mov r29=b0                              // save b0
-       mov r31=pr                              // save predicates
-dtlb_fault:
-#ifdef CONFIG_XEN
-       movl r17=XSI_IHA
-       ;;
-       ld8 r17=[r17]                           // get virtual address of L3 PTE
-#else
-       mov r17=cr.iha                          // get virtual address of PTE
-#endif
-       movl r30=1f                             // load nested fault continuation point
-       ;;
-1:     ld8 r18=[r17]                           // read *pte
-       ;;
-       mov b0=r29
-       tbit.z p6,p0=r18,_PAGE_P_BIT            // page present bit cleared?
-(p6)   br.cond.spnt page_fault
-       ;;
-#ifdef CONFIG_XEN
-       mov r19=r8
-       mov r8=r18
-       ;;
-       XEN_HYPER_ITC_D
-       ;;
-       mov r8=r19
-       ;;
-#else
-       itc.d r18
-#endif
-       ;;
-#ifdef CONFIG_SMP
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-
-       ld8 r19=[r17]                           // read *pte again and see if same
-       mov r20=PAGE_SHIFT<<2                   // setup page size for purge
-       ;;
-       cmp.ne p7,p0=r18,r19
-       ;;
-(p7)   ptc.l r16,r20
-#endif
-       mov pr=r31,-1
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(dtlb_miss)
-
-       .org ia64_ivt+0x0c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x0c00 Entry 3 (size 64 bundles) Alt ITLB (19)
-ENTRY(alt_itlb_miss)
-       DBG_FAULT(3)
-#ifdef CONFIG_XEN
-       movl r31=XSI_IPSR
-       ;;
-       ld8 r21=[r31],XSI_IFA_OFS-XSI_IPSR_OFS  // get ipsr, point to ifa
-       movl r17=PAGE_KERNEL
-       ;;
-       ld8 r16=[r31]           // get ifa
-#else
-       mov r16=cr.ifa          // get address that caused the TLB miss
-       movl r17=PAGE_KERNEL
-       mov r21=cr.ipsr
-#endif
-       movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
-       mov r31=pr
-       ;;
-#ifdef CONFIG_DISABLE_VHPT
-       shr.u r22=r16,61                        // get the region number into r21
-       ;;
-       cmp.gt p8,p0=6,r22                      // user mode
-       ;;
-#ifndef CONFIG_XEN
-(p8)   thash r17=r16
-       ;;
-(p8)   mov cr.iha=r17
-#endif
-(p8)   mov r29=b0                              // save b0
-(p8)   br.cond.dptk .itlb_fault
-#endif
-       extr.u r23=r21,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
-       and r19=r19,r16         // clear ed, reserved bits, and PTE control bits
-       shr.u r18=r16,57        // move address bit 61 to bit 4
-       ;;
-       andcm r18=0x10,r18      // bit 4=~address-bit(61)
-       cmp.ne p8,p0=r0,r23     // psr.cpl != 0?
-       or r19=r17,r19          // insert PTE control bits into r19
-       ;;
-       or r19=r19,r18          // set bit 4 (uncached) if the access was to region 6
-(p8)   br.cond.spnt page_fault
-       ;;
-#ifdef CONFIG_XEN
-       mov r18=r8
-       mov r8=r19
-       ;;
-       XEN_HYPER_ITC_I
-       ;;
-       mov r8=r18
-       ;;
-       mov pr=r31,-1
-       ;;
-       XEN_HYPER_RFI;
-#else
-       itc.i r19               // insert the TLB entry
-       mov pr=r31,-1
-       rfi
-#endif
-END(alt_itlb_miss)
-
-       .org ia64_ivt+0x1000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46)
-ENTRY(alt_dtlb_miss)
-       DBG_FAULT(4)
-#ifdef CONFIG_XEN
-       movl r31=XSI_IPSR
-       ;;
-       ld8 r21=[r31],XSI_ISR_OFS-XSI_IPSR_OFS  // get ipsr, point to isr
-       movl r17=PAGE_KERNEL
-       ;;
-       ld8 r20=[r31],XSI_IFA_OFS-XSI_ISR_OFS   // get isr, point to ifa
-       movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
-       ;;
-       ld8 r16=[r31]           // get ifa
-#else
-       mov r16=cr.ifa          // get address that caused the TLB miss
-       movl r17=PAGE_KERNEL
-       mov r20=cr.isr
-       movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
-       mov r21=cr.ipsr
-#endif
-       mov r31=pr
-       ;;
-#ifdef CONFIG_DISABLE_VHPT
-       shr.u r22=r16,61                        // get the region number into r21
-       ;;
-       cmp.gt p8,p0=6,r22                      // access to region 0-5
-       ;;
-#ifndef CONFIG_XEN
-(p8)   thash r17=r16
-       ;;
-(p8)   mov cr.iha=r17
-#endif
-(p8)   mov r29=b0                              // save b0
-(p8)   br.cond.dptk dtlb_fault
-#endif
-       extr.u r23=r21,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
-       and r22=IA64_ISR_CODE_MASK,r20          // get the isr.code field
-       tbit.nz p6,p7=r20,IA64_ISR_SP_BIT       // is speculation bit on?
-       shr.u r18=r16,57                        // move address bit 61 to bit 4
-       and r19=r19,r16                         // clear ed, reserved bits, and PTE control bits
-       tbit.nz p9,p0=r20,IA64_ISR_NA_BIT       // is non-access bit on?
-       ;;
-       andcm r18=0x10,r18      // bit 4=~address-bit(61)
-       cmp.ne p8,p0=r0,r23
-(p9)   cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22  // check isr.code field
-(p8)   br.cond.spnt page_fault
-
-       dep r21=-1,r21,IA64_PSR_ED_BIT,1
-       or r19=r19,r17          // insert PTE control bits into r19
-       ;;
-       or r19=r19,r18          // set bit 4 (uncached) if the access was to region 6
-(p6)   mov cr.ipsr=r21
-       ;;
-#ifdef CONFIG_XEN
-(p7)   mov r18=r8
-(p7)   mov r8=r19
-       ;;
-(p7)   XEN_HYPER_ITC_D
-       ;;
-(p7)   mov r8=r18
-       ;;
-       mov pr=r31,-1
-       ;;
-       XEN_HYPER_RFI;
-#else
-(p7)   itc.d r19               // insert the TLB entry
-       mov pr=r31,-1
-       rfi
-#endif
-END(alt_dtlb_miss)
-
-       .org ia64_ivt+0x1400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x1400 Entry 5 (size 64 bundles) Data nested TLB (6,45)
-ENTRY(nested_dtlb_miss)
-       /*
-        * In the absence of kernel bugs, we get here when the virtually mapped linear
-        * page table is accessed non-speculatively (e.g., in the Dirty-bit, Instruction
-        * Access-bit, or Data Access-bit faults).  If the DTLB entry for the virtual page
-        * table is missing, a nested TLB miss fault is triggered and control is
-        * transferred to this point.  When this happens, we lookup the pte for the
-        * faulting address by walking the page table in physical mode and return to the
-        * continuation point passed in register r30 (or call page_fault if the address is
-        * not mapped).
-        *
-        * Input:       r16:    faulting address
-        *              r29:    saved b0
-        *              r30:    continuation address
-        *              r31:    saved pr
-        *
-        * Output:      r17:    physical address of PTE of faulting address
-        *              r29:    saved b0
-        *              r30:    continuation address
-        *              r31:    saved pr
-        *
-        * Clobbered:   b0, r18, r19, r21, r22, psr.dt (cleared)
-        */
-#ifdef CONFIG_XEN
-       XEN_HYPER_RSM_PSR_DT;
-#else
-       rsm psr.dt                              // switch to using physical data addressing
-#endif
-       mov r19=IA64_KR(PT_BASE)                // get the page table base address
-       shl r21=r16,3                           // shift bit 60 into sign bit
-#ifdef CONFIG_XEN
-       movl r18=XSI_ITIR
-       ;;
-       ld8 r18=[r18]
-#else
-       mov r18=cr.itir
-#endif
-       ;;
-       shr.u r17=r16,61                        // get the region number into r17
-       extr.u r18=r18,2,6                      // get the faulting page size
-       ;;
-       cmp.eq p6,p7=5,r17                      // is faulting address in region 5?
-       add r22=-PAGE_SHIFT,r18                 // adjustment for hugetlb address
-       add r18=PGDIR_SHIFT-PAGE_SHIFT,r18
-       ;;
-       shr.u r22=r16,r22
-       shr.u r18=r16,r18
-(p7)   dep r17=r17,r19,(PAGE_SHIFT-3),3        // put region number bits in place
-
-       srlz.d
-       LOAD_PHYSICAL(p6, r19, swapper_pg_dir)  // region 5 is rooted at swapper_pg_dir
-
-       .pred.rel "mutex", p6, p7
-(p6)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
-(p7)   shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
-       ;;
-(p6)   dep r17=r18,r19,3,(PAGE_SHIFT-3)        // r17=pgd_offset for region 5
-(p7)   dep r17=r18,r17,3,(PAGE_SHIFT-6)        // r17=pgd_offset for region[0-4]
-       cmp.eq p7,p6=0,r21                      // unused address bits all zeroes?
-#ifdef CONFIG_PGTABLE_4
-       shr.u r18=r22,PUD_SHIFT                 // shift pud index into position
-#else
-       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
-#endif
-       ;;
-       ld8 r17=[r17]                           // get *pgd (may be 0)
-       ;;
-(p7)   cmp.eq p6,p7=r17,r0                     // was pgd_present(*pgd) == NULL?
-       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=p[u|m]d_offset(pgd,addr)
-       ;;
-#ifdef CONFIG_PGTABLE_4
-(p7)   ld8 r17=[r17]                           // get *pud (may be 0)
-       shr.u r18=r22,PMD_SHIFT                 // shift pmd index into position
-       ;;
-(p7)   cmp.eq.or.andcm p6,p7=r17,r0            // was pud_present(*pud) == NULL?
-       dep r17=r18,r17,3,(PAGE_SHIFT-3)        // r17=pmd_offset(pud,addr)
-       ;;
-#endif
-(p7)   ld8 r17=[r17]                           // get *pmd (may be 0)
-       shr.u r19=r22,PAGE_SHIFT                // shift pte index into position
-       ;;
-(p7)   cmp.eq.or.andcm p6,p7=r17,r0            // was pmd_present(*pmd) == NULL?
-       dep r17=r19,r17,3,(PAGE_SHIFT-3)        // r17=pte_offset(pmd,addr);
-(p6)   br.cond.spnt page_fault
-       mov b0=r30
-       br.sptk.many b0                         // return to continuation point
-END(nested_dtlb_miss)
-
-       .org ia64_ivt+0x1800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x1800 Entry 6 (size 64 bundles) Instruction Key Miss (24)
-ENTRY(ikey_miss)
-       DBG_FAULT(6)
-       FAULT(6)
-END(ikey_miss)
-
-       //-----------------------------------------------------------------------------------
-       // call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address)
-ENTRY(page_fault)
-#ifdef CONFIG_XEN
-       XEN_HYPER_SSM_PSR_DT
-#else
-       ssm psr.dt
-       ;;
-       srlz.i
-#endif
-       ;;
-       SAVE_MIN_WITH_COVER
-       alloc r15=ar.pfs,0,0,3,0
-#ifdef CONFIG_XEN
-       movl r3=XSI_ISR
-       ;;
-       ld8 out1=[r3],XSI_IFA_OFS-XSI_ISR_OFS   // get vcr.isr, point to ifa
-       ;;
-       ld8 out0=[r3]                           // get vcr.ifa
-       mov r14=1
-       ;;
-       add r3=XSI_PSR_IC_OFS-XSI_IFA_OFS, r3   // point to vpsr.ic
-       ;;
-       st4 [r3]=r14                            // vpsr.ic = 1
-       adds r3=8,r2                            // set up second base pointer
-       ;;
-#else
-       mov out0=cr.ifa
-       mov out1=cr.isr
-       adds r3=8,r2                            // set up second base pointer
-       ;;
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                                  // guarantee that interruption collectin is on
-       ;;
-#endif
-#ifdef CONFIG_XEN
-    
-#define MASK_TO_PEND_OFS    (-1)
-    
-(p15)  movl r14=XSI_PSR_I_ADDR
-       ;;
-(p15)  ld8 r14=[r14]
-       ;;
-(p15)  st1 [r14]=r0,MASK_TO_PEND_OFS           // if (p15) vpsr.i = 1
-       ;;              // if (p15) (vcpu->vcpu_info->evtchn_upcall_mask)=0
-(p15)  ld1 r14=[r14]   // if (vcpu->vcpu_info->evtchn_upcall_pending)
-       ;;
-(p15)  cmp.ne  p15,p0=r14,r0
-       ;;
-(p15)  XEN_HYPER_SSM_I
-#else
-(p15)  ssm psr.i                               // restore psr.i
-#endif
-       movl r14=ia64_leave_kernel
-       ;;
-       SAVE_REST
-       mov rp=r14
-       ;;
-       adds out2=16,r12                        // out2 = pointer to pt_regs
-       br.call.sptk.many b6=ia64_do_page_fault // ignore return address
-END(page_fault)
-
-       .org ia64_ivt+0x1c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x1c00 Entry 7 (size 64 bundles) Data Key Miss (12,51)
-ENTRY(dkey_miss)
-       DBG_FAULT(7)
-       FAULT(7)
-END(dkey_miss)
-
-       .org ia64_ivt+0x2000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x2000 Entry 8 (size 64 bundles) Dirty-bit (54)
-ENTRY(dirty_bit)
-       DBG_FAULT(8)
-       /*
-        * What we do here is to simply turn on the dirty bit in the PTE.  We need to
-        * update both the page-table and the TLB entry.  To efficiently access the PTE,
-        * we address it through the virtual page table.  Most likely, the TLB entry for
-        * the relevant virtual page table page is still present in the TLB so we can
-        * normally do this without additional TLB misses.  In case the necessary virtual
-        * page table TLB entry isn't present, we take a nested TLB miss hit where we look
-        * up the physical address of the L3 PTE and then continue at label 1 below.
-        */
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-       ;;
-#else
-       mov r16=cr.ifa                          // get the address that caused the fault
-#endif
-       movl r30=1f                             // load continuation point in case of nested fault
-       ;;
-#ifdef CONFIG_XEN
-       mov r18=r8;
-       mov r8=r16;
-       XEN_HYPER_THASH;;
-       mov r17=r8;
-       mov r8=r18;;
-#else
-       thash r17=r16                           // compute virtual address of L3 PTE
-#endif
-       mov r29=b0                              // save b0 in case of nested fault
-       mov r31=pr                              // save pr
-#ifdef CONFIG_SMP
-       mov r28=ar.ccv                          // save ar.ccv
-       ;;
-1:     ld8 r18=[r17]
-       ;;                                      // avoid RAW on r18
-       mov ar.ccv=r18                          // set compare value for cmpxchg
-       or r25=_PAGE_D|_PAGE_A,r18              // set the dirty and accessed bits
-       tbit.z p7,p6 = r18,_PAGE_P_BIT          // Check present bit
-       ;;
-(p6)   cmpxchg8.acq r26=[r17],r25,ar.ccv       // Only update if page is present
-       mov r24=PAGE_SHIFT<<2
-       ;;
-(p6)   cmp.eq p6,p7=r26,r18                    // Only compare if page is present
-       ;;
-#ifdef CONFIG_XEN
-(p6)   mov r18=r8
-(p6)   mov r8=r25
-       ;;
-(p6)   XEN_HYPER_ITC_D
-       ;;
-(p6)   mov r8=r18
-#else
-(p6)   itc.d r25                               // install updated PTE
-#endif 
-       ;;
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-
-       ld8 r18=[r17]                           // read PTE again
-       ;;
-       cmp.eq p6,p7=r18,r25                    // is it same as the newly installed
-       ;;
-(p7)   ptc.l r16,r24
-       mov b0=r29                              // restore b0
-       mov ar.ccv=r28
-#else
-       ;;
-1:     ld8 r18=[r17]
-       ;;                                      // avoid RAW on r18
-       or r18=_PAGE_D|_PAGE_A,r18              // set the dirty and accessed bits
-       mov b0=r29                              // restore b0
-       ;;
-       st8 [r17]=r18                           // store back updated PTE
-       itc.d r18                               // install updated PTE
-#endif
-       mov pr=r31,-1                           // restore pr
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(dirty_bit)
-
-       .org ia64_ivt+0x2400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x2400 Entry 9 (size 64 bundles) Instruction Access-bit (27)
-ENTRY(iaccess_bit)
-       DBG_FAULT(9)
-       // Like Entry 8, except for instruction access
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-       ;;
-#else
-       mov r16=cr.ifa                          // get the address that caused the fault
-#endif
-       movl r30=1f                             // load continuation point in case of nested fault
-       mov r31=pr                              // save predicates
-#ifdef CONFIG_ITANIUM
-       /*
-        * Erratum 10 (IFA may contain incorrect address) has "NoFix" status.
-        */
-       mov r17=cr.ipsr
-       ;;
-       mov r18=cr.iip
-       tbit.z p6,p0=r17,IA64_PSR_IS_BIT        // IA64 instruction set?
-       ;;
-(p6)   mov r16=r18                             // if so, use cr.iip instead of cr.ifa
-#endif /* CONFIG_ITANIUM */
-       ;;
-#ifdef CONFIG_XEN
-       mov r18=r8;
-       mov r8=r16;
-       XEN_HYPER_THASH;;
-       mov r17=r8;
-       mov r8=r18;;
-#else
-       thash r17=r16                           // compute virtual address of L3 PTE
-#endif
-       mov r29=b0                              // save b0 in case of nested fault)
-#ifdef CONFIG_SMP
-       mov r28=ar.ccv                          // save ar.ccv
-       ;;
-1:     ld8 r18=[r17]
-       ;;
-       mov ar.ccv=r18                          // set compare value for cmpxchg
-       or r25=_PAGE_A,r18                      // set the accessed bit
-       tbit.z p7,p6 = r18,_PAGE_P_BIT          // Check present bit
-       ;;
-(p6)   cmpxchg8.acq r26=[r17],r25,ar.ccv       // Only if page present
-       mov r24=PAGE_SHIFT<<2
-       ;;
-(p6)   cmp.eq p6,p7=r26,r18                    // Only if page present
-       ;;
-#ifdef CONFIG_XEN
-       mov r26=r8
-       mov r8=r25
-       ;;
-(p6)   XEN_HYPER_ITC_I
-       ;;
-       mov r8=r26
-       ;;
-#else
-(p6)   itc.i r25                               // install updated PTE
-#endif
-       ;;
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-
-       ld8 r18=[r17]                           // read PTE again
-       ;;
-       cmp.eq p6,p7=r18,r25                    // is it same as the newly installed
-       ;;
-(p7)   ptc.l r16,r24
-       mov b0=r29                              // restore b0
-       mov ar.ccv=r28
-#else /* !CONFIG_SMP */
-       ;;
-1:     ld8 r18=[r17]
-       ;;
-       or r18=_PAGE_A,r18                      // set the accessed bit
-       mov b0=r29                              // restore b0
-       ;;
-       st8 [r17]=r18                           // store back updated PTE
-       itc.i r18                               // install updated PTE
-#endif /* !CONFIG_SMP */
-       mov pr=r31,-1
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(iaccess_bit)
-
-       .org ia64_ivt+0x2800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x2800 Entry 10 (size 64 bundles) Data Access-bit (15,55)
-ENTRY(daccess_bit)
-       DBG_FAULT(10)
-       // Like Entry 8, except for data access
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-       ;;
-#else
-       mov r16=cr.ifa                          // get the address that caused the fault
-#endif
-       movl r30=1f                             // load continuation point in case of nested fault
-       ;;
-#ifdef CONFIG_XEN
-       mov r18=r8
-       mov r8=r16
-       XEN_HYPER_THASH
-       ;;
-       mov r17=r8
-       mov r8=r18
-       ;;
-#else
-       thash r17=r16                           // compute virtual address of L3 PTE
-#endif
-       mov r31=pr
-       mov r29=b0                              // save b0 in case of nested fault)
-#ifdef CONFIG_SMP
-       mov r28=ar.ccv                          // save ar.ccv
-       ;;
-1:     ld8 r18=[r17]
-       ;;                                      // avoid RAW on r18
-       mov ar.ccv=r18                          // set compare value for cmpxchg
-       or r25=_PAGE_A,r18                      // set the dirty bit
-       tbit.z p7,p6 = r18,_PAGE_P_BIT          // Check present bit
-       ;;
-(p6)   cmpxchg8.acq r26=[r17],r25,ar.ccv       // Only if page is present
-       mov r24=PAGE_SHIFT<<2
-       ;;
-(p6)   cmp.eq p6,p7=r26,r18                    // Only if page is present
-       ;;
-#ifdef CONFIG_XEN
-       mov r26=r8
-       mov r8=r25
-       ;;
-(p6)   XEN_HYPER_ITC_D
-       ;;
-       mov r8=r26
-       ;;
-#else
-(p6)   itc.d r25                               // install updated PTE
-#endif
-       /*
-        * Tell the assemblers dependency-violation checker that the above "itc" instructions
-        * cannot possibly affect the following loads:
-        */
-       dv_serialize_data
-       ;;
-       ld8 r18=[r17]                           // read PTE again
-       ;;
-       cmp.eq p6,p7=r18,r25                    // is it same as the newly installed
-       ;;
-(p7)   ptc.l r16,r24
-       mov ar.ccv=r28
-#else
-       ;;
-1:     ld8 r18=[r17]
-       ;;                                      // avoid RAW on r18
-       or r18=_PAGE_A,r18                      // set the accessed bit
-       ;;
-       st8 [r17]=r18                           // store back updated PTE
-       itc.d r18                               // install updated PTE
-#endif
-       mov b0=r29                              // restore b0
-       mov pr=r31,-1
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI
-       dv_serialize_data
-#else
-       rfi
-#endif
-END(daccess_bit)
-
-       .org ia64_ivt+0x2c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x2c00 Entry 11 (size 64 bundles) Break instruction (33)
-ENTRY(break_fault)
-       /*
-        * The streamlined system call entry/exit paths only save/restore the initial part
-        * of pt_regs.  This implies that the callers of system-calls must adhere to the
-        * normal procedure calling conventions.
-        *
-        *   Registers to be saved & restored:
-        *      CR registers: cr.ipsr, cr.iip, cr.ifs
-        *      AR registers: ar.unat, ar.pfs, ar.rsc, ar.rnat, ar.bspstore, ar.fpsr
-        *      others: pr, b0, b6, loadrs, r1, r11, r12, r13, r15
-        *   Registers to be restored only:
-        *      r8-r11: output value from the system call.
-        *
-        * During system call exit, scratch registers (including r15) are modified/cleared
-        * to prevent leaking bits from kernel to user level.
-        */
-       DBG_FAULT(11)
-       mov.m r16=IA64_KR(CURRENT)              // M2 r16 <- current task (12 cyc)
-#ifdef CONFIG_XEN
-       movl r22=XSI_IPSR
-       ;;
-       ld8 r29=[r22],XSI_IIM_OFS-XSI_IPSR_OFS  // get ipsr, point to iip
-#else
-       mov r29=cr.ipsr                         // M2 (12 cyc)
-#endif
-       mov r31=pr                              // I0 (2 cyc)
-
-#ifdef CONFIG_XEN
-       ;;
-       ld8 r17=[r22],XSI_IIP_OFS-XSI_IIM_OFS
-#else
-       mov r17=cr.iim                          // M2 (2 cyc)
-#endif
-       mov.m r27=ar.rsc                        // M2 (12 cyc)
-       mov r18=__IA64_BREAK_SYSCALL            // A
-
-       mov.m ar.rsc=0                          // M2
-       mov.m r21=ar.fpsr                       // M2 (12 cyc)
-       mov r19=b6                              // I0 (2 cyc)
-       ;;
-       mov.m r23=ar.bspstore                   // M2 (12 cyc)
-       mov.m r24=ar.rnat                       // M2 (5 cyc)
-       mov.i r26=ar.pfs                        // I0 (2 cyc)
-
-       invala                                  // M0|1
-       nop.m 0                                 // M
-       mov r20=r1                              // A                    save r1
-
-       nop.m 0
-       movl r30=sys_call_table                 // X
-
-#ifdef CONFIG_XEN
-       ld8 r28=[r22]
-#else
-       mov r28=cr.iip                          // M2 (2 cyc)
-#endif
-       cmp.eq p0,p7=r18,r17                    // I0 is this a system call?
-(p7)   br.cond.spnt non_syscall                // B  no ->
-       //
-       // From this point on, we are definitely on the syscall-path
-       // and we can use (non-banked) scratch registers.
-       //
-///////////////////////////////////////////////////////////////////////
-       mov r1=r16                              // A    move task-pointer to "addl"-addressable reg
-       mov r2=r16                              // A    setup r2 for ia64_syscall_setup
-       add r9=TI_FLAGS+IA64_TASK_SIZE,r16      // A    r9 = &current_thread_info()->flags
-
-       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16
-       adds r15=-1024,r15                      // A    subtract 1024 from syscall number
-       mov r3=NR_syscalls - 1
-       ;;
-       ld1.bias r17=[r16]                      // M0|1 r17 = current->thread.on_ustack flag
-       ld4 r9=[r9]                             // M0|1 r9 = current_thread_info()->flags
-       extr.u r8=r29,41,2                      // I0   extract ei field from cr.ipsr
-
-       shladd r30=r15,3,r30                    // A    r30 = sys_call_table + 8*(syscall-1024)
-       addl r22=IA64_RBS_OFFSET,r1             // A    compute base of RBS
-       cmp.leu p6,p7=r15,r3                    // A    syscall number in range?
-       ;;
-
-       lfetch.fault.excl.nt1 [r22]             // M0|1 prefetch RBS
-(p6)   ld8 r30=[r30]                           // M0|1 load address of syscall entry point
-       tnat.nz.or p7,p0=r15                    // I0   is syscall nr a NaT?
-
-       mov.m ar.bspstore=r22                   // M2   switch to kernel RBS
-       cmp.eq p8,p9=2,r8                       // A    isr.ei==2?
-       ;;
-
-(p8)   mov r8=0                                // A    clear ei to 0
-(p7)   movl r30=sys_ni_syscall                 // X
-
-(p8)   adds r28=16,r28                         // A    switch cr.iip to next bundle
-(p9)   adds r8=1,r8                            // A    increment ei to next slot
-       nop.i 0
-       ;;
-
-       mov.m r25=ar.unat                       // M2 (5 cyc)
-       dep r29=r8,r29,41,2                     // I0   insert new ei into cr.ipsr
-       adds r15=1024,r15                       // A    restore original syscall number
-       //
-       // If any of the above loads miss in L1D, we'll stall here until
-       // the data arrives.
-       //
-///////////////////////////////////////////////////////////////////////
-       st1 [r16]=r0                            // M2|3 clear current->thread.on_ustack flag
-       mov b6=r30                              // I0   setup syscall handler branch reg early
-       cmp.eq pKStk,pUStk=r0,r17               // A    were we on kernel stacks already?
-
-       and r9=_TIF_SYSCALL_TRACEAUDIT,r9       // A    mask trace or audit
-       mov r18=ar.bsp                          // M2 (12 cyc)
-(pKStk)        br.cond.spnt .break_fixup               // B    we're already in kernel-mode -- fix up RBS
-       ;;
-.back_from_break_fixup:
-(pUStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1 // A    compute base of memory stack
-       cmp.eq p14,p0=r9,r0                     // A    are syscalls being traced/audited?
-       br.call.sptk.many b7=ia64_syscall_setup // B
-1:
-       mov ar.rsc=0x3                          // M2   set eager mode, pl 0, LE, loadrs=0
-       nop 0
-#ifdef CONFIG_XEN
-       mov r2=b0; br.call.sptk b0=xen_bsw1;; mov b0=r2;;
-#else
-       bsw.1                                   // B (6 cyc) regs are saved, switch to bank 1
-#endif
-       ;;
-
-#ifdef CONFIG_XEN
-       movl r16=XSI_PSR_IC
-       mov r3=1
-       ;;
-       st4 [r16]=r3,XSI_PSR_I_ADDR_OFS-XSI_PSR_IC_OFS  // vpsr.ic = 1
-#else
-       ssm psr.ic | PSR_DEFAULT_BITS           // M2   now it's safe to re-enable intr.-collection
-#endif
-       movl r3=ia64_ret_from_syscall           // X
-       ;;
-
-       srlz.i                                  // M0   ensure interruption collection is on
-       mov rp=r3                               // I0   set the real return addr
-(p10)  br.cond.spnt.many ia64_ret_from_syscall // B    return if bad call-frame or r15 is a NaT
-
-#ifdef CONFIG_XEN
-(p15)  ld8 r16=[r16]                           // vpsr.i
-       ;;
-(p15)  st1 [r16]=r0,MASK_TO_PEND_OFS           // if (p15) vpsr.i = 1
-       ;;              // if (p15) (vcpu->vcpu_info->evtchn_upcall_mask)=0
-(p15)  ld1 r2=[r16]    // if (vcpu->vcpu_info->evtchn_upcall_pending)
-       ;;
-(p15)  cmp.ne.unc p6,p0=r2,r0
-       ;;
-(p6)   XEN_HYPER_SSM_I                         //   do a real ssm psr.i
-#else
-(p15)  ssm psr.i                               // M2   restore psr.i
-#endif
-(p14)  br.call.sptk.many b6=b6                 // B    invoke syscall-handker (ignore return addr)
-       br.cond.spnt.many ia64_trace_syscall    // B    do syscall-tracing thingamagic
-       // NOT REACHED
-///////////////////////////////////////////////////////////////////////
-       // On entry, we optimistically assumed that we're coming from user-space.
-       // For the rare cases where a system-call is done from within the kernel,
-       // we fix things up at this point:
-.break_fixup:
-       add r1=-IA64_PT_REGS_SIZE,sp            // A    allocate space for pt_regs structure
-       mov ar.rnat=r24                         // M2   restore kernel's AR.RNAT
-       ;;
-       mov ar.bspstore=r23                     // M2   restore kernel's AR.BSPSTORE
-       br.cond.sptk .back_from_break_fixup
-END(break_fault)
-
-       .org ia64_ivt+0x3000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x3000 Entry 12 (size 64 bundles) External Interrupt (4)
-ENTRY(interrupt)
-       DBG_FAULT(12)
-       mov r31=pr              // prepare to save predicates
-       ;;
-       SAVE_MIN_WITH_COVER     // uses r31; defines r2 and r3
-#ifdef CONFIG_XEN
-       movl r3=XSI_PSR_IC
-       mov r14=1
-       ;;
-       st4 [r3]=r14
-#else
-       ssm psr.ic | PSR_DEFAULT_BITS
-#endif
-       ;;
-       adds r3=8,r2            // set up second base pointer for SAVE_REST
-       srlz.i                  // ensure everybody knows psr.ic is back on
-       ;;
-       SAVE_REST
-       ;;
-       alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group
-#ifdef CONFIG_XEN
-       ;;
-       br.call.sptk.many rp=xen_get_ivr
-       ;;
-       mov out0=r8             // pass cr.ivr as first arg
-#else
-       mov out0=cr.ivr         // pass cr.ivr as first arg
-#endif
-       add out1=16,sp          // pass pointer to pt_regs as second arg
-       ;;
-       srlz.d                  // make sure we see the effect of cr.ivr
-       movl r14=ia64_leave_kernel
-       ;;
-       mov rp=r14
-       br.call.sptk.many b6=ia64_handle_irq
-END(interrupt)
-
-       .org ia64_ivt+0x3400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x3400 Entry 13 (size 64 bundles) Reserved
-       DBG_FAULT(13)
-       FAULT(13)
-
-       .org ia64_ivt+0x3800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x3800 Entry 14 (size 64 bundles) Reserved
-       DBG_FAULT(14)
-       FAULT(14)
-
-       /*
-        * There is no particular reason for this code to be here, other than that
-        * there happens to be space here that would go unused otherwise.  If this
-        * fault ever gets "unreserved", simply moved the following code to a more
-        * suitable spot...
-        *
-        * ia64_syscall_setup() is a separate subroutine so that it can
-        *      allocate stacked registers so it can safely demine any
-        *      potential NaT values from the input registers.
-        *
-        * On entry:
-        *      - executing on bank 0 or bank 1 register set (doesn't matter)
-        *      -  r1: stack pointer
-        *      -  r2: current task pointer
-        *      -  r3: preserved
-        *      - r11: original contents (saved ar.pfs to be saved)
-        *      - r12: original contents (sp to be saved)
-        *      - r13: original contents (tp to be saved)
-        *      - r15: original contents (syscall # to be saved)
-        *      - r18: saved bsp (after switching to kernel stack)
-        *      - r19: saved b6
-        *      - r20: saved r1 (gp)
-        *      - r21: saved ar.fpsr
-        *      - r22: kernel's register backing store base (krbs_base)
-        *      - r23: saved ar.bspstore
-        *      - r24: saved ar.rnat
-        *      - r25: saved ar.unat
-        *      - r26: saved ar.pfs
-        *      - r27: saved ar.rsc
-        *      - r28: saved cr.iip
-        *      - r29: saved cr.ipsr
-        *      - r31: saved pr
-        *      -  b0: original contents (to be saved)
-        * On exit:
-        *      -  p10: TRUE if syscall is invoked with more than 8 out
-        *              registers or r15's Nat is true
-        *      -  r1: kernel's gp
-        *      -  r3: preserved (same as on entry)
-        *      -  r8: -EINVAL if p10 is true
-        *      - r12: points to kernel stack
-        *      - r13: points to current task
-        *      - r14: preserved (same as on entry)
-        *      - p13: preserved
-        *      - p15: TRUE if interrupts need to be re-enabled
-        *      - ar.fpsr: set to kernel settings
-        *      -  b6: preserved (same as on entry)
-        */
-#ifndef CONFIG_XEN
-GLOBAL_ENTRY(ia64_syscall_setup)
-#if PT(B6) != 0
-# error This code assumes that b6 is the first field in pt_regs.
-#endif
-       st8 [r1]=r19                            // save b6
-       add r16=PT(CR_IPSR),r1                  // initialize first base pointer
-       add r17=PT(R11),r1                      // initialize second base pointer
-       ;;
-       alloc r19=ar.pfs,8,0,0,0                // ensure in0-in7 are writable
-       st8 [r16]=r29,PT(AR_PFS)-PT(CR_IPSR)    // save cr.ipsr
-       tnat.nz p8,p0=in0
-
-       st8.spill [r17]=r11,PT(CR_IIP)-PT(R11)  // save r11
-       tnat.nz p9,p0=in1
-(pKStk)        mov r18=r0                              // make sure r18 isn't NaT
-       ;;
-
-       st8 [r16]=r26,PT(CR_IFS)-PT(AR_PFS)     // save ar.pfs
-       st8 [r17]=r28,PT(AR_UNAT)-PT(CR_IIP)    // save cr.iip
-       mov r28=b0                              // save b0 (2 cyc)
-       ;;
-
-       st8 [r17]=r25,PT(AR_RSC)-PT(AR_UNAT)    // save ar.unat
-       dep r19=0,r19,38,26                     // clear all bits but 0..37 [I0]
-(p8)   mov in0=-1
-       ;;
-
-       st8 [r16]=r19,PT(AR_RNAT)-PT(CR_IFS)    // store ar.pfs.pfm in cr.ifs
-       extr.u r11=r19,7,7      // I0           // get sol of ar.pfs
-       and r8=0x7f,r19         // A            // get sof of ar.pfs
-
-       st8 [r17]=r27,PT(AR_BSPSTORE)-PT(AR_RSC)// save ar.rsc
-       tbit.nz p15,p0=r29,IA64_PSR_I_BIT // I0
-(p9)   mov in1=-1
-       ;;
-
-(pUStk) sub r18=r18,r22                                // r18=RSE.ndirty*8
-       tnat.nz p10,p0=in2
-       add r11=8,r11
-       ;;
-(pKStk) adds r16=PT(PR)-PT(AR_RNAT),r16                // skip over ar_rnat field
-(pKStk) adds r17=PT(B0)-PT(AR_BSPSTORE),r17    // skip over ar_bspstore field
-       tnat.nz p11,p0=in3
-       ;;
-(p10)  mov in2=-1
-       tnat.nz p12,p0=in4                              // [I0]
-(p11)  mov in3=-1
-       ;;
-(pUStk) st8 [r16]=r24,PT(PR)-PT(AR_RNAT)       // save ar.rnat
-(pUStk) st8 [r17]=r23,PT(B0)-PT(AR_BSPSTORE)   // save ar.bspstore
-       shl r18=r18,16                          // compute ar.rsc to be used for "loadrs"
-       ;;
-       st8 [r16]=r31,PT(LOADRS)-PT(PR)         // save predicates
-       st8 [r17]=r28,PT(R1)-PT(B0)             // save b0
-       tnat.nz p13,p0=in5                              // [I0]
-       ;;
-       st8 [r16]=r18,PT(R12)-PT(LOADRS)        // save ar.rsc value for "loadrs"
-       st8.spill [r17]=r20,PT(R13)-PT(R1)      // save original r1
-(p12)  mov in4=-1
-       ;;
-
-.mem.offset 0,0; st8.spill [r16]=r12,PT(AR_FPSR)-PT(R12)       // save r12
-.mem.offset 8,0; st8.spill [r17]=r13,PT(R15)-PT(R13)           // save r13
-(p13)  mov in5=-1
-       ;;
-       st8 [r16]=r21,PT(R8)-PT(AR_FPSR)        // save ar.fpsr
-       tnat.nz p13,p0=in6
-       cmp.lt p10,p9=r11,r8    // frame size can't be more than local+8
-       ;;
-       mov r8=1
-(p9)   tnat.nz p10,p0=r15
-       adds r12=-16,r1         // switch to kernel memory stack (with 16 bytes of scratch)
-
-       st8.spill [r17]=r15                     // save r15
-       tnat.nz p8,p0=in7
-       nop.i 0
-
-       mov r13=r2                              // establish `current'
-       movl r1=__gp                            // establish kernel global pointer
-       ;;
-       st8 [r16]=r8            // ensure pt_regs.r8 != 0 (see handle_syscall_error)
-(p13)  mov in6=-1
-(p8)   mov in7=-1
-
-       cmp.eq pSys,pNonSys=r0,r0               // set pSys=1, pNonSys=0
-       movl r17=FPSR_DEFAULT
-       ;;
-       mov.m ar.fpsr=r17                       // set ar.fpsr to kernel default value
-(p10)  mov r8=-EINVAL
-       br.ret.sptk.many b7
-END(ia64_syscall_setup)
-#endif
-
-       .org ia64_ivt+0x3c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x3c00 Entry 15 (size 64 bundles) Reserved
-       DBG_FAULT(15)
-       FAULT(15)
-
-       /*
-        * Squatting in this space ...
-        *
-        * This special case dispatcher for illegal operation faults allows preserved
-        * registers to be modified through a callback function (asm only) that is handed
-        * back from the fault handler in r8. Up to three arguments can be passed to the
-        * callback function by returning an aggregate with the callback as its first
-        * element, followed by the arguments.
-        */
-ENTRY(dispatch_illegal_op_fault)
-       .prologue
-       .body
-       SAVE_MIN_WITH_COVER
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i          // guarantee that interruption collection is on
-       ;;
-(p15)  ssm psr.i       // restore psr.i
-       adds r3=8,r2    // set up second base pointer for SAVE_REST
-       ;;
-       alloc r14=ar.pfs,0,0,1,0        // must be first in insn group
-       mov out0=ar.ec
-       ;;
-       SAVE_REST
-       PT_REGS_UNWIND_INFO(0)
-       ;;
-       br.call.sptk.many rp=ia64_illegal_op_fault
-.ret0: ;;
-       alloc r14=ar.pfs,0,0,3,0        // must be first in insn group
-       mov out0=r9
-       mov out1=r10
-       mov out2=r11
-       movl r15=ia64_leave_kernel
-       ;;
-       mov rp=r15
-       mov b6=r8
-       ;;
-       cmp.ne p6,p0=0,r8
-(p6)   br.call.dpnt.many b6=b6         // call returns to ia64_leave_kernel
-       br.sptk.many ia64_leave_kernel
-END(dispatch_illegal_op_fault)
-
-       .org ia64_ivt+0x4000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x4000 Entry 16 (size 64 bundles) Reserved
-       DBG_FAULT(16)
-       FAULT(16)
-
-       .org ia64_ivt+0x4400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x4400 Entry 17 (size 64 bundles) Reserved
-       DBG_FAULT(17)
-       FAULT(17)
-
-ENTRY(non_syscall)
-       mov ar.rsc=r27                  // restore ar.rsc before SAVE_MIN_WITH_COVER
-       ;;
-       SAVE_MIN_WITH_COVER
-
-       // There is no particular reason for this code to be here, other than that
-       // there happens to be space here that would go unused otherwise.  If this
-       // fault ever gets "unreserved", simply moved the following code to a more
-       // suitable spot...
-
-       alloc r14=ar.pfs,0,0,2,0
-       mov out0=cr.iim
-       add out1=16,sp
-       adds r3=8,r2                    // set up second base pointer for SAVE_REST
-
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                          // guarantee that interruption collection is on
-       ;;
-(p15)  ssm psr.i                       // restore psr.i
-       movl r15=ia64_leave_kernel
-       ;;
-       SAVE_REST
-       mov rp=r15
-       ;;
-       br.call.sptk.many b6=ia64_bad_break     // avoid WAW on CFM and ignore return addr
-END(non_syscall)
-
-       .org ia64_ivt+0x4800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x4800 Entry 18 (size 64 bundles) Reserved
-       DBG_FAULT(18)
-       FAULT(18)
-
-       /*
-        * There is no particular reason for this code to be here, other than that
-        * there happens to be space here that would go unused otherwise.  If this
-        * fault ever gets "unreserved", simply moved the following code to a more
-        * suitable spot...
-        */
-
-ENTRY(dispatch_unaligned_handler)
-       SAVE_MIN_WITH_COVER
-       ;;
-       alloc r14=ar.pfs,0,0,2,0                // now it's safe (must be first in insn group!)
-       mov out0=cr.ifa
-       adds out1=16,sp
-
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                                  // guarantee that interruption collection is on
-       ;;
-(p15)  ssm psr.i                               // restore psr.i
-       adds r3=8,r2                            // set up second base pointer
-       ;;
-       SAVE_REST
-       movl r14=ia64_leave_kernel
-       ;;
-       mov rp=r14
-       br.sptk.many ia64_prepare_handle_unaligned
-END(dispatch_unaligned_handler)
-
-       .org ia64_ivt+0x4c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x4c00 Entry 19 (size 64 bundles) Reserved
-       DBG_FAULT(19)
-       FAULT(19)
-
-       /*
-        * There is no particular reason for this code to be here, other than that
-        * there happens to be space here that would go unused otherwise.  If this
-        * fault ever gets "unreserved", simply moved the following code to a more
-        * suitable spot...
-        */
-
-ENTRY(dispatch_to_fault_handler)
-       /*
-        * Input:
-        *      psr.ic: off
-        *      r19:    fault vector number (e.g., 24 for General Exception)
-        *      r31:    contains saved predicates (pr)
-        */
-       SAVE_MIN_WITH_COVER_R19
-       alloc r14=ar.pfs,0,0,5,0
-       mov out0=r15
-#ifdef CONFIG_XEN
-       movl out1=XSI_ISR
-       ;;
-       adds out2=XSI_IFA-XSI_ISR,out1
-       adds out3=XSI_IIM-XSI_ISR,out1
-       adds out4=XSI_ITIR-XSI_ISR,out1
-       ;;
-       ld8 out1=[out1]
-       ld8 out2=[out2]
-       ld8 out3=[out4]
-       ld8 out4=[out4]
-       ;;
-#else
-       mov out1=cr.isr
-       mov out2=cr.ifa
-       mov out3=cr.iim
-       mov out4=cr.itir
-       ;;
-#endif
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                                  // guarantee that interruption collection is on
-       ;;
-(p15)  ssm psr.i                               // restore psr.i
-       adds r3=8,r2                            // set up second base pointer for SAVE_REST
-       ;;
-       SAVE_REST
-       movl r14=ia64_leave_kernel
-       ;;
-       mov rp=r14
-       br.call.sptk.many b6=ia64_fault
-END(dispatch_to_fault_handler)
-
-//
-// --- End of long entries, Beginning of short entries
-//
-
-       .org ia64_ivt+0x5000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5000 Entry 20 (size 16 bundles) Page Not Present (10,22,49)
-ENTRY(page_not_present)
-       DBG_FAULT(20)
-       mov r16=cr.ifa
-       rsm psr.dt
-       /*
-        * The Linux page fault handler doesn't expect non-present pages to be in
-        * the TLB.  Flush the existing entry now, so we meet that expectation.
-        */
-       mov r17=PAGE_SHIFT<<2
-       ;;
-       ptc.l r16,r17
-       ;;
-       mov r31=pr
-       srlz.d
-       br.sptk.many page_fault
-END(page_not_present)
-
-       .org ia64_ivt+0x5100
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5100 Entry 21 (size 16 bundles) Key Permission (13,25,52)
-ENTRY(key_permission)
-       DBG_FAULT(21)
-       mov r16=cr.ifa
-       rsm psr.dt
-       mov r31=pr
-       ;;
-       srlz.d
-       br.sptk.many page_fault
-END(key_permission)
-
-       .org ia64_ivt+0x5200
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5200 Entry 22 (size 16 bundles) Instruction Access Rights (26)
-ENTRY(iaccess_rights)
-       DBG_FAULT(22)
-       mov r16=cr.ifa
-       rsm psr.dt
-       mov r31=pr
-       ;;
-       srlz.d
-       br.sptk.many page_fault
-END(iaccess_rights)
-
-       .org ia64_ivt+0x5300
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5300 Entry 23 (size 16 bundles) Data Access Rights (14,53)
-ENTRY(daccess_rights)
-       DBG_FAULT(23)
-#ifdef CONFIG_XEN
-       movl r16=XSI_IFA
-       ;;
-       ld8 r16=[r16]
-       ;;
-       XEN_HYPER_RSM_PSR_DT
-#else
-       mov r16=cr.ifa
-       rsm psr.dt
-#endif
-       mov r31=pr
-       ;;
-       srlz.d
-       br.sptk.many page_fault
-END(daccess_rights)
-
-       .org ia64_ivt+0x5400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5400 Entry 24 (size 16 bundles) General Exception (5,32,34,36,38,39)
-ENTRY(general_exception)
-       DBG_FAULT(24)
-       mov r16=cr.isr
-       mov r31=pr
-       ;;
-       cmp4.eq p6,p0=0,r16
-(p6)   br.sptk.many dispatch_illegal_op_fault
-       ;;
-       mov r19=24              // fault number
-       br.sptk.many dispatch_to_fault_handler
-END(general_exception)
-
-       .org ia64_ivt+0x5500
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5500 Entry 25 (size 16 bundles) Disabled FP-Register (35)
-ENTRY(disabled_fp_reg)
-       DBG_FAULT(25)
-       rsm psr.dfh             // ensure we can access fph
-       ;;
-       srlz.d
-       mov r31=pr
-       mov r19=25
-       br.sptk.many dispatch_to_fault_handler
-END(disabled_fp_reg)
-
-       .org ia64_ivt+0x5600
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5600 Entry 26 (size 16 bundles) Nat Consumption (11,23,37,50)
-ENTRY(nat_consumption)
-       DBG_FAULT(26)
-
-       mov r16=cr.ipsr
-       mov r17=cr.isr
-       mov r31=pr                              // save PR
-       ;;
-       and r18=0xf,r17                         // r18 = cr.ipsr.code{3:0}
-       tbit.z p6,p0=r17,IA64_ISR_NA_BIT
-       ;;
-       cmp.ne.or p6,p0=IA64_ISR_CODE_LFETCH,r18
-       dep r16=-1,r16,IA64_PSR_ED_BIT,1
-(p6)   br.cond.spnt 1f         // branch if (cr.ispr.na == 0 || cr.ipsr.code{3:0} != LFETCH)
-       ;;
-       mov cr.ipsr=r16         // set cr.ipsr.na
-       mov pr=r31,-1
-       ;;
-       rfi
-
-1:     mov pr=r31,-1
-       ;;
-       FAULT(26)
-END(nat_consumption)
-
-       .org ia64_ivt+0x5700
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5700 Entry 27 (size 16 bundles) Speculation (40)
-ENTRY(speculation_vector)
-       DBG_FAULT(27)
-       /*
-        * A [f]chk.[as] instruction needs to take the branch to the recovery code but
-        * this part of the architecture is not implemented in hardware on some CPUs, such
-        * as Itanium.  Thus, in general we need to emulate the behavior.  IIM contains
-        * the relative target (not yet sign extended).  So after sign extending it we
-        * simply add it to IIP.  We also need to reset the EI field of the IPSR to zero,
-        * i.e., the slot to restart into.
-        *
-        * cr.imm contains zero_ext(imm21)
-        */
-       mov r18=cr.iim
-       ;;
-       mov r17=cr.iip
-       shl r18=r18,43                  // put sign bit in position (43=64-21)
-       ;;
-
-       mov r16=cr.ipsr
-       shr r18=r18,39                  // sign extend (39=43-4)
-       ;;
-
-       add r17=r17,r18                 // now add the offset
-       ;;
-       mov cr.iip=r17
-       dep r16=0,r16,41,2              // clear EI
-       ;;
-
-       mov cr.ipsr=r16
-       ;;
-
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI;
-#else
-       rfi                             // and go back
-#endif
-END(speculation_vector)
-
-       .org ia64_ivt+0x5800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5800 Entry 28 (size 16 bundles) Reserved
-       DBG_FAULT(28)
-       FAULT(28)
-
-       .org ia64_ivt+0x5900
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5900 Entry 29 (size 16 bundles) Debug (16,28,56)
-ENTRY(debug_vector)
-       DBG_FAULT(29)
-       FAULT(29)
-END(debug_vector)
-
-       .org ia64_ivt+0x5a00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5a00 Entry 30 (size 16 bundles) Unaligned Reference (57)
-ENTRY(unaligned_access)
-       DBG_FAULT(30)
-       mov r31=pr              // prepare to save predicates
-       ;;
-       br.sptk.many dispatch_unaligned_handler
-END(unaligned_access)
-
-       .org ia64_ivt+0x5b00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5b00 Entry 31 (size 16 bundles) Unsupported Data Reference (57)
-ENTRY(unsupported_data_reference)
-       DBG_FAULT(31)
-       FAULT(31)
-END(unsupported_data_reference)
-
-       .org ia64_ivt+0x5c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5c00 Entry 32 (size 16 bundles) Floating-Point Fault (64)
-ENTRY(floating_point_fault)
-       DBG_FAULT(32)
-       FAULT(32)
-END(floating_point_fault)
-
-       .org ia64_ivt+0x5d00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5d00 Entry 33 (size 16 bundles) Floating Point Trap (66)
-ENTRY(floating_point_trap)
-       DBG_FAULT(33)
-       FAULT(33)
-END(floating_point_trap)
-
-       .org ia64_ivt+0x5e00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5e00 Entry 34 (size 16 bundles) Lower Privilege Transfer Trap (66)
-ENTRY(lower_privilege_trap)
-       DBG_FAULT(34)
-       FAULT(34)
-END(lower_privilege_trap)
-
-       .org ia64_ivt+0x5f00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x5f00 Entry 35 (size 16 bundles) Taken Branch Trap (68)
-ENTRY(taken_branch_trap)
-       DBG_FAULT(35)
-       FAULT(35)
-END(taken_branch_trap)
-
-       .org ia64_ivt+0x6000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6000 Entry 36 (size 16 bundles) Single Step Trap (69)
-ENTRY(single_step_trap)
-       DBG_FAULT(36)
-       FAULT(36)
-END(single_step_trap)
-
-       .org ia64_ivt+0x6100
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6100 Entry 37 (size 16 bundles) Reserved
-       DBG_FAULT(37)
-       FAULT(37)
-
-       .org ia64_ivt+0x6200
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6200 Entry 38 (size 16 bundles) Reserved
-       DBG_FAULT(38)
-       FAULT(38)
-
-       .org ia64_ivt+0x6300
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6300 Entry 39 (size 16 bundles) Reserved
-       DBG_FAULT(39)
-       FAULT(39)
-
-       .org ia64_ivt+0x6400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6400 Entry 40 (size 16 bundles) Reserved
-       DBG_FAULT(40)
-       FAULT(40)
-
-       .org ia64_ivt+0x6500
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6500 Entry 41 (size 16 bundles) Reserved
-       DBG_FAULT(41)
-       FAULT(41)
-
-       .org ia64_ivt+0x6600
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6600 Entry 42 (size 16 bundles) Reserved
-       DBG_FAULT(42)
-       FAULT(42)
-
-       .org ia64_ivt+0x6700
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6700 Entry 43 (size 16 bundles) Reserved
-       DBG_FAULT(43)
-       FAULT(43)
-
-       .org ia64_ivt+0x6800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6800 Entry 44 (size 16 bundles) Reserved
-       DBG_FAULT(44)
-       FAULT(44)
-
-       .org ia64_ivt+0x6900
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6900 Entry 45 (size 16 bundles) IA-32 Exeception (17,18,29,41,42,43,44,58,60,61,62,72,73,75,76,77)
-ENTRY(ia32_exception)
-       DBG_FAULT(45)
-       FAULT(45)
-END(ia32_exception)
-
-       .org ia64_ivt+0x6a00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6a00 Entry 46 (size 16 bundles) IA-32 Intercept  (30,31,59,70,71)
-ENTRY(ia32_intercept)
-       DBG_FAULT(46)
-#ifdef CONFIG_IA32_SUPPORT
-       mov r31=pr
-       mov r16=cr.isr
-       ;;
-       extr.u r17=r16,16,8     // get ISR.code
-       mov r18=ar.eflag
-       mov r19=cr.iim          // old eflag value
-       ;;
-       cmp.ne p6,p0=2,r17
-(p6)   br.cond.spnt 1f         // not a system flag fault
-       xor r16=r18,r19
-       ;;
-       extr.u r17=r16,18,1     // get the eflags.ac bit
-       ;;
-       cmp.eq p6,p0=0,r17
-(p6)   br.cond.spnt 1f         // eflags.ac bit didn't change
-       ;;
-       mov pr=r31,-1           // restore predicate registers
-#ifdef CONFIG_XEN
-       XEN_HYPER_RFI;
-#else
-       rfi
-#endif
-
-1:
-#endif // CONFIG_IA32_SUPPORT
-       FAULT(46)
-END(ia32_intercept)
-
-       .org ia64_ivt+0x6b00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6b00 Entry 47 (size 16 bundles) IA-32 Interrupt  (74)
-ENTRY(ia32_interrupt)
-       DBG_FAULT(47)
-#ifdef CONFIG_IA32_SUPPORT
-       mov r31=pr
-       br.sptk.many dispatch_to_ia32_handler
-#else
-       FAULT(47)
-#endif
-END(ia32_interrupt)
-
-       .org ia64_ivt+0x6c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6c00 Entry 48 (size 16 bundles) Reserved
-       DBG_FAULT(48)
-       FAULT(48)
-
-       .org ia64_ivt+0x6d00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6d00 Entry 49 (size 16 bundles) Reserved
-       DBG_FAULT(49)
-       FAULT(49)
-
-       .org ia64_ivt+0x6e00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6e00 Entry 50 (size 16 bundles) Reserved
-       DBG_FAULT(50)
-       FAULT(50)
-
-       .org ia64_ivt+0x6f00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x6f00 Entry 51 (size 16 bundles) Reserved
-       DBG_FAULT(51)
-       FAULT(51)
-
-       .org ia64_ivt+0x7000
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7000 Entry 52 (size 16 bundles) Reserved
-       DBG_FAULT(52)
-       FAULT(52)
-
-       .org ia64_ivt+0x7100
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7100 Entry 53 (size 16 bundles) Reserved
-       DBG_FAULT(53)
-       FAULT(53)
-
-       .org ia64_ivt+0x7200
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7200 Entry 54 (size 16 bundles) Reserved
-       DBG_FAULT(54)
-       FAULT(54)
-
-       .org ia64_ivt+0x7300
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7300 Entry 55 (size 16 bundles) Reserved
-       DBG_FAULT(55)
-       FAULT(55)
-
-       .org ia64_ivt+0x7400
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7400 Entry 56 (size 16 bundles) Reserved
-       DBG_FAULT(56)
-       FAULT(56)
-
-       .org ia64_ivt+0x7500
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7500 Entry 57 (size 16 bundles) Reserved
-       DBG_FAULT(57)
-       FAULT(57)
-
-       .org ia64_ivt+0x7600
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7600 Entry 58 (size 16 bundles) Reserved
-       DBG_FAULT(58)
-       FAULT(58)
-
-       .org ia64_ivt+0x7700
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7700 Entry 59 (size 16 bundles) Reserved
-       DBG_FAULT(59)
-       FAULT(59)
-
-       .org ia64_ivt+0x7800
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7800 Entry 60 (size 16 bundles) Reserved
-       DBG_FAULT(60)
-       FAULT(60)
-
-       .org ia64_ivt+0x7900
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7900 Entry 61 (size 16 bundles) Reserved
-       DBG_FAULT(61)
-       FAULT(61)
-
-       .org ia64_ivt+0x7a00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7a00 Entry 62 (size 16 bundles) Reserved
-       DBG_FAULT(62)
-       FAULT(62)
-
-       .org ia64_ivt+0x7b00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7b00 Entry 63 (size 16 bundles) Reserved
-       DBG_FAULT(63)
-       FAULT(63)
-
-       .org ia64_ivt+0x7c00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7c00 Entry 64 (size 16 bundles) Reserved
-       DBG_FAULT(64)
-       FAULT(64)
-
-       .org ia64_ivt+0x7d00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7d00 Entry 65 (size 16 bundles) Reserved
-       DBG_FAULT(65)
-       FAULT(65)
-
-       .org ia64_ivt+0x7e00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7e00 Entry 66 (size 16 bundles) Reserved
-       DBG_FAULT(66)
-       FAULT(66)
-
-       .org ia64_ivt+0x7f00
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0x7f00 Entry 67 (size 16 bundles) Reserved
-       DBG_FAULT(67)
-       FAULT(67)
-
-#ifdef CONFIG_IA32_SUPPORT
-
-       /*
-        * There is no particular reason for this code to be here, other than that
-        * there happens to be space here that would go unused otherwise.  If this
-        * fault ever gets "unreserved", simply moved the following code to a more
-        * suitable spot...
-        */
-
-       // IA32 interrupt entry point
-
-ENTRY(dispatch_to_ia32_handler)
-       SAVE_MIN
-       ;;
-       mov r14=cr.isr
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                                  // guarantee that interruption collection is on
-       ;;
-(p15)  ssm psr.i
-       adds r3=8,r2            // Base pointer for SAVE_REST
-       ;;
-       SAVE_REST
-       ;;
-       mov r15=0x80
-       shr r14=r14,16          // Get interrupt number
-       ;;
-       cmp.ne p6,p0=r14,r15
-(p6)   br.call.dpnt.many b6=non_ia32_syscall
-
-       adds r14=IA64_PT_REGS_R8_OFFSET + 16,sp // 16 byte hole per SW conventions
-       adds r15=IA64_PT_REGS_R1_OFFSET + 16,sp
-       ;;
-       cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0
-       ld8 r8=[r14]            // get r8
-       ;;
-       st8 [r15]=r8            // save original EAX in r1 (IA32 procs don't use the GP)
-       ;;
-       alloc r15=ar.pfs,0,0,6,0        // must first in an insn group
-       ;;
-       ld4 r8=[r14],8          // r8 == eax (syscall number)
-       mov r15=IA32_NR_syscalls
-       ;;
-       cmp.ltu.unc p6,p7=r8,r15
-       ld4 out1=[r14],8        // r9 == ecx
-       ;;
-       ld4 out2=[r14],8        // r10 == edx
-       ;;
-       ld4 out0=[r14]          // r11 == ebx
-       adds r14=(IA64_PT_REGS_R13_OFFSET) + 16,sp
-       ;;
-       ld4 out5=[r14],PT(R14)-PT(R13)  // r13 == ebp
-       ;;
-       ld4 out3=[r14],PT(R15)-PT(R14)  // r14 == esi
-       adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-       ld4 out4=[r14]          // r15 == edi
-       movl r16=ia32_syscall_table
-       ;;
-(p6)   shladd r16=r8,3,r16     // force ni_syscall if not valid syscall number
-       ld4 r2=[r2]             // r2 = current_thread_info()->flags
-       ;;
-       ld8 r16=[r16]
-       and r2=_TIF_SYSCALL_TRACEAUDIT,r2       // mask trace or audit
-       ;;
-       mov b6=r16
-       movl r15=ia32_ret_from_syscall
-       cmp.eq p8,p0=r2,r0
-       ;;
-       mov rp=r15
-(p8)   br.call.sptk.many b6=b6
-       br.cond.sptk ia32_trace_syscall
-
-non_ia32_syscall:
-       alloc r15=ar.pfs,0,0,2,0
-       mov out0=r14                            // interrupt #
-       add out1=16,sp                          // pointer to pt_regs
-       ;;                      // avoid WAW on CFM
-       br.call.sptk.many rp=ia32_bad_interrupt
-.ret1: movl r15=ia64_leave_kernel
-       ;;
-       mov rp=r15
-       br.ret.sptk.many rp
-END(dispatch_to_ia32_handler)
-#endif /* CONFIG_IA32_SUPPORT */
-
-#ifdef CONFIG_XEN
-       .section .text,"ax"
-GLOBAL_ENTRY(xen_event_callback)
-       mov r31=pr              // prepare to save predicates
-       ;;
-       SAVE_MIN_WITH_COVER     // uses r31; defines r2 and r3
-       ;;
-       movl r3=XSI_PSR_IC
-       mov r14=1
-       ;;
-       st4 [r3]=r14
-       ;;
-       adds r3=8,r2            // set up second base pointer for SAVE_REST
-       srlz.i                  // ensure everybody knows psr.ic is back on
-       ;;
-       SAVE_REST
-       ;;
-1:
-       alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group
-       add out0=16,sp          // pass pointer to pt_regs as first arg
-       ;;
-       br.call.sptk.many b0=evtchn_do_upcall
-       ;;
-       movl r20=XSI_PSR_I_ADDR
-       ;;
-       ld8 r20=[r20]
-       ;;
-       adds r20=-1,r20         // vcpu_info->evtchn_upcall_pending
-       ;;
-       ld1 r20=[r20]
-       ;;
-       cmp.ne p6,p0=r20,r0     // if there are pending events, 
-       (p6) br.spnt.few 1b     // call evtchn_do_upcall again.
-       br.sptk.many ia64_leave_kernel   
-END(xen_event_callback)
-
-
-       /*
-        * There is no particular reason for this code to be here, other than that
-        * there happens to be space here that would go unused otherwise.  If this
-        * fault ever gets "unreserved", simply moved the following code to a more
-        * suitable spot...
-        */
-
-GLOBAL_ENTRY(xen_bsw1)
-       /* FIXME: THIS CODE IS NOT NaT SAFE! */
-       mov r14=ar.unat
-       movl r30=XSI_B1NAT
-       ;;
-       ld8 r30=[r30];;
-       mov ar.unat=r30
-       movl r30=XSI_BANKNUM;
-       mov r31=1;;
-       st4 [r30]=r31;
-       movl r30=XSI_BANK1_R16;
-       movl r31=XSI_BANK1_R16+8;;
-       ld8.fill r16=[r30],16; ld8.fill r17=[r31],16;;
-       ld8.fill r18=[r30],16; ld8.fill r19=[r31],16;;
-       ld8.fill r20=[r30],16; ld8.fill r21=[r31],16;;
-       ld8.fill r22=[r30],16; ld8.fill r23=[r31],16;;
-       ld8.fill r24=[r30],16; ld8.fill r25=[r31],16;;
-       ld8.fill r26=[r30],16; ld8.fill r27=[r31],16;;
-       ld8.fill r28=[r30],16; ld8.fill r29=[r31],16;;
-       ld8.fill r30=[r30]; ld8.fill r31=[r31];;
-       mov ar.unat=r14
-       br.ret.sptk.many b0
-END(xen_bsw1)
-
-   
-#endif
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h b/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h
deleted file mode 100644 (file)
index 5741b4e..0000000
+++ /dev/null
@@ -1,358 +0,0 @@
-#include <asm/cache.h>
-
-#ifdef CONFIG_XEN
-#include "../kernel/entry.h"
-#else
-#include "entry.h"
-#endif
-
-/*
- * For ivt.s we want to access the stack virtually so we don't have to disable translation
- * on interrupts.
- *
- *  On entry:
- *     r1:     pointer to current task (ar.k6)
- */
-#define MINSTATE_START_SAVE_MIN_VIRT                                                           \
-(pUStk)        mov ar.rsc=0;           /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */     \
-       ;;                                                                                      \
-(pUStk)        mov.m r24=ar.rnat;                                                                      \
-(pUStk)        addl r22=IA64_RBS_OFFSET,r1;                    /* compute base of RBS */               \
-(pKStk) mov r1=sp;                                     /* get sp  */                           \
-       ;;                                                                                      \
-(pUStk) lfetch.fault.excl.nt1 [r22];                                                           \
-(pUStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;   /* compute base of memory stack */      \
-(pUStk)        mov r23=ar.bspstore;                            /* save ar.bspstore */                  \
-       ;;                                                                                      \
-(pUStk)        mov ar.bspstore=r22;                            /* switch to kernel RBS */              \
-(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;                 /* if in kernel mode, use sp (r12) */   \
-       ;;                                                                                      \
-(pUStk)        mov r18=ar.bsp;                                                                         \
-(pUStk)        mov ar.rsc=0x3;         /* set eager mode, pl 0, little-endian, loadrs=0 */             \
-
-#define MINSTATE_END_SAVE_MIN_VIRT                                                             \
-       bsw.1;                  /* switch back to bank 1 (must be last in insn group) */        \
-       ;;
-
-/*
- * For mca_asm.S we want to access the stack physically since the state is saved before we
- * go virtual and don't want to destroy the iip or ipsr.
- */
-#define MINSTATE_START_SAVE_MIN_PHYS                                                           \
-(pKStk) mov r3=IA64_KR(PER_CPU_DATA);;                                                         \
-(pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;;                                                   \
-(pKStk) ld8 r3 = [r3];;                                                                                \
-(pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;;                                            \
-(pKStk) addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3;                                          \
-(pUStk)        mov ar.rsc=0;           /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */     \
-(pUStk)        addl r22=IA64_RBS_OFFSET,r1;            /* compute base of register backing store */    \
-       ;;                                                                                      \
-(pUStk)        mov r24=ar.rnat;                                                                        \
-(pUStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;   /* compute base of memory stack */      \
-(pUStk)        mov r23=ar.bspstore;                            /* save ar.bspstore */                  \
-(pUStk)        dep r22=-1,r22,61,3;                    /* compute kernel virtual addr of RBS */        \
-       ;;                                                                                      \
-(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;         /* if in kernel mode, use sp (r12) */           \
-(pUStk)        mov ar.bspstore=r22;                    /* switch to kernel RBS */                      \
-       ;;                                                                                      \
-(pUStk)        mov r18=ar.bsp;                                                                         \
-(pUStk)        mov ar.rsc=0x3;         /* set eager mode, pl 0, little-endian, loadrs=0 */             \
-
-#define MINSTATE_END_SAVE_MIN_PHYS                                                             \
-       dep r12=-1,r12,61,3;            /* make sp a kernel virtual address */                  \
-       ;;
-
-#ifdef MINSTATE_VIRT
-# define MINSTATE_GET_CURRENT(reg)     mov reg=IA64_KR(CURRENT)
-# define MINSTATE_START_SAVE_MIN       MINSTATE_START_SAVE_MIN_VIRT
-# define MINSTATE_END_SAVE_MIN         MINSTATE_END_SAVE_MIN_VIRT
-#endif
-
-#ifdef MINSTATE_PHYS
-# define MINSTATE_GET_CURRENT(reg)     mov reg=IA64_KR(CURRENT);; tpa reg=reg
-# define MINSTATE_START_SAVE_MIN       MINSTATE_START_SAVE_MIN_PHYS
-# define MINSTATE_END_SAVE_MIN         MINSTATE_END_SAVE_MIN_PHYS
-#endif
-
-/*
- * DO_SAVE_MIN switches to the kernel stacks (if necessary) and saves
- * the minimum state necessary that allows us to turn psr.ic back
- * on.
- *
- * Assumed state upon entry:
- *     psr.ic: off
- *     r31:    contains saved predicates (pr)
- *
- * Upon exit, the state is as follows:
- *     psr.ic: off
- *      r2 = points to &pt_regs.r16
- *      r8 = contents of ar.ccv
- *      r9 = contents of ar.csd
- *     r10 = contents of ar.ssd
- *     r11 = FPSR_DEFAULT
- *     r12 = kernel sp (kernel virtual address)
- *     r13 = points to current task_struct (kernel virtual address)
- *     p15 = TRUE if psr.i is set in cr.ipsr
- *     predicate registers (other than p2, p3, and p15), b6, r3, r14, r15:
- *             preserved
- * CONFIG_XEN note: p6/p7 are not preserved
- *
- * Note that psr.ic is NOT turned on by this macro.  This is so that
- * we can pass interruption state as arguments to a handler.
- */
-#ifdef CONFIG_XEN
-#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA)                                                      \
-       MINSTATE_GET_CURRENT(r16);      /* M (or M;;I) */                                       \
-       mov r27=ar.rsc;                 /* M */                                                 \
-       mov r20=r1;                     /* A */                                                 \
-       mov r25=ar.unat;                /* M */                                                 \
-       /* mov r29=cr.ipsr;             /* M */                                                 \
-       movl r29=XSI_IPSR;;                                                                     \
-       ld8 r29=[r29];;                                                                         \
-       mov r26=ar.pfs;                 /* I */                                                 \
-       /* mov r28=cr.iip;              /* M */                                                 \
-       movl r28=XSI_IIP;;                                                                      \
-       ld8 r28=[r28];;                                                                         \
-       mov r21=ar.fpsr;                /* M */                                                 \
-       COVER;                  /* B;; (or nothing) */                                  \
-       ;;                                                                                      \
-       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16;                                         \
-       ;;                                                                                      \
-       ld1 r17=[r16];                          /* load current->thread.on_ustack flag */       \
-       st1 [r16]=r0;                           /* clear current->thread.on_ustack flag */      \
-       adds r1=-IA64_TASK_THREAD_ON_USTACK_OFFSET,r16                                          \
-       /* switch from user to kernel RBS: */                                                   \
-       ;;                                                                                      \
-       invala;                         /* M */                                                 \
-       /* SAVE_IFS; /* see xen special handling below */                                               \
-       cmp.eq pKStk,pUStk=r0,r17;              /* are we in kernel mode already? */            \
-       ;;                                                                                      \
-       MINSTATE_START_SAVE_MIN                                                                 \
-       adds r17=2*L1_CACHE_BYTES,r1;           /* really: biggest cache-line size */           \
-       adds r16=PT(CR_IPSR),r1;                                                                \
-       ;;                                                                                      \
-       lfetch.fault.excl.nt1 [r17],L1_CACHE_BYTES;                                             \
-       st8 [r16]=r29;          /* save cr.ipsr */                                              \
-       ;;                                                                                      \
-       lfetch.fault.excl.nt1 [r17];                                                            \
-       tbit.nz p15,p0=r29,IA64_PSR_I_BIT;                                                      \
-       mov r29=b0                                                                              \
-       ;;                                                                                      \
-       adds r16=PT(R8),r1;     /* initialize first base pointer */                             \
-       adds r17=PT(R9),r1;     /* initialize second base pointer */                            \
-(pKStk)        mov r18=r0;             /* make sure r18 isn't NaT */                                   \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r8,16;                                                                \
-.mem.offset 8,0; st8.spill [r17]=r9,16;                                                                \
-        ;;                                                                                     \
-.mem.offset 0,0; st8.spill [r16]=r10,24;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r11,24;                                                       \
-        ;;                                                                                     \
-       /* xen special handling for possibly lazy cover */                                      \
-       movl r8=XSI_PRECOVER_IFS;                                                               \
-       ;;                                                                                      \
-       ld8 r30=[r8];                                                                           \
-       ;;                                                                                      \
-       st8 [r16]=r28,16;       /* save cr.iip */                                               \
-       st8 [r17]=r30,16;       /* save cr.ifs */                                               \
-(pUStk)        sub r18=r18,r22;        /* r18=RSE.ndirty*8 */                                          \
-       mov r8=ar.ccv;                                                                          \
-       mov r9=ar.csd;                                                                          \
-       mov r10=ar.ssd;                                                                         \
-       movl r11=FPSR_DEFAULT;   /* L-unit */                                                   \
-       ;;                                                                                      \
-       st8 [r16]=r25,16;       /* save ar.unat */                                              \
-       st8 [r17]=r26,16;       /* save ar.pfs */                                               \
-       shl r18=r18,16;         /* compute ar.rsc to be used for "loadrs" */                    \
-       ;;                                                                                      \
-       st8 [r16]=r27,16;       /* save ar.rsc */                                               \
-(pUStk)        st8 [r17]=r24,16;       /* save ar.rnat */                                              \
-(pKStk)        adds r17=16,r17;        /* skip over ar_rnat field */                                   \
-       ;;                      /* avoid RAW on r16 & r17 */                                    \
-(pUStk)        st8 [r16]=r23,16;       /* save ar.bspstore */                                          \
-       st8 [r17]=r31,16;       /* save predicates */                                           \
-(pKStk)        adds r16=16,r16;        /* skip over ar_bspstore field */                               \
-       ;;                                                                                      \
-       st8 [r16]=r29,16;       /* save b0 */                                                   \
-       st8 [r17]=r18,16;       /* save ar.rsc value for "loadrs" */                            \
-       cmp.eq pNonSys,pSys=r0,r0       /* initialize pSys=0, pNonSys=1 */                      \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r20,16;       /* save original r1 */                          \
-.mem.offset 8,0; st8.spill [r17]=r12,16;                                                       \
-       adds r12=-16,r1;        /* switch to kernel memory stack (with 16 bytes of scratch) */  \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r13,16;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r21,16;       /* save ar.fpsr */                              \
-       mov r13=IA64_KR(CURRENT);       /* establish `current' */                               \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r15,16;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r14,16;                                                       \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r2,16;                                                                \
-.mem.offset 8,0; st8.spill [r17]=r3,16;                                                                \
-       ;;                                                                                      \
-       EXTRA;                                                                                  \
-       mov r2=b0; br.call.sptk b0=xen_bsw1;; mov b0=r2;                                        \
-       adds r2=IA64_PT_REGS_R16_OFFSET,r1;                                                     \
-       ;;                                                                                      \
-       movl r1=__gp;           /* establish kernel global pointer */                           \
-       ;;                                                                                      \
-       /* MINSTATE_END_SAVE_MIN */
-#else
-#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA)                                                      \
-       MINSTATE_GET_CURRENT(r16);      /* M (or M;;I) */                                       \
-       mov r27=ar.rsc;                 /* M */                                                 \
-       mov r20=r1;                     /* A */                                                 \
-       mov r25=ar.unat;                /* M */                                                 \
-       mov r29=cr.ipsr;                /* M */                                                 \
-       mov r26=ar.pfs;                 /* I */                                                 \
-       mov r28=cr.iip;                 /* M */                                                 \
-       mov r21=ar.fpsr;                /* M */                                                 \
-       COVER;                          /* B;; (or nothing) */                                  \
-       ;;                                                                                      \
-       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16;                                         \
-       ;;                                                                                      \
-       ld1 r17=[r16];                          /* load current->thread.on_ustack flag */       \
-       st1 [r16]=r0;                           /* clear current->thread.on_ustack flag */      \
-       adds r1=-IA64_TASK_THREAD_ON_USTACK_OFFSET,r16                                          \
-       /* switch from user to kernel RBS: */                                                   \
-       ;;                                                                                      \
-       invala;                         /* M */                                                 \
-       SAVE_IFS;                                                                               \
-       cmp.eq pKStk,pUStk=r0,r17;              /* are we in kernel mode already? */            \
-       ;;                                                                                      \
-       MINSTATE_START_SAVE_MIN                                                                 \
-       adds r17=2*L1_CACHE_BYTES,r1;           /* really: biggest cache-line size */           \
-       adds r16=PT(CR_IPSR),r1;                                                                \
-       ;;                                                                                      \
-       lfetch.fault.excl.nt1 [r17],L1_CACHE_BYTES;                                             \
-       st8 [r16]=r29;          /* save cr.ipsr */                                              \
-       ;;                                                                                      \
-       lfetch.fault.excl.nt1 [r17];                                                            \
-       tbit.nz p15,p0=r29,IA64_PSR_I_BIT;                                                      \
-       mov r29=b0                                                                              \
-       ;;                                                                                      \
-       adds r16=PT(R8),r1;     /* initialize first base pointer */                             \
-       adds r17=PT(R9),r1;     /* initialize second base pointer */                            \
-(pKStk)        mov r18=r0;             /* make sure r18 isn't NaT */                                   \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r8,16;                                                                \
-.mem.offset 8,0; st8.spill [r17]=r9,16;                                                                \
-        ;;                                                                                     \
-.mem.offset 0,0; st8.spill [r16]=r10,24;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r11,24;                                                       \
-        ;;                                                                                     \
-       st8 [r16]=r28,16;       /* save cr.iip */                                               \
-       st8 [r17]=r30,16;       /* save cr.ifs */                                               \
-(pUStk)        sub r18=r18,r22;        /* r18=RSE.ndirty*8 */                                          \
-       mov r8=ar.ccv;                                                                          \
-       mov r9=ar.csd;                                                                          \
-       mov r10=ar.ssd;                                                                         \
-       movl r11=FPSR_DEFAULT;   /* L-unit */                                                   \
-       ;;                                                                                      \
-       st8 [r16]=r25,16;       /* save ar.unat */                                              \
-       st8 [r17]=r26,16;       /* save ar.pfs */                                               \
-       shl r18=r18,16;         /* compute ar.rsc to be used for "loadrs" */                    \
-       ;;                                                                                      \
-       st8 [r16]=r27,16;       /* save ar.rsc */                                               \
-(pUStk)        st8 [r17]=r24,16;       /* save ar.rnat */                                              \
-(pKStk)        adds r17=16,r17;        /* skip over ar_rnat field */                                   \
-       ;;                      /* avoid RAW on r16 & r17 */                                    \
-(pUStk)        st8 [r16]=r23,16;       /* save ar.bspstore */                                          \
-       st8 [r17]=r31,16;       /* save predicates */                                           \
-(pKStk)        adds r16=16,r16;        /* skip over ar_bspstore field */                               \
-       ;;                                                                                      \
-       st8 [r16]=r29,16;       /* save b0 */                                                   \
-       st8 [r17]=r18,16;       /* save ar.rsc value for "loadrs" */                            \
-       cmp.eq pNonSys,pSys=r0,r0       /* initialize pSys=0, pNonSys=1 */                      \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r20,16;       /* save original r1 */                          \
-.mem.offset 8,0; st8.spill [r17]=r12,16;                                                       \
-       adds r12=-16,r1;        /* switch to kernel memory stack (with 16 bytes of scratch) */  \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r13,16;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r21,16;       /* save ar.fpsr */                              \
-       mov r13=IA64_KR(CURRENT);       /* establish `current' */                               \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r15,16;                                                       \
-.mem.offset 8,0; st8.spill [r17]=r14,16;                                                       \
-       ;;                                                                                      \
-.mem.offset 0,0; st8.spill [r16]=r2,16;                                                                \
-.mem.offset 8,0; st8.spill [r17]=r3,16;                                                                \
-       adds r2=IA64_PT_REGS_R16_OFFSET,r1;                                                     \
-       ;;                                                                                      \
-       EXTRA;                                                                                  \
-       movl r1=__gp;           /* establish kernel global pointer */                           \
-       ;;                                                                                      \
-       MINSTATE_END_SAVE_MIN
-#endif
-
-/*
- * SAVE_REST saves the remainder of pt_regs (with psr.ic on).
- *
- * Assumed state upon entry:
- *     psr.ic: on
- *     r2:     points to &pt_regs.r16
- *     r3:     points to &pt_regs.r17
- *     r8:     contents of ar.ccv
- *     r9:     contents of ar.csd
- *     r10:    contents of ar.ssd
- *     r11:    FPSR_DEFAULT
- *
- * Registers r14 and r15 are guaranteed not to be touched by SAVE_REST.
- */
-#define SAVE_REST                              \
-.mem.offset 0,0; st8.spill [r2]=r16,16;                \
-.mem.offset 8,0; st8.spill [r3]=r17,16;                \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r18,16;                \
-.mem.offset 8,0; st8.spill [r3]=r19,16;                \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r20,16;                \
-.mem.offset 8,0; st8.spill [r3]=r21,16;                \
-       mov r18=b6;                             \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r22,16;                \
-.mem.offset 8,0; st8.spill [r3]=r23,16;                \
-       mov r19=b7;                             \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r24,16;                \
-.mem.offset 8,0; st8.spill [r3]=r25,16;                \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r26,16;                \
-.mem.offset 8,0; st8.spill [r3]=r27,16;                \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r28,16;                \
-.mem.offset 8,0; st8.spill [r3]=r29,16;                \
-       ;;                                      \
-.mem.offset 0,0; st8.spill [r2]=r30,16;                \
-.mem.offset 8,0; st8.spill [r3]=r31,32;                \
-       ;;                                      \
-       mov ar.fpsr=r11;        /* M-unit */    \
-       st8 [r2]=r8,8;          /* ar.ccv */    \
-       adds r24=PT(B6)-PT(F7),r3;              \
-       ;;                                      \
-       stf.spill [r2]=f6,32;                   \
-       stf.spill [r3]=f7,32;                   \
-       ;;                                      \
-       stf.spill [r2]=f8,32;                   \
-       stf.spill [r3]=f9,32;                   \
-       ;;                                      \
-       stf.spill [r2]=f10;                     \
-       stf.spill [r3]=f11;                     \
-       adds r25=PT(B7)-PT(F11),r3;             \
-       ;;                                      \
-       st8 [r24]=r18,16;       /* b6 */        \
-       st8 [r25]=r19,16;       /* b7 */        \
-       ;;                                      \
-       st8 [r24]=r9;           /* ar.csd */    \
-       st8 [r25]=r10;          /* ar.ssd */    \
-       ;;
-
-#define SAVE_MIN_WITH_COVER    DO_SAVE_MIN(cover, mov r30=cr.ifs,)
-#define SAVE_MIN_WITH_COVER_R19        DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19)
-#ifdef CONFIG_XEN
-#define SAVE_MIN               break 0;; /* FIXME: non-cover version only for ia32 support? */
-#else
-#define SAVE_MIN               DO_SAVE_MIN(     , mov r30=r0, )
-#endif
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S b/linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S
deleted file mode 100644 (file)
index d8ebfb9..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * ia64/xen/xenpal.S
- *
- * Alternate PAL  routines for Xen.  Heavily leveraged from
- *   ia64/kernel/pal.S
- *
- * Copyright (C) 2005 Hewlett-Packard Co
- *     Dan Magenheimer <dan.magenheimer@.hp.com>
- */
-
-#include <asm/asmmacro.h>
-#include <asm/processor.h>
-
-GLOBAL_ENTRY(xen_pal_call_static)
-       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
-       alloc loc1 = ar.pfs,5,5,0,0
-#ifdef CONFIG_XEN
-       movl r22=running_on_xen;;
-       ld4 r22=[r22];;
-       cmp.eq p7,p0=r22,r0
-(p7)   br.cond.spnt.many __ia64_pal_call_static;;
-#endif
-       movl loc2 = pal_entry_point
-1:     {
-         mov r28 = in0
-         mov r29 = in1
-         mov r8 = ip
-       }
-       ;;
-       ld8 loc2 = [loc2]               // loc2 <- entry point
-       tbit.nz p6,p7 = in4, 0
-       adds r8 = 1f-1b,r8
-       mov loc4=ar.rsc                 // save RSE configuration
-       ;;
-       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
-#ifdef CONFIG_XEN
-       mov r9 = r8
-       XEN_HYPER_GET_PSR
-       ;;
-       mov loc3 = r8
-       mov r8 = r9
-       ;;
-#else    
-       mov loc3 = psr
-#endif    
-       mov loc0 = rp
-       .body
-       mov r30 = in2
-
-#ifdef CONFIG_XEN
-       // this is low priority for paravirtualization, but is called
-       // from the idle loop so confuses privop counting
-       movl r31=XSI_PSR_I_ADDR
-       ;;
-       ld8 r31=[r31]
-       mov r22=1
-       ;;
-       st1 [r31]=r22
-       ;;  
-(p6)   movl r31=XSI_PSR_IC
-       ;;
-(p6)   st4.rel [r31]=r0
-       ;;
-       mov r31 = in3
-       mov b7 = loc2
-       ;;
-#else
-(p6)   rsm psr.i | psr.ic
-       mov r31 = in3
-       mov b7 = loc2
-
-(p7)   rsm psr.i
-       ;;
-(p6)   srlz.i
-#endif
-       mov rp = r8
-       br.cond.sptk.many b7
-1:     mov psr.l = loc3
-       mov ar.rsc = loc4               // restore RSE configuration
-       mov ar.pfs = loc1
-       mov rp = loc0
-       ;;
-       srlz.d                          // seralize restoration of psr.l
-       br.ret.sptk.many b0
-END(xen_pal_call_static)
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S b/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S
deleted file mode 100644 (file)
index 469f39e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Support routines for Xen
- *
- * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
- */
-
-#include <asm/processor.h>
-#include <asm/asmmacro.h>
-
-#define isBP   p3      // are we the Bootstrap Processor?
-
-       .text
-GLOBAL_ENTRY(early_xen_setup)
-       mov r8=ar.rsc           // Initialized in head.S
-(isBP) movl r9=running_on_xen;;
-       extr.u r8=r8,2,2;;      // Extract pl fields
-       cmp.eq p7,p0=r8,r0      // p7: !running on xen
-       mov r8=1                // booleanize.
-(p7)   br.ret.sptk.many rp;;
-(isBP) st4 [r9]=r8
-       movl r10=xen_ivt;;
-       
-       mov cr.iva=r10
-
-       /* Set xsi base.  */
-#define FW_HYPERCALL_SET_SHARED_INFO_VA                        0x600
-(isBP) mov r2=FW_HYPERCALL_SET_SHARED_INFO_VA
-(isBP) movl r28=XSI_BASE;;
-(isBP) break 0x1000;;
-
-       br.ret.sptk.many rp
-       ;;
-END(early_xen_setup)
-
-#include <xen/interface/xen.h>
-
-/* Stub for suspend.
-   Just force the stacked registers to be written in memory.  */       
-GLOBAL_ENTRY(xencomm_arch_hypercall_suspend)
-       ;; 
-       alloc r20=ar.pfs,0,0,6,0
-       mov r2=__HYPERVISOR_sched_op
-       ;; 
-       /* We don't want to deal with RSE.  */
-       flushrs
-       mov r33=r32
-       mov r32=2 // SCHEDOP_shutdown
-       ;;
-       break 0x1000
-       ;; 
-       br.ret.sptk.many b0
-END(xencomm_arch_hypercall_suspend)
diff --git a/linux-2.6-xen-sparse/arch/um/kernel/physmem.c b/linux-2.6-xen-sparse/arch/um/kernel/physmem.c
deleted file mode 100644 (file)
index 22c40d3..0000000
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
- * Licensed under the GPL
- */
-
-#include "linux/mm.h"
-#include "linux/rbtree.h"
-#include "linux/slab.h"
-#include "linux/vmalloc.h"
-#include "linux/bootmem.h"
-#include "linux/module.h"
-#include "linux/pfn.h"
-#include "asm/types.h"
-#include "asm/pgtable.h"
-#include "kern_util.h"
-#include "user_util.h"
-#include "mode_kern.h"
-#include "mem.h"
-#include "mem_user.h"
-#include "os.h"
-#include "kern.h"
-#include "init.h"
-
-struct phys_desc {
-       struct rb_node rb;
-       int fd;
-       __u64 offset;
-       void *virt;
-       unsigned long phys;
-       struct list_head list;
-};
-
-static struct rb_root phys_mappings = RB_ROOT;
-
-static struct rb_node **find_rb(void *virt)
-{
-       struct rb_node **n = &phys_mappings.rb_node;
-       struct phys_desc *d;
-
-       while(*n != NULL){
-               d = rb_entry(*n, struct phys_desc, rb);
-               if(d->virt == virt)
-                       return(n);
-
-               if(d->virt > virt)
-                       n = &(*n)->rb_left;
-               else
-                       n = &(*n)->rb_right;
-       }
-
-       return(n);
-}
-
-static struct phys_desc *find_phys_mapping(void *virt)
-{
-       struct rb_node **n = find_rb(virt);
-
-       if(*n == NULL)
-               return(NULL);
-
-       return(rb_entry(*n, struct phys_desc, rb));
-}
-
-static void insert_phys_mapping(struct phys_desc *desc)
-{
-       struct rb_node **n = find_rb(desc->virt);
-
-       if(*n != NULL)
-               panic("Physical remapping for %p already present",
-                     desc->virt);
-
-       rb_link_node(&desc->rb, rb_parent(*n), n);
-       rb_insert_color(&desc->rb, &phys_mappings);
-}
-
-LIST_HEAD(descriptor_mappings);
-
-struct desc_mapping {
-       int fd;
-       struct list_head list;
-       struct list_head pages;
-};
-
-static struct desc_mapping *find_mapping(int fd)
-{
-       struct desc_mapping *desc;
-       struct list_head *ele;
-
-       list_for_each(ele, &descriptor_mappings){
-               desc = list_entry(ele, struct desc_mapping, list);
-               if(desc->fd == fd)
-                       return(desc);
-       }
-
-       return(NULL);
-}
-
-static struct desc_mapping *descriptor_mapping(int fd)
-{
-       struct desc_mapping *desc;
-
-       desc = find_mapping(fd);
-       if(desc != NULL)
-               return(desc);
-
-       desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
-       if(desc == NULL)
-               return(NULL);
-
-       *desc = ((struct desc_mapping)
-               { .fd =         fd,
-                 .list =       LIST_HEAD_INIT(desc->list),
-                 .pages =      LIST_HEAD_INIT(desc->pages) });
-       list_add(&desc->list, &descriptor_mappings);
-
-       return(desc);
-}
-
-int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w)
-{
-       struct desc_mapping *fd_maps;
-       struct phys_desc *desc;
-       unsigned long phys;
-       int err;
-
-       fd_maps = descriptor_mapping(fd);
-       if(fd_maps == NULL)
-               return(-ENOMEM);
-
-       phys = __pa(virt);
-       desc = find_phys_mapping(virt);
-       if(desc != NULL)
-               panic("Address 0x%p is already substituted\n", virt);
-
-       err = -ENOMEM;
-       desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
-       if(desc == NULL)
-               goto out;
-
-       *desc = ((struct phys_desc)
-               { .fd =                 fd,
-                 .offset =             offset,
-                 .virt =               virt,
-                 .phys =               __pa(virt),
-                 .list =               LIST_HEAD_INIT(desc->list) });
-       insert_phys_mapping(desc);
-
-       list_add(&desc->list, &fd_maps->pages);
-
-       virt = (void *) ((unsigned long) virt & PAGE_MASK);
-       err = os_map_memory(virt, fd, offset, PAGE_SIZE, 1, w, 0);
-       if(!err)
-               goto out;
-
-       rb_erase(&desc->rb, &phys_mappings);
-       kfree(desc);
- out:
-       return(err);
-}
-
-static int physmem_fd = -1;
-
-static void remove_mapping(struct phys_desc *desc)
-{
-       void *virt = desc->virt;
-       int err;
-
-       rb_erase(&desc->rb, &phys_mappings);
-       list_del(&desc->list);
-       kfree(desc);
-
-       err = os_map_memory(virt, physmem_fd, __pa(virt), PAGE_SIZE, 1, 1, 0);
-       if(err)
-               panic("Failed to unmap block device page from physical memory, "
-                     "errno = %d", -err);
-}
-
-int physmem_remove_mapping(void *virt)
-{
-       struct phys_desc *desc;
-
-       virt = (void *) ((unsigned long) virt & PAGE_MASK);
-       desc = find_phys_mapping(virt);
-       if(desc == NULL)
-               return(0);
-
-       remove_mapping(desc);
-       return(1);
-}
-
-void physmem_forget_descriptor(int fd)
-{
-       struct desc_mapping *desc;
-       struct phys_desc *page;
-       struct list_head *ele, *next;
-       __u64 offset;
-       void *addr;
-       int err;
-
-       desc = find_mapping(fd);
-       if(desc == NULL)
-               return;
-
-       list_for_each_safe(ele, next, &desc->pages){
-               page = list_entry(ele, struct phys_desc, list);
-               offset = page->offset;
-               addr = page->virt;
-               remove_mapping(page);
-               err = os_seek_file(fd, offset);
-               if(err)
-                       panic("physmem_forget_descriptor - failed to seek "
-                             "to %lld in fd %d, error = %d\n",
-                             offset, fd, -err);
-               err = os_read_file(fd, addr, PAGE_SIZE);
-               if(err < 0)
-                       panic("physmem_forget_descriptor - failed to read "
-                             "from fd %d to 0x%p, error = %d\n",
-                             fd, addr, -err);
-       }
-
-       list_del(&desc->list);
-       kfree(desc);
-}
-
-EXPORT_SYMBOL(physmem_forget_descriptor);
-EXPORT_SYMBOL(physmem_remove_mapping);
-EXPORT_SYMBOL(physmem_subst_mapping);
-
-int arch_free_page(struct page *page, int order)
-{
-       void *virt;
-       int i;
-
-       for(i = 0; i < (1 << order); i++){
-               virt = __va(page_to_phys(page + i));
-               physmem_remove_mapping(virt);
-       }
-
-       return 0;
-}
-
-int is_remapped(void *virt)
-{
-       struct phys_desc *desc = find_phys_mapping(virt);
-
-       return(desc != NULL);
-}
-
-/* Changed during early boot */
-unsigned long high_physmem;
-
-extern unsigned long long physmem_size;
-
-int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
-{
-       struct page *p, *map;
-       unsigned long phys_len, phys_pages, highmem_len, highmem_pages;
-       unsigned long iomem_len, iomem_pages, total_len, total_pages;
-       int i;
-
-       phys_pages = physmem >> PAGE_SHIFT;
-       phys_len = phys_pages * sizeof(struct page);
-
-       iomem_pages = iomem >> PAGE_SHIFT;
-       iomem_len = iomem_pages * sizeof(struct page);
-
-       highmem_pages = highmem >> PAGE_SHIFT;
-       highmem_len = highmem_pages * sizeof(struct page);
-
-       total_pages = phys_pages + iomem_pages + highmem_pages;
-       total_len = phys_len + iomem_len + highmem_len;
-
-       if(kmalloc_ok){
-               map = kmalloc(total_len, GFP_KERNEL);
-               if(map == NULL)
-                       map = vmalloc(total_len);
-       }
-       else map = alloc_bootmem_low_pages(total_len);
-
-       if(map == NULL)
-               return(-ENOMEM);
-
-       for(i = 0; i < total_pages; i++){
-               p = &map[i];
-               memset(p, 0, sizeof(struct page));
-               SetPageReserved(p);
-               INIT_LIST_HEAD(&p->lru);
-       }
-
-       max_mapnr = total_pages;
-       return(0);
-}
-
-/* Changed during early boot */
-static unsigned long kmem_top = 0;
-
-unsigned long get_kmem_end(void)
-{
-       if(kmem_top == 0)
-               kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas);
-       return(kmem_top);
-}
-
-void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
-               int r, int w, int x)
-{
-       __u64 offset;
-       int fd, err;
-
-       fd = phys_mapping(phys, &offset);
-       err = os_map_memory((void *) virt, fd, offset, len, r, w, x);
-       if(err) {
-               if(err == -ENOMEM)
-                       printk("try increasing the host's "
-                              "/proc/sys/vm/max_map_count to <physical "
-                              "memory size>/4096\n");
-               panic("map_memory(0x%lx, %d, 0x%llx, %ld, %d, %d, %d) failed, "
-                     "err = %d\n", virt, fd, offset, len, r, w, x, err);
-       }
-}
-
-extern int __syscall_stub_start;
-
-void setup_physmem(unsigned long start, unsigned long reserve_end,
-                  unsigned long len, unsigned long long highmem)
-{
-       unsigned long reserve = reserve_end - start;
-       int pfn = PFN_UP(__pa(reserve_end));
-       int delta = (len - reserve) >> PAGE_SHIFT;
-       int err, offset, bootmap_size;
-
-       physmem_fd = create_mem_file(len + highmem);
-
-       offset = uml_reserved - uml_physmem;
-       err = os_map_memory((void *) uml_reserved, physmem_fd, offset,
-                           len - offset, 1, 1, 0);
-       if(err < 0){
-               os_print_error(err, "Mapping memory");
-               exit(1);
-       }
-
-       /* Special kludge - This page will be mapped in to userspace processes
-        * from physmem_fd, so it needs to be written out there.
-        */
-       os_seek_file(physmem_fd, __pa(&__syscall_stub_start));
-       os_write_file(physmem_fd, &__syscall_stub_start, PAGE_SIZE);
-
-       bootmap_size = init_bootmem(pfn, pfn + delta);
-       free_bootmem(__pa(reserve_end) + bootmap_size,
-                    len - bootmap_size - reserve);
-}
-
-int phys_mapping(unsigned long phys, __u64 *offset_out)
-{
-       struct phys_desc *desc = find_phys_mapping(__va(phys & PAGE_MASK));
-       int fd = -1;
-
-       if(desc != NULL){
-               fd = desc->fd;
-               *offset_out = desc->offset;
-       }
-       else if(phys < physmem_size){
-               fd = physmem_fd;
-               *offset_out = phys;
-       }
-       else if(phys < __pa(end_iomem)){
-               struct iomem_region *region = iomem_regions;
-
-               while(region != NULL){
-                       if((phys >= region->phys) &&
-                          (phys < region->phys + region->size)){
-                               fd = region->fd;
-                               *offset_out = phys - region->phys;
-                               break;
-                       }
-                       region = region->next;
-               }
-       }
-       else if(phys < __pa(end_iomem) + highmem){
-               fd = physmem_fd;
-               *offset_out = phys - iomem_size;
-       }
-
-       return(fd);
-}
-
-static int __init uml_mem_setup(char *line, int *add)
-{
-       char *retptr;
-       physmem_size = memparse(line,&retptr);
-       return 0;
-}
-__uml_setup("mem=", uml_mem_setup,
-"mem=<Amount of desired ram>\n"
-"    This controls how much \"physical\" memory the kernel allocates\n"
-"    for the system. The size is specified as a number followed by\n"
-"    one of 'k', 'K', 'm', 'M', which have the obvious meanings.\n"
-"    This is not related to the amount of memory in the host.  It can\n"
-"    be more, and the excess, if it's ever used, will just be swapped out.\n"
-"      Example: mem=64M\n\n"
-);
-
-unsigned long find_iomem(char *driver, unsigned long *len_out)
-{
-       struct iomem_region *region = iomem_regions;
-
-       while(region != NULL){
-               if(!strcmp(region->driver, driver)){
-                       *len_out = region->size;
-                       return(region->virt);
-               }
-
-               region = region->next;
-       }
-
-       return(0);
-}
-
-int setup_iomem(void)
-{
-       struct iomem_region *region = iomem_regions;
-       unsigned long iomem_start = high_physmem + PAGE_SIZE;
-       int err;
-
-       while(region != NULL){
-               err = os_map_memory((void *) iomem_start, region->fd, 0,
-                                   region->size, 1, 1, 0);
-               if(err)
-                       printk("Mapping iomem region for driver '%s' failed, "
-                              "errno = %d\n", region->driver, -err);
-               else {
-                       region->virt = iomem_start;
-                       region->phys = __pa(region->virt);
-               }
-
-               iomem_start += region->size + PAGE_SIZE;
-               region = region->next;
-       }
-
-       return(0);
-}
-
-__initcall(setup_iomem);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
diff --git a/linux-2.6-xen-sparse/arch/x86_64/Kconfig b/linux-2.6-xen-sparse/arch/x86_64/Kconfig
deleted file mode 100644 (file)
index 09d6e4f..0000000
+++ /dev/null
@@ -1,709 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-# Note: ISA is disabled and will hopefully never be enabled.
-# If you managed to buy an ISA x86-64 box you'll have to fix all the
-# ISA drivers you need yourself.
-#
-
-mainmenu "Linux Kernel Configuration"
-
-config X86_64
-       bool
-       default y
-       help
-         Port to the x86-64 architecture. x86-64 is a 64-bit extension to the
-         classical 32-bit x86 architecture. For details see
-         <http://www.x86-64.org/>.
-
-config 64BIT
-       def_bool y
-
-config X86
-       bool
-       default y
-
-config LOCKDEP_SUPPORT
-       bool
-       default y
-
-config STACKTRACE_SUPPORT
-       bool
-       default y
-
-config SEMAPHORE_SLEEPERS
-       bool
-       default y
-
-config MMU
-       bool
-       default y
-
-config ISA
-       bool
-
-config SBUS
-       bool
-
-config RWSEM_GENERIC_SPINLOCK
-       bool
-       default y
-
-config RWSEM_XCHGADD_ALGORITHM
-       bool
-
-config GENERIC_HWEIGHT
-       bool
-       default y
-
-config GENERIC_CALIBRATE_DELAY
-       bool
-       default y
-
-config X86_CMPXCHG
-       bool
-       default y
-
-config EARLY_PRINTK
-       bool
-       default y
-
-config GENERIC_ISA_DMA
-       bool
-       default y
-
-config GENERIC_IOMAP
-       bool
-       default y
-
-config ARCH_MAY_HAVE_PC_FDC
-       bool
-       default y
-
-config DMI
-       bool
-       default y
-
-config AUDIT_ARCH
-       bool
-       default y
-
-source "init/Kconfig"
-
-
-menu "Processor type and features"
-
-choice
-       prompt "Subarchitecture Type"
-       default X86_PC
-
-config X86_PC
-       bool "PC-compatible"
-       help
-         Choose this option if your computer is a standard PC or compatible.
-
-config X86_VSMP
-       bool "Support for ScaleMP vSMP"
-        help
-         Support for ScaleMP vSMP systems.  Say 'Y' here if this kernel is
-         supposed to run on these EM64T-based machines.  Only choose this option
-         if you have one of these machines.
-
-endchoice
-
-choice
-       prompt "Processor family"
-       default MK8
-
-config MK8
-       bool "AMD-Opteron/Athlon64"
-       help
-         Optimize for AMD Opteron/Athlon64/Hammer/K8 CPUs.
-
-config MPSC
-       bool "Intel EM64T"
-       help
-         Optimize for Intel Pentium 4 and Xeon CPUs with Intel
-         Extended Memory 64 Technology(EM64T). For details see
-         <http://www.intel.com/technology/64bitextensions/>.
-
-config GENERIC_CPU
-       bool "Generic-x86-64"
-       help
-         Generic x86-64 CPU.
-
-endchoice
-
-config X86_64_XEN
-       bool "Enable Xen compatible kernel"
-       select SWIOTLB
-       help
-         This option will compile a kernel compatible with Xen hypervisor
-
-config X86_NO_TSS
-       bool
-       depends on X86_64_XEN
-       default y
-
-config X86_NO_IDT
-       bool
-       depends on X86_64_XEN
-       default y
-
-#
-# Define implied options from the CPU selection here
-#
-config X86_L1_CACHE_BYTES
-       int
-       default "128" if GENERIC_CPU || MPSC
-       default "64" if MK8
-
-config X86_L1_CACHE_SHIFT
-       int
-       default "7" if GENERIC_CPU || MPSC
-       default "6" if MK8
-
-config X86_INTERNODE_CACHE_BYTES
-       int
-       default "4096" if X86_VSMP
-       default X86_L1_CACHE_BYTES if !X86_VSMP
-
-config X86_TSC
-       bool
-       depends on !X86_64_XEN
-       default y
-
-config X86_GOOD_APIC
-       bool
-       default y
-
-config MICROCODE
-       tristate "/dev/cpu/microcode - Intel CPU microcode support"
-       ---help---
-         If you say Y here the 'File systems' section, you will be
-         able to update the microcode on Intel processors. You will
-         obviously need the actual microcode binary data itself which is
-         not shipped with the Linux kernel.
-
-         For latest news and information on obtaining all the required
-         ingredients for this driver, check:
-         <http://www.urbanmyth.org/microcode/>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called microcode.
-         If you use modprobe or kmod you may also want to add the line
-         'alias char-major-10-184 microcode' to your /etc/modules.conf file.
-
-config X86_MSR
-       tristate "/dev/cpu/*/msr - Model-specific register support"
-       help
-         This device gives privileged processes access to the x86
-         Model-Specific Registers (MSRs).  It is a character device with
-         major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr.
-         MSR accesses are directed to a specific CPU on multi-processor
-         systems.
-
-config X86_CPUID
-       tristate "/dev/cpu/*/cpuid - CPU information support"
-       help
-         This device gives processes access to the x86 CPUID instruction to
-         be executed on a specific processor.  It is a character device
-         with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to
-         /dev/cpu/31/cpuid.
-
-config X86_HT
-       bool
-       depends on SMP && !MK8 && !X86_64_XEN
-       default y
-
-config MATH_EMULATION
-       bool
-
-config MCA
-       bool
-
-config EISA
-       bool
-
-config X86_IO_APIC
-       bool
-       depends !XEN_UNPRIVILEGED_GUEST
-       default y
-
-config X86_XEN_GENAPIC
-       bool
-       depends X86_64_XEN
-       default XEN_PRIVILEGED_GUEST || SMP
-
-config X86_LOCAL_APIC
-       bool
-       depends !XEN_UNPRIVILEGED_GUEST
-       default y
-
-config MTRR
-       bool "MTRR (Memory Type Range Register) support"
-       depends on !XEN_UNPRIVILEGED_GUEST
-       ---help---
-         On Intel P6 family processors (Pentium Pro, Pentium II and later)
-         the Memory Type Range Registers (MTRRs) may be used to control
-         processor access to memory ranges. This is most useful if you have
-         a video (VGA) card on a PCI or AGP bus. Enabling write-combining
-         allows bus write transfers to be combined into a larger transfer
-         before bursting over the PCI/AGP bus. This can increase performance
-         of image write operations 2.5 times or more. Saying Y here creates a
-         /proc/mtrr file which may be used to manipulate your processor's
-         MTRRs. Typically the X server should use this.
-
-         This code has a reasonably generic interface so that similar
-         control registers on other processors can be easily supported
-         as well.
-
-         Saying Y here also fixes a problem with buggy SMP BIOSes which only
-         set the MTRRs for the boot CPU and not for the secondary CPUs. This
-         can lead to all sorts of problems, so it's good to say Y here.
-
-         Just say Y here, all x86-64 machines support MTRRs.
-
-         See <file:Documentation/mtrr.txt> for more information.
-
-config SMP
-       bool "Symmetric multi-processing support"
-       ---help---
-         This enables support for systems with more than one CPU. If you have
-         a system with only one CPU, like most personal computers, say N. If
-         you have a system with more than one CPU, say Y.
-
-         If you say N here, the kernel will run on single and multiprocessor
-         machines, but will use only one CPU of a multiprocessor machine. If
-         you say Y here, the kernel will run on many, but not all,
-         singleprocessor machines. On a singleprocessor machine, the kernel
-         will run faster if you say N here.
-
-         If you don't know what to do here, say N.
-
-config SCHED_SMT
-       bool "SMT (Hyperthreading) scheduler support"
-       depends on SMP && !X86_64_XEN
-       default n
-       help
-         SMT scheduler support improves the CPU scheduler's decision making
-         when dealing with Intel Pentium 4 chips with HyperThreading at a
-         cost of slightly increased overhead in some places. If unsure say
-         N here.
-
-config SCHED_MC
-       bool "Multi-core scheduler support"
-       depends on SMP && !X86_64_XEN
-       default y
-       help
-         Multi-core scheduler support improves the CPU scheduler's decision
-         making when dealing with multi-core CPU chips at a cost of slightly
-         increased overhead in some places. If unsure say N here.
-
-source "kernel/Kconfig.preempt"
-
-config NUMA
-       bool "Non Uniform Memory Access (NUMA) Support"
-       depends on SMP && !X86_64_XEN
-       help
-        Enable NUMA (Non Uniform Memory Access) support. The kernel 
-        will try to allocate memory used by a CPU on the local memory 
-        controller of the CPU and add some more NUMA awareness to the kernel.
-        This code is recommended on all multiprocessor Opteron systems.
-        If the system is EM64T, you should say N unless your system is EM64T 
-        NUMA. 
-
-config K8_NUMA
-       bool "Old style AMD Opteron NUMA detection"
-       depends on NUMA
-       default y
-       help
-        Enable K8 NUMA node topology detection.  You should say Y here if
-        you have a multi processor AMD K8 system. This uses an old
-        method to read the NUMA configurtion directly from the builtin
-        Northbridge of Opteron. It is recommended to use X86_64_ACPI_NUMA
-        instead, which also takes priority if both are compiled in.   
-
-config NODES_SHIFT
-       int
-       default "6"
-       depends on NEED_MULTIPLE_NODES
-
-# Dummy CONFIG option to select ACPI_NUMA from drivers/acpi/Kconfig.
-
-config X86_64_ACPI_NUMA
-       bool "ACPI NUMA detection"
-       depends on NUMA
-       select ACPI 
-       select PCI
-       select ACPI_NUMA
-       default y
-       help
-        Enable ACPI SRAT based node topology detection.
-
-config NUMA_EMU
-       bool "NUMA emulation"
-       depends on NUMA
-       help
-         Enable NUMA emulation. A flat machine will be split
-         into virtual nodes when booted with "numa=fake=N", where N is the
-         number of nodes. This is only useful for debugging.
-
-config ARCH_DISCONTIGMEM_ENABLE
-       bool
-       depends on NUMA
-       default y
-
-
-config ARCH_DISCONTIGMEM_ENABLE
-       def_bool y
-       depends on NUMA
-
-config ARCH_DISCONTIGMEM_DEFAULT
-       def_bool y
-       depends on NUMA
-
-config ARCH_SPARSEMEM_ENABLE
-       def_bool y
-       depends on (NUMA || EXPERIMENTAL) && !X86_64_XEN
-
-config ARCH_MEMORY_PROBE
-       def_bool y
-       depends on MEMORY_HOTPLUG
-
-config ARCH_FLATMEM_ENABLE
-       def_bool y
-       depends on !NUMA
-
-source "mm/Kconfig"
-
-config HAVE_ARCH_EARLY_PFN_TO_NID
-       def_bool y
-       depends on NUMA
-
-config OUT_OF_LINE_PFN_TO_PAGE
-       def_bool y
-       depends on DISCONTIGMEM
-
-config NR_CPUS
-       int "Maximum number of CPUs (2-256)"
-       range 2 255
-       depends on SMP
-       default "16" if X86_64_XEN
-       default "8"
-       help
-         This allows you to specify the maximum number of CPUs which this
-         kernel will support. Current maximum is 256 CPUs due to
-         APIC addressing limits. Less depending on the hardware.
-
-         This is purely to save memory - each supported CPU requires
-         memory in the static kernel configuration.
-
-config HOTPLUG_CPU
-       bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
-       depends on SMP && HOTPLUG && EXPERIMENTAL
-       help
-               Say Y here to experiment with turning CPUs off and on.  CPUs
-               can be controlled through /sys/devices/system/cpu/cpu#.
-               Say N if you want to disable CPU hotplug.
-
-config ARCH_ENABLE_MEMORY_HOTPLUG
-       def_bool y
-
-config HPET_TIMER
-       bool
-       depends on !X86_64_XEN
-       default y
-       help
-         Use the IA-PC HPET (High Precision Event Timer) to manage
-         time in preference to the PIT and RTC, if a HPET is
-         present.  The HPET provides a stable time base on SMP
-         systems, unlike the TSC, but it is more expensive to access,
-         as it is off-chip.  You can find the HPET spec at
-         <http://www.intel.com/hardwaredesign/hpetspec.htm>.
-
-config HPET_EMULATE_RTC
-       bool "Provide RTC interrupt"
-       depends on HPET_TIMER && RTC=y
-
-# Mark as embedded because too many people got it wrong.
-# The code disables itself when not needed.
-config IOMMU
-       bool "IOMMU support" if EMBEDDED
-       default y
-       select SWIOTLB
-       select AGP
-       depends on PCI && !X86_64_XEN
-       help
-         Support for full DMA access of devices with 32bit memory access only
-         on systems with more than 3GB. This is usually needed for USB,
-         sound, many IDE/SATA chipsets and some other devices.
-         Provides a driver for the AMD Athlon64/Opteron/Turion/Sempron GART
-         based IOMMU and a software bounce buffer based IOMMU used on Intel
-         systems and as fallback.
-         The code is only active when needed (enough memory and limited
-         device) unless CONFIG_IOMMU_DEBUG or iommu=force is specified
-         too.
-
-config CALGARY_IOMMU
-       bool "IBM Calgary IOMMU support"
-       default y
-       select SWIOTLB
-       depends on PCI && !X86_64_XEN && EXPERIMENTAL
-       help
-         Support for hardware IOMMUs in IBM's xSeries x366 and x460
-         systems. Needed to run systems with more than 3GB of memory
-         properly with 32-bit PCI devices that do not support DAC
-         (Double Address Cycle). Calgary also supports bus level
-         isolation, where all DMAs pass through the IOMMU.  This
-         prevents them from going anywhere except their intended
-         destination. This catches hard-to-find kernel bugs and
-         mis-behaving drivers and devices that do not use the DMA-API
-         properly to set up their DMA buffers.  The IOMMU can be
-         turned off at boot time with the iommu=off parameter.
-         Normally the kernel will make the right choice by itself.
-         If unsure, say Y.
-
-# need this always selected by IOMMU for the VIA workaround
-config SWIOTLB
-       bool
-
-config X86_MCE
-       bool "Machine check support" if EMBEDDED
-       depends on !X86_64_XEN
-       default y
-       help
-          Include a machine check error handler to report hardware errors.
-          This version will require the mcelog utility to decode some
-          machine check error logs. See
-          ftp://ftp.x86-64.org/pub/linux/tools/mcelog
-
-config X86_MCE_INTEL
-       bool "Intel MCE features"
-       depends on X86_MCE && X86_LOCAL_APIC
-       default y
-       help
-          Additional support for intel specific MCE features such as
-          the thermal monitor.
-
-config X86_MCE_AMD
-       bool "AMD MCE features"
-       depends on X86_MCE && X86_LOCAL_APIC
-       default y
-       help
-          Additional support for AMD specific MCE features such as
-          the DRAM Error Threshold.
-
-config KEXEC
-       bool "kexec system call (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && !XEN_UNPRIVILEGED_GUEST
-       help
-         kexec is a system call that implements the ability to shutdown your
-         current kernel, and to start another kernel.  It is like a reboot
-         but it is independent of the system firmware.   And like a reboot
-         you can start any kernel with it, not just Linux.
-
-         The name comes from the similarity to the exec system call.
-
-         It is an ongoing process to be certain the hardware in a machine
-         is properly shutdown, so do not be surprised if this code does not
-         initially work for you.  It may help to enable device hotplugging
-         support.  As of this writing the exact hardware interface is
-         strongly in flux, so no good recommendation can be made.
-
-config CRASH_DUMP
-       bool "kernel crash dumps (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       help
-               Generate crash dump after being started by kexec.
-
-config PHYSICAL_START
-       hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP)
-       default "0x1000000" if CRASH_DUMP
-       default "0x200000"
-       help
-         This gives the physical address where the kernel is loaded. Normally
-         for regular kernels this value is 0x200000 (2MB). But in the case
-         of kexec on panic the fail safe kernel needs to run at a different
-         address than the panic-ed kernel. This option is used to set the load
-         address for kernels used to capture crash dump on being kexec'ed
-         after panic. The default value for crash dump kernels is
-         0x1000000 (16MB). This can also be set based on the "X" value as
-         specified in the "crashkernel=YM@XM" command line boot parameter
-         passed to the panic-ed kernel. Typically this parameter is set as
-         crashkernel=64M@16M. Please take a look at
-         Documentation/kdump/kdump.txt for more details about crash dumps.
-
-         Don't change this unless you know what you are doing.
-
-config SECCOMP
-       bool "Enable seccomp to safely compute untrusted bytecode"
-       depends on PROC_FS
-       default y
-       help
-         This kernel feature is useful for number crunching applications
-         that may need to compute untrusted bytecode during their
-         execution. By using pipes or other transports made available to
-         the process as file descriptors supporting the read/write
-         syscalls, it's possible to isolate those applications in
-         their own address space using seccomp. Once seccomp is
-         enabled via /proc/<pid>/seccomp, it cannot be disabled
-         and the task is only allowed to execute a few safe syscalls
-         defined by each seccomp mode.
-
-         If unsure, say Y. Only embedded should say N here.
-
-source kernel/Kconfig.hz
-
-config REORDER
-       bool "Function reordering"
-       default n
-       help
-         This option enables the toolchain to reorder functions for a more 
-         optimal TLB usage. If you have pretty much any version of binutils, 
-        this can increase your kernel build time by roughly one minute.
-
-config K8_NB
-       def_bool y
-       depends on AGP_AMD64 || IOMMU || (PCI && NUMA)
-
-endmenu
-
-#
-# Use the generic interrupt handling code in kernel/irq/:
-#
-config GENERIC_HARDIRQS
-       bool
-       default y
-
-config GENERIC_IRQ_PROBE
-       bool
-       default y
-
-# we have no ISA slots, but we do have ISA-style DMA.
-config ISA_DMA_API
-       bool
-       default y
-
-config GENERIC_PENDING_IRQ
-       bool
-       depends on GENERIC_HARDIRQS && SMP
-       default y
-
-menu "Power management options"
-       depends on !XEN_UNPRIVILEGED_GUEST
-
-if !X86_64_XEN
-source kernel/power/Kconfig
-endif
-
-source "drivers/acpi/Kconfig"
-
-source "arch/x86_64/kernel/cpufreq/Kconfig"
-
-endmenu
-
-menu "Bus options (PCI etc.)"
-
-config PCI
-       bool "PCI support"
-
-# x86-64 doesn't support PCI BIOS access from long mode so always go direct.
-config PCI_DIRECT
-       bool
-       depends on PCI
-       default y
-
-config PCI_MMCONFIG
-       bool "Support mmconfig PCI config space access"
-       depends on PCI && ACPI
-
-config XEN_PCIDEV_FRONTEND
-       bool "Xen PCI Frontend"
-       depends on PCI && X86_64_XEN
-       default y
-       help
-         The PCI device frontend driver allows the kernel to import arbitrary
-         PCI devices from a PCI backend to support PCI driver domains.
-
-config XEN_PCIDEV_FE_DEBUG
-       bool "Xen PCI Frontend Debugging"
-       depends on XEN_PCIDEV_FRONTEND
-       default n
-       help
-         Enables some debug statements within the PCI Frontend.
-
-source "drivers/pci/pcie/Kconfig"
-
-source "drivers/pci/Kconfig"
-
-source "drivers/pcmcia/Kconfig"
-
-source "drivers/pci/hotplug/Kconfig"
-
-endmenu
-
-
-menu "Executable file formats / Emulations"
-
-source "fs/Kconfig.binfmt"
-
-config IA32_EMULATION
-       bool "IA32 Emulation"
-       help
-         Include code to run 32-bit programs under a 64-bit kernel. You should likely
-         turn this on, unless you're 100% sure that you don't have any 32-bit programs
-         left.
-
-config IA32_AOUT
-       tristate "IA32 a.out support"
-       depends on IA32_EMULATION
-       help
-         Support old a.out binaries in the 32bit emulation.
-
-config COMPAT
-       bool
-       depends on IA32_EMULATION
-       default y
-
-config SYSVIPC_COMPAT
-       bool
-       depends on COMPAT && SYSVIPC
-       default y
-
-endmenu
-
-source "net/Kconfig"
-
-source drivers/Kconfig
-
-source "drivers/firmware/Kconfig"
-
-source fs/Kconfig
-
-menu "Instrumentation Support"
-        depends on EXPERIMENTAL
-
-source "arch/x86_64/oprofile/Kconfig"
-
-config KPROBES
-       bool "Kprobes (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && MODULES
-       help
-         Kprobes allows you to trap at almost any kernel address and
-         execute a callback function.  register_kprobe() establishes
-         a probepoint and specifies the callback.  Kprobes is useful
-         for kernel debugging, non-intrusive instrumentation and testing.
-         If in doubt, say "N".
-endmenu
-
-source "arch/x86_64/Kconfig.debug"
-
-source "security/Kconfig"
-
-source "crypto/Kconfig"
-
-source "drivers/xen/Kconfig"
-
-source "lib/Kconfig"
diff --git a/linux-2.6-xen-sparse/arch/x86_64/Makefile b/linux-2.6-xen-sparse/arch/x86_64/Makefile
deleted file mode 100644 (file)
index b45be59..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#
-# x86_64/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies. Remember to do have actions
-# for "archclean" and "archdep" for cleaning up and making dependencies for
-# this architecture
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (C) 1994 by Linus Torvalds
-#
-# 19990713  Artur Skawina <skawina@geocities.com>
-#           Added '-march' and '-mpreferred-stack-boundary' support
-# 20000913  Pavel Machek <pavel@suse.cz>
-#          Converted for x86_64 architecture
-# 20010105  Andi Kleen, add IA32 compiler.
-#           ....and later removed it again....
-#
-# $Id: Makefile,v 1.31 2002/03/22 15:56:07 ak Exp $
-
-LDFLAGS                := -m elf_x86_64
-OBJCOPYFLAGS   := -O binary -R .note -R .comment -S
-LDFLAGS_vmlinux :=
-CHECKFLAGS      += -D__x86_64__ -m64
-
-cflags-y       :=
-cflags-kernel-y        :=
-cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
-cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
-cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic)
-
-cppflags-$(CONFIG_XEN) += \
-       -D__XEN_INTERFACE_VERSION__=$(CONFIG_XEN_INTERFACE_VERSION)
-CPPFLAGS += $(cppflags-y)
-
-cflags-y += -m64
-cflags-y += -mno-red-zone
-cflags-y += -mcmodel=kernel
-cflags-y += -pipe
-cflags-kernel-$(CONFIG_REORDER) += -ffunction-sections
-# this makes reading assembly source easier, but produces worse code
-# actually it makes the kernel smaller too.
-cflags-y += -fno-reorder-blocks
-cflags-y += -Wno-sign-compare
-ifneq ($(CONFIG_UNWIND_INFO),y)
-cflags-y += -fno-asynchronous-unwind-tables
-endif
-ifneq ($(CONFIG_DEBUG_INFO),y)
-# -fweb shrinks the kernel a bit, but the difference is very small
-# it also messes up debugging, so don't use it for now.
-#cflags-y += $(call cc-option,-fweb)
-endif
-# -funit-at-a-time shrinks the kernel .text considerably
-# unfortunately it makes reading oopses harder.
-cflags-y += $(call cc-option,-funit-at-a-time)
-# prevent gcc from generating any FP code by mistake
-cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)
-
-CFLAGS += $(cflags-y)
-CFLAGS_KERNEL += $(cflags-kernel-y)
-AFLAGS += -m64
-
-head-y := arch/x86_64/kernel/head.o arch/x86_64/kernel/head64.o arch/x86_64/kernel/init_task.o
-
-libs-y                                         += arch/x86_64/lib/
-core-y                                 += arch/x86_64/kernel/ \
-                                          arch/x86_64/mm/ \
-                                          arch/x86_64/crypto/
-core-$(CONFIG_IA32_EMULATION)          += arch/x86_64/ia32/
-drivers-$(CONFIG_PCI)                  += arch/x86_64/pci/
-drivers-$(CONFIG_OPROFILE)             += arch/x86_64/oprofile/
-
-boot := arch/x86_64/boot
-
-PHONY += bzImage bzlilo install archmrproper \
-        fdimage fdimage144 fdimage288 isoimage archclean
-
-ifdef CONFIG_XEN
-CPPFLAGS := -Iinclude$(if $(KBUILD_SRC),2)/asm/mach-xen $(CPPFLAGS)
-head-y := arch/x86_64/kernel/head-xen.o arch/x86_64/kernel/head64-xen.o arch/x86_64/kernel/init_task.o
-LDFLAGS_vmlinux := -e _start
-boot := arch/i386/boot-xen
-.PHONY: vmlinuz
-#Default target when executing "make"
-all: vmlinuz
-
-vmlinuz: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $@
-
-install:
-       $(Q)$(MAKE) $(build)=$(boot) $@
-else
-#Default target when executing "make"
-all: bzImage
-
-BOOTIMAGE                     := arch/x86_64/boot/bzImage
-KBUILD_IMAGE                  := $(BOOTIMAGE)
-
-bzImage: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) $(BOOTIMAGE)
-
-bzlilo: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zlilo
-
-bzdisk: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zdisk
-
-fdimage fdimage144 fdimage288 isoimage: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@
-
-install:
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@ 
-endif
-
-archclean:
-       $(Q)$(MAKE) $(clean)=$(boot)
-
-define archhelp
-  echo  '* bzImage     - Compressed kernel image (arch/$(ARCH)/boot/bzImage)'
-  echo  '  install     - Install kernel using'
-  echo  '                 (your) ~/bin/installkernel or'
-  echo  '                 (distribution) /sbin/installkernel or'
-  echo  '                 install to $$(INSTALL_PATH) and run lilo'
-  echo  '  bzdisk       - Create a boot floppy in /dev/fd0'
-  echo  '  fdimage      - Create a boot floppy image'
-  echo  '  isoimage     - Create a boot CD-ROM image'
-endef
-
-CLEAN_FILES += arch/$(ARCH)/boot/fdimage \
-              arch/$(ARCH)/boot/image.iso \
-              arch/$(ARCH)/boot/mtools.conf
-
-
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/Makefile b/linux-2.6-xen-sparse/arch/x86_64/ia32/Makefile
deleted file mode 100644 (file)
index b3dfcb5..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# Makefile for the ia32 kernel emulation subsystem.
-#
-
-obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o tls32.o \
-       ia32_binfmt.o fpu32.o ptrace32.o syscall32.o syscall32_syscall.o \
-       mmap32.o
-
-sysv-$(CONFIG_SYSVIPC) := ipc32.o
-obj-$(CONFIG_IA32_EMULATION) += $(sysv-y)
-
-obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
-
-audit-class-$(CONFIG_AUDIT) := audit.o
-obj-$(CONFIG_IA32_EMULATION) += $(audit-class-y)
-
-$(obj)/syscall32_syscall.o: \
-       $(foreach F,sysenter syscall,$(obj)/vsyscall-$F.so)
-
-# Teach kbuild about targets
-targets := $(foreach F,sysenter syscall,vsyscall-$F.o vsyscall-$F.so)
-
-# The DSO images are built using a special linker script
-quiet_cmd_syscall = SYSCALL $@
-      cmd_syscall = $(CC) -m32 -nostdlib -shared -s \
-                         $(call ld-option, -Wl$(comma)--hash-style=sysv) \
-                          -Wl,-soname=linux-gate.so.1 -o $@ \
-                          -Wl,-T,$(filter-out FORCE,$^)
-
-$(obj)/vsyscall-int80.so \
-$(obj)/vsyscall-sysenter.so $(obj)/vsyscall-syscall.so: \
-$(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE
-       $(call if_changed,syscall)
-
-AFLAGS_vsyscall-sysenter.o = -m32 -Wa,-32 -Iarch/i386/kernel
-AFLAGS_vsyscall-syscall.o = -m32 -Wa,-32 -Iarch/i386/kernel
-
-ifdef CONFIG_XEN
-AFLAGS_vsyscall-int80.o = -m32 -Wa,-32 -Iarch/i386/kernel
-CFLAGS_syscall32-xen.o += -DUSE_INT80
-AFLAGS_syscall32_syscall-xen.o += -DUSE_INT80
-
-$(obj)/syscall32_syscall-xen.o: \
-       $(foreach F,int80 sysenter syscall,$(obj)/vsyscall-$F.so)
-
-targets := $(foreach F,int80 sysenter syscall,vsyscall-$F.o vsyscall-$F.so)
-
-include $(srctree)/scripts/Makefile.xen
-
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/ia32entry-xen.S b/linux-2.6-xen-sparse/arch/x86_64/ia32/ia32entry-xen.S
deleted file mode 100644 (file)
index dedf5cf..0000000
+++ /dev/null
@@ -1,743 +0,0 @@
-/*
- * Compatibility mode system call entry point for x86-64. 
- *             
- * Copyright 2000-2002 Andi Kleen, SuSE Labs.
- */             
-
-#include <asm/dwarf2.h>
-#include <asm/calling.h>
-#include <asm/asm-offsets.h>
-#include <asm/current.h>
-#include <asm/errno.h>
-#include <asm/ia32_unistd.h>   
-#include <asm/thread_info.h>   
-#include <asm/segment.h>
-#include <asm/vsyscall32.h>
-#include <asm/irqflags.h>
-#include <linux/linkage.h>
-
-#define __XEN_X86_64 1
-
-#define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)
-
-       .macro IA32_ARG_FIXUP noebp=0
-       movl    %edi,%r8d
-       .if \noebp
-       .else
-       movl    %ebp,%r9d
-       .endif
-       xchg    %ecx,%esi
-       movl    %ebx,%edi
-       movl    %edx,%edx       /* zero extension */
-       .endm 
-
-       /* clobbers %eax */     
-       .macro  CLEAR_RREGS
-       xorl    %eax,%eax
-       movq    %rax,R11(%rsp)
-       movq    %rax,R10(%rsp)
-       movq    %rax,R9(%rsp)
-       movq    %rax,R8(%rsp)
-       .endm
-
-#if defined (__XEN_X86_64)
-#include "../kernel/xen_entry.S"
-               
-#define        __swapgs
-#define __cli
-#define __sti  
-#else
-/*
- * Use the native instructions
- */    
-#define        __swapgs        swapgs
-#define __cli          cli
-#define __sti          sti     
-#endif                 
-
-       .macro CFI_STARTPROC32 simple
-       CFI_STARTPROC   \simple
-       CFI_UNDEFINED   r8
-       CFI_UNDEFINED   r9
-       CFI_UNDEFINED   r10
-       CFI_UNDEFINED   r11
-       CFI_UNDEFINED   r12
-       CFI_UNDEFINED   r13
-       CFI_UNDEFINED   r14
-       CFI_UNDEFINED   r15
-       .endm
-
-/*
- * 32bit SYSENTER instruction entry.
- *
- * Arguments:
- * %eax        System call number.
- * %ebx Arg1
- * %ecx Arg2
- * %edx Arg3
- * %esi Arg4
- * %edi Arg5
- * %ebp user stack
- * 0(%ebp) Arg6        
- *     
- * Interrupts off.
- *     
- * This is purely a fast path. For anything complicated we use the int 0x80
- * path below. Set up a complete hardware stack frame to share code
- * with the int 0x80 path.
- */    
-ENTRY(ia32_sysenter_target)
-       CFI_STARTPROC32 simple
-       CFI_DEF_CFA     rsp,0
-       CFI_REGISTER    rsp,rbp
-       __swapgs 
-       movq    %gs:pda_kernelstack, %rsp
-       addq    $(PDA_STACKOFFSET),%rsp
-       /*
-        * No need to follow this irqs on/off section: the syscall
-        * disabled irqs, here we enable it straight after entry:
-        */
-       XEN_UNBLOCK_EVENTS(%r11)        
-       __sti
-       movl    %ebp,%ebp               /* zero extension */
-       pushq   $__USER32_DS
-       CFI_ADJUST_CFA_OFFSET 8
-       /*CFI_REL_OFFSET ss,0*/
-       pushq   %rbp
-       CFI_ADJUST_CFA_OFFSET 8
-       CFI_REL_OFFSET rsp,0
-       pushfq
-       CFI_ADJUST_CFA_OFFSET 8
-       /*CFI_REL_OFFSET rflags,0*/
-       movl    $VSYSCALL32_SYSEXIT, %r10d
-       CFI_REGISTER rip,r10
-       pushq   $__USER32_CS
-       CFI_ADJUST_CFA_OFFSET 8
-       /*CFI_REL_OFFSET cs,0*/
-       movl    %eax, %eax
-       pushq   %r10
-       CFI_ADJUST_CFA_OFFSET 8
-       CFI_REL_OFFSET rip,0
-       pushq   %rax
-       CFI_ADJUST_CFA_OFFSET 8
-       cld
-       SAVE_ARGS 0,0,0
-       /* no need to do an access_ok check here because rbp has been
-          32bit zero extended */ 
-1:     movl    (%rbp),%r9d
-       .section __ex_table,"a"
-       .quad 1b,ia32_badarg
-       .previous       
-       GET_THREAD_INFO(%r10)
-       orl    $TS_COMPAT,threadinfo_status(%r10)
-       testl  $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-       CFI_REMEMBER_STATE
-       jnz  sysenter_tracesys
-sysenter_do_call:      
-       cmpl    $(IA32_NR_syscalls-1),%eax
-       ja      ia32_badsys
-       IA32_ARG_FIXUP 1
-       call    *ia32_sys_call_table(,%rax,8)
-       movq    %rax,RAX-ARGOFFSET(%rsp)
-       GET_THREAD_INFO(%r10)
-       XEN_BLOCK_EVENTS(%r11)  
-       __cli
-       TRACE_IRQS_OFF
-       testl   $_TIF_ALLWORK_MASK,threadinfo_flags(%r10)
-       jnz     int_ret_from_sys_call
-       andl    $~TS_COMPAT,threadinfo_status(%r10)
-       /* clear IF, that popfq doesn't enable interrupts early */
-       andl  $~0x200,EFLAGS-R11(%rsp) 
-       RESTORE_ARGS 1,24,1,1,1,1
-       popfq
-       CFI_ADJUST_CFA_OFFSET -8
-       /*CFI_RESTORE rflags*/
-       popq    %rcx                            /* User %esp */
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_REGISTER rsp,rcx
-       movl    $VSYSCALL32_SYSEXIT,%edx        /* User %eip */
-       CFI_REGISTER rip,rdx
-       TRACE_IRQS_ON
-       __swapgs
-       XEN_UNBLOCK_EVENTS(%r11)                
-       __sti           /* sti only takes effect after the next instruction */
-       /* sysexit */
-       .byte   0xf, 0x35  /* TBD */
-
-sysenter_tracesys:
-       CFI_RESTORE_STATE
-       SAVE_REST
-       CLEAR_RREGS
-       movq    $-ENOSYS,RAX(%rsp)      /* really needed? */
-       movq    %rsp,%rdi        /* &pt_regs -> arg1 */
-       call    syscall_trace_enter
-       LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
-       RESTORE_REST
-       movl    %ebp, %ebp
-       /* no need to do an access_ok check here because rbp has been
-          32bit zero extended */ 
-1:     movl    (%rbp),%r9d
-       .section __ex_table,"a"
-       .quad 1b,ia32_badarg
-       .previous
-       jmp     sysenter_do_call
-       CFI_ENDPROC
-ENDPROC(ia32_sysenter_target)
-
-/*
- * 32bit SYSCALL instruction entry.
- *
- * Arguments:
- * %eax        System call number.
- * %ebx Arg1
- * %ecx return EIP 
- * %edx Arg3
- * %esi Arg4
- * %edi Arg5
- * %ebp Arg2    [note: not saved in the stack frame, should not be touched]
- * %esp user stack 
- * 0(%esp) Arg6
- *     
- * Interrupts off.
- *     
- * This is purely a fast path. For anything complicated we use the int 0x80
- * path below. Set up a complete hardware stack frame to share code
- * with the int 0x80 path.     
- */    
-ENTRY(ia32_cstar_target)
-       CFI_STARTPROC32 simple
-       CFI_DEF_CFA     rsp,PDA_STACKOFFSET
-       CFI_REGISTER    rip,rcx
-       /*CFI_REGISTER  rflags,r11*/
-       __swapgs
-       movl    %esp,%r8d
-       CFI_REGISTER    rsp,r8
-       movq    %gs:pda_kernelstack,%rsp
-       /*
-        * No need to follow this irqs on/off section: the syscall
-        * disabled irqs and here we enable it straight after entry:
-        */
-       XEN_UNBLOCK_EVENTS(%r11)        
-       __sti
-       SAVE_ARGS 8,1,1
-       movl    %eax,%eax       /* zero extension */
-       movq    %rax,ORIG_RAX-ARGOFFSET(%rsp)
-       movq    %rcx,RIP-ARGOFFSET(%rsp)
-       CFI_REL_OFFSET rip,RIP-ARGOFFSET
-       movq    %rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */
-       movl    %ebp,%ecx
-       movq    $__USER32_CS,CS-ARGOFFSET(%rsp)
-       movq    $__USER32_DS,SS-ARGOFFSET(%rsp)
-       movq    %r11,EFLAGS-ARGOFFSET(%rsp)
-       /*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/
-       movq    %r8,RSP-ARGOFFSET(%rsp) 
-       CFI_REL_OFFSET rsp,RSP-ARGOFFSET
-       /* no need to do an access_ok check here because r8 has been
-          32bit zero extended */ 
-       /* hardware stack frame is complete now */      
-1:     movl    (%r8),%r9d
-       .section __ex_table,"a"
-       .quad 1b,ia32_badarg
-       .previous       
-       GET_THREAD_INFO(%r10)
-       orl   $TS_COMPAT,threadinfo_status(%r10)
-       testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-       CFI_REMEMBER_STATE
-       jnz   cstar_tracesys
-cstar_do_call: 
-       cmpl $IA32_NR_syscalls-1,%eax
-       ja  ia32_badsys
-       IA32_ARG_FIXUP 1
-       call *ia32_sys_call_table(,%rax,8)
-       movq %rax,RAX-ARGOFFSET(%rsp)
-       GET_THREAD_INFO(%r10)
-       XEN_BLOCK_EVENTS(%r11)          
-       __cli
-       TRACE_IRQS_OFF
-       testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10)
-       jnz  int_ret_from_sys_call
-       andl $~TS_COMPAT,threadinfo_status(%r10)
-       RESTORE_ARGS 1,-ARG_SKIP,1,1,1
-       movl RIP-ARGOFFSET(%rsp),%ecx
-       CFI_REGISTER rip,rcx
-       movl EFLAGS-ARGOFFSET(%rsp),%r11d       
-       /*CFI_REGISTER rflags,r11*/
-       TRACE_IRQS_ON
-       movl RSP-ARGOFFSET(%rsp),%esp
-       CFI_RESTORE rsp
-       __swapgs
-       sysretl  /* TBD */
-       
-cstar_tracesys:        
-       CFI_RESTORE_STATE
-       SAVE_REST
-       CLEAR_RREGS
-       movq $-ENOSYS,RAX(%rsp) /* really needed? */
-       movq %rsp,%rdi        /* &pt_regs -> arg1 */
-       call syscall_trace_enter
-       LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
-       RESTORE_REST
-       movl RSP-ARGOFFSET(%rsp), %r8d
-       /* no need to do an access_ok check here because r8 has been
-          32bit zero extended */ 
-1:     movl    (%r8),%r9d
-       .section __ex_table,"a"
-       .quad 1b,ia32_badarg
-       .previous
-       jmp cstar_do_call
-END(ia32_cstar_target)
-                               
-ia32_badarg:
-       movq $-EFAULT,%rax
-       jmp ia32_sysret
-       CFI_ENDPROC
-
-/* 
- * Emulated IA32 system calls via int 0x80. 
- *
- * Arguments:   
- * %eax        System call number.
- * %ebx Arg1
- * %ecx Arg2
- * %edx Arg3
- * %esi Arg4
- * %edi Arg5
- * %ebp Arg6    [note: not saved in the stack frame, should not be touched]
- *
- * Notes:
- * Uses the same stack frame as the x86-64 version.    
- * All registers except %eax must be saved (but ptrace may violate that)
- * Arguments are zero extended. For system calls that want sign extension and
- * take long arguments a wrapper is needed. Most calls can just be called
- * directly.
- * Assumes it is only called from user space and entered with interrupts off.  
- */                            
-
-ENTRY(ia32_syscall)
-       CFI_STARTPROC   simple
-       CFI_DEF_CFA     rsp,SS+8-RIP
-       /*CFI_REL_OFFSET        ss,SS-RIP*/
-       CFI_REL_OFFSET  rsp,RSP-RIP
-       /*CFI_REL_OFFSET        rflags,EFLAGS-RIP*/
-       /*CFI_REL_OFFSET        cs,CS-RIP*/
-       CFI_REL_OFFSET  rip,RIP-RIP
-       __swapgs
-       /*
-        * No need to follow this irqs on/off section: the syscall
-        * disabled irqs and here we enable it straight after entry:
-        */
-       XEN_UNBLOCK_EVENTS(%r11)
-       __sti
-       movq (%rsp),%rcx
-       movq 8(%rsp),%r11
-        addq $0x10,%rsp /* skip rcx and r11 */
-       movl %eax,%eax
-       pushq %rax
-       CFI_ADJUST_CFA_OFFSET 8
-       cld
-/* 1:  jmp 1b   */
-       /* note the registers are not zero extended to the sf.
-          this could be a problem. */
-       SAVE_ARGS 0,0,1
-       GET_THREAD_INFO(%r10)
-       orl   $TS_COMPAT,threadinfo_status(%r10)
-       testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-       jnz ia32_tracesys
-ia32_do_syscall:       
-       cmpl $(IA32_NR_syscalls-1),%eax
-       ja  ia32_badsys
-       IA32_ARG_FIXUP
-       call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
-ia32_sysret:
-       movq %rax,RAX-ARGOFFSET(%rsp)
-       jmp int_ret_from_sys_call 
-
-ia32_tracesys:                  
-       SAVE_REST
-       movq $-ENOSYS,RAX(%rsp) /* really needed? */
-       movq %rsp,%rdi        /* &pt_regs -> arg1 */
-       call syscall_trace_enter
-       LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
-       RESTORE_REST
-       jmp ia32_do_syscall
-END(ia32_syscall)
-
-ia32_badsys:
-       movq $0,ORIG_RAX-ARGOFFSET(%rsp)
-       movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-       jmp int_ret_from_sys_call
-
-quiet_ni_syscall:
-       movq $-ENOSYS,%rax
-       ret
-       CFI_ENDPROC
-       
-       .macro PTREGSCALL label, func, arg
-       .globl \label
-\label:
-       leaq \func(%rip),%rax
-       leaq -ARGOFFSET+8(%rsp),\arg    /* 8 for return address */
-       jmp  ia32_ptregs_common 
-       .endm
-
-       CFI_STARTPROC32
-
-       PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
-       PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
-       PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
-       PTREGSCALL stub32_sigsuspend, sys32_sigsuspend, %rcx
-       PTREGSCALL stub32_execve, sys32_execve, %rcx
-       PTREGSCALL stub32_fork, sys_fork, %rdi
-       PTREGSCALL stub32_clone, sys32_clone, %rdx
-       PTREGSCALL stub32_vfork, sys_vfork, %rdi
-       PTREGSCALL stub32_iopl, sys_iopl, %rsi
-       PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend, %rdx
-
-ENTRY(ia32_ptregs_common)
-       popq %r11
-       CFI_ENDPROC
-       CFI_STARTPROC32 simple
-       CFI_DEF_CFA     rsp,SS+8-ARGOFFSET
-       CFI_REL_OFFSET  rax,RAX-ARGOFFSET
-       CFI_REL_OFFSET  rcx,RCX-ARGOFFSET
-       CFI_REL_OFFSET  rdx,RDX-ARGOFFSET
-       CFI_REL_OFFSET  rsi,RSI-ARGOFFSET
-       CFI_REL_OFFSET  rdi,RDI-ARGOFFSET
-       CFI_REL_OFFSET  rip,RIP-ARGOFFSET
-/*     CFI_REL_OFFSET  cs,CS-ARGOFFSET*/
-/*     CFI_REL_OFFSET  rflags,EFLAGS-ARGOFFSET*/
-       CFI_REL_OFFSET  rsp,RSP-ARGOFFSET
-/*     CFI_REL_OFFSET  ss,SS-ARGOFFSET*/
-       SAVE_REST
-       call *%rax
-       RESTORE_REST
-       jmp  ia32_sysret        /* misbalances the return cache */
-       CFI_ENDPROC
-END(ia32_ptregs_common)
-
-       .section .rodata,"a"
-       .align 8
-ia32_sys_call_table:
-       .quad sys_restart_syscall
-       .quad sys_exit
-       .quad stub32_fork
-       .quad sys_read
-       .quad sys_write
-       .quad compat_sys_open           /* 5 */
-       .quad sys_close
-       .quad sys32_waitpid
-       .quad sys_creat
-       .quad sys_link
-       .quad sys_unlink                /* 10 */
-       .quad stub32_execve
-       .quad sys_chdir
-       .quad compat_sys_time
-       .quad sys_mknod
-       .quad sys_chmod         /* 15 */
-       .quad sys_lchown16
-       .quad quiet_ni_syscall                  /* old break syscall holder */
-       .quad sys_stat
-       .quad sys32_lseek
-       .quad sys_getpid                /* 20 */
-       .quad compat_sys_mount  /* mount  */
-       .quad sys_oldumount     /* old_umount  */
-       .quad sys_setuid16
-       .quad sys_getuid16
-       .quad compat_sys_stime  /* stime */             /* 25 */
-       .quad sys32_ptrace      /* ptrace */
-       .quad sys_alarm
-       .quad sys_fstat /* (old)fstat */
-       .quad sys_pause
-       .quad compat_sys_utime  /* 30 */
-       .quad quiet_ni_syscall  /* old stty syscall holder */
-       .quad quiet_ni_syscall  /* old gtty syscall holder */
-       .quad sys_access
-       .quad sys_nice  
-       .quad quiet_ni_syscall  /* 35 */        /* old ftime syscall holder */
-       .quad sys_sync
-       .quad sys32_kill
-       .quad sys_rename
-       .quad sys_mkdir
-       .quad sys_rmdir         /* 40 */
-       .quad sys_dup
-       .quad sys32_pipe
-       .quad compat_sys_times
-       .quad quiet_ni_syscall                  /* old prof syscall holder */
-       .quad sys_brk           /* 45 */
-       .quad sys_setgid16
-       .quad sys_getgid16
-       .quad sys_signal
-       .quad sys_geteuid16
-       .quad sys_getegid16     /* 50 */
-       .quad sys_acct
-       .quad sys_umount                        /* new_umount */
-       .quad quiet_ni_syscall                  /* old lock syscall holder */
-       .quad compat_sys_ioctl
-       .quad compat_sys_fcntl64                /* 55 */
-       .quad quiet_ni_syscall                  /* old mpx syscall holder */
-       .quad sys_setpgid
-       .quad quiet_ni_syscall                  /* old ulimit syscall holder */
-       .quad sys32_olduname
-       .quad sys_umask         /* 60 */
-       .quad sys_chroot
-       .quad sys32_ustat
-       .quad sys_dup2
-       .quad sys_getppid
-       .quad sys_getpgrp               /* 65 */
-       .quad sys_setsid
-       .quad sys32_sigaction
-       .quad sys_sgetmask
-       .quad sys_ssetmask
-       .quad sys_setreuid16    /* 70 */
-       .quad sys_setregid16
-       .quad stub32_sigsuspend
-       .quad compat_sys_sigpending
-       .quad sys_sethostname
-       .quad compat_sys_setrlimit      /* 75 */
-       .quad compat_sys_old_getrlimit  /* old_getrlimit */
-       .quad compat_sys_getrusage
-       .quad sys32_gettimeofday
-       .quad sys32_settimeofday
-       .quad sys_getgroups16   /* 80 */
-       .quad sys_setgroups16
-       .quad sys32_old_select
-       .quad sys_symlink
-       .quad sys_lstat
-       .quad sys_readlink              /* 85 */
-#ifdef CONFIG_IA32_AOUT
-       .quad sys_uselib
-#else
-       .quad quiet_ni_syscall
-#endif
-       .quad sys_swapon
-       .quad sys_reboot
-       .quad compat_sys_old_readdir
-       .quad sys32_mmap                /* 90 */
-       .quad sys_munmap
-       .quad sys_truncate
-       .quad sys_ftruncate
-       .quad sys_fchmod
-       .quad sys_fchown16              /* 95 */
-       .quad sys_getpriority
-       .quad sys_setpriority
-       .quad quiet_ni_syscall                  /* old profil syscall holder */
-       .quad compat_sys_statfs
-       .quad compat_sys_fstatfs                /* 100 */
-       .quad sys_ioperm
-       .quad compat_sys_socketcall
-       .quad sys_syslog
-       .quad compat_sys_setitimer
-       .quad compat_sys_getitimer      /* 105 */
-       .quad compat_sys_newstat
-       .quad compat_sys_newlstat
-       .quad compat_sys_newfstat
-       .quad sys32_uname
-       .quad stub32_iopl               /* 110 */
-       .quad sys_vhangup
-       .quad quiet_ni_syscall  /* old "idle" system call */
-       .quad sys32_vm86_warning        /* vm86old */ 
-       .quad compat_sys_wait4
-       .quad sys_swapoff               /* 115 */
-       .quad sys32_sysinfo
-       .quad sys32_ipc
-       .quad sys_fsync
-       .quad stub32_sigreturn
-       .quad stub32_clone              /* 120 */
-       .quad sys_setdomainname
-       .quad sys_uname
-       .quad sys_modify_ldt
-       .quad compat_sys_adjtimex
-       .quad sys32_mprotect            /* 125 */
-       .quad compat_sys_sigprocmask
-       .quad quiet_ni_syscall          /* create_module */
-       .quad sys_init_module
-       .quad sys_delete_module
-       .quad quiet_ni_syscall          /* 130  get_kernel_syms */
-       .quad sys_quotactl
-       .quad sys_getpgid
-       .quad sys_fchdir
-       .quad quiet_ni_syscall  /* bdflush */
-       .quad sys_sysfs         /* 135 */
-       .quad sys_personality
-       .quad quiet_ni_syscall  /* for afs_syscall */
-       .quad sys_setfsuid16
-       .quad sys_setfsgid16
-       .quad sys_llseek                /* 140 */
-       .quad compat_sys_getdents
-       .quad compat_sys_select
-       .quad sys_flock
-       .quad sys_msync
-       .quad compat_sys_readv          /* 145 */
-       .quad compat_sys_writev
-       .quad sys_getsid
-       .quad sys_fdatasync
-       .quad sys32_sysctl      /* sysctl */
-       .quad sys_mlock         /* 150 */
-       .quad sys_munlock
-       .quad sys_mlockall
-       .quad sys_munlockall
-       .quad sys_sched_setparam
-       .quad sys_sched_getparam   /* 155 */
-       .quad sys_sched_setscheduler
-       .quad sys_sched_getscheduler
-       .quad sys_sched_yield
-       .quad sys_sched_get_priority_max
-       .quad sys_sched_get_priority_min  /* 160 */
-       .quad sys_sched_rr_get_interval
-       .quad compat_sys_nanosleep
-       .quad sys_mremap
-       .quad sys_setresuid16
-       .quad sys_getresuid16   /* 165 */
-       .quad sys32_vm86_warning        /* vm86 */ 
-       .quad quiet_ni_syscall  /* query_module */
-       .quad sys_poll
-       .quad compat_sys_nfsservctl
-       .quad sys_setresgid16   /* 170 */
-       .quad sys_getresgid16
-       .quad sys_prctl
-       .quad stub32_rt_sigreturn
-       .quad sys32_rt_sigaction
-       .quad sys32_rt_sigprocmask      /* 175 */
-       .quad sys32_rt_sigpending
-       .quad compat_sys_rt_sigtimedwait
-       .quad sys32_rt_sigqueueinfo
-       .quad stub32_rt_sigsuspend
-       .quad sys32_pread               /* 180 */
-       .quad sys32_pwrite
-       .quad sys_chown16
-       .quad sys_getcwd
-       .quad sys_capget
-       .quad sys_capset
-       .quad stub32_sigaltstack
-       .quad sys32_sendfile
-       .quad quiet_ni_syscall          /* streams1 */
-       .quad quiet_ni_syscall          /* streams2 */
-       .quad stub32_vfork            /* 190 */
-       .quad compat_sys_getrlimit
-       .quad sys32_mmap2
-       .quad sys32_truncate64
-       .quad sys32_ftruncate64
-       .quad sys32_stat64              /* 195 */
-       .quad sys32_lstat64
-       .quad sys32_fstat64
-       .quad sys_lchown
-       .quad sys_getuid
-       .quad sys_getgid                /* 200 */
-       .quad sys_geteuid
-       .quad sys_getegid
-       .quad sys_setreuid
-       .quad sys_setregid
-       .quad sys_getgroups     /* 205 */
-       .quad sys_setgroups
-       .quad sys_fchown
-       .quad sys_setresuid
-       .quad sys_getresuid
-       .quad sys_setresgid     /* 210 */
-       .quad sys_getresgid
-       .quad sys_chown
-       .quad sys_setuid
-       .quad sys_setgid
-       .quad sys_setfsuid              /* 215 */
-       .quad sys_setfsgid
-       .quad sys_pivot_root
-       .quad sys_mincore
-       .quad sys_madvise
-       .quad compat_sys_getdents64     /* 220 getdents64 */
-       .quad compat_sys_fcntl64        
-       .quad quiet_ni_syscall          /* tux */
-       .quad quiet_ni_syscall          /* security */
-       .quad sys_gettid        
-       .quad sys_readahead     /* 225 */
-       .quad sys_setxattr
-       .quad sys_lsetxattr
-       .quad sys_fsetxattr
-       .quad sys_getxattr
-       .quad sys_lgetxattr     /* 230 */
-       .quad sys_fgetxattr
-       .quad sys_listxattr
-       .quad sys_llistxattr
-       .quad sys_flistxattr
-       .quad sys_removexattr   /* 235 */
-       .quad sys_lremovexattr
-       .quad sys_fremovexattr
-       .quad sys_tkill
-       .quad sys_sendfile64 
-       .quad compat_sys_futex          /* 240 */
-       .quad compat_sys_sched_setaffinity
-       .quad compat_sys_sched_getaffinity
-       .quad sys32_set_thread_area
-       .quad sys32_get_thread_area
-       .quad compat_sys_io_setup       /* 245 */
-       .quad sys_io_destroy
-       .quad compat_sys_io_getevents
-       .quad compat_sys_io_submit
-       .quad sys_io_cancel
-       .quad sys_fadvise64             /* 250 */
-       .quad quiet_ni_syscall  /* free_huge_pages */
-       .quad sys_exit_group
-       .quad sys32_lookup_dcookie
-       .quad sys_epoll_create
-       .quad sys_epoll_ctl             /* 255 */
-       .quad sys_epoll_wait
-       .quad sys_remap_file_pages
-       .quad sys_set_tid_address
-       .quad compat_sys_timer_create
-       .quad compat_sys_timer_settime  /* 260 */
-       .quad compat_sys_timer_gettime
-       .quad sys_timer_getoverrun
-       .quad sys_timer_delete
-       .quad compat_sys_clock_settime
-       .quad compat_sys_clock_gettime  /* 265 */
-       .quad compat_sys_clock_getres
-       .quad compat_sys_clock_nanosleep
-       .quad compat_sys_statfs64
-       .quad compat_sys_fstatfs64
-       .quad sys_tgkill                /* 270 */
-       .quad compat_sys_utimes
-       .quad sys32_fadvise64_64
-       .quad quiet_ni_syscall  /* sys_vserver */
-       .quad sys_mbind
-       .quad compat_sys_get_mempolicy  /* 275 */
-       .quad sys_set_mempolicy
-       .quad compat_sys_mq_open
-       .quad sys_mq_unlink
-       .quad compat_sys_mq_timedsend
-       .quad compat_sys_mq_timedreceive        /* 280 */
-       .quad compat_sys_mq_notify
-       .quad compat_sys_mq_getsetattr
-       .quad compat_sys_kexec_load     /* reserved for kexec */
-       .quad compat_sys_waitid
-       .quad quiet_ni_syscall          /* 285: sys_altroot */
-       .quad sys_add_key
-       .quad sys_request_key
-       .quad sys_keyctl
-       .quad sys_ioprio_set
-       .quad sys_ioprio_get            /* 290 */
-       .quad sys_inotify_init
-       .quad sys_inotify_add_watch
-       .quad sys_inotify_rm_watch
-       .quad sys_migrate_pages
-       .quad compat_sys_openat         /* 295 */
-       .quad sys_mkdirat
-       .quad sys_mknodat
-       .quad sys_fchownat
-       .quad compat_sys_futimesat
-       .quad sys32_fstatat             /* 300 */
-       .quad sys_unlinkat
-       .quad sys_renameat
-       .quad sys_linkat
-       .quad sys_symlinkat
-       .quad sys_readlinkat            /* 305 */
-       .quad sys_fchmodat
-       .quad sys_faccessat
-       .quad quiet_ni_syscall          /* pselect6 for now */
-       .quad quiet_ni_syscall          /* ppoll for now */
-       .quad sys_unshare               /* 310 */
-       .quad compat_sys_set_robust_list
-       .quad compat_sys_get_robust_list
-       .quad sys_splice
-       .quad sys_sync_file_range
-       .quad sys_tee
-       .quad compat_sys_vmsplice
-       .quad compat_sys_move_pages
-ia32_syscall_end:              
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32-xen.c b/linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32-xen.c
deleted file mode 100644 (file)
index e99a6f7..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Copyright 2002,2003 Andi Kleen, SuSE Labs */
-
-/* vsyscall handling for 32bit processes. Map a stub page into it 
-   on demand because 32bit cannot reach the kernel's fixmaps */
-
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/gfp.h>
-#include <linux/init.h>
-#include <linux/stringify.h>
-#include <linux/security.h>
-#include <asm/proto.h>
-#include <asm/tlbflush.h>
-#include <asm/ia32_unistd.h>
-
-#ifdef USE_INT80
-extern unsigned char syscall32_int80[], syscall32_int80_end[];
-#endif
-extern unsigned char syscall32_syscall[], syscall32_syscall_end[];
-extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[];
-extern int sysctl_vsyscall32;
-
-char *syscall32_page; 
-#ifndef USE_INT80
-static int use_sysenter = -1;
-#endif
-
-static struct page *
-syscall32_nopage(struct vm_area_struct *vma, unsigned long adr, int *type)
-{
-       struct page *p = virt_to_page(adr - vma->vm_start + syscall32_page);
-       get_page(p);
-       return p;
-}
-
-/* Prevent VMA merging */
-static void syscall32_vma_close(struct vm_area_struct *vma)
-{
-}
-
-static struct vm_operations_struct syscall32_vm_ops = {
-       .close = syscall32_vma_close,
-       .nopage = syscall32_nopage,
-};
-
-struct linux_binprm;
-
-/* Setup a VMA at program startup for the vsyscall page */
-int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
-{
-       int npages = (VSYSCALL32_END - VSYSCALL32_BASE) >> PAGE_SHIFT;
-       struct vm_area_struct *vma;
-       struct mm_struct *mm = current->mm;
-       int ret;
-
-       vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!vma)
-               return -ENOMEM;
-
-       memset(vma, 0, sizeof(struct vm_area_struct));
-       /* Could randomize here */
-       vma->vm_start = VSYSCALL32_BASE;
-       vma->vm_end = VSYSCALL32_END;
-       /* MAYWRITE to allow gdb to COW and set breakpoints */
-       vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
-       vma->vm_flags |= mm->def_flags;
-       vma->vm_page_prot = protection_map[vma->vm_flags & 7];
-       vma->vm_ops = &syscall32_vm_ops;
-       vma->vm_mm = mm;
-
-       down_write(&mm->mmap_sem);
-       if ((ret = insert_vm_struct(mm, vma))) {
-               up_write(&mm->mmap_sem);
-               kmem_cache_free(vm_area_cachep, vma);
-               return ret;
-       }
-       mm->total_vm += npages;
-       up_write(&mm->mmap_sem);
-       return 0;
-}
-
-static int __init init_syscall32(void)
-{ 
-       syscall32_page = (void *)get_zeroed_page(GFP_KERNEL); 
-       if (!syscall32_page) 
-               panic("Cannot allocate syscall32 page"); 
-
-#ifdef USE_INT80
-       /*
-        * At this point we use int 0x80.
-        */
-       memcpy(syscall32_page, syscall32_int80,
-              syscall32_int80_end - syscall32_int80);
-#else
-       if (use_sysenter > 0) {
-               memcpy(syscall32_page, syscall32_sysenter,
-                      syscall32_sysenter_end - syscall32_sysenter);
-       } else {
-               memcpy(syscall32_page, syscall32_syscall,
-                      syscall32_syscall_end - syscall32_syscall);
-       }       
-#endif
-       return 0;
-} 
-
-/*
- * This must be done early in case we have an initrd containing 32-bit
- * binaries (e.g., hotplug). This could be pushed upstream to arch/x86_64.
- */    
-core_initcall(init_syscall32); 
-
-/* May not be __init: called during resume */
-void syscall32_cpu_init(void)
-{
-#ifndef USE_INT80
-       if (use_sysenter < 0)
-               use_sysenter = (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL);
-
-       /* Load these always in case some future AMD CPU supports
-          SYSENTER from compat mode too. */
-       checking_wrmsrl(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
-       checking_wrmsrl(MSR_IA32_SYSENTER_ESP, 0ULL);
-       checking_wrmsrl(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target);
-
-       wrmsrl(MSR_CSTAR, ia32_cstar_target);
-#endif
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32_syscall-xen.S b/linux-2.6-xen-sparse/arch/x86_64/ia32/syscall32_syscall-xen.S
deleted file mode 100644 (file)
index 749b198..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* 32bit VDSOs mapped into user space. */
-
-       .section ".init.data","aw"
-
-#ifdef USE_INT80
-
-       .globl syscall32_int80
-       .globl syscall32_int80_end
-
-syscall32_int80:
-       .incbin "arch/x86_64/ia32/vsyscall-int80.so"
-syscall32_int80_end:
-
-#endif
-
-       .globl syscall32_syscall
-       .globl syscall32_syscall_end
-
-syscall32_syscall:
-       .incbin "arch/x86_64/ia32/vsyscall-syscall.so"
-syscall32_syscall_end:
-
-       .globl syscall32_sysenter
-       .globl syscall32_sysenter_end
-
-syscall32_sysenter:
-       .incbin "arch/x86_64/ia32/vsyscall-sysenter.so"
-syscall32_sysenter_end:
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-int80.S b/linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-int80.S
deleted file mode 100644 (file)
index 00e4148..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Code for the vsyscall page.  This version uses the old int $0x80 method.
- *
- * NOTE:
- * 1) __kernel_vsyscall _must_ be first in this page.
- * 2) there are alignment constraints on this stub, see vsyscall-sigreturn.S
- *    for details.
- */
-#include <asm/ia32_unistd.h>
-#include <asm/asm-offsets.h>
-
-       .code32
-       .text
-       .section .text.vsyscall,"ax"
-       .globl __kernel_vsyscall
-       .type __kernel_vsyscall,@function
-__kernel_vsyscall:
-.LSTART_vsyscall:
-       int $0x80
-       ret
-.LEND_vsyscall:
-       .size __kernel_vsyscall,.-.LSTART_vsyscall
-       .previous
-
-       .section .eh_frame,"a",@progbits
-.LSTARTFRAME:
-       .long .LENDCIE-.LSTARTCIE
-.LSTARTCIE:
-       .long 0                 /* CIE ID */
-       .byte 1                 /* Version number */
-       .string "zR"            /* NUL-terminated augmentation string */
-       .uleb128 1              /* Code alignment factor */
-       .sleb128 -4             /* Data alignment factor */
-       .byte 8                 /* Return address register column */
-       .uleb128 1              /* Augmentation value length */
-       .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
-       .byte 0x0c              /* DW_CFA_def_cfa */
-       .uleb128 4
-       .uleb128 4
-       .byte 0x88              /* DW_CFA_offset, column 0x8 */
-       .uleb128 1
-       .align 4
-.LENDCIE:
-
-       .long .LENDFDE1-.LSTARTFDE1     /* Length FDE */
-.LSTARTFDE1:
-       .long .LSTARTFDE1-.LSTARTFRAME  /* CIE pointer */
-       .long .LSTART_vsyscall-.        /* PC-relative start address */
-       .long .LEND_vsyscall-.LSTART_vsyscall
-       .uleb128 0                      /* Augmentation length */
-       .align 4
-.LENDFDE1:
-               
-/*
- * Get the common code for the sigreturn entry points.
- */
-#define SYSCALL_ENTER_KERNEL    int $0x80
-#include "vsyscall-sigreturn.S"
diff --git a/linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-sigreturn.S b/linux-2.6-xen-sparse/arch/x86_64/ia32/vsyscall-sigreturn.S
deleted file mode 100644 (file)
index 6086ac6..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Common code for the sigreturn entry points on the vsyscall page.
- * This code uses SYSCALL_ENTER_KERNEL (either syscall or int $0x80)
- * to enter the kernel.
- * This file is #include'd by vsyscall-*.S to define them after the
- * vsyscall entry point.  The addresses we get for these entry points
- * by doing ".balign 32" must match in both versions of the page.
- */
-
-       .code32
-       .section .text.sigreturn,"ax"
-       .balign 32
-       .globl __kernel_sigreturn
-       .type __kernel_sigreturn,@function
-__kernel_sigreturn:
-.LSTART_sigreturn:
-       popl %eax
-       movl $__NR_ia32_sigreturn, %eax
-       SYSCALL_ENTER_KERNEL
-.LEND_sigreturn:
-       .size __kernel_sigreturn,.-.LSTART_sigreturn
-
-       .section .text.rtsigreturn,"ax"
-       .balign 32
-       .globl __kernel_rt_sigreturn
-       .type __kernel_rt_sigreturn,@function
-__kernel_rt_sigreturn:
-.LSTART_rt_sigreturn:
-       movl $__NR_ia32_rt_sigreturn, %eax
-       SYSCALL_ENTER_KERNEL
-.LEND_rt_sigreturn:
-       .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
-
-       .section .eh_frame,"a",@progbits
-.LSTARTFRAMES:
-        .long .LENDCIES-.LSTARTCIES
-.LSTARTCIES:
-       .long 0                 /* CIE ID */
-       .byte 1                 /* Version number */
-       .string "zRS"           /* NUL-terminated augmentation string */
-       .uleb128 1              /* Code alignment factor */
-       .sleb128 -4             /* Data alignment factor */
-       .byte 8                 /* Return address register column */
-       .uleb128 1              /* Augmentation value length */
-       .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
-       .byte 0x0c              /* DW_CFA_def_cfa */
-       .uleb128 4
-       .uleb128 4
-       .byte 0x88              /* DW_CFA_offset, column 0x8 */
-       .uleb128 1
-       .align 4
-.LENDCIES:
-
-       .long .LENDFDE2-.LSTARTFDE2     /* Length FDE */
-.LSTARTFDE2:
-       .long .LSTARTFDE2-.LSTARTFRAMES /* CIE pointer */
-       /* HACK: The dwarf2 unwind routines will subtract 1 from the
-          return address to get an address in the middle of the
-          presumed call instruction.  Since we didn't get here via
-          a call, we need to include the nop before the real start
-          to make up for it.  */
-       .long .LSTART_sigreturn-1-.     /* PC-relative start address */
-       .long .LEND_sigreturn-.LSTART_sigreturn+1
-       .uleb128 0                      /* Augmentation length */
-       /* What follows are the instructions for the table generation.
-          We record the locations of each register saved.  This is
-          complicated by the fact that the "CFA" is always assumed to
-          be the value of the stack pointer in the caller.  This means
-          that we must define the CFA of this body of code to be the
-          saved value of the stack pointer in the sigcontext.  Which
-          also means that there is no fixed relation to the other 
-          saved registers, which means that we must use DW_CFA_expression
-          to compute their addresses.  It also means that when we 
-          adjust the stack with the popl, we have to do it all over again.  */
-
-#define do_cfa_expr(offset)                                            \
-       .byte 0x0f;                     /* DW_CFA_def_cfa_expression */ \
-       .uleb128 1f-0f;                 /*   length */                  \
-0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
-       .sleb128 offset;                /*      offset */               \
-       .byte 0x06;                     /*     DW_OP_deref */           \
-1:
-
-#define do_expr(regno, offset)                                         \
-       .byte 0x10;                     /* DW_CFA_expression */         \
-       .uleb128 regno;                 /*   regno */                   \
-       .uleb128 1f-0f;                 /*   length */                  \
-0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
-       .sleb128 offset;                /*       offset */              \
-1:
-
-       do_cfa_expr(IA32_SIGCONTEXT_esp+4)
-       do_expr(0, IA32_SIGCONTEXT_eax+4)
-       do_expr(1, IA32_SIGCONTEXT_ecx+4)
-       do_expr(2, IA32_SIGCONTEXT_edx+4)
-       do_expr(3, IA32_SIGCONTEXT_ebx+4)
-       do_expr(5, IA32_SIGCONTEXT_ebp+4)
-       do_expr(6, IA32_SIGCONTEXT_esi+4)
-       do_expr(7, IA32_SIGCONTEXT_edi+4)
-       do_expr(8, IA32_SIGCONTEXT_eip+4)
-
-       .byte 0x42      /* DW_CFA_advance_loc 2 -- nop; popl eax. */
-
-       do_cfa_expr(IA32_SIGCONTEXT_esp)
-       do_expr(0, IA32_SIGCONTEXT_eax)
-       do_expr(1, IA32_SIGCONTEXT_ecx)
-       do_expr(2, IA32_SIGCONTEXT_edx)
-       do_expr(3, IA32_SIGCONTEXT_ebx)
-       do_expr(5, IA32_SIGCONTEXT_ebp)
-       do_expr(6, IA32_SIGCONTEXT_esi)
-       do_expr(7, IA32_SIGCONTEXT_edi)
-       do_expr(8, IA32_SIGCONTEXT_eip)
-
-       .align 4
-.LENDFDE2:
-
-       .long .LENDFDE3-.LSTARTFDE3     /* Length FDE */
-.LSTARTFDE3:
-       .long .LSTARTFDE3-.LSTARTFRAMES /* CIE pointer */
-       /* HACK: See above wrt unwind library assumptions.  */
-       .long .LSTART_rt_sigreturn-1-.  /* PC-relative start address */
-       .long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1
-       .uleb128 0                      /* Augmentation */
-       /* What follows are the instructions for the table generation.
-          We record the locations of each register saved.  This is
-          slightly less complicated than the above, since we don't
-          modify the stack pointer in the process.  */
-
-       do_cfa_expr(IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_esp)
-       do_expr(0, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_eax)
-       do_expr(1, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ecx)
-       do_expr(2, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_edx)
-       do_expr(3, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ebx)
-       do_expr(5, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ebp)
-       do_expr(6, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_esi)
-       do_expr(7, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_edi)
-       do_expr(8, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_eip)
-
-       .align 4
-.LENDFDE3:
-
-#include <vsyscall-note.S>
-
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile b/linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile
deleted file mode 100644 (file)
index fca2eae..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-extra-y        := head.o head64.o init_task.o vmlinux.lds
-EXTRA_AFLAGS   := -traditional
-obj-y  := process.o signal.o entry.o traps.o irq.o \
-               ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_x86_64.o \
-               x8664_ksyms.o i387.o syscall.o vsyscall.o \
-               setup64.o bootflag.o e820.o reboot.o quirks.o i8237.o \
-               pci-dma.o pci-nommu.o alternative.o
-
-obj-$(CONFIG_STACKTRACE)       += stacktrace.o
-obj-$(CONFIG_X86_MCE)         += mce.o
-obj-$(CONFIG_X86_MCE_INTEL)    += mce_intel.o
-obj-$(CONFIG_X86_MCE_AMD)      += mce_amd.o
-obj-$(CONFIG_MTRR)             += ../../i386/kernel/cpu/mtrr/
-obj-$(CONFIG_ACPI)             += acpi/
-obj-$(CONFIG_X86_MSR)          += msr.o
-obj-$(CONFIG_MICROCODE)                += microcode.o
-obj-$(CONFIG_X86_CPUID)                += cpuid.o
-obj-$(CONFIG_SMP)              += smp.o smpboot.o trampoline.o
-obj-$(CONFIG_X86_LOCAL_APIC)   += apic.o  nmi.o
-obj-$(CONFIG_X86_XEN_GENAPIC)  += genapic.o genapic_xen.o
-obj-$(CONFIG_X86_IO_APIC)      += io_apic.o mpparse.o \
-               genapic.o genapic_cluster.o genapic_flat.o
-obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o crash.o
-obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
-obj-$(CONFIG_ACPI_SLEEP)       += suspend.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend_asm.o
-obj-$(CONFIG_CPU_FREQ)         += cpufreq/
-obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
-obj-$(CONFIG_IOMMU)            += pci-gart.o aperture.o
-obj-$(CONFIG_CALGARY_IOMMU)    += pci-calgary.o tce.o
-obj-$(CONFIG_SWIOTLB)          += pci-swiotlb.o
-obj-$(CONFIG_KPROBES)          += kprobes.o
-obj-$(CONFIG_X86_PM_TIMER)     += pmtimer.o
-obj-$(CONFIG_X86_VSMP)         += vsmp.o
-obj-$(CONFIG_K8_NB)            += k8.o
-obj-$(CONFIG_AUDIT)            += audit.o
-
-obj-$(CONFIG_MODULES)          += module.o
-
-obj-y                          += topology.o
-obj-y                          += intel_cacheinfo.o
-
-CFLAGS_vsyscall.o              := $(PROFILING) -g0
-
-bootflag-y                     += ../../i386/kernel/bootflag.o
-cpuid-$(subst m,y,$(CONFIG_X86_CPUID))  += ../../i386/kernel/cpuid.o
-topology-y                     += ../../i386/kernel/topology.o
-microcode-$(subst m,y,$(CONFIG_MICROCODE))  += ../../i386/kernel/microcode.o
-intel_cacheinfo-y              += ../../i386/kernel/cpu/intel_cacheinfo.o
-quirks-y                       += ../../i386/kernel/quirks.o
-i8237-y                                += ../../i386/kernel/i8237.o
-msr-$(subst m,y,$(CONFIG_X86_MSR))  += ../../i386/kernel/msr.o
-alternative-y                  += ../../i386/kernel/alternative.o
-
-ifdef CONFIG_XEN
-time-y                         += ../../i386/kernel/time-xen.o
-pci-dma-y                      += ../../i386/kernel/pci-dma-xen.o
-microcode-$(subst m,y,$(CONFIG_MICROCODE))  := ../../i386/kernel/microcode-xen.o
-quirks-y                       := ../../i386/kernel/quirks-xen.o
-
-n-obj-xen := i8259.o reboot.o i8237.o smpboot.o trampoline.o
-
-include $(srctree)/scripts/Makefile.xen
-
-obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
-obj-y := $(call cherrypickxen, $(obj-y))
-extra-y := $(call cherrypickxen, $(extra-y))
-%/head-xen.o %/head-xen.s: EXTRA_AFLAGS :=
-endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/acpi/Makefile b/linux-2.6-xen-sparse/arch/x86_64/kernel/acpi/Makefile
deleted file mode 100644 (file)
index 57b7fe1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-obj-y                  := boot.o
-boot-y                 := ../../../i386/kernel/acpi/boot.o
-obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
-
-ifneq ($(CONFIG_ACPI_PROCESSOR),)
-obj-y                  += processor.o
-processor-y            := ../../../i386/kernel/acpi/processor.o ../../../i386/kernel/acpi/cstate.o
-endif
-
-boot-$(CONFIG_XEN)             := ../../../i386/kernel/acpi/boot-xen.o
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/apic-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/apic-xen.c
deleted file mode 100644 (file)
index d5f44ac..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *     Local APIC handling, local APIC timers
- *
- *     (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *     Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
- *                                     thanks to Eric Gilmore
- *                                     and Rolf G. Tews
- *                                     for testing these extensively.
- *     Maciej W. Rozycki       :       Various updates and fixes.
- *     Mikael Pettersson       :       Power Management for UP-APIC.
- *     Pavel Machek and
- *     Mikael Pettersson       :       PM converted to driver model.
- */
-
-#include <linux/init.h>
-
-#include <linux/mm.h>
-#include <linux/delay.h>
-#include <linux/bootmem.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-#include <linux/mc146818rtc.h>
-#include <linux/kernel_stat.h>
-#include <linux/sysdev.h>
-#include <linux/module.h>
-
-#include <asm/atomic.h>
-#include <asm/smp.h>
-#include <asm/mtrr.h>
-#include <asm/mpspec.h>
-#include <asm/desc.h>
-#include <asm/arch_hooks.h>
-#include <asm/hpet.h>
-#include <asm/idle.h>
-
-int apic_verbosity;
-
-/*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
- */
-void ack_bad_irq(unsigned int irq)
-{
-       printk("unexpected IRQ trap at vector %02x\n", irq);
-       /*
-        * Currently unexpected vectors happen only on SMP and APIC.
-        * We _must_ ack these because every local APIC has only N
-        * irq slots per priority level, and a 'hanging, unacked' IRQ
-        * holds up an irq slot - in excessive cases (when multiple
-        * unexpected vectors occur) that might lock up the APIC
-        * completely.
-        * But don't ack when the APIC is disabled. -AK
-        */
-       if (!disable_apic)
-               ack_APIC_irq();
-}
-
-int setup_profiling_timer(unsigned int multiplier)
-{
-       return -EINVAL;
-}
-
-void smp_local_timer_interrupt(struct pt_regs *regs)
-{
-       profile_tick(CPU_PROFILING, regs);
-#ifndef CONFIG_XEN
-#ifdef CONFIG_SMP
-               update_process_times(user_mode(regs));
-#endif
-#endif
-       /*
-        * We take the 'long' return path, and there every subsystem
-        * grabs the appropriate locks (kernel lock/ irq lock).
-        *
-        * we might want to decouple profiling from the 'long path',
-        * and do the profiling totally in assembly.
-        *
-        * Currently this isn't too much of an issue (performance wise),
-        * we can take more than 100K local irqs per second on a 100 MHz P5.
-        */
-}
-
-/*
- * Local APIC timer interrupt. This is the most natural way for doing
- * local interrupts, but local timer interrupts can be emulated by
- * broadcast interrupts too. [in case the hw doesn't support APIC timers]
- *
- * [ if a single-CPU system runs an SMP kernel then we call the local
- *   interrupt as well. Thus we cannot inline the local irq ... ]
- */
-void smp_apic_timer_interrupt(struct pt_regs *regs)
-{
-       /*
-        * the NMI deadlock-detector uses this.
-        */
-       add_pda(apic_timer_irqs, 1);
-
-       /*
-        * NOTE! We'd better ACK the irq immediately,
-        * because timer handling can be slow.
-        */
-       ack_APIC_irq();
-       /*
-        * update_process_times() expects us to have done irq_enter().
-        * Besides, if we don't timer interrupts ignore the global
-        * interrupt lock, which is the WrongThing (tm) to do.
-        */
-       exit_idle();
-       irq_enter();
-       smp_local_timer_interrupt(regs);
-       irq_exit();
-}
-
-/*
- * This interrupt should _never_ happen with our APIC/SMP architecture
- */
-asmlinkage void smp_spurious_interrupt(void)
-{
-       unsigned int v;
-       exit_idle();
-       irq_enter();
-       /*
-        * Check if this really is a spurious interrupt and ACK it
-        * if it is a vectored one.  Just in case...
-        * Spurious interrupts should not be ACKed.
-        */
-       v = apic_read(APIC_ISR + ((SPURIOUS_APIC_VECTOR & ~0x1f) >> 1));
-       if (v & (1 << (SPURIOUS_APIC_VECTOR & 0x1f)))
-               ack_APIC_irq();
-
-#if 0
-       static unsigned long last_warning; 
-       static unsigned long skipped; 
-
-       /* see sw-dev-man vol 3, chapter 7.4.13.5 */
-       if (time_before(last_warning+30*HZ,jiffies)) { 
-               printk(KERN_INFO "spurious APIC interrupt on CPU#%d, %ld skipped.\n",
-                      smp_processor_id(), skipped);
-               last_warning = jiffies; 
-               skipped = 0;
-       } else { 
-               skipped++; 
-       } 
-#endif 
-       irq_exit();
-}
-
-/*
- * This interrupt should never happen with our APIC/SMP architecture
- */
-
-asmlinkage void smp_error_interrupt(void)
-{
-       unsigned int v, v1;
-
-       exit_idle();
-       irq_enter();
-       /* First tickle the hardware, only then report what went on. -- REW */
-       v = apic_read(APIC_ESR);
-       apic_write(APIC_ESR, 0);
-       v1 = apic_read(APIC_ESR);
-       ack_APIC_irq();
-       atomic_inc(&irq_err_count);
-
-       /* Here is what the APIC error bits mean:
-          0: Send CS error
-          1: Receive CS error
-          2: Send accept error
-          3: Receive accept error
-          4: Reserved
-          5: Send illegal vector
-          6: Received illegal vector
-          7: Illegal register address
-       */
-       printk (KERN_DEBUG "APIC error on CPU%d: %02x(%02x)\n",
-               smp_processor_id(), v , v1);
-       irq_exit();
-}
-
-int disable_apic;
-
-/*
- * This initializes the IO-APIC and APIC hardware if this is
- * a UP kernel.
- */
-int __init APIC_init_uniprocessor (void)
-{
-#ifdef CONFIG_X86_IO_APIC
-       if (smp_found_config)
-               if (!skip_ioapic_setup && nr_ioapics)
-                       setup_IO_APIC();
-#endif
-
-       return 1;
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c
deleted file mode 100644 (file)
index 85f73c1..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed to extract
- * and format the required data.
- */
-
-#include <linux/crypto.h>
-#include <linux/sched.h> 
-#include <linux/stddef.h>
-#include <linux/errno.h> 
-#include <linux/hardirq.h>
-#include <linux/suspend.h>
-#include <asm/pda.h>
-#include <asm/processor.h>
-#include <asm/segment.h>
-#include <asm/thread_info.h>
-#include <asm/ia32.h>
-
-#define DEFINE(sym, val) \
-        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-int main(void)
-{
-#define ENTRY(entry) DEFINE(tsk_ ## entry, offsetof(struct task_struct, entry))
-       ENTRY(state);
-       ENTRY(flags); 
-       ENTRY(thread); 
-       ENTRY(pid);
-       BLANK();
-#undef ENTRY
-#define ENTRY(entry) DEFINE(threadinfo_ ## entry, offsetof(struct thread_info, entry))
-       ENTRY(flags);
-       ENTRY(addr_limit);
-       ENTRY(preempt_count);
-       ENTRY(status);
-       BLANK();
-#undef ENTRY
-#define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry))
-       ENTRY(kernelstack); 
-       ENTRY(oldrsp); 
-       ENTRY(pcurrent); 
-       ENTRY(irqcount);
-       ENTRY(cpunumber);
-       ENTRY(irqstackptr);
-       ENTRY(data_offset);
-       BLANK();
-#undef ENTRY
-#ifdef CONFIG_IA32_EMULATION
-#define ENTRY(entry) DEFINE(IA32_SIGCONTEXT_ ## entry, offsetof(struct sigcontext_ia32, entry))
-       ENTRY(eax);
-       ENTRY(ebx);
-       ENTRY(ecx);
-       ENTRY(edx);
-       ENTRY(esi);
-       ENTRY(edi);
-       ENTRY(ebp);
-       ENTRY(esp);
-       ENTRY(eip);
-       BLANK();
-#undef ENTRY
-       DEFINE(IA32_RT_SIGFRAME_sigcontext,
-              offsetof (struct rt_sigframe32, uc.uc_mcontext));
-       BLANK();
-#endif
-       DEFINE(pbe_address, offsetof(struct pbe, address));
-       DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
-       DEFINE(pbe_next, offsetof(struct pbe, next));
-#ifndef CONFIG_X86_NO_TSS
-       BLANK();
-       DEFINE(TSS_ist, offsetof(struct tss_struct, ist));
-#endif
-       BLANK();
-       DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/crash.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/crash.c
deleted file mode 100644 (file)
index 178fb47..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Architecture specific (x86_64) functions for kexec based crash dumps.
- *
- * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
- *
- * Copyright (C) IBM Corporation, 2004. All rights reserved.
- *
- */
-
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/smp.h>
-#include <linux/irq.h>
-#include <linux/reboot.h>
-#include <linux/kexec.h>
-#include <linux/delay.h>
-#include <linux/elf.h>
-#include <linux/elfcore.h>
-
-#include <asm/processor.h>
-#include <asm/hardirq.h>
-#include <asm/nmi.h>
-#include <asm/hw_irq.h>
-#include <asm/mach_apic.h>
-
-/* This keeps a track of which one is crashing cpu. */
-static int crashing_cpu;
-
-static u32 *append_elf_note(u32 *buf, char *name, unsigned type,
-                                               void *data, size_t data_len)
-{
-       struct elf_note note;
-
-       note.n_namesz = strlen(name) + 1;
-       note.n_descsz = data_len;
-       note.n_type   = type;
-       memcpy(buf, &note, sizeof(note));
-       buf += (sizeof(note) +3)/4;
-       memcpy(buf, name, note.n_namesz);
-       buf += (note.n_namesz + 3)/4;
-       memcpy(buf, data, note.n_descsz);
-       buf += (note.n_descsz + 3)/4;
-
-       return buf;
-}
-
-static void final_note(u32 *buf)
-{
-       struct elf_note note;
-
-       note.n_namesz = 0;
-       note.n_descsz = 0;
-       note.n_type   = 0;
-       memcpy(buf, &note, sizeof(note));
-}
-
-static void crash_save_this_cpu(struct pt_regs *regs, int cpu)
-{
-       struct elf_prstatus prstatus;
-       u32 *buf;
-
-       if ((cpu < 0) || (cpu >= NR_CPUS))
-               return;
-
-       /* Using ELF notes here is opportunistic.
-        * I need a well defined structure format
-        * for the data I pass, and I need tags
-        * on the data to indicate what information I have
-        * squirrelled away.  ELF notes happen to provide
-        * all of that that no need to invent something new.
-        */
-
-       buf = (u32*)per_cpu_ptr(crash_notes, cpu);
-
-       if (!buf)
-               return;
-
-       memset(&prstatus, 0, sizeof(prstatus));
-       prstatus.pr_pid = current->pid;
-       elf_core_copy_regs(&prstatus.pr_reg, regs);
-       buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
-                                       sizeof(prstatus));
-       final_note(buf);
-}
-
-static void crash_save_self(struct pt_regs *regs)
-{
-       int cpu;
-
-       cpu = smp_processor_id();
-       crash_save_this_cpu(regs, cpu);
-}
-
-#ifndef CONFIG_XEN
-#ifdef CONFIG_SMP
-static atomic_t waiting_for_crash_ipi;
-
-static int crash_nmi_callback(struct pt_regs *regs, int cpu)
-{
-       /*
-        * Don't do anything if this handler is invoked on crashing cpu.
-        * Otherwise, system will completely hang. Crashing cpu can get
-        * an NMI if system was initially booted with nmi_watchdog parameter.
-        */
-       if (cpu == crashing_cpu)
-               return 1;
-       local_irq_disable();
-
-       crash_save_this_cpu(regs, cpu);
-       disable_local_APIC();
-       atomic_dec(&waiting_for_crash_ipi);
-       /* Assume hlt works */
-       for(;;)
-               halt();
-
-       return 1;
-}
-
-static void smp_send_nmi_allbutself(void)
-{
-       send_IPI_allbutself(NMI_VECTOR);
-}
-
-/*
- * This code is a best effort heuristic to get the
- * other cpus to stop executing. So races with
- * cpu hotplug shouldn't matter.
- */
-
-static void nmi_shootdown_cpus(void)
-{
-       unsigned long msecs;
-
-       atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
-       set_nmi_callback(crash_nmi_callback);
-
-       /*
-        * Ensure the new callback function is set before sending
-        * out the NMI
-        */
-       wmb();
-
-       smp_send_nmi_allbutself();
-
-       msecs = 1000; /* Wait at most a second for the other cpus to stop */
-       while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
-               mdelay(1);
-               msecs--;
-       }
-       /* Leave the nmi callback set */
-       disable_local_APIC();
-}
-#else
-static void nmi_shootdown_cpus(void)
-{
-       /* There are no cpus to shootdown */
-}
-#endif
-#endif /* CONFIG_XEN */
-
-void machine_crash_shutdown(struct pt_regs *regs)
-{
-       /*
-        * This function is only called after the system
-        * has panicked or is otherwise in a critical state.
-        * The minimum amount of code to allow a kexec'd kernel
-        * to run successfully needs to happen here.
-        *
-        * In practice this means shooting down the other cpus in
-        * an SMP system.
-        */
-       /* The kernel is broken so disable interrupts */
-       local_irq_disable();
-
-       /* Make a note of crashing cpu. Will be used in NMI callback.*/
-       crashing_cpu = smp_processor_id();
-
-#ifndef CONFIG_XEN
-       nmi_shootdown_cpus();
-
-       if(cpu_has_apic)
-                disable_local_APIC();
-
-#if defined(CONFIG_X86_IO_APIC)
-       disable_IO_APIC();
-#endif
-#endif /* CONFIG_XEN */
-       crash_save_self(regs);
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c
deleted file mode 100644 (file)
index 29c0bb2..0000000
+++ /dev/null
@@ -1,774 +0,0 @@
-/* 
- * Handle the memory map.
- * The functions here do the job until bootmem takes over.
- *
- *  Getting sanitize_e820_map() in sync with i386 version by applying change:
- *  -  Provisions for empty E820 memory regions (reported by certain BIOSes).
- *     Alex Achenbach <xela@slit.de>, December 2002.
- *  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
- *
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/kexec.h>
-#include <linux/module.h>
-
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/e820.h>
-#include <asm/proto.h>
-#include <asm/bootsetup.h>
-#include <asm/sections.h>
-#include <xen/interface/memory.h>
-
-/* 
- * PFN of last memory page.
- */
-unsigned long end_pfn; 
-EXPORT_SYMBOL(end_pfn);
-
-/* 
- * end_pfn only includes RAM, while end_pfn_map includes all e820 entries.
- * The direct mapping extends to end_pfn_map, so that we can directly access
- * apertures, ACPI and other tables without having to play with fixmaps.
- */ 
-unsigned long end_pfn_map; 
-
-/* 
- * Last pfn which the user wants to use.
- */
-unsigned long end_user_pfn = MAXMEM>>PAGE_SHIFT;  
-
-extern struct resource code_resource, data_resource;
-
-/* Check for some hardcoded bad areas that early boot is not allowed to touch */ 
-static inline int bad_addr(unsigned long *addrp, unsigned long size)
-{ 
-       unsigned long addr = *addrp, last = addr + size; 
-
-#ifndef CONFIG_XEN
-       /* various gunk below that needed for SMP startup */
-       if (addr < 0x8000) { 
-               *addrp = 0x8000;
-               return 1; 
-       }
-
-       /* direct mapping tables of the kernel */
-       if (last >= table_start<<PAGE_SHIFT && addr < table_end<<PAGE_SHIFT) { 
-               *addrp = table_end << PAGE_SHIFT; 
-               return 1;
-       } 
-
-       /* initrd */ 
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (LOADER_TYPE && INITRD_START && last >= INITRD_START && 
-           addr < INITRD_START+INITRD_SIZE) { 
-               *addrp = INITRD_START + INITRD_SIZE; 
-               return 1;
-       } 
-#endif
-       /* kernel code + 640k memory hole (later should not be needed, but 
-          be paranoid for now) */
-       if (last >= 640*1024 && addr < 1024*1024) {
-               *addrp = 1024*1024;
-               return 1;
-       }
-       if (last >= __pa_symbol(&_text) && last < __pa_symbol(&_end)) {
-               *addrp = __pa_symbol(&_end);
-               return 1;
-       }
-
-       if (last >= ebda_addr && addr < ebda_addr + ebda_size) {
-               *addrp = ebda_addr + ebda_size;
-               return 1;
-       }
-
-       /* XXX ramdisk image here? */ 
-#else
-       if (last < (table_end<<PAGE_SHIFT)) {
-               *addrp = table_end << PAGE_SHIFT;
-               return 1;
-       }
-#endif
-       return 0;
-} 
-
-#ifndef CONFIG_XEN
-/*
- * This function checks if any part of the range <start,end> is mapped
- * with type.
- */
-int __meminit
-e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
-{ 
-       int i;
-       for (i = 0; i < e820.nr_map; i++) { 
-               struct e820entry *ei = &e820.map[i]; 
-               if (type && ei->type != type) 
-                       continue;
-               if (ei->addr >= end || ei->addr + ei->size <= start)
-                       continue; 
-               return 1; 
-       } 
-       return 0;
-}
-#endif
-
-/*
- * This function checks if the entire range <start,end> is mapped with type.
- *
- * Note: this function only works correct if the e820 table is sorted and
- * not-overlapping, which is the case
- */
-int __init e820_all_mapped(unsigned long start, unsigned long end, unsigned type)
-{
-       int i;
-
-#ifndef CONFIG_XEN
-       for (i = 0; i < e820.nr_map; i++) {
-               struct e820entry *ei = &e820.map[i];
-#else
-       extern struct e820map machine_e820;
-
-       if (!is_initial_xendomain())
-               return 0;
-       for (i = 0; i < machine_e820.nr_map; i++) {
-               const struct e820entry *ei = &machine_e820.map[i];
-#endif
-
-               if (type && ei->type != type)
-                       continue;
-               /* is the region (part) in overlap with the current region ?*/
-               if (ei->addr >= end || ei->addr + ei->size <= start)
-                       continue;
-
-               /* if the region is at the beginning of <start,end> we move
-                * start to the end of the region since it's ok until there
-                */
-               if (ei->addr <= start)
-                       start = ei->addr + ei->size;
-               /* if start is now at or beyond end, we're done, full coverage */
-               if (start >= end)
-                       return 1; /* we're done */
-       }
-       return 0;
-}
-
-/* 
- * Find a free area in a specific range. 
- */ 
-unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsigned size) 
-{ 
-       int i; 
-       for (i = 0; i < e820.nr_map; i++) { 
-               struct e820entry *ei = &e820.map[i]; 
-               unsigned long addr = ei->addr, last; 
-               if (ei->type != E820_RAM) 
-                       continue; 
-               if (addr < start) 
-                       addr = start;
-               if (addr > ei->addr + ei->size) 
-                       continue; 
-               while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size)
-                       ;
-               last = addr + size;
-               if (last > ei->addr + ei->size)
-                       continue;
-               if (last > end) 
-                       continue;
-               return addr; 
-       } 
-       return -1UL;            
-} 
-
-/* 
- * Free bootmem based on the e820 table for a node.
- */
-void __init e820_bootmem_free(pg_data_t *pgdat, unsigned long start,unsigned long end)
-{
-       int i;
-       for (i = 0; i < e820.nr_map; i++) {
-               struct e820entry *ei = &e820.map[i]; 
-               unsigned long last, addr;
-
-               if (ei->type != E820_RAM || 
-                   ei->addr+ei->size <= start || 
-                   ei->addr >= end)
-                       continue;
-
-               addr = round_up(ei->addr, PAGE_SIZE);
-               if (addr < start) 
-                       addr = start;
-
-               last = round_down(ei->addr + ei->size, PAGE_SIZE); 
-               if (last >= end)
-                       last = end; 
-
-               if (last > addr && last-addr >= PAGE_SIZE)
-                       free_bootmem_node(pgdat, addr, last-addr);
-       }
-}
-
-/*
- * Find the highest page frame number we have available
- */
-unsigned long __init e820_end_of_ram(void)
-{
-       int i;
-       unsigned long end_pfn = 0;
-       
-       for (i = 0; i < e820.nr_map; i++) {
-               struct e820entry *ei = &e820.map[i]; 
-               unsigned long start, end;
-
-               start = round_up(ei->addr, PAGE_SIZE); 
-               end = round_down(ei->addr + ei->size, PAGE_SIZE); 
-               if (start >= end)
-                       continue;
-               if (ei->type == E820_RAM) { 
-               if (end > end_pfn<<PAGE_SHIFT)
-                       end_pfn = end>>PAGE_SHIFT;
-               } else { 
-                       if (end > end_pfn_map<<PAGE_SHIFT) 
-                               end_pfn_map = end>>PAGE_SHIFT;
-               } 
-       }
-
-       if (end_pfn > end_pfn_map) 
-               end_pfn_map = end_pfn;
-       if (end_pfn_map > MAXMEM>>PAGE_SHIFT)
-               end_pfn_map = MAXMEM>>PAGE_SHIFT;
-       if (end_pfn > end_user_pfn)
-               end_pfn = end_user_pfn;
-       if (end_pfn > end_pfn_map) 
-               end_pfn = end_pfn_map; 
-
-       return end_pfn; 
-}
-
-/* 
- * Compute how much memory is missing in a range.
- * Unlike the other functions in this file the arguments are in page numbers.
- */
-unsigned long __init
-e820_hole_size(unsigned long start_pfn, unsigned long end_pfn)
-{
-       unsigned long ram = 0;
-       unsigned long start = start_pfn << PAGE_SHIFT;
-       unsigned long end = end_pfn << PAGE_SHIFT;
-       int i;
-       for (i = 0; i < e820.nr_map; i++) {
-               struct e820entry *ei = &e820.map[i];
-               unsigned long last, addr;
-
-               if (ei->type != E820_RAM ||
-                   ei->addr+ei->size <= start ||
-                   ei->addr >= end)
-                       continue;
-
-               addr = round_up(ei->addr, PAGE_SIZE);
-               if (addr < start)
-                       addr = start;
-
-               last = round_down(ei->addr + ei->size, PAGE_SIZE);
-               if (last >= end)
-                       last = end;
-
-               if (last > addr)
-                       ram += last - addr;
-       }
-       return ((end - start) - ram) >> PAGE_SHIFT;
-}
-
-/*
- * Mark e820 reserved areas as busy for the resource manager.
- */
-void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
-{
-       int i;
-       for (i = 0; i < nr_map; i++) {
-               struct resource *res;
-               res = alloc_bootmem_low(sizeof(struct resource));
-               switch (e820[i].type) {
-               case E820_RAM:  res->name = "System RAM"; break;
-               case E820_ACPI: res->name = "ACPI Tables"; break;
-               case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
-               default:        res->name = "reserved";
-               }
-               res->start = e820[i].addr;
-               res->end = res->start + e820[i].size - 1;
-               res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-               request_resource(&iomem_resource, res);
-               if (e820[i].type == E820_RAM) {
-                       /*
-                        *  We don't know which RAM region contains kernel data,
-                        *  so we try it repeatedly and let the resource manager
-                        *  test it.
-                        */
-#ifndef CONFIG_XEN
-                       request_resource(res, &code_resource);
-                       request_resource(res, &data_resource);
-#endif
-#ifdef CONFIG_KEXEC
-                       if (crashk_res.start != crashk_res.end)
-                               request_resource(res, &crashk_res);
-#ifdef CONFIG_XEN
-                       xen_machine_kexec_register_resources(res);
-#endif
-#endif
-               }
-       }
-}
-
-/* 
- * Add a memory region to the kernel e820 map.
- */ 
-void __init add_memory_region(unsigned long start, unsigned long size, int type)
-{
-       int x = e820.nr_map;
-
-       if (x == E820MAX) {
-               printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-               return;
-       }
-
-       e820.map[x].addr = start;
-       e820.map[x].size = size;
-       e820.map[x].type = type;
-       e820.nr_map++;
-}
-
-void __init e820_print_map(char *who)
-{
-       int i;
-
-       for (i = 0; i < e820.nr_map; i++) {
-               printk(" %s: %016Lx - %016Lx ", who,
-                       (unsigned long long) e820.map[i].addr,
-                       (unsigned long long) (e820.map[i].addr + e820.map[i].size));
-               switch (e820.map[i].type) {
-               case E820_RAM:  printk("(usable)\n");
-                               break;
-               case E820_RESERVED:
-                               printk("(reserved)\n");
-                               break;
-               case E820_ACPI:
-                               printk("(ACPI data)\n");
-                               break;
-               case E820_NVS:
-                               printk("(ACPI NVS)\n");
-                               break;
-               default:        printk("type %u\n", e820.map[i].type);
-                               break;
-               }
-       }
-}
-
-/*
- * Sanitize the BIOS e820 map.
- *
- * Some e820 responses include overlapping entries.  The following 
- * replaces the original e820 map with a new one, removing overlaps.
- *
- */
-static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
-{
-       struct change_member {
-               struct e820entry *pbios; /* pointer to original bios entry */
-               unsigned long long addr; /* address for this change point */
-       };
-       static struct change_member change_point_list[2*E820MAX] __initdata;
-       static struct change_member *change_point[2*E820MAX] __initdata;
-       static struct e820entry *overlap_list[E820MAX] __initdata;
-       static struct e820entry new_bios[E820MAX] __initdata;
-       struct change_member *change_tmp;
-       unsigned long current_type, last_type;
-       unsigned long long last_addr;
-       int chgidx, still_changing;
-       int overlap_entries;
-       int new_bios_entry;
-       int old_nr, new_nr, chg_nr;
-       int i;
-
-       /*
-               Visually we're performing the following (1,2,3,4 = memory types)...
-
-               Sample memory map (w/overlaps):
-                  ____22__________________
-                  ______________________4_
-                  ____1111________________
-                  _44_____________________
-                  11111111________________
-                  ____________________33__
-                  ___________44___________
-                  __________33333_________
-                  ______________22________
-                  ___________________2222_
-                  _________111111111______
-                  _____________________11_
-                  _________________4______
-
-               Sanitized equivalent (no overlap):
-                  1_______________________
-                  _44_____________________
-                  ___1____________________
-                  ____22__________________
-                  ______11________________
-                  _________1______________
-                  __________3_____________
-                  ___________44___________
-                  _____________33_________
-                  _______________2________
-                  ________________1_______
-                  _________________4______
-                  ___________________2____
-                  ____________________33__
-                  ______________________4_
-       */
-
-       /* if there's only one memory region, don't bother */
-       if (*pnr_map < 2)
-               return -1;
-
-       old_nr = *pnr_map;
-
-       /* bail out if we find any unreasonable addresses in bios map */
-       for (i=0; i<old_nr; i++)
-               if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
-                       return -1;
-
-       /* create pointers for initial change-point information (for sorting) */
-       for (i=0; i < 2*old_nr; i++)
-               change_point[i] = &change_point_list[i];
-
-       /* record all known change-points (starting and ending addresses),
-          omitting those that are for empty memory regions */
-       chgidx = 0;
-       for (i=0; i < old_nr; i++)      {
-               if (biosmap[i].size != 0) {
-                       change_point[chgidx]->addr = biosmap[i].addr;
-                       change_point[chgidx++]->pbios = &biosmap[i];
-                       change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
-                       change_point[chgidx++]->pbios = &biosmap[i];
-               }
-       }
-       chg_nr = chgidx;
-
-       /* sort change-point list by memory addresses (low -> high) */
-       still_changing = 1;
-       while (still_changing)  {
-               still_changing = 0;
-               for (i=1; i < chg_nr; i++)  {
-                       /* if <current_addr> > <last_addr>, swap */
-                       /* or, if current=<start_addr> & last=<end_addr>, swap */
-                       if ((change_point[i]->addr < change_point[i-1]->addr) ||
-                               ((change_point[i]->addr == change_point[i-1]->addr) &&
-                                (change_point[i]->addr == change_point[i]->pbios->addr) &&
-                                (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
-                          )
-                       {
-                               change_tmp = change_point[i];
-                               change_point[i] = change_point[i-1];
-                               change_point[i-1] = change_tmp;
-                               still_changing=1;
-                       }
-               }
-       }
-
-       /* create a new bios memory map, removing overlaps */
-       overlap_entries=0;       /* number of entries in the overlap table */
-       new_bios_entry=0;        /* index for creating new bios map entries */
-       last_type = 0;           /* start with undefined memory type */
-       last_addr = 0;           /* start with 0 as last starting address */
-       /* loop through change-points, determining affect on the new bios map */
-       for (chgidx=0; chgidx < chg_nr; chgidx++)
-       {
-               /* keep track of all overlapping bios entries */
-               if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
-               {
-                       /* add map entry to overlap list (> 1 entry implies an overlap) */
-                       overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
-               }
-               else
-               {
-                       /* remove entry from list (order independent, so swap with last) */
-                       for (i=0; i<overlap_entries; i++)
-                       {
-                               if (overlap_list[i] == change_point[chgidx]->pbios)
-                                       overlap_list[i] = overlap_list[overlap_entries-1];
-                       }
-                       overlap_entries--;
-               }
-               /* if there are overlapping entries, decide which "type" to use */
-               /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
-               current_type = 0;
-               for (i=0; i<overlap_entries; i++)
-                       if (overlap_list[i]->type > current_type)
-                               current_type = overlap_list[i]->type;
-               /* continue building up new bios map based on this information */
-               if (current_type != last_type)  {
-                       if (last_type != 0)      {
-                               new_bios[new_bios_entry].size =
-                                       change_point[chgidx]->addr - last_addr;
-                               /* move forward only if the new size was non-zero */
-                               if (new_bios[new_bios_entry].size != 0)
-                                       if (++new_bios_entry >= E820MAX)
-                                               break;  /* no more space left for new bios entries */
-                       }
-                       if (current_type != 0)  {
-                               new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
-                               new_bios[new_bios_entry].type = current_type;
-                               last_addr=change_point[chgidx]->addr;
-                       }
-                       last_type = current_type;
-               }
-       }
-       new_nr = new_bios_entry;   /* retain count for new bios entries */
-
-       /* copy new bios mapping into original location */
-       memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
-       *pnr_map = new_nr;
-
-       return 0;
-}
-
-/*
- * Copy the BIOS e820 map into a safe place.
- *
- * Sanity-check it while we're at it..
- *
- * If we're lucky and live on a modern system, the setup code
- * will have given us a memory map that we can use to properly
- * set up memory.  If we aren't, we'll fake a memory map.
- *
- * We check to see that the memory map contains at least 2 elements
- * before we'll use it, because the detection code in setup.S may
- * not be perfect and most every PC known to man has two memory
- * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
- * thinkpad 560x, for example, does not cooperate with the memory
- * detection code.)
- */
-static int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
-{
-#ifndef CONFIG_XEN
-       /* Only one memory region (or negative)? Ignore it */
-       if (nr_map < 2)
-               return -1;
-#else
-       BUG_ON(nr_map < 1);
-#endif
-
-       do {
-               unsigned long start = biosmap->addr;
-               unsigned long size = biosmap->size;
-               unsigned long end = start + size;
-               unsigned long type = biosmap->type;
-
-               /* Overflow in 64 bits? Ignore the memory map. */
-               if (start > end)
-                       return -1;
-
-#ifndef CONFIG_XEN
-               /*
-                * Some BIOSes claim RAM in the 640k - 1M region.
-                * Not right. Fix it up.
-                * 
-                * This should be removed on Hammer which is supposed to not
-                * have non e820 covered ISA mappings there, but I had some strange
-                * problems so it stays for now.  -AK
-                */
-               if (type == E820_RAM) {
-                       if (start < 0x100000ULL && end > 0xA0000ULL) {
-                               if (start < 0xA0000ULL)
-                                       add_memory_region(start, 0xA0000ULL-start, type);
-                               if (end <= 0x100000ULL)
-                                       continue;
-                               start = 0x100000ULL;
-                               size = end - start;
-                       }
-               }
-#endif
-
-               add_memory_region(start, size, type);
-       } while (biosmap++,--nr_map);
-       return 0;
-}
-
-#ifndef CONFIG_XEN
-void __init setup_memory_region(void)
-{
-       char *who = "BIOS-e820";
-
-       /*
-        * Try to copy the BIOS-supplied E820-map.
-        *
-        * Otherwise fake a memory map; one section from 0k->640k,
-        * the next section from 1mb->appropriate_mem_k
-        */
-       sanitize_e820_map(E820_MAP, &E820_MAP_NR);
-       if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
-               unsigned long mem_size;
-
-               /* compare results from other methods and take the greater */
-               if (ALT_MEM_K < EXT_MEM_K) {
-                       mem_size = EXT_MEM_K;
-                       who = "BIOS-88";
-               } else {
-                       mem_size = ALT_MEM_K;
-                       who = "BIOS-e801";
-               }
-
-               e820.nr_map = 0;
-               add_memory_region(0, LOWMEMSIZE(), E820_RAM);
-               add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-       }
-       printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-       e820_print_map(who);
-}
-
-#else  /* CONFIG_XEN */
-
-void __init setup_memory_region(void)
-{
-       int rc;
-       struct xen_memory_map memmap;
-       /*
-        * This is rather large for a stack variable but this early in
-        * the boot process we know we have plenty slack space.
-        */
-       struct e820entry map[E820MAX];
-
-       memmap.nr_entries = E820MAX;
-       set_xen_guest_handle(memmap.buffer, map);
-
-       rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
-       if ( rc == -ENOSYS ) {
-               memmap.nr_entries = 1;
-               map[0].addr = 0ULL;
-               map[0].size = xen_start_info->nr_pages << PAGE_SHIFT;
-               /* 8MB slack (to balance backend allocations). */
-               map[0].size += 8 << 20;
-               map[0].type = E820_RAM;
-               rc = 0;
-       }
-       BUG_ON(rc);
-
-       sanitize_e820_map(map, (char *)&memmap.nr_entries);
-
-       BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
-
-       printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-       e820_print_map("Xen");
-}
-#endif
-
-void __init parse_memopt(char *p, char **from) 
-{ 
-       int i;
-       unsigned long current_end;
-       unsigned long end;
-
-       end_user_pfn = memparse(p, from);
-       end_user_pfn >>= PAGE_SHIFT;    
-
-       end = end_user_pfn<<PAGE_SHIFT;
-       i = e820.nr_map-1;
-       current_end = e820.map[i].addr + e820.map[i].size;
-
-       if (current_end < end) {
-               /*
-                 * The e820 map ends before our requested size so
-                 * extend the final entry to the requested address.
-                 */
-               if (e820.map[i].type == E820_RAM)
-                       e820.map[i].size = end - e820.map[i].addr;
-               else
-                       add_memory_region(current_end, end - current_end, E820_RAM);
-       }
-} 
-
-void __init parse_memmapopt(char *p, char **from)
-{
-       unsigned long long start_at, mem_size;
-
-       mem_size = memparse(p, from);
-       p = *from;
-       if (*p == '@') {
-               start_at = memparse(p+1, from);
-               add_memory_region(start_at, mem_size, E820_RAM);
-       } else if (*p == '#') {
-               start_at = memparse(p+1, from);
-               add_memory_region(start_at, mem_size, E820_ACPI);
-       } else if (*p == '$') {
-               start_at = memparse(p+1, from);
-               add_memory_region(start_at, mem_size, E820_RESERVED);
-       } else {
-               end_user_pfn = (mem_size >> PAGE_SHIFT);
-       }
-       p = *from;
-}
-
-unsigned long pci_mem_start = 0xaeedbabe;
-EXPORT_SYMBOL(pci_mem_start);
-
-/*
- * Search for the biggest gap in the low 32 bits of the e820
- * memory space.  We pass this space to PCI to assign MMIO resources
- * for hotplug or unconfigured devices in.
- * Hopefully the BIOS let enough space left.
- */
-__init void e820_setup_gap(struct e820entry *e820, int nr_map)
-{
-       unsigned long gapstart, gapsize, round;
-       unsigned long last;
-       int i;
-       int found = 0;
-
-       last = 0x100000000ull;
-       gapstart = 0x10000000;
-       gapsize = 0x400000;
-       i = nr_map;
-       while (--i >= 0) {
-               unsigned long long start = e820[i].addr;
-               unsigned long long end = start + e820[i].size;
-
-               /*
-                * Since "last" is at most 4GB, we know we'll
-                * fit in 32 bits if this condition is true
-                */
-               if (last > end) {
-                       unsigned long gap = last - end;
-
-                       if (gap > gapsize) {
-                               gapsize = gap;
-                               gapstart = end;
-                               found = 1;
-                       }
-               }
-               if (start < last)
-                       last = start;
-       }
-
-       if (!found) {
-               gapstart = (end_pfn << PAGE_SHIFT) + 1024*1024;
-               printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit address range\n"
-                      KERN_ERR "PCI: Unassigned devices with 32bit resource registers may break!\n");
-       }
-
-       /*
-        * See how much we want to round up: start off with
-        * rounding to the next 1MB area.
-        */
-       round = 0x100000;
-       while ((gapsize >> 4) > round)
-               round += round;
-       /* Fun with two's complement */
-       pci_mem_start = (gapstart + round) & -round;
-
-       printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
-               pci_mem_start, gapstart, gapsize);
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/early_printk-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/early_printk-xen.c
deleted file mode 100644 (file)
index 090f670..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-#include <linux/console.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/string.h>
-#include <linux/screen_info.h>
-#include <asm/io.h>
-#include <asm/processor.h>
-#include <asm/fcntl.h>
-
-/* Simple VGA output */
-
-#ifdef __i386__
-#include <asm/setup.h>
-#define VGABASE                (__ISA_IO_base + 0xb8000)
-#else
-#include <asm/bootsetup.h>
-#define VGABASE                ((void __iomem *)0xffffffff800b8000UL)
-#endif
-
-#ifndef CONFIG_XEN
-static int max_ypos = 25, max_xpos = 80;
-static int current_ypos = 25, current_xpos = 0; 
-
-static void early_vga_write(struct console *con, const char *str, unsigned n)
-{
-       char c;
-       int  i, k, j;
-
-       while ((c = *str++) != '\0' && n-- > 0) {
-               if (current_ypos >= max_ypos) {
-                       /* scroll 1 line up */
-                       for (k = 1, j = 0; k < max_ypos; k++, j++) {
-                               for (i = 0; i < max_xpos; i++) {
-                                       writew(readw(VGABASE+2*(max_xpos*k+i)),
-                                              VGABASE + 2*(max_xpos*j + i));
-                               }
-                       }
-                       for (i = 0; i < max_xpos; i++)
-                               writew(0x720, VGABASE + 2*(max_xpos*j + i));
-                       current_ypos = max_ypos-1;
-               }
-               if (c == '\n') {
-                       current_xpos = 0;
-                       current_ypos++;
-               } else if (c != '\r')  {
-                       writew(((0x7 << 8) | (unsigned short) c),
-                              VGABASE + 2*(max_xpos*current_ypos +
-                                               current_xpos++));
-                       if (current_xpos >= max_xpos) {
-                               current_xpos = 0;
-                               current_ypos++;
-                       }
-               }
-       }
-}
-
-static struct console early_vga_console = {
-       .name =         "earlyvga",
-       .write =        early_vga_write,
-       .flags =        CON_PRINTBUFFER,
-       .index =        -1,
-};
-
-/* Serial functions loosely based on a similar package from Klaus P. Gerlicher */
-
-static int early_serial_base = 0x3f8;  /* ttyS0 */
-
-#define XMTRDY          0x20
-
-#define DLAB           0x80
-
-#define TXR             0       /*  Transmit register (WRITE) */
-#define RXR             0       /*  Receive register  (READ)  */
-#define IER             1       /*  Interrupt Enable          */
-#define IIR             2       /*  Interrupt ID              */
-#define FCR             2       /*  FIFO control              */
-#define LCR             3       /*  Line control              */
-#define MCR             4       /*  Modem control             */
-#define LSR             5       /*  Line Status               */
-#define MSR             6       /*  Modem Status              */
-#define DLL             0       /*  Divisor Latch Low         */
-#define DLH             1       /*  Divisor latch High        */
-
-static int early_serial_putc(unsigned char ch)
-{
-       unsigned timeout = 0xffff;
-       while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout)
-               cpu_relax();
-       outb(ch, early_serial_base + TXR);
-       return timeout ? 0 : -1;
-}
-
-static void early_serial_write(struct console *con, const char *s, unsigned n)
-{
-       while (*s && n-- > 0) {
-               early_serial_putc(*s);
-               if (*s == '\n')
-                       early_serial_putc('\r');
-               s++;
-       }
-}
-
-#define DEFAULT_BAUD 9600
-
-static __init void early_serial_init(char *s)
-{
-       unsigned char c;
-       unsigned divisor;
-       unsigned baud = DEFAULT_BAUD;
-       char *e;
-
-       if (*s == ',')
-               ++s;
-
-       if (*s) {
-               unsigned port;
-               if (!strncmp(s,"0x",2)) {
-                       early_serial_base = simple_strtoul(s, &e, 16);
-               } else {
-                       static int bases[] = { 0x3f8, 0x2f8 };
-
-                       if (!strncmp(s,"ttyS",4))
-                               s += 4;
-                       port = simple_strtoul(s, &e, 10);
-                       if (port > 1 || s == e)
-                               port = 0;
-                       early_serial_base = bases[port];
-               }
-               s += strcspn(s, ",");
-               if (*s == ',')
-                       s++;
-       }
-
-       outb(0x3, early_serial_base + LCR);     /* 8n1 */
-       outb(0, early_serial_base + IER);       /* no interrupt */
-       outb(0, early_serial_base + FCR);       /* no fifo */
-       outb(0x3, early_serial_base + MCR);     /* DTR + RTS */
-
-       if (*s) {
-               baud = simple_strtoul(s, &e, 0);
-               if (baud == 0 || s == e)
-                       baud = DEFAULT_BAUD;
-       }
-
-       divisor = 115200 / baud;
-       c = inb(early_serial_base + LCR);
-       outb(c | DLAB, early_serial_base + LCR);
-       outb(divisor & 0xff, early_serial_base + DLL);
-       outb((divisor >> 8) & 0xff, early_serial_base + DLH);
-       outb(c & ~DLAB, early_serial_base + LCR);
-}
-
-#else /* CONFIG_XEN */
-
-static void
-early_serial_write(struct console *con, const char *s, unsigned count)
-{
-       int n;
-
-       while (count > 0) {
-               n = HYPERVISOR_console_io(CONSOLEIO_write, count, (char *)s);
-               if (n <= 0)
-                       break;
-               count -= n;
-               s += n;
-       }
-} 
-
-static __init void early_serial_init(char *s)
-{
-}
-
-/*
- * No early VGA console on Xen, as we do not have convenient ISA-space
- * mappings. Someone should fix this for domain 0. For now, use fake serial.
- */
-#define early_vga_console early_serial_console
-
-#endif
-
-static struct console early_serial_console = {
-       .name =         "earlyser",
-       .write =        early_serial_write,
-       .flags =        CON_PRINTBUFFER,
-       .index =        -1,
-};
-
-/* Console interface to a host file on AMD's SimNow! */
-
-static int simnow_fd;
-
-enum {
-       MAGIC1 = 0xBACCD00A,
-       MAGIC2 = 0xCA110000,
-       XOPEN = 5,
-       XWRITE = 4,
-};
-
-static noinline long simnow(long cmd, long a, long b, long c)
-{
-       long ret;
-       asm volatile("cpuid" :
-                    "=a" (ret) :
-                    "b" (a), "c" (b), "d" (c), "0" (MAGIC1), "D" (cmd + MAGIC2));
-       return ret;
-}
-
-void __init simnow_init(char *str)
-{
-       char *fn = "klog";
-       if (*str == '=')
-               fn = ++str;
-       /* error ignored */
-       simnow_fd = simnow(XOPEN, (unsigned long)fn, O_WRONLY|O_APPEND|O_CREAT, 0644);
-}
-
-static void simnow_write(struct console *con, const char *s, unsigned n)
-{
-       simnow(XWRITE, simnow_fd, (unsigned long)s, n);
-}
-
-static struct console simnow_console = {
-       .name =         "simnow",
-       .write =        simnow_write,
-       .flags =        CON_PRINTBUFFER,
-       .index =        -1,
-};
-
-/* Direct interface for emergencies */
-struct console *early_console = &early_vga_console;
-static int early_console_initialized = 0;
-
-void early_printk(const char *fmt, ...)
-{
-       char buf[512];
-       int n;
-       va_list ap;
-
-       va_start(ap,fmt);
-       n = vscnprintf(buf,512,fmt,ap);
-       early_console->write(early_console,buf,n);
-       va_end(ap);
-}
-
-static int __initdata keep_early;
-
-int __init setup_early_printk(char *opt)
-{
-       char *space;
-       char buf[256];
-
-       if (early_console_initialized)
-               return 1;
-
-       strlcpy(buf,opt,sizeof(buf));
-       space = strchr(buf, ' ');
-       if (space)
-               *space = 0;
-
-       if (strstr(buf,"keep"))
-               keep_early = 1;
-
-       if (!strncmp(buf, "serial", 6)) {
-               early_serial_init(buf + 6);
-               early_console = &early_serial_console;
-       } else if (!strncmp(buf, "ttyS", 4)) {
-               early_serial_init(buf);
-               early_console = &early_serial_console;
-       } else if (!strncmp(buf, "vga", 3)
-#ifndef CONFIG_XEN
-                  && SCREEN_INFO.orig_video_isVGA == 1) {
-               max_xpos = SCREEN_INFO.orig_video_cols;
-               max_ypos = SCREEN_INFO.orig_video_lines;
-               current_ypos = SCREEN_INFO.orig_y;
-#else
-                  || !strncmp(buf, "xen", 3)) {
-#endif
-               early_console = &early_vga_console;
-       } else if (!strncmp(buf, "simnow", 6)) {
-               simnow_init(buf + 6);
-               early_console = &simnow_console;
-               keep_early = 1;
-       }
-       early_console_initialized = 1;
-       register_console(early_console);
-       return 0;
-}
-
-void __init disable_early_printk(void)
-{
-       if (!early_console_initialized || !early_console)
-               return;
-       if (!keep_early) {
-               printk("disabling early console\n");
-               unregister_console(early_console);
-               early_console_initialized = 0;
-       } else {
-               printk("keeping early console\n");
-       }
-}
-
-__setup("earlyprintk=", setup_early_printk);
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
deleted file mode 100644 (file)
index f9e16e3..0000000
+++ /dev/null
@@ -1,1325 +0,0 @@
-/*
- *  linux/arch/x86_64/entry.S
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *  Copyright (C) 2000, 2001, 2002  Andi Kleen SuSE Labs
- *  Copyright (C) 2000  Pavel Machek <pavel@suse.cz>
- * 
- *  $Id$
- *
- *  Jun Nakajima <jun.nakajima@intel.com>
- *  Asit Mallick <asit.k.mallick@intel.com>
- *      Modified for Xen
- */
-
-/*
- * entry.S contains the system-call and fault low-level handling routines.
- *
- * NOTE: This code handles signal-recognition, which happens every time
- * after an interrupt and after each system call.
- * 
- * Normal syscalls and interrupts don't save a full stack frame, this is 
- * only done for syscall tracing, signals or fork/exec et.al.
- * 
- * A note on terminology:       
- * - top of stack: Architecture defined interrupt frame from SS to RIP 
- * at the top of the kernel process stack.     
- * - partial stack frame: partially saved registers upto R11.
- * - full stack frame: Like partial stack frame, but all register saved. 
- *     
- * TODO:        
- * - schedule it carefully for the final hardware.
- */
-
-#define ASSEMBLY 1
-#include <linux/linkage.h>
-#include <asm/segment.h>
-#include <asm/smp.h>
-#include <asm/cache.h>
-#include <asm/errno.h>
-#include <asm/dwarf2.h>
-#include <asm/calling.h>
-#include <asm/asm-offsets.h>
-#include <asm/msr.h>
-#include <asm/unistd.h>
-#include <asm/thread_info.h>
-#include <asm/hw_irq.h>
-#include <asm/page.h>
-#include <asm/irqflags.h>
-#include <asm/errno.h>
-#include <xen/interface/arch-x86_64.h>
-#include <xen/interface/features.h>
-
-#include "irq_vectors.h"
-
-#include "xen_entry.S"
-       
-       .code64
-
-#ifndef CONFIG_PREEMPT
-#define retint_kernel retint_restore_args
-#endif 
-
-
-.macro TRACE_IRQS_IRETQ offset=ARGOFFSET
-#ifdef CONFIG_TRACE_IRQFLAGS
-       bt   $9,EFLAGS-\offset(%rsp)    /* interrupts off? */
-       jnc  1f
-       TRACE_IRQS_ON
-1:
-#endif
-.endm
-
-NMI_MASK = 0x80000000
-       
-/*
- * C code is not supposed to know about undefined top of stack. Every time 
- * a C function with an pt_regs argument is called from the SYSCALL based 
- * fast path FIXUP_TOP_OF_STACK is needed.
- * RESTORE_TOP_OF_STACK syncs the syscall state after any possible ptregs
- * manipulation.
- */            
-               
-       /* %rsp:at FRAMEEND */ 
-       .macro FIXUP_TOP_OF_STACK tmp
-       movq    $__USER_CS,CS(%rsp)
-       movq    $-1,RCX(%rsp)
-       .endm
-
-       .macro RESTORE_TOP_OF_STACK tmp,offset=0
-       .endm
-
-       .macro FAKE_STACK_FRAME child_rip
-       /* push in order ss, rsp, eflags, cs, rip */
-       xorl %eax, %eax
-       pushq %rax /* ss */
-       CFI_ADJUST_CFA_OFFSET   8
-       /*CFI_REL_OFFSET        ss,0*/
-       pushq %rax /* rsp */
-       CFI_ADJUST_CFA_OFFSET   8
-       CFI_REL_OFFSET  rsp,0
-       pushq $(1<<9) /* eflags - interrupts on */
-       CFI_ADJUST_CFA_OFFSET   8
-       /*CFI_REL_OFFSET        rflags,0*/
-       pushq $__KERNEL_CS /* cs */
-       CFI_ADJUST_CFA_OFFSET   8
-       /*CFI_REL_OFFSET        cs,0*/
-       pushq \child_rip /* rip */
-       CFI_ADJUST_CFA_OFFSET   8
-       CFI_REL_OFFSET  rip,0
-       pushq   %rax /* orig rax */
-       CFI_ADJUST_CFA_OFFSET   8
-       .endm
-
-       .macro UNFAKE_STACK_FRAME
-       addq $8*6, %rsp
-       CFI_ADJUST_CFA_OFFSET   -(6*8)
-       .endm
-
-       .macro  CFI_DEFAULT_STACK start=1,adj=0
-       .if \start
-       CFI_STARTPROC   simple
-       CFI_DEF_CFA     rsp,SS+8-(\adj*ARGOFFSET)
-       .else
-       CFI_DEF_CFA_OFFSET SS+8-(\adj*ARGOFFSET)
-       .endif
-       .if \adj == 0
-       CFI_REL_OFFSET  r15,R15
-       CFI_REL_OFFSET  r14,R14
-       CFI_REL_OFFSET  r13,R13
-       CFI_REL_OFFSET  r12,R12
-       CFI_REL_OFFSET  rbp,RBP
-       CFI_REL_OFFSET  rbx,RBX
-       .endif
-       CFI_REL_OFFSET  r11,R11
-       CFI_REL_OFFSET  r10,R10
-       CFI_REL_OFFSET  r9,R9
-       CFI_REL_OFFSET  r8,R8
-       CFI_REL_OFFSET  rax,RAX
-       CFI_REL_OFFSET  rcx,RCX
-       CFI_REL_OFFSET  rdx,RDX
-       CFI_REL_OFFSET  rsi,RSI
-       CFI_REL_OFFSET  rdi,RDI
-       CFI_REL_OFFSET  rip,RIP
-       /*CFI_REL_OFFSET        cs,CS*/
-       /*CFI_REL_OFFSET        rflags,EFLAGS*/
-       CFI_REL_OFFSET  rsp,RSP
-       /*CFI_REL_OFFSET        ss,SS*/
-       .endm
-
-        /*
-         * Must be consistent with the definition in arch-x86/xen-x86_64.h:
-         *     struct iret_context {
-         *        u64 rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
-         *     };
-         * with rax, r11, and rcx being taken care of in the hypercall stub.
-         */
-       .macro HYPERVISOR_IRET flag
-       testb $3,1*8(%rsp)
-       jnz   2f
-       testl $NMI_MASK,2*8(%rsp)
-       jnz   2f
-
-       cmpb  $0,(xen_features+XENFEAT_supervisor_mode_kernel)(%rip)
-       jne   1f
-
-       /* Direct iret to kernel space. Correct CS and SS. */
-       orl   $3,1*8(%rsp)
-       orl   $3,4*8(%rsp)
-1:     iretq
-
-2:     /* Slow iret via hypervisor. */
-       andl  $~NMI_MASK, 2*8(%rsp)
-       pushq $\flag
-       jmp  hypercall_page + (__HYPERVISOR_iret * 32)
-       .endm
-
-/*
- * A newly forked process directly context switches into this.
- */    
-/* rdi:        prev */ 
-ENTRY(ret_from_fork)
-       CFI_DEFAULT_STACK
-       call schedule_tail
-       GET_THREAD_INFO(%rcx)
-       testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx)
-       jnz rff_trace
-rff_action:    
-       RESTORE_REST
-       testl $3,CS-ARGOFFSET(%rsp)     # from kernel_thread?
-       je   int_ret_from_sys_call
-       testl $_TIF_IA32,threadinfo_flags(%rcx)
-       jnz  int_ret_from_sys_call
-       RESTORE_TOP_OF_STACK %rdi,ARGOFFSET
-       jmp ret_from_sys_call
-rff_trace:
-       movq %rsp,%rdi
-       call syscall_trace_leave
-       GET_THREAD_INFO(%rcx)   
-       jmp rff_action
-       CFI_ENDPROC
-END(ret_from_fork)
-
-/*
- * initial frame state for interrupts and exceptions
- */
-       .macro _frame ref
-       CFI_STARTPROC simple
-       CFI_DEF_CFA rsp,SS+8-\ref
-       /*CFI_REL_OFFSET ss,SS-\ref*/
-       CFI_REL_OFFSET rsp,RSP-\ref
-       /*CFI_REL_OFFSET rflags,EFLAGS-\ref*/
-       /*CFI_REL_OFFSET cs,CS-\ref*/
-       CFI_REL_OFFSET rip,RIP-\ref
-       .endm
-
-/*
- * System call entry. Upto 6 arguments in registers are supported.
- *
- * SYSCALL does not save anything on the stack and does not change the
- * stack pointer.
- */
-               
-/*
- * Register setup:     
- * rax  system call number
- * rdi  arg0
- * rcx  return address for syscall/sysret, C arg3 
- * rsi  arg1
- * rdx  arg2   
- * r10  arg3   (--> moved to rcx for C)
- * r8   arg4
- * r9   arg5
- * r11  eflags for syscall/sysret, temporary for C
- * r12-r15,rbp,rbx saved by C code, not touched.               
- * 
- * Interrupts are off on entry.
- * Only called from user space.
- *
- * XXX if we had a free scratch register we could save the RSP into the stack frame
- *      and report it properly in ps. Unfortunately we haven't.
- *
- * When user can change the frames always force IRET. That is because
- * it deals with uncanonical addresses better. SYSRET has trouble
- * with them due to bugs in both AMD and Intel CPUs.
- */                                    
-
-ENTRY(system_call)
-       _frame (RIP-0x10)
-       SAVE_ARGS -8,0
-       movq  %rax,ORIG_RAX-ARGOFFSET(%rsp) 
-       /*
-        * No need to follow this irqs off/on section - it's straight
-        * and short:
-        */
-        XEN_UNBLOCK_EVENTS(%r11)        
-       GET_THREAD_INFO(%rcx)
-       testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx)
-       CFI_REMEMBER_STATE
-       jnz tracesys
-       cmpq $__NR_syscall_max,%rax
-       ja badsys
-       movq %r10,%rcx
-       call *sys_call_table(,%rax,8)  # XXX:    rip relative
-       movq %rax,RAX-ARGOFFSET(%rsp)
-/*
- * Syscall return path ending with SYSRET (fast path)
- * Has incomplete stack frame and undefined top of stack. 
- */            
-       .globl ret_from_sys_call
-ret_from_sys_call:
-       movl $_TIF_ALLWORK_MASK,%edi
-       /* edi: flagmask */
-sysret_check:          
-       GET_THREAD_INFO(%rcx)
-        XEN_BLOCK_EVENTS(%rsi)        
-       TRACE_IRQS_OFF
-       movl threadinfo_flags(%rcx),%edx
-       andl %edi,%edx
-       CFI_REMEMBER_STATE
-       jnz  sysret_careful 
-       /*
-        * sysretq will re-enable interrupts:
-        */
-       TRACE_IRQS_ON
-        XEN_UNBLOCK_EVENTS(%rsi)                
-       RESTORE_ARGS 0,8,0
-        HYPERVISOR_IRET VGCF_IN_SYSCALL
-
-       /* Handle reschedules */
-       /* edx: work, edi: workmask */  
-sysret_careful:
-       CFI_RESTORE_STATE
-       bt $TIF_NEED_RESCHED,%edx
-       jnc sysret_signal
-       TRACE_IRQS_ON
-       XEN_UNBLOCK_EVENTS(%rsi)
-       pushq %rdi
-       CFI_ADJUST_CFA_OFFSET 8
-       call schedule
-       popq  %rdi
-       CFI_ADJUST_CFA_OFFSET -8
-       jmp sysret_check
-
-       /* Handle a signal */ 
-sysret_signal:
-       TRACE_IRQS_ON
-/*     sti */
-        XEN_UNBLOCK_EVENTS(%rsi)        
-       testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
-       jz    1f
-
-       /* Really a signal */
-       /* edx: work flags (arg3) */
-       leaq do_notify_resume(%rip),%rax
-       leaq -ARGOFFSET(%rsp),%rdi # &pt_regs -> arg1
-       xorl %esi,%esi # oldset -> arg2
-       call ptregscall_common
-1:     movl $_TIF_NEED_RESCHED,%edi
-       /* Use IRET because user could have changed frame. This
-          works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
-       XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-       jmp int_with_check
-       
-badsys:
-       movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-       jmp ret_from_sys_call
-
-       /* Do syscall tracing */
-tracesys:                       
-       CFI_RESTORE_STATE
-       SAVE_REST
-       movq $-ENOSYS,RAX(%rsp)
-       FIXUP_TOP_OF_STACK %rdi
-       movq %rsp,%rdi
-       call syscall_trace_enter
-       LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
-       RESTORE_REST
-       cmpq $__NR_syscall_max,%rax
-       ja  1f
-       movq %r10,%rcx  /* fixup for C */
-       call *sys_call_table(,%rax,8)
-1:     movq %rax,RAX-ARGOFFSET(%rsp)
-       /* Use IRET because user could have changed frame */
-       jmp int_ret_from_sys_call
-       CFI_ENDPROC
-END(system_call)
-               
-/* 
- * Syscall return path ending with IRET.
- * Has correct top of stack, but partial stack frame.
- */    
-ENTRY(int_ret_from_sys_call)
-       CFI_STARTPROC   simple
-       CFI_DEF_CFA     rsp,SS+8-ARGOFFSET
-       /*CFI_REL_OFFSET        ss,SS-ARGOFFSET*/
-       CFI_REL_OFFSET  rsp,RSP-ARGOFFSET
-       /*CFI_REL_OFFSET        rflags,EFLAGS-ARGOFFSET*/
-       /*CFI_REL_OFFSET        cs,CS-ARGOFFSET*/
-       CFI_REL_OFFSET  rip,RIP-ARGOFFSET
-       CFI_REL_OFFSET  rdx,RDX-ARGOFFSET
-       CFI_REL_OFFSET  rcx,RCX-ARGOFFSET
-       CFI_REL_OFFSET  rax,RAX-ARGOFFSET
-       CFI_REL_OFFSET  rdi,RDI-ARGOFFSET
-       CFI_REL_OFFSET  rsi,RSI-ARGOFFSET
-       CFI_REL_OFFSET  r8,R8-ARGOFFSET
-       CFI_REL_OFFSET  r9,R9-ARGOFFSET
-       CFI_REL_OFFSET  r10,R10-ARGOFFSET
-       CFI_REL_OFFSET  r11,R11-ARGOFFSET
-        XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-       testb $3,CS-ARGOFFSET(%rsp)
-        jnz 1f
-        /* Need to set the proper %ss (not NULL) for ring 3 iretq */
-        movl $__KERNEL_DS,SS-ARGOFFSET(%rsp)
-        jmp retint_restore_args   # retrun from ring3 kernel
-1:              
-       movl $_TIF_ALLWORK_MASK,%edi
-       /* edi: mask to check */
-int_with_check:
-       GET_THREAD_INFO(%rcx)
-       movl threadinfo_flags(%rcx),%edx
-       andl %edi,%edx
-       jnz   int_careful
-       andl    $~TS_COMPAT,threadinfo_status(%rcx)
-       jmp   retint_restore_args
-
-       /* Either reschedule or signal or syscall exit tracking needed. */
-       /* First do a reschedule test. */
-       /* edx: work, edi: workmask */
-int_careful:
-       bt $TIF_NEED_RESCHED,%edx
-       jnc  int_very_careful
-       TRACE_IRQS_ON
-/*     sti */
-        XEN_UNBLOCK_EVENTS(%rsi)
-       pushq %rdi
-       CFI_ADJUST_CFA_OFFSET 8
-       call schedule
-       popq %rdi
-       CFI_ADJUST_CFA_OFFSET -8
-       XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-       jmp int_with_check
-
-       /* handle signals and tracing -- both require a full stack frame */
-int_very_careful:
-       TRACE_IRQS_ON
-/*     sti */
-        XEN_UNBLOCK_EVENTS(%rsi)
-       SAVE_REST
-       /* Check for syscall exit trace */      
-       testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edx
-       jz int_signal
-       pushq %rdi
-       CFI_ADJUST_CFA_OFFSET 8
-       leaq 8(%rsp),%rdi       # &ptregs -> arg1       
-       call syscall_trace_leave
-       popq %rdi
-       CFI_ADJUST_CFA_OFFSET -8
-       andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi
-       XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-       jmp int_restore_rest
-       
-int_signal:
-       testl $(_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_SINGLESTEP),%edx
-       jz 1f
-       movq %rsp,%rdi          # &ptregs -> arg1
-       xorl %esi,%esi          # oldset -> arg2
-       call do_notify_resume
-1:     movl $_TIF_NEED_RESCHED,%edi    
-int_restore_rest:
-       RESTORE_REST
-       XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-       jmp int_with_check
-       CFI_ENDPROC
-END(int_ret_from_sys_call)
-               
-/* 
- * Certain special system calls that need to save a complete full stack frame.
- */                                                            
-       
-       .macro PTREGSCALL label,func,arg
-       .globl \label
-\label:
-       leaq    \func(%rip),%rax
-       leaq    -ARGOFFSET+8(%rsp),\arg /* 8 for return address */
-       jmp     ptregscall_common
-END(\label)
-       .endm
-
-       CFI_STARTPROC
-
-       PTREGSCALL stub_clone, sys_clone, %r8
-       PTREGSCALL stub_fork, sys_fork, %rdi
-       PTREGSCALL stub_vfork, sys_vfork, %rdi
-       PTREGSCALL stub_rt_sigsuspend, sys_rt_sigsuspend, %rdx
-       PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx
-       PTREGSCALL stub_iopl, sys_iopl, %rsi
-
-ENTRY(ptregscall_common)
-       popq %r11
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_REGISTER rip, r11
-       SAVE_REST
-       movq %r11, %r15
-       CFI_REGISTER rip, r15
-       FIXUP_TOP_OF_STACK %r11
-       call *%rax
-       RESTORE_TOP_OF_STACK %r11
-       movq %r15, %r11
-       CFI_REGISTER rip, r11
-       RESTORE_REST
-       pushq %r11
-       CFI_ADJUST_CFA_OFFSET 8
-       CFI_REL_OFFSET rip, 0
-       ret
-       CFI_ENDPROC
-END(ptregscall_common)
-       
-ENTRY(stub_execve)
-       CFI_STARTPROC
-       popq %r11
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_REGISTER rip, r11
-       SAVE_REST
-       FIXUP_TOP_OF_STACK %r11
-       call sys_execve
-       RESTORE_TOP_OF_STACK %r11
-       movq %rax,RAX(%rsp)
-       RESTORE_REST
-       jmp int_ret_from_sys_call
-       CFI_ENDPROC
-END(stub_execve)
-       
-/*
- * sigreturn is special because it needs to restore all registers on return.
- * This cannot be done with SYSRET, so use the IRET return path instead.
- */                
-ENTRY(stub_rt_sigreturn)
-       CFI_STARTPROC
-       addq $8, %rsp
-       CFI_ADJUST_CFA_OFFSET   -8
-       SAVE_REST
-       movq %rsp,%rdi
-       FIXUP_TOP_OF_STACK %r11
-       call sys_rt_sigreturn
-       movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer
-       RESTORE_REST
-       jmp int_ret_from_sys_call
-       CFI_ENDPROC
-END(stub_rt_sigreturn)
-
-/* initial frame state for interrupts (and exceptions without error code) */
-#define INTR_FRAME _frame (RIP-0x10); \
-       CFI_REL_OFFSET rcx,0; \
-       CFI_REL_OFFSET r11,8
-
-/* initial frame state for exceptions with error code (and interrupts with
-   vector already pushed) */
-#define XCPT_FRAME _frame (RIP-0x18); \
-       CFI_REL_OFFSET rcx,0; \
-       CFI_REL_OFFSET r11,8
-
-/* 
- * Interrupt exit.
- *
- */ 
-
-retint_check:
-       CFI_DEFAULT_STACK adj=1
-       movl threadinfo_flags(%rcx),%edx
-       andl %edi,%edx
-       CFI_REMEMBER_STATE
-       jnz  retint_careful
-retint_restore_args:
-       movl EFLAGS-REST_SKIP(%rsp), %eax
-       shr $9, %eax                    # EAX[0] == IRET_EFLAGS.IF
-       XEN_GET_VCPU_INFO(%rsi)
-       andb evtchn_upcall_mask(%rsi),%al
-       andb $1,%al                     # EAX[0] == IRET_EFLAGS.IF & event_mask
-       jnz restore_all_enable_events   #        != 0 => enable event delivery
-       XEN_PUT_VCPU_INFO(%rsi)
-               
-       RESTORE_ARGS 0,8,0
-       HYPERVISOR_IRET 0
-       
-       /* edi: workmask, edx: work */
-retint_careful:
-       CFI_RESTORE_STATE
-       bt    $TIF_NEED_RESCHED,%edx
-       jnc   retint_signal
-       TRACE_IRQS_ON
-       XEN_UNBLOCK_EVENTS(%rsi)
-/*     sti */        
-       pushq %rdi
-       CFI_ADJUST_CFA_OFFSET   8
-       call  schedule
-       popq %rdi               
-       CFI_ADJUST_CFA_OFFSET   -8
-       GET_THREAD_INFO(%rcx)
-       XEN_BLOCK_EVENTS(%rsi)          
-/*     cli */
-       TRACE_IRQS_OFF
-       jmp retint_check
-       
-retint_signal:
-       testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
-       jz    retint_restore_args
-       TRACE_IRQS_ON
-        XEN_UNBLOCK_EVENTS(%rsi)
-       SAVE_REST
-       movq $-1,ORIG_RAX(%rsp)                         
-       xorl %esi,%esi          # oldset
-       movq %rsp,%rdi          # &pt_regs
-       call do_notify_resume
-       RESTORE_REST
-        XEN_BLOCK_EVENTS(%rsi)         
-       TRACE_IRQS_OFF
-       movl $_TIF_NEED_RESCHED,%edi
-       GET_THREAD_INFO(%rcx)
-       jmp retint_check
-
-#ifdef CONFIG_PREEMPT
-       /* Returning to kernel space. Check if we need preemption */
-       /* rcx:  threadinfo. interrupts off. */
-       .p2align
-retint_kernel: 
-       cmpl $0,threadinfo_preempt_count(%rcx)
-       jnz  retint_restore_args
-       bt  $TIF_NEED_RESCHED,threadinfo_flags(%rcx)
-       jnc  retint_restore_args
-       bt   $9,EFLAGS-ARGOFFSET(%rsp)  /* interrupts off? */
-       jnc  retint_restore_args
-       call preempt_schedule_irq
-       jmp retint_kernel       /* check again */
-#endif 
-
-       CFI_ENDPROC
-END(retint_check)
-       
-#ifndef CONFIG_XEN
-/*
- * APIC interrupts.
- */            
-       .macro apicinterrupt num,func
-       INTR_FRAME
-       pushq $~(\num)
-       CFI_ADJUST_CFA_OFFSET 8
-       interrupt \func
-       jmp error_entry
-       CFI_ENDPROC
-       .endm
-
-ENTRY(thermal_interrupt)
-       apicinterrupt THERMAL_APIC_VECTOR,smp_thermal_interrupt
-END(thermal_interrupt)
-
-ENTRY(threshold_interrupt)
-       apicinterrupt THRESHOLD_APIC_VECTOR,mce_threshold_interrupt
-END(threshold_interrupt)
-
-#ifdef CONFIG_SMP      
-ENTRY(reschedule_interrupt)
-       apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt
-END(reschedule_interrupt)
-
-       .macro INVALIDATE_ENTRY num
-ENTRY(invalidate_interrupt\num)
-       apicinterrupt INVALIDATE_TLB_VECTOR_START+\num,smp_invalidate_interrupt 
-END(invalidate_interrupt\num)
-       .endm
-
-       INVALIDATE_ENTRY 0
-       INVALIDATE_ENTRY 1
-       INVALIDATE_ENTRY 2
-       INVALIDATE_ENTRY 3
-       INVALIDATE_ENTRY 4
-       INVALIDATE_ENTRY 5
-       INVALIDATE_ENTRY 6
-       INVALIDATE_ENTRY 7
-
-ENTRY(call_function_interrupt)
-       apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt
-END(call_function_interrupt)
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC   
-ENTRY(apic_timer_interrupt)
-       apicinterrupt LOCAL_TIMER_VECTOR,smp_apic_timer_interrupt
-END(apic_timer_interrupt)
-
-ENTRY(error_interrupt)
-       apicinterrupt ERROR_APIC_VECTOR,smp_error_interrupt
-END(error_interrupt)
-
-ENTRY(spurious_interrupt)
-       apicinterrupt SPURIOUS_APIC_VECTOR,smp_spurious_interrupt
-END(spurious_interrupt)
-#endif
-#endif /* !CONFIG_XEN */
-                               
-/*
- * Exception entry points.
- */            
-       .macro zeroentry sym
-       INTR_FRAME
-        movq (%rsp),%rcx
-       CFI_RESTORE rcx
-        movq 8(%rsp),%r11
-       CFI_RESTORE r11
-        addq $0x10,%rsp /* skip rcx and r11 */
-       CFI_ADJUST_CFA_OFFSET -0x10
-       pushq $0        /* push error code/oldrax */ 
-       CFI_ADJUST_CFA_OFFSET 8
-       pushq %rax      /* push real oldrax to the rdi slot */ 
-       CFI_ADJUST_CFA_OFFSET 8
-       CFI_REL_OFFSET rax,0
-       leaq  \sym(%rip),%rax
-       jmp error_entry
-       CFI_ENDPROC
-       .endm   
-
-       .macro errorentry sym
-       XCPT_FRAME
-        movq (%rsp),%rcx
-       CFI_RESTORE rcx
-        movq 8(%rsp),%r11
-       CFI_RESTORE r11
-        addq $0x10,%rsp /* rsp points to the error code */
-       CFI_ADJUST_CFA_OFFSET -0x10
-       pushq %rax
-       CFI_ADJUST_CFA_OFFSET 8
-       CFI_REL_OFFSET rax,0
-       leaq  \sym(%rip),%rax
-       jmp error_entry
-       CFI_ENDPROC
-       .endm
-
-#if 0 /* not XEN */
-       /* error code is on the stack already */
-       /* handle NMI like exceptions that can happen everywhere */
-       .macro paranoidentry sym, ist=0, irqtrace=1
-        movq (%rsp),%rcx
-        movq 8(%rsp),%r11
-        addq $0x10,%rsp /* skip rcx and r11 */        
-       SAVE_ALL
-       cld
-#if 0 /* not XEN */
-       movl $1,%ebx
-       movl  $MSR_GS_BASE,%ecx
-       rdmsr
-       testl %edx,%edx
-       js    1f
-       swapgs
-       xorl  %ebx,%ebx
-1:
-#endif
-       .if \ist
-       movq    %gs:pda_data_offset, %rbp
-       .endif
-       movq %rsp,%rdi
-       movq ORIG_RAX(%rsp),%rsi
-       movq $-1,ORIG_RAX(%rsp)
-       .if \ist
-       subq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
-       .endif
-       call \sym
-       .if \ist
-       addq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
-       .endif
-/*     cli */
-       XEN_BLOCK_EVENTS(%rsi)          
-       .if \irqtrace
-       TRACE_IRQS_OFF
-       .endif
-       .endm
-
-       /*
-        * "Paranoid" exit path from exception stack.
-        * Paranoid because this is used by NMIs and cannot take
-        * any kernel state for granted.
-        * We don't do kernel preemption checks here, because only
-        * NMI should be common and it does not enable IRQs and
-        * cannot get reschedule ticks.
-        *
-        * "trace" is 0 for the NMI handler only, because irq-tracing
-        * is fundamentally NMI-unsafe. (we cannot change the soft and
-        * hard flags at once, atomically)
-        */
-       .macro paranoidexit trace=1
-       /* ebx: no swapgs flag */
-paranoid_exit\trace:
-       testl %ebx,%ebx                         /* swapgs needed? */
-       jnz paranoid_restore\trace
-       testl $3,CS(%rsp)
-       jnz   paranoid_userspace\trace
-paranoid_swapgs\trace:
-       TRACE_IRQS_IRETQ 0
-       swapgs
-paranoid_restore\trace:
-       RESTORE_ALL 8
-       iretq
-paranoid_userspace\trace:
-       GET_THREAD_INFO(%rcx)
-       movl threadinfo_flags(%rcx),%ebx
-       andl $_TIF_WORK_MASK,%ebx
-       jz paranoid_swapgs\trace
-       movq %rsp,%rdi                  /* &pt_regs */
-       call sync_regs
-       movq %rax,%rsp                  /* switch stack for scheduling */
-       testl $_TIF_NEED_RESCHED,%ebx
-       jnz paranoid_schedule\trace
-       movl %ebx,%edx                  /* arg3: thread flags */
-       .if \trace
-       TRACE_IRQS_ON
-       .endif
-       sti
-       xorl %esi,%esi                  /* arg2: oldset */
-       movq %rsp,%rdi                  /* arg1: &pt_regs */
-       call do_notify_resume
-       cli
-       .if \trace
-       TRACE_IRQS_OFF
-       .endif
-       jmp paranoid_userspace\trace
-paranoid_schedule\trace:
-       .if \trace
-       TRACE_IRQS_ON
-       .endif
-       sti
-       call schedule
-       cli
-       .if \trace
-       TRACE_IRQS_OFF
-       .endif
-       jmp paranoid_userspace\trace
-       CFI_ENDPROC
-       .endm
-#endif
-
-/*
- * Exception entry point. This expects an error code/orig_rax on the stack
- * and the exception handler in %rax.  
- */                                            
-ENTRY(error_entry)
-       _frame RDI
-       CFI_REL_OFFSET rax,0
-       /* rdi slot contains rax, oldrax contains error code */
-       cld     
-       subq  $14*8,%rsp
-       CFI_ADJUST_CFA_OFFSET   (14*8)
-       movq %rsi,13*8(%rsp)
-       CFI_REL_OFFSET  rsi,RSI
-       movq 14*8(%rsp),%rsi    /* load rax from rdi slot */
-       CFI_REGISTER    rax,rsi
-       movq %rdx,12*8(%rsp)
-       CFI_REL_OFFSET  rdx,RDX
-       movq %rcx,11*8(%rsp)
-       CFI_REL_OFFSET  rcx,RCX
-       movq %rsi,10*8(%rsp)    /* store rax */ 
-       CFI_REL_OFFSET  rax,RAX
-       movq %r8, 9*8(%rsp)
-       CFI_REL_OFFSET  r8,R8
-       movq %r9, 8*8(%rsp)
-       CFI_REL_OFFSET  r9,R9
-       movq %r10,7*8(%rsp)
-       CFI_REL_OFFSET  r10,R10
-       movq %r11,6*8(%rsp)
-       CFI_REL_OFFSET  r11,R11
-       movq %rbx,5*8(%rsp) 
-       CFI_REL_OFFSET  rbx,RBX
-       movq %rbp,4*8(%rsp) 
-       CFI_REL_OFFSET  rbp,RBP
-       movq %r12,3*8(%rsp) 
-       CFI_REL_OFFSET  r12,R12
-       movq %r13,2*8(%rsp) 
-       CFI_REL_OFFSET  r13,R13
-       movq %r14,1*8(%rsp) 
-       CFI_REL_OFFSET  r14,R14
-       movq %r15,(%rsp) 
-       CFI_REL_OFFSET  r15,R15
-#if 0        
-       cmpl $__KERNEL_CS,CS(%rsp)
-       CFI_REMEMBER_STATE
-       je  error_kernelspace
-#endif        
-error_call_handler:
-       movq %rdi, RDI(%rsp)            
-       CFI_REL_OFFSET  rdi,RDI
-       movq %rsp,%rdi
-       movq ORIG_RAX(%rsp),%rsi        # get error code 
-       movq $-1,ORIG_RAX(%rsp)
-       call *%rax
-error_exit:            
-       RESTORE_REST
-/*     cli */
-       XEN_BLOCK_EVENTS(%rsi)          
-       TRACE_IRQS_OFF
-       GET_THREAD_INFO(%rcx)   
-       testb $3,CS-ARGOFFSET(%rsp)
-       jz retint_kernel
-       movl  threadinfo_flags(%rcx),%edx
-       movl  $_TIF_WORK_MASK,%edi      
-       andl  %edi,%edx
-       jnz   retint_careful
-       /*
-        * The iret might restore flags:
-        */
-       TRACE_IRQS_IRETQ
-       jmp   retint_restore_args
-
-#if 0
-         /*
-         * We need to re-write the logic here because we don't do iretq to 
-         * to return to user mode. It's still possible that we get trap/fault
-         * in the kernel (when accessing buffers pointed to by system calls, 
-         * for example).
-         *
-         */           
-       CFI_RESTORE_STATE
-error_kernelspace:
-       incl %ebx
-       /* There are two places in the kernel that can potentially fault with
-          usergs. Handle them here. The exception handlers after
-          iret run with kernel gs again, so don't set the user space flag.
-          B stepping K8s sometimes report an truncated RIP for IRET 
-          exceptions returning to compat mode. Check for these here too. */
-       leaq iret_label(%rip),%rbp
-       cmpq %rbp,RIP(%rsp) 
-       je   error_swapgs
-       movl %ebp,%ebp  /* zero extend */
-       cmpq %rbp,RIP(%rsp) 
-       je   error_swapgs
-       cmpq $gs_change,RIP(%rsp)
-        je   error_swapgs
-       jmp  error_sti
-#endif
-       CFI_ENDPROC
-END(error_entry)
-       
-ENTRY(hypervisor_callback)
-       zeroentry do_hypervisor_callback
-END(hypervisor_callback)
-        
-/*
- * Copied from arch/xen/i386/kernel/entry.S
- */               
-# A note on the "critical region" in our callback handler.
-# We want to avoid stacking callback handlers due to events occurring
-# during handling of the last event. To do this, we keep events disabled
-# until we've done all processing. HOWEVER, we must enable events before
-# popping the stack frame (can't be done atomically) and so it would still
-# be possible to get enough handler activations to overflow the stack.
-# Although unlikely, bugs of that kind are hard to track down, so we'd
-# like to avoid the possibility.
-# So, on entry to the handler we detect whether we interrupted an
-# existing activation in its critical region -- if so, we pop the current
-# activation and restart the handler using the previous one.
-ENTRY(do_hypervisor_callback)   # do_hypervisor_callback(struct *pt_regs)
-       CFI_STARTPROC
-# Since we don't modify %rdi, evtchn_do_upall(struct *pt_regs) will
-# see the correct pointer to the pt_regs
-       movq %rdi, %rsp            # we don't return, adjust the stack frame
-       CFI_ENDPROC
-       CFI_DEFAULT_STACK
-11:    incl %gs:pda_irqcount
-       movq %rsp,%rbp
-       CFI_DEF_CFA_REGISTER rbp
-       cmovzq %gs:pda_irqstackptr,%rsp
-       pushq %rbp                      # backlink for old unwinder
-       call evtchn_do_upcall
-       popq %rsp
-       CFI_DEF_CFA_REGISTER rsp
-       decl %gs:pda_irqcount
-       jmp  error_exit
-       CFI_ENDPROC
-END(do_hypervisor_callback)
-
-#ifdef CONFIG_X86_LOCAL_APIC
-KPROBE_ENTRY(nmi)
-       zeroentry do_nmi_callback
-ENTRY(do_nmi_callback)
-       CFI_STARTPROC
-        addq $8, %rsp
-       CFI_ENDPROC
-       CFI_DEFAULT_STACK
-        call do_nmi
-        orl  $NMI_MASK,EFLAGS(%rsp)
-        RESTORE_REST
-        XEN_BLOCK_EVENTS(%rsi)
-       TRACE_IRQS_OFF
-        GET_THREAD_INFO(%rcx)
-        jmp  retint_restore_args
-       CFI_ENDPROC
-       .previous .text
-END(nmi)
-#endif
-
-        ALIGN
-restore_all_enable_events:  
-       CFI_DEFAULT_STACK adj=1
-       TRACE_IRQS_ON
-       XEN_UNBLOCK_EVENTS(%rsi)        # %rsi is already set up...
-
-scrit: /**** START OF CRITICAL REGION ****/
-       XEN_TEST_PENDING(%rsi)
-       CFI_REMEMBER_STATE
-       jnz  14f                        # process more events if necessary...
-       XEN_PUT_VCPU_INFO(%rsi)
-        RESTORE_ARGS 0,8,0
-        HYPERVISOR_IRET 0
-        
-       CFI_RESTORE_STATE
-14:    XEN_LOCKED_BLOCK_EVENTS(%rsi)
-       XEN_PUT_VCPU_INFO(%rsi)
-       SAVE_REST
-        movq %rsp,%rdi                  # set the argument again
-       jmp  11b
-       CFI_ENDPROC
-ecrit:  /**** END OF CRITICAL REGION ****/
-# At this point, unlike on x86-32, we don't do the fixup to simplify the 
-# code and the stack frame is more complex on x86-64.
-# When the kernel is interrupted in the critical section, the kernel 
-# will do IRET in that case, and everything will be restored at that point, 
-# i.e. it just resumes from the next instruction interrupted with the same context. 
-
-# Hypervisor uses this for application faults while it executes.
-# We get here for two reasons:
-#  1. Fault while reloading DS, ES, FS or GS
-#  2. Fault while executing IRET
-# Category 1 we do not need to fix up as Xen has already reloaded all segment
-# registers that could be reloaded and zeroed the others.
-# Category 2 we fix up by killing the current process. We cannot use the
-# normal Linux return path in this case because if we use the IRET hypercall
-# to pop the stack frame we end up in an infinite loop of failsafe callbacks.
-# We distinguish between categories by comparing each saved segment register
-# with its current contents: any discrepancy means we in category 1.
-ENTRY(failsafe_callback)
-       _frame (RIP-0x30)
-       CFI_REL_OFFSET rcx, 0
-       CFI_REL_OFFSET r11, 8
-       movw %ds,%cx
-       cmpw %cx,0x10(%rsp)
-       CFI_REMEMBER_STATE
-       jne 1f
-       movw %es,%cx
-       cmpw %cx,0x18(%rsp)
-       jne 1f
-       movw %fs,%cx
-       cmpw %cx,0x20(%rsp)
-       jne 1f
-       movw %gs,%cx
-       cmpw %cx,0x28(%rsp)
-       jne 1f
-       /* All segments match their saved values => Category 2 (Bad IRET). */
-       movq (%rsp),%rcx
-       CFI_RESTORE rcx
-       movq 8(%rsp),%r11
-       CFI_RESTORE r11
-       addq $0x30,%rsp
-       CFI_ADJUST_CFA_OFFSET -0x30
-       movq $11,%rdi   /* SIGSEGV */
-       jmp do_exit                     
-       CFI_RESTORE_STATE
-1:     /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
-       movq (%rsp),%rcx
-       CFI_RESTORE rcx
-       movq 8(%rsp),%r11
-       CFI_RESTORE r11
-       addq $0x30,%rsp
-       CFI_ADJUST_CFA_OFFSET -0x30
-       pushq $0
-       CFI_ADJUST_CFA_OFFSET 8
-       SAVE_ALL
-       jmp error_exit
-       CFI_ENDPROC
-#if 0        
-        .section __ex_table,"a"
-        .align 8
-        .quad gs_change,bad_gs
-        .previous
-        .section .fixup,"ax"
-       /* running with kernelgs */
-bad_gs: 
-/*     swapgs          */      /* switch back to user gs */
-       xorl %eax,%eax
-        movl %eax,%gs
-        jmp  2b
-        .previous       
-#endif
-       
-/*
- * Create a kernel thread.
- *
- * C extern interface:
- *     extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
- *
- * asm input arguments:
- *     rdi: fn, rsi: arg, rdx: flags
- */
-ENTRY(kernel_thread)
-       CFI_STARTPROC
-       FAKE_STACK_FRAME $child_rip
-       SAVE_ALL
-
-       # rdi: flags, rsi: usp, rdx: will be &pt_regs
-       movq %rdx,%rdi
-       orq  kernel_thread_flags(%rip),%rdi
-       movq $-1, %rsi
-       movq %rsp, %rdx
-
-       xorl %r8d,%r8d
-       xorl %r9d,%r9d
-       
-       # clone now
-       call do_fork
-       movq %rax,RAX(%rsp)
-       xorl %edi,%edi
-
-       /*
-        * It isn't worth to check for reschedule here,
-        * so internally to the x86_64 port you can rely on kernel_thread()
-        * not to reschedule the child before returning, this avoids the need
-        * of hacks for example to fork off the per-CPU idle tasks.
-         * [Hopefully no generic code relies on the reschedule -AK]    
-        */
-       RESTORE_ALL
-       UNFAKE_STACK_FRAME
-       ret
-       CFI_ENDPROC
-ENDPROC(kernel_thread)
-       
-child_rip:
-       pushq $0                # fake return address
-       CFI_STARTPROC
-       /*
-        * Here we are in the child and the registers are set as they were
-        * at kernel_thread() invocation in the parent.
-        */
-       movq %rdi, %rax
-       movq %rsi, %rdi
-       call *%rax
-       # exit
-       xorl %edi, %edi
-       call do_exit
-       CFI_ENDPROC
-ENDPROC(child_rip)
-
-/*
- * execve(). This function needs to use IRET, not SYSRET, to set up all state properly.
- *
- * C extern interface:
- *      extern long execve(char *name, char **argv, char **envp)
- *
- * asm input arguments:
- *     rdi: name, rsi: argv, rdx: envp
- *
- * We want to fallback into:
- *     extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs regs)
- *
- * do_sys_execve asm fallback arguments:
- *     rdi: name, rsi: argv, rdx: envp, fake frame on the stack
- */
-ENTRY(execve)
-       CFI_STARTPROC
-       FAKE_STACK_FRAME $0
-       SAVE_ALL        
-       call sys_execve
-       movq %rax, RAX(%rsp)    
-       RESTORE_REST
-       testq %rax,%rax
-       jne 1f
-        jmp int_ret_from_sys_call
-1:      RESTORE_ARGS
-       UNFAKE_STACK_FRAME
-       ret
-       CFI_ENDPROC
-ENDPROC(execve)
-
-KPROBE_ENTRY(page_fault)
-       errorentry do_page_fault
-END(page_fault)
-       .previous .text
-
-ENTRY(coprocessor_error)
-       zeroentry do_coprocessor_error
-END(coprocessor_error)
-
-ENTRY(simd_coprocessor_error)
-       zeroentry do_simd_coprocessor_error     
-END(simd_coprocessor_error)
-
-ENTRY(device_not_available)
-       zeroentry math_state_restore
-END(device_not_available)
-
-       /* runs on exception stack */
-KPROBE_ENTRY(debug)
-/*     INTR_FRAME
-       pushq $0
-       CFI_ADJUST_CFA_OFFSET 8 */
-       zeroentry do_debug
-/*     paranoidexit
-       CFI_ENDPROC */
-END(debug)
-       .previous .text
-
-#if 0
-       /* runs on exception stack */   
-KPROBE_ENTRY(nmi)
-       INTR_FRAME
-       pushq $-1
-       CFI_ADJUST_CFA_OFFSET 8
-       paranoidentry do_nmi, 0, 0
-#ifdef CONFIG_TRACE_IRQFLAGS
-       paranoidexit 0
-#else
-       jmp paranoid_exit1
-       CFI_ENDPROC
-#endif
-END(nmi)
-       .previous .text
-#endif        
-
-KPROBE_ENTRY(int3)
-/*     INTR_FRAME
-       pushq $0
-       CFI_ADJUST_CFA_OFFSET 8 */
-       zeroentry do_int3
-/*     jmp paranoid_exit1
-       CFI_ENDPROC */
-END(int3)
-       .previous .text
-
-ENTRY(overflow)
-       zeroentry do_overflow
-END(overflow)
-
-ENTRY(bounds)
-       zeroentry do_bounds
-END(bounds)
-
-ENTRY(invalid_op)
-       zeroentry do_invalid_op 
-END(invalid_op)
-
-ENTRY(coprocessor_segment_overrun)
-       zeroentry do_coprocessor_segment_overrun
-END(coprocessor_segment_overrun)
-
-ENTRY(reserved)
-       zeroentry do_reserved
-END(reserved)
-
-#if 0
-       /* runs on exception stack */
-ENTRY(double_fault)
-       XCPT_FRAME
-       paranoidentry do_double_fault
-       jmp paranoid_exit1
-       CFI_ENDPROC
-END(double_fault)
-#endif
-
-ENTRY(invalid_TSS)
-       errorentry do_invalid_TSS
-END(invalid_TSS)
-
-ENTRY(segment_not_present)
-       errorentry do_segment_not_present
-END(segment_not_present)
-
-       /* runs on exception stack */
-ENTRY(stack_segment)
-/*     XCPT_FRAME
-       paranoidentry do_stack_segment */
-       errorentry do_stack_segment
-/*     jmp paranoid_exit1
-       CFI_ENDPROC */
-END(stack_segment)
-
-KPROBE_ENTRY(general_protection)
-       errorentry do_general_protection
-END(general_protection)
-       .previous .text
-
-ENTRY(alignment_check)
-       errorentry do_alignment_check
-END(alignment_check)
-
-ENTRY(divide_error)
-       zeroentry do_divide_error
-END(divide_error)
-
-ENTRY(spurious_interrupt_bug)
-       zeroentry do_spurious_interrupt_bug
-END(spurious_interrupt_bug)
-
-#ifdef CONFIG_X86_MCE
-       /* runs on exception stack */
-ENTRY(machine_check)
-       INTR_FRAME
-       pushq $0
-       CFI_ADJUST_CFA_OFFSET 8 
-       paranoidentry do_machine_check
-       jmp paranoid_exit1
-       CFI_ENDPROC
-END(machine_check)
-#endif
-
-/* Call softirq on interrupt stack. Interrupts are off. */
-ENTRY(call_softirq)
-       CFI_STARTPROC
-       push %rbp
-       CFI_ADJUST_CFA_OFFSET   8
-       CFI_REL_OFFSET rbp,0
-       mov  %rsp,%rbp
-       CFI_DEF_CFA_REGISTER rbp
-       incl %gs:pda_irqcount
-       cmove %gs:pda_irqstackptr,%rsp
-       push  %rbp                      # backlink for old unwinder
-       call __do_softirq
-       leaveq
-       CFI_DEF_CFA_REGISTER    rsp
-       CFI_ADJUST_CFA_OFFSET   -8
-       decl %gs:pda_irqcount
-       ret
-       CFI_ENDPROC
-ENDPROC(call_softirq)
-
-#ifdef CONFIG_STACK_UNWIND
-ENTRY(arch_unwind_init_running)
-       CFI_STARTPROC
-       movq    %r15, R15(%rdi)
-       movq    %r14, R14(%rdi)
-       xchgq   %rsi, %rdx
-       movq    %r13, R13(%rdi)
-       movq    %r12, R12(%rdi)
-       xorl    %eax, %eax
-       movq    %rbp, RBP(%rdi)
-       movq    %rbx, RBX(%rdi)
-       movq    (%rsp), %rcx
-       movq    %rax, R11(%rdi)
-       movq    %rax, R10(%rdi)
-       movq    %rax, R9(%rdi)
-       movq    %rax, R8(%rdi)
-       movq    %rax, RAX(%rdi)
-       movq    %rax, RCX(%rdi)
-       movq    %rax, RDX(%rdi)
-       movq    %rax, RSI(%rdi)
-       movq    %rax, RDI(%rdi)
-       movq    %rax, ORIG_RAX(%rdi)
-       movq    %rcx, RIP(%rdi)
-       leaq    8(%rsp), %rcx
-       movq    $__KERNEL_CS, CS(%rdi)
-       movq    %rax, EFLAGS(%rdi)
-       movq    %rcx, RSP(%rdi)
-       movq    $__KERNEL_DS, SS(%rdi)
-       jmpq    *%rdx
-       CFI_ENDPROC
-ENDPROC(arch_unwind_init_running)
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/genapic-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/genapic-xen.c
deleted file mode 100644 (file)
index c04ae58..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2004 James Cleverdon, IBM.
- * Subject to the GNU Public License, v.2
- *
- * Generic APIC sub-arch probe layer.
- *
- * Hacked for x86-64 by James Cleverdon from i386 architecture code by
- * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
- * James Cleverdon.
- */
-#include <linux/threads.h>
-#include <linux/cpumask.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/ctype.h>
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include <asm/smp.h>
-#include <asm/ipi.h>
-
-#if defined(CONFIG_ACPI)
-#include <acpi/acpi_bus.h>
-#endif
-
-/* which logical CPU number maps to which CPU (physical APIC ID) */
-u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
-EXPORT_SYMBOL(x86_cpu_to_apicid);
-u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-
-extern struct genapic apic_cluster;
-extern struct genapic apic_flat;
-extern struct genapic apic_physflat;
-
-#ifndef CONFIG_XEN
-struct genapic *genapic = &apic_flat;
-#else
-extern struct genapic apic_xen;
-struct genapic *genapic = &apic_xen;
-#endif
-
-
-/*
- * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode.
- */
-void __init clustered_apic_check(void)
-{
-#ifndef CONFIG_XEN
-       long i;
-       u8 clusters, max_cluster;
-       u8 id;
-       u8 cluster_cnt[NUM_APIC_CLUSTERS];
-       int max_apic = 0;
-
-#if defined(CONFIG_ACPI)
-       /*
-        * Some x86_64 machines use physical APIC mode regardless of how many
-        * procs/clusters are present (x86_64 ES7000 is an example).
-        */
-       if (acpi_fadt.revision > FADT2_REVISION_ID)
-               if (acpi_fadt.force_apic_physical_destination_mode) {
-                       genapic = &apic_cluster;
-                       goto print;
-               }
-#endif
-
-       memset(cluster_cnt, 0, sizeof(cluster_cnt));
-       for (i = 0; i < NR_CPUS; i++) {
-               id = bios_cpu_apicid[i];
-               if (id == BAD_APICID)
-                       continue;
-               if (id > max_apic)
-                       max_apic = id;
-               cluster_cnt[APIC_CLUSTERID(id)]++;
-       }
-
-       /* Don't use clustered mode on AMD platforms. */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
-               genapic = &apic_physflat;
-#ifndef CONFIG_HOTPLUG_CPU
-               /* In the CPU hotplug case we cannot use broadcast mode
-                  because that opens a race when a CPU is removed.
-                  Stay at physflat mode in this case.
-                  It is bad to do this unconditionally though. Once
-                  we have ACPI platform support for CPU hotplug
-                  we should detect hotplug capablity from ACPI tables and
-                  only do this when really needed. -AK */
-               if (max_apic <= 8)
-                       genapic = &apic_flat;
-#endif
-               goto print;
-       }
-
-       clusters = 0;
-       max_cluster = 0;
-
-       for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
-               if (cluster_cnt[i] > 0) {
-                       ++clusters;
-                       if (cluster_cnt[i] > max_cluster)
-                               max_cluster = cluster_cnt[i];
-               }
-       }
-
-       /*
-        * If we have clusters <= 1 and CPUs <= 8 in cluster 0, then flat mode,
-        * else if max_cluster <= 4 and cluster_cnt[15] == 0, clustered logical
-        * else physical mode.
-        * (We don't use lowest priority delivery + HW APIC IRQ steering, so
-        * can ignore the clustered logical case and go straight to physical.)
-        */
-       if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) {
-#ifdef CONFIG_HOTPLUG_CPU
-               /* Don't use APIC shortcuts in CPU hotplug to avoid races */
-               genapic = &apic_physflat;
-#else
-               genapic = &apic_flat;
-#endif
-       } else
-               genapic = &apic_cluster;
-
-print:
-#else
-       /* hardcode to xen apic functions */
-       genapic = &apic_xen;
-#endif
-       printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name);
-}
-
-/* Same for both flat and clustered. */
-
-#ifdef CONFIG_XEN
-extern void xen_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest);
-#endif
-
-void send_IPI_self(int vector)
-{
-#ifndef CONFIG_XEN
-       __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
-#else
-       xen_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
-#endif
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/genapic_xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/genapic_xen.c
deleted file mode 100644 (file)
index 1171aad..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2004 James Cleverdon, IBM.
- * Subject to the GNU Public License, v.2
- *
- * Xen APIC subarch code.  Maximum 8 CPUs, logical delivery.
- *
- * Hacked for x86-64 by James Cleverdon from i386 architecture code by
- * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
- * James Cleverdon.
- *
- * Hacked to pieces for Xen by Chris Wright.
- */
-#include <linux/threads.h>
-#include <linux/cpumask.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/ctype.h>
-#include <linux/init.h>
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-#include <asm/smp.h>
-#include <asm/ipi.h>
-#else
-#include <asm/apic.h>
-#include <asm/apicdef.h>
-#include <asm/genapic.h>
-#endif
-#include <xen/evtchn.h>
-
-DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
-
-static inline void __send_IPI_one(unsigned int cpu, int vector)
-{
-       int irq = per_cpu(ipi_to_irq, cpu)[vector];
-       BUG_ON(irq < 0);
-       notify_remote_via_irq(irq);
-}
-
-void xen_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest)
-{
-       int cpu;
-
-       switch (shortcut) {
-       case APIC_DEST_SELF:
-               __send_IPI_one(smp_processor_id(), vector);
-               break;
-       case APIC_DEST_ALLBUT:
-               for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-                       if (cpu == smp_processor_id())
-                               continue;
-                       if (cpu_isset(cpu, cpu_online_map)) {
-                               __send_IPI_one(cpu, vector);
-                       }
-               }
-               break;
-       case APIC_DEST_ALLINC:
-               for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-                       if (cpu_isset(cpu, cpu_online_map)) {
-                               __send_IPI_one(cpu, vector);
-                       }
-               }
-               break;
-       default:
-               printk("XXXXXX __send_IPI_shortcut %08x vector %d\n", shortcut,
-                      vector);
-               break;
-       }
-}
-
-static cpumask_t xen_target_cpus(void)
-{
-       return cpu_online_map;
-}
-
-/*
- * Set up the logical destination ID.
- * Do nothing, not called now.
- */
-static void xen_init_apic_ldr(void)
-{
-       Dprintk("%s\n", __FUNCTION__);
-       return;
-}
-
-static void xen_send_IPI_allbutself(int vector)
-{
-       /*
-        * if there are no other CPUs in the system then
-        * we get an APIC send error if we try to broadcast.
-        * thus we have to avoid sending IPIs in this case.
-        */
-       Dprintk("%s\n", __FUNCTION__);
-       if (num_online_cpus() > 1)
-               xen_send_IPI_shortcut(APIC_DEST_ALLBUT, vector, APIC_DEST_LOGICAL);
-}
-
-static void xen_send_IPI_all(int vector)
-{
-       Dprintk("%s\n", __FUNCTION__);
-       xen_send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
-}
-
-static void xen_send_IPI_mask(cpumask_t cpumask, int vector)
-{
-       unsigned long mask = cpus_addr(cpumask)[0];
-       unsigned int cpu;
-       unsigned long flags;
-
-       Dprintk("%s\n", __FUNCTION__);
-       local_irq_save(flags);
-       WARN_ON(mask & ~cpus_addr(cpu_online_map)[0]);
-
-       for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-               if (cpu_isset(cpu, cpumask)) {
-                       __send_IPI_one(cpu, vector);
-               }
-       }
-       local_irq_restore(flags);
-}
-
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-static int xen_apic_id_registered(void)
-{
-       /* better be set */
-       Dprintk("%s\n", __FUNCTION__);
-       return physid_isset(smp_processor_id(), phys_cpu_present_map);
-}
-#endif
-
-static unsigned int xen_cpu_mask_to_apicid(cpumask_t cpumask)
-{
-       Dprintk("%s\n", __FUNCTION__);
-       return cpus_addr(cpumask)[0] & APIC_ALL_CPUS;
-}
-
-static unsigned int phys_pkg_id(int index_msb)
-{
-       u32 ebx;
-
-       Dprintk("%s\n", __FUNCTION__);
-       ebx = cpuid_ebx(1);
-       return ((ebx >> 24) & 0xFF) >> index_msb;
-}
-
-struct genapic apic_xen =  {
-       .name = "xen",
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-       .int_delivery_mode = dest_LowestPrio,
-#endif
-       .int_dest_mode = (APIC_DEST_LOGICAL != 0),
-       .int_delivery_dest = APIC_DEST_LOGICAL | APIC_DM_LOWEST,
-       .target_cpus = xen_target_cpus,
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-       .apic_id_registered = xen_apic_id_registered,
-#endif
-       .init_apic_ldr = xen_init_apic_ldr,
-       .send_IPI_all = xen_send_IPI_all,
-       .send_IPI_allbutself = xen_send_IPI_allbutself,
-       .send_IPI_mask = xen_send_IPI_mask,
-       .cpu_mask_to_apicid = xen_cpu_mask_to_apicid,
-       .phys_pkg_id = phys_pkg_id,
-};
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S b/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S
deleted file mode 100644 (file)
index 0ab1074..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  linux/arch/x86_64/kernel/head.S -- start in 32bit and switch to 64bit
- *
- *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
- *  Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
- *  Copyright (C) 2000 Karsten Keil <kkeil@suse.de>
- *  Copyright (C) 2001,2002 Andi Kleen <ak@suse.de>
- *
- *  $Id: head.S,v 1.49 2002/03/19 17:39:25 ak Exp $
- *
- *  Jun Nakajima <jun.nakajima@intel.com>
- *    Modified for Xen                                
- */
-
-
-#include <linux/linkage.h>
-#include <linux/threads.h>
-#include <linux/init.h>
-#include <linux/elfnote.h>
-#include <asm/desc.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/msr.h>
-#include <asm/cache.h>
-#include <asm/dwarf2.h>
-#include <xen/interface/elfnote.h>
-
-       .section .bootstrap.text, "ax", @progbits
-       .code64
-#define VIRT_ENTRY_OFFSET 0x0
-.org VIRT_ENTRY_OFFSET
-       .globl startup_64
-startup_64:
-ENTRY(_start)
-       movq $(init_thread_union+THREAD_SIZE-8),%rsp
-
-       /* rsi is pointer to startup info structure.
-          pass it to C */
-       movq %rsi,%rdi
-       pushq $0                # fake return address
-       jmp x86_64_start_kernel
-
-ENTRY(stext)
-ENTRY(_stext)
-
-       $page = 0
-#define NEXT_PAGE(name) \
-       $page = $page + 1; \
-       .org $page * 0x1000; \
-       phys_##name = $page * 0x1000 + __PHYSICAL_START; \
-ENTRY(name)
-
-NEXT_PAGE(init_level4_pgt)
-       /* This gets initialized in x86_64_start_kernel */
-       .fill   512,8,0
-
-        /*
-         * We update two pgd entries to make kernel and user pgd consistent
-         * at pgd_populate(). It can be used for kernel modules. So we place 
-         * this page here for those cases to avoid memory corruption.
-         * We also use this page to establish the initiali mapping for
-         * vsyscall area.
-         */
-NEXT_PAGE(init_level4_user_pgt)
-       .fill   512,8,0
-
-NEXT_PAGE(level3_kernel_pgt)
-       .fill   512,8,0
-
-        /*
-         * This is used for vsyscall area mapping as we have a different
-         * level4 page table for user.
-         */
-NEXT_PAGE(level3_user_pgt)
-        .fill  512,8,0
-
-NEXT_PAGE(level2_kernel_pgt)
-       .fill   512,8,0
-
-NEXT_PAGE(hypercall_page)
-       CFI_STARTPROC
-       .rept 0x1000 / 0x20
-       .skip 1 /* push %rcx */
-       CFI_ADJUST_CFA_OFFSET   8
-       CFI_REL_OFFSET  rcx,0
-       .skip 2 /* push %r11 */
-       CFI_ADJUST_CFA_OFFSET   8
-       CFI_REL_OFFSET  rcx,0
-       .skip 5 /* mov $#,%eax */
-       .skip 2 /* syscall */
-       .skip 2 /* pop %r11 */
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_RESTORE r11
-       .skip 1 /* pop %rcx */
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_RESTORE rcx
-       .align 0x20,0 /* ret */
-       .endr
-       CFI_ENDPROC
-
-#undef NEXT_PAGE
-
-       .data
-
-       .align 16
-       .globl cpu_gdt_descr
-cpu_gdt_descr:
-       .word   gdt_end-cpu_gdt_table-1
-gdt:
-       .quad   cpu_gdt_table
-#ifdef CONFIG_SMP
-       .rept   NR_CPUS-1
-       .word   0
-       .quad   0
-       .endr
-#endif
-
-/* We need valid kernel segments for data and code in long mode too
- * IRET will check the segment types  kkeil 2000/10/28
- * Also sysret mandates a special GDT layout 
- */
-                               
-       .section .data.page_aligned, "aw"
-       .align PAGE_SIZE
-
-/* The TLS descriptors are currently at a different place compared to i386.
-   Hopefully nobody expects them at a fixed place (Wine?) */
-
-ENTRY(cpu_gdt_table)
-       .quad   0x0000000000000000      /* NULL descriptor */
-       .quad   0x0                     /* unused */
-       .quad   0x00af9a000000ffff      /* __KERNEL_CS */
-       .quad   0x00cf92000000ffff      /* __KERNEL_DS */
-       .quad   0x00cffa000000ffff      /* __USER32_CS */
-       .quad   0x00cff2000000ffff      /* __USER_DS, __USER32_DS  */
-       .quad   0x00affa000000ffff      /* __USER_CS */
-       .quad   0x00cf9a000000ffff      /* __KERNEL32_CS */
-       .quad   0,0                     /* TSS */
-       .quad   0,0                     /* LDT */
-       .quad   0,0,0                   /* three TLS descriptors */
-       .quad   0                       /* unused */
-gdt_end:
-       /* asm/segment.h:GDT_ENTRIES must match this */
-       /* This should be a multiple of the cache line size */
-       /* GDTs of other CPUs are now dynamically allocated */
-
-       /* zero the remaining page */
-       .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0
-
-       .section .bss.page_aligned, "aw", @nobits
-       .align PAGE_SIZE
-ENTRY(empty_zero_page)
-       .skip PAGE_SIZE
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-/*
- * __xen_guest information
- */
-.macro utoh value
- .if (\value) < 0 || (\value) >= 0x10
-       utoh (((\value)>>4)&0x0fffffffffffffff)
- .endif
- .if ((\value) & 0xf) < 10
-  .byte '0' + ((\value) & 0xf)
- .else
-  .byte 'A' + ((\value) & 0xf) - 10
- .endif
-.endm
-
-.section __xen_guest
-       .ascii  "GUEST_OS=linux,GUEST_VER=2.6"
-       .ascii  ",XEN_VER=xen-3.0"
-       .ascii  ",VIRT_BASE=0x"
-               utoh __START_KERNEL_map
-       .ascii  ",ELF_PADDR_OFFSET=0x"
-               utoh __START_KERNEL_map
-       .ascii  ",VIRT_ENTRY=0x"
-               utoh (__START_KERNEL_map + __PHYSICAL_START + VIRT_ENTRY_OFFSET)
-       .ascii  ",HYPERCALL_PAGE=0x"
-               utoh (phys_hypercall_page >> PAGE_SHIFT)
-       .ascii  ",FEATURES=writable_page_tables"
-       .ascii           "|writable_descriptor_tables"
-       .ascii           "|auto_translated_physmap"
-       .ascii           "|supervisor_mode_kernel"
-       .ascii  ",LOADER=generic"
-       .byte   0
-#endif /* CONFIG_XEN_COMPAT <= 0x030002 */
-       
-       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz, "linux")
-       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, "2.6")
-       ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz, "xen-3.0")
-       ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .quad,  __START_KERNEL_map)
-#if CONFIG_XEN_COMPAT <= 0x030002
-       ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  __START_KERNEL_map)
-#else
-       ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  0)
-#endif
-       ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .quad,  startup_64)
-       ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
-       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  _PAGE_PRESENT,_PAGE_PRESENT)
-       ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
-       ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-       ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c
deleted file mode 100644 (file)
index a9dab81..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  linux/arch/x86_64/kernel/head64.c -- prepare to run common code
- *
- *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
- *
- *  Jun Nakajima <jun.nakajima@intel.com>
- *     Modified for Xen.
- */
-
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/percpu.h>
-#include <linux/module.h>
-
-#include <asm/processor.h>
-#include <asm/proto.h>
-#include <asm/smp.h>
-#include <asm/bootsetup.h>
-#include <asm/setup.h>
-#include <asm/desc.h>
-#include <asm/pgtable.h>
-#include <asm/sections.h>
-
-unsigned long start_pfn;
-
-/* Don't add a printk in there. printk relies on the PDA which is not initialized 
-   yet. */
-#if 0
-static void __init clear_bss(void)
-{
-       memset(__bss_start, 0,
-              (unsigned long) __bss_stop - (unsigned long) __bss_start);
-}
-#endif
-
-#define NEW_CL_POINTER         0x228   /* Relative to real mode data */
-#define OLD_CL_MAGIC_ADDR      0x90020
-#define OLD_CL_MAGIC            0xA33F
-#define OLD_CL_BASE_ADDR        0x90000
-#define OLD_CL_OFFSET           0x90022
-
-extern char saved_command_line[];
-
-static void __init copy_bootdata(char *real_mode_data)
-{
-#ifndef CONFIG_XEN
-       int new_data;
-       char * command_line;
-
-       memcpy(x86_boot_params, real_mode_data, BOOT_PARAM_SIZE);
-       new_data = *(int *) (x86_boot_params + NEW_CL_POINTER);
-       if (!new_data) {
-               if (OLD_CL_MAGIC != * (u16 *) OLD_CL_MAGIC_ADDR) {
-                       printk("so old bootloader that it does not support commandline?!\n");
-                       return;
-               }
-               new_data = OLD_CL_BASE_ADDR + * (u16 *) OLD_CL_OFFSET;
-               printk("old bootloader convention, maybe loadlin?\n");
-       }
-       command_line = (char *) ((u64)(new_data));
-       memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-#else
-       int max_cmdline;
-       
-       if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
-               max_cmdline = COMMAND_LINE_SIZE;
-       memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
-       saved_command_line[max_cmdline-1] = '\0';
-#endif
-       printk("Bootdata ok (command line is %s)\n", saved_command_line);
-}
-
-static void __init setup_boot_cpu_data(void)
-{
-       unsigned int dummy, eax;
-
-       /* get vendor info */
-       cpuid(0, (unsigned int *)&boot_cpu_data.cpuid_level,
-             (unsigned int *)&boot_cpu_data.x86_vendor_id[0],
-             (unsigned int *)&boot_cpu_data.x86_vendor_id[8],
-             (unsigned int *)&boot_cpu_data.x86_vendor_id[4]);
-
-       /* get cpu type */
-       cpuid(1, &eax, &dummy, &dummy,
-               (unsigned int *) &boot_cpu_data.x86_capability);
-       boot_cpu_data.x86 = (eax >> 8) & 0xf;
-       boot_cpu_data.x86_model = (eax >> 4) & 0xf;
-       boot_cpu_data.x86_mask = eax & 0xf;
-}
-
-#include <xen/interface/memory.h>
-unsigned long *machine_to_phys_mapping;
-EXPORT_SYMBOL(machine_to_phys_mapping);
-unsigned int machine_to_phys_order;
-EXPORT_SYMBOL(machine_to_phys_order);
-
-void __init x86_64_start_kernel(char * real_mode_data)
-{
-       struct xen_machphys_mapping mapping;
-       unsigned long machine_to_phys_nr_ents;
-       char *s;
-       int i;
-
-       setup_xen_features();
-
-       xen_start_info = (struct start_info *)real_mode_data;
-       if (!xen_feature(XENFEAT_auto_translated_physmap))
-               phys_to_machine_mapping =
-                       (unsigned long *)xen_start_info->mfn_list;
-       start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) +
-               xen_start_info->nr_pt_frames;
-
-       machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START;
-       machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES;
-       if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
-               machine_to_phys_mapping = (unsigned long *)mapping.v_start;
-               machine_to_phys_nr_ents = mapping.max_mfn + 1;
-       }
-       while ((1UL << machine_to_phys_order) < machine_to_phys_nr_ents )
-               machine_to_phys_order++;
-
-#if 0
-       for (i = 0; i < 256; i++)
-               set_intr_gate(i, early_idt_handler);
-       asm volatile("lidt %0" :: "m" (idt_descr));
-#endif
-
-       /*
-        * This must be called really, really early:
-        */
-       lockdep_init();
-
-       for (i = 0; i < NR_CPUS; i++)
-               cpu_pda(i) = &boot_cpu_pda[i];
-
-       pda_init(0);
-       copy_bootdata(real_mode_data);
-#ifdef CONFIG_SMP
-       cpu_set(0, cpu_online_map);
-#endif
-       s = strstr(saved_command_line, "earlyprintk=");
-       if (s != NULL)
-               setup_early_printk(strchr(s, '=') + 1);
-#ifdef CONFIG_NUMA
-       s = strstr(saved_command_line, "numa=");
-       if (s != NULL)
-               numa_setup(s+5);
-#endif
-#ifdef CONFIG_X86_IO_APIC
-       if (strstr(saved_command_line, "disableapic"))
-               disable_apic = 1;
-#endif
-       /* You need early console to see that */
-       if (__pa_symbol(&_end) >= KERNEL_TEXT_SIZE)
-               panic("Kernel too big for kernel mapping\n");
-
-       setup_boot_cpu_data();
-       start_kernel();
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c
deleted file mode 100644 (file)
index e0bd1e5..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/init_task.h>
-#include <linux/fs.h>
-#include <linux/mqueue.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/desc.h>
-
-static struct fs_struct init_fs = INIT_FS;
-static struct files_struct init_files = INIT_FILES;
-static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
-static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-struct mm_struct init_mm = INIT_MM(init_mm);
-
-EXPORT_SYMBOL(init_mm);
-
-/*
- * Initial task structure.
- *
- * We need to make sure that this is 8192-byte aligned due to the
- * way process stacks are handled. This is done by having a special
- * "init_task" linker map entry..
- */
-union thread_union init_thread_union 
-       __attribute__((__section__(".data.init_task"))) =
-               { INIT_THREAD_INFO(init_task) };
-
-/*
- * Initial task structure.
- *
- * All other task structs will be allocated on slabs in fork.c
- */
-struct task_struct init_task = INIT_TASK(init_task);
-
-EXPORT_SYMBOL(init_task);
-
-#ifndef CONFIG_X86_NO_TSS
-/*
- * per-CPU TSS segments. Threads are completely 'soft' on Linux,
- * no more per-task TSS's. The TSS size is kept cacheline-aligned
- * so they are allowed to end up in the .data.cacheline_aligned
- * section. Since TSS's are completely CPU-local, we want them
- * on exact cacheline boundaries, to eliminate cacheline ping-pong.
- */ 
-DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
-
-/* Copies of the original ist values from the tss are only accessed during
- * debugging, no special alignment required.
- */
-DEFINE_PER_CPU(struct orig_ist, orig_ist);
-#endif
-
-#define ALIGN_TO_4K __attribute__((section(".data.init_task")))
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c
deleted file mode 100644 (file)
index c1f5172..0000000
+++ /dev/null
@@ -1,2269 +0,0 @@
-/*
- *     Intel IO-APIC support for multi-Pentium hosts.
- *
- *     Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar, Hajnalka Szabo
- *
- *     Many thanks to Stig Venaas for trying out countless experimental
- *     patches and reporting/debugging problems patiently!
- *
- *     (c) 1999, Multiple IO-APIC support, developed by
- *     Ken-ichi Yaku <yaku@css1.kbnes.nec.co.jp> and
- *      Hidemi Kishimoto <kisimoto@css1.kbnes.nec.co.jp>,
- *     further tested and cleaned up by Zach Brown <zab@redhat.com>
- *     and Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *     Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
- *                                     thanks to Eric Gilmore
- *                                     and Rolf G. Tews
- *                                     for testing these extensively
- *     Paul Diefenbaugh        :       Added full ACPI support
- */
-
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/smp_lock.h>
-#include <linux/mc146818rtc.h>
-#include <linux/acpi.h>
-#include <linux/sysdev.h>
-#ifdef CONFIG_ACPI
-#include <acpi/acpi_bus.h>
-#endif
-
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/desc.h>
-#include <asm/proto.h>
-#include <asm/mach_apic.h>
-#include <asm/acpi.h>
-#include <asm/dma.h>
-#include <asm/nmi.h>
-
-#define __apicdebuginit  __init
-
-int sis_apic_bug; /* not actually supported, dummy for compile */
-
-static int no_timer_check;
-
-int disable_timer_pin_1 __initdata;
-
-#ifndef CONFIG_XEN
-int timer_over_8254 __initdata = 0;
-
-/* Where if anywhere is the i8259 connect in external int mode */
-static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
-#endif
-
-static DEFINE_SPINLOCK(ioapic_lock);
-static DEFINE_SPINLOCK(vector_lock);
-
-/*
- * # of IRQ routing registers
- */
-int nr_ioapic_registers[MAX_IO_APICS];
-
-/*
- * Rough estimation of how many shared IRQs there are, can
- * be changed anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQ_VECTORS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
-
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
-
-static struct irq_pin_list {
-       short apic, pin, next;
-} irq_2_pin[PIN_MAP_SIZE];
-
-int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1};
-#ifdef CONFIG_PCI_MSI
-#define vector_to_irq(vector)  \
-       (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-#else
-#define vector_to_irq(vector)  (vector)
-#endif
-
-#ifdef CONFIG_XEN
-
-#include <xen/interface/xen.h>
-#include <xen/interface/physdev.h>
-
-/* Fake i8259 */
-#define make_8259A_irq(_irq)     (io_apic_irqs &= ~(1UL<<(_irq)))
-#define disable_8259A_irq(_irq)  ((void)0)
-#define i8259A_irq_pending(_irq) (0)
-
-unsigned long io_apic_irqs;
-
-static inline unsigned int xen_io_apic_read(unsigned int apic, unsigned int reg)
-{
-       struct physdev_apic apic_op;
-       int ret;
-
-       apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-       apic_op.reg = reg;
-       ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
-       if (ret)
-               return ret;
-       return apic_op.value;
-}
-
-static inline void xen_io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
-{
-       struct physdev_apic apic_op;
-
-       apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-       apic_op.reg = reg;
-       apic_op.value = value;
-       HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
-}
-
-#define io_apic_read(a,r)    xen_io_apic_read(a,r)
-#define io_apic_write(a,r,v) xen_io_apic_write(a,r,v)
-
-#define clear_IO_APIC() ((void)0)
-
-#else
-
-#ifdef CONFIG_SMP
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
-{
-       unsigned long flags;
-       unsigned int dest;
-       cpumask_t tmp;
-
-       cpus_and(tmp, mask, cpu_online_map);
-       if (cpus_empty(tmp))
-               tmp = TARGET_CPUS;
-
-       cpus_and(mask, tmp, CPU_MASK_ALL);
-
-       dest = cpu_mask_to_apicid(mask);
-
-       /*
-        * Only the high 8 bits are valid.
-        */
-       dest = SET_APIC_LOGICAL_ID(dest);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       __DO_ACTION(1, = dest, )
-       set_irq_info(irq, mask);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-#endif
-
-#endif /* !CONFIG_XEN */
-
-/*
- * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
- * shared ISA-space IRQs, so we have to support them. We are super
- * fast in the common case, and fast for shared ISA-space IRQs.
- */
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
-{
-       static int first_free_entry = NR_IRQS;
-       struct irq_pin_list *entry = irq_2_pin + irq;
-
-       BUG_ON(irq >= NR_IRQS);
-       while (entry->next)
-               entry = irq_2_pin + entry->next;
-
-       if (entry->pin != -1) {
-               entry->next = first_free_entry;
-               entry = irq_2_pin + entry->next;
-               if (++first_free_entry >= PIN_MAP_SIZE)
-                       panic("io_apic.c: ran out of irq_2_pin entries!");
-       }
-       entry->apic = apic;
-       entry->pin = pin;
-}
-
-#ifndef CONFIG_XEN
-#define __DO_ACTION(R, ACTION, FINAL)                                  \
-                                                                       \
-{                                                                      \
-       int pin;                                                        \
-       struct irq_pin_list *entry = irq_2_pin + irq;                   \
-                                                                       \
-       BUG_ON(irq >= NR_IRQS);                                         \
-       for (;;) {                                                      \
-               unsigned int reg;                                       \
-               pin = entry->pin;                                       \
-               if (pin == -1)                                          \
-                       break;                                          \
-               reg = io_apic_read(entry->apic, 0x10 + R + pin*2);      \
-               reg ACTION;                                             \
-               io_apic_modify(entry->apic, reg);                       \
-               if (!entry->next)                                       \
-                       break;                                          \
-               entry = irq_2_pin + entry->next;                        \
-       }                                                               \
-       FINAL;                                                          \
-}
-
-#define DO_ACTION(name,R,ACTION, FINAL)                                        \
-                                                                       \
-       static void name##_IO_APIC_irq (unsigned int irq)               \
-       __DO_ACTION(R, ACTION, FINAL)
-
-DO_ACTION( __mask,             0, |= 0x00010000, io_apic_sync(entry->apic) )
-                                               /* mask = 1 */
-DO_ACTION( __unmask,           0, &= 0xfffeffff, )
-                                               /* mask = 0 */
-
-static void mask_IO_APIC_irq (unsigned int irq)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       __mask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void unmask_IO_APIC_irq (unsigned int irq)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       __unmask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-
-       /* Check delivery_mode to be sure we're not clearing an SMI pin */
-       spin_lock_irqsave(&ioapic_lock, flags);
-       *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-       *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-       if (entry.delivery_mode == dest_SMI)
-               return;
-       /*
-        * Disable it in the IO-APIC irq-routing table:
-        */
-       memset(&entry, 0, sizeof(entry));
-       entry.mask = 1;
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry) + 0));
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry) + 1));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-static void clear_IO_APIC (void)
-{
-       int apic, pin;
-
-       for (apic = 0; apic < nr_ioapics; apic++)
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
-                       clear_IO_APIC_pin(apic, pin);
-}
-
-#endif /* !CONFIG_XEN */
-
-static u8 gsi_2_irq[NR_IRQ_VECTORS] = { [0 ... NR_IRQ_VECTORS-1] = 0xFF };
-
-/*
- * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
- * specific CPU-side IRQs.
- */
-
-#define MAX_PIRQS 8
-static int pirq_entries [MAX_PIRQS];
-static int pirqs_enabled;
-int skip_ioapic_setup;
-int ioapic_force;
-
-/* dummy parsing: see setup.c */
-
-static int __init disable_ioapic_setup(char *str)
-{
-       skip_ioapic_setup = 1;
-       return 1;
-}
-
-static int __init enable_ioapic_setup(char *str)
-{
-       ioapic_force = 1;
-       skip_ioapic_setup = 0;
-       return 1;
-}
-
-__setup("noapic", disable_ioapic_setup);
-__setup("apic", enable_ioapic_setup);
-
-#ifndef CONFIG_XEN
-static int __init setup_disable_8254_timer(char *s)
-{
-       timer_over_8254 = -1;
-       return 1;
-}
-static int __init setup_enable_8254_timer(char *s)
-{
-       timer_over_8254 = 2;
-       return 1;
-}
-
-__setup("disable_8254_timer", setup_disable_8254_timer);
-__setup("enable_8254_timer", setup_enable_8254_timer);
-#endif /* !CONFIG_XEN */
-
-#include <asm/pci-direct.h>
-#include <linux/pci_ids.h>
-#include <linux/pci.h>
-
-
-#ifdef CONFIG_ACPI
-
-static int nvidia_hpet_detected __initdata;
-
-static int __init nvidia_hpet_check(unsigned long phys, unsigned long size)
-{
-       nvidia_hpet_detected = 1;
-       return 0;
-}
-#endif
-
-/* Temporary Hack. Nvidia and VIA boards currently only work with IO-APIC
-   off. Check for an Nvidia or VIA PCI bridge and turn it off.
-   Use pci direct infrastructure because this runs before the PCI subsystem. 
-
-   Can be overwritten with "apic"
-
-   And another hack to disable the IOMMU on VIA chipsets.
-
-   ... and others. Really should move this somewhere else.
-
-   Kludge-O-Rama. */
-void __init check_ioapic(void) 
-{ 
-       int num,slot,func; 
-       /* Poor man's PCI discovery */
-       for (num = 0; num < 32; num++) { 
-               for (slot = 0; slot < 32; slot++) { 
-                       for (func = 0; func < 8; func++) { 
-                               u32 class;
-                               u32 vendor;
-                               u8 type;
-                               class = read_pci_config(num,slot,func,
-                                                       PCI_CLASS_REVISION);
-                               if (class == 0xffffffff)
-                                       break; 
-
-                               if ((class >> 16) != PCI_CLASS_BRIDGE_PCI)
-                                       continue; 
-
-                               vendor = read_pci_config(num, slot, func, 
-                                                        PCI_VENDOR_ID);
-                               vendor &= 0xffff;
-                               switch (vendor) { 
-                               case PCI_VENDOR_ID_VIA:
-#ifdef CONFIG_IOMMU
-                                       if ((end_pfn > MAX_DMA32_PFN ||
-                                            force_iommu) &&
-                                           !iommu_aperture_allowed) {
-                                               printk(KERN_INFO
-    "Looks like a VIA chipset. Disabling IOMMU. Override with \"iommu=allowed\"\n");
-                                               iommu_aperture_disabled = 1;
-                                       }
-#endif
-                                       return;
-                               case PCI_VENDOR_ID_NVIDIA:
-#ifdef CONFIG_ACPI
-                                       /*
-                                        * All timer overrides on Nvidia are
-                                        * wrong unless HPET is enabled.
-                                        */
-                                       nvidia_hpet_detected = 0;
-                                       acpi_table_parse(ACPI_HPET,
-                                                       nvidia_hpet_check);
-                                       if (nvidia_hpet_detected == 0) {
-                                               acpi_skip_timer_override = 1;
-                                               printk(KERN_INFO "Nvidia board "
-                                                   "detected. Ignoring ACPI "
-                                                   "timer override.\n");
-                                       }
-#endif
-                                       /* RED-PEN skip them on mptables too? */
-                                       return;
-                               case PCI_VENDOR_ID_ATI:
-
-                               /* This should be actually default, but
-                                  for 2.6.16 let's do it for ATI only where
-                                  it's really needed. */
-#ifndef CONFIG_XEN
-                                       if (timer_over_8254 == 1) {     
-                                               timer_over_8254 = 0;    
-                                       printk(KERN_INFO
-               "ATI board detected. Disabling timer routing over 8254.\n");
-                                       }       
-#endif
-                                       return;
-                               } 
-
-
-                               /* No multi-function device? */
-                               type = read_pci_config_byte(num,slot,func,
-                                                           PCI_HEADER_TYPE);
-                               if (!(type & 0x80))
-                                       break;
-                       } 
-               }
-       }
-} 
-
-static int __init ioapic_pirq_setup(char *str)
-{
-       int i, max;
-       int ints[MAX_PIRQS+1];
-
-       get_options(str, ARRAY_SIZE(ints), ints);
-
-       for (i = 0; i < MAX_PIRQS; i++)
-               pirq_entries[i] = -1;
-
-       pirqs_enabled = 1;
-       apic_printk(APIC_VERBOSE, "PIRQ redirection, working around broken MP-BIOS.\n");
-       max = MAX_PIRQS;
-       if (ints[0] < MAX_PIRQS)
-               max = ints[0];
-
-       for (i = 0; i < max; i++) {
-               apic_printk(APIC_VERBOSE, "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
-               /*
-                * PIRQs are mapped upside down, usually.
-                */
-               pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
-       }
-       return 1;
-}
-
-__setup("pirq=", ioapic_pirq_setup);
-
-/*
- * Find the IRQ entry number of a certain pin.
- */
-static int find_irq_entry(int apic, int pin, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++)
-               if (mp_irqs[i].mpc_irqtype == type &&
-                   (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid ||
-                    mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
-                   mp_irqs[i].mpc_dstirq == pin)
-                       return i;
-
-       return -1;
-}
-
-#ifndef CONFIG_XEN
-/*
- * Find the pin to which IRQ[irq] (ISA) is connected
- */
-static int __init find_isa_irq_pin(int irq, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_MCA) &&
-                   (mp_irqs[i].mpc_irqtype == type) &&
-                   (mp_irqs[i].mpc_srcbusirq == irq))
-
-                       return mp_irqs[i].mpc_dstirq;
-       }
-       return -1;
-}
-
-static int __init find_isa_irq_apic(int irq, int type)
-{
-       int i;
-
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-                    mp_bus_id_to_type[lbus] == MP_BUS_MCA) &&
-                   (mp_irqs[i].mpc_irqtype == type) &&
-                   (mp_irqs[i].mpc_srcbusirq == irq))
-                       break;
-       }
-       if (i < mp_irq_entries) {
-               int apic;
-               for(apic = 0; apic < nr_ioapics; apic++) {
-                       if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
-                               return apic;
-               }
-       }
-
-       return -1;
-}
-#endif
-
-/*
- * Find a specific PCI IRQ entry.
- * Not an __init, possibly needed by modules
- */
-static int pin_2_irq(int idx, int apic, int pin);
-
-int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
-{
-       int apic, i, best_guess = -1;
-
-       apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
-               bus, slot, pin);
-       if (mp_bus_id_to_pci_bus[bus] == -1) {
-               apic_printk(APIC_VERBOSE, "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
-               return -1;
-       }
-       for (i = 0; i < mp_irq_entries; i++) {
-               int lbus = mp_irqs[i].mpc_srcbus;
-
-               for (apic = 0; apic < nr_ioapics; apic++)
-                       if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic ||
-                           mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
-                               break;
-
-               if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) &&
-                   !mp_irqs[i].mpc_irqtype &&
-                   (bus == lbus) &&
-                   (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
-                       int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
-
-                       if (!(apic || IO_APIC_IRQ(irq)))
-                               continue;
-
-                       if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
-                               return irq;
-                       /*
-                        * Use the first all-but-pin matching entry as a
-                        * best-guess fuzzy result for broken mptables.
-                        */
-                       if (best_guess < 0)
-                               best_guess = irq;
-               }
-       }
-       BUG_ON(best_guess >= NR_IRQS);
-       return best_guess;
-}
-
-/*
- * EISA Edge/Level control register, ELCR
- */
-static int EISA_ELCR(unsigned int irq)
-{
-       if (irq < 16) {
-               unsigned int port = 0x4d0 + (irq >> 3);
-               return (inb(port) >> (irq & 7)) & 1;
-       }
-       apic_printk(APIC_VERBOSE, "Broken MPtable reports ISA irq %d\n", irq);
-       return 0;
-}
-
-/* EISA interrupts are always polarity zero and can be edge or level
- * trigger depending on the ELCR value.  If an interrupt is listed as
- * EISA conforming in the MP table, that means its trigger type must
- * be read in from the ELCR */
-
-#define default_EISA_trigger(idx)      (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
-#define default_EISA_polarity(idx)     (0)
-
-/* ISA interrupts are always polarity zero edge triggered,
- * when listed as conforming in the MP table. */
-
-#define default_ISA_trigger(idx)       (0)
-#define default_ISA_polarity(idx)      (0)
-
-/* PCI interrupts are always polarity one level triggered,
- * when listed as conforming in the MP table. */
-
-#define default_PCI_trigger(idx)       (1)
-#define default_PCI_polarity(idx)      (1)
-
-/* MCA interrupts are always polarity zero level triggered,
- * when listed as conforming in the MP table. */
-
-#define default_MCA_trigger(idx)       (1)
-#define default_MCA_polarity(idx)      (0)
-
-static int __init MPBIOS_polarity(int idx)
-{
-       int bus = mp_irqs[idx].mpc_srcbus;
-       int polarity;
-
-       /*
-        * Determine IRQ line polarity (high active or low active):
-        */
-       switch (mp_irqs[idx].mpc_irqflag & 3)
-       {
-               case 0: /* conforms, ie. bus-type dependent polarity */
-               {
-                       switch (mp_bus_id_to_type[bus])
-                       {
-                               case MP_BUS_ISA: /* ISA pin */
-                               {
-                                       polarity = default_ISA_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_EISA: /* EISA pin */
-                               {
-                                       polarity = default_EISA_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_PCI: /* PCI pin */
-                               {
-                                       polarity = default_PCI_polarity(idx);
-                                       break;
-                               }
-                               case MP_BUS_MCA: /* MCA pin */
-                               {
-                                       polarity = default_MCA_polarity(idx);
-                                       break;
-                               }
-                               default:
-                               {
-                                       printk(KERN_WARNING "broken BIOS!!\n");
-                                       polarity = 1;
-                                       break;
-                               }
-                       }
-                       break;
-               }
-               case 1: /* high active */
-               {
-                       polarity = 0;
-                       break;
-               }
-               case 2: /* reserved */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       polarity = 1;
-                       break;
-               }
-               case 3: /* low active */
-               {
-                       polarity = 1;
-                       break;
-               }
-               default: /* invalid */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       polarity = 1;
-                       break;
-               }
-       }
-       return polarity;
-}
-
-static int MPBIOS_trigger(int idx)
-{
-       int bus = mp_irqs[idx].mpc_srcbus;
-       int trigger;
-
-       /*
-        * Determine IRQ trigger mode (edge or level sensitive):
-        */
-       switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
-       {
-               case 0: /* conforms, ie. bus-type dependent */
-               {
-                       switch (mp_bus_id_to_type[bus])
-                       {
-                               case MP_BUS_ISA: /* ISA pin */
-                               {
-                                       trigger = default_ISA_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_EISA: /* EISA pin */
-                               {
-                                       trigger = default_EISA_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_PCI: /* PCI pin */
-                               {
-                                       trigger = default_PCI_trigger(idx);
-                                       break;
-                               }
-                               case MP_BUS_MCA: /* MCA pin */
-                               {
-                                       trigger = default_MCA_trigger(idx);
-                                       break;
-                               }
-                               default:
-                               {
-                                       printk(KERN_WARNING "broken BIOS!!\n");
-                                       trigger = 1;
-                                       break;
-                               }
-                       }
-                       break;
-               }
-               case 1: /* edge */
-               {
-                       trigger = 0;
-                       break;
-               }
-               case 2: /* reserved */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       trigger = 1;
-                       break;
-               }
-               case 3: /* level */
-               {
-                       trigger = 1;
-                       break;
-               }
-               default: /* invalid */
-               {
-                       printk(KERN_WARNING "broken BIOS!!\n");
-                       trigger = 0;
-                       break;
-               }
-       }
-       return trigger;
-}
-
-static inline int irq_polarity(int idx)
-{
-       return MPBIOS_polarity(idx);
-}
-
-static inline int irq_trigger(int idx)
-{
-       return MPBIOS_trigger(idx);
-}
-
-static int next_irq = 16;
-
-/*
- * gsi_irq_sharing -- Name overload!  "irq" can be either a legacy IRQ
- * in the range 0-15, a linux IRQ in the range 0-223, or a GSI number
- * from ACPI, which can reach 800 in large boxen.
- *
- * Compact the sparse GSI space into a sequential IRQ series and reuse
- * vectors if possible.
- */
-int gsi_irq_sharing(int gsi)
-{
-       int i, tries, vector;
-
-       BUG_ON(gsi >= NR_IRQ_VECTORS);
-
-       if (platform_legacy_irq(gsi))
-               return gsi;
-
-       if (gsi_2_irq[gsi] != 0xFF)
-               return (int)gsi_2_irq[gsi];
-
-       tries = NR_IRQS;
-  try_again:
-       vector = assign_irq_vector(gsi);
-
-       /*
-        * Sharing vectors means sharing IRQs, so scan irq_vectors for previous
-        * use of vector and if found, return that IRQ.  However, we never want
-        * to share legacy IRQs, which usually have a different trigger mode
-        * than PCI.
-        */
-       for (i = 0; i < NR_IRQS; i++)
-               if (IO_APIC_VECTOR(i) == vector)
-                       break;
-       if (platform_legacy_irq(i)) {
-               if (--tries >= 0) {
-                       IO_APIC_VECTOR(i) = 0;
-                       goto try_again;
-               }
-               panic("gsi_irq_sharing: didn't find an IRQ using vector 0x%02X for GSI %d", vector, gsi);
-       }
-       if (i < NR_IRQS) {
-               gsi_2_irq[gsi] = i;
-               printk(KERN_INFO "GSI %d sharing vector 0x%02X and IRQ %d\n",
-                               gsi, vector, i);
-               return i;
-       }
-
-       i = next_irq++;
-       BUG_ON(i >= NR_IRQS);
-       gsi_2_irq[gsi] = i;
-       IO_APIC_VECTOR(i) = vector;
-       printk(KERN_INFO "GSI %d assigned vector 0x%02X and IRQ %d\n",
-                       gsi, vector, i);
-       return i;
-}
-
-static int pin_2_irq(int idx, int apic, int pin)
-{
-       int irq, i;
-       int bus = mp_irqs[idx].mpc_srcbus;
-
-       /*
-        * Debugging check, we are in big trouble if this message pops up!
-        */
-       if (mp_irqs[idx].mpc_dstirq != pin)
-               printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
-
-       switch (mp_bus_id_to_type[bus])
-       {
-               case MP_BUS_ISA: /* ISA pin */
-               case MP_BUS_EISA:
-               case MP_BUS_MCA:
-               {
-                       irq = mp_irqs[idx].mpc_srcbusirq;
-                       break;
-               }
-               case MP_BUS_PCI: /* PCI pin */
-               {
-                       /*
-                        * PCI IRQs are mapped in order
-                        */
-                       i = irq = 0;
-                       while (i < apic)
-                               irq += nr_ioapic_registers[i++];
-                       irq += pin;
-                       irq = gsi_irq_sharing(irq);
-                       break;
-               }
-               default:
-               {
-                       printk(KERN_ERR "unknown bus type %d.\n",bus); 
-                       irq = 0;
-                       break;
-               }
-       }
-       BUG_ON(irq >= NR_IRQS);
-
-       /*
-        * PCI IRQ command line redirection. Yes, limits are hardcoded.
-        */
-       if ((pin >= 16) && (pin <= 23)) {
-               if (pirq_entries[pin-16] != -1) {
-                       if (!pirq_entries[pin-16]) {
-                               apic_printk(APIC_VERBOSE, "disabling PIRQ%d\n", pin-16);
-                       } else {
-                               irq = pirq_entries[pin-16];
-                               apic_printk(APIC_VERBOSE, "using PIRQ%d -> IRQ %d\n",
-                                               pin-16, irq);
-                       }
-               }
-       }
-       BUG_ON(irq >= NR_IRQS);
-       return irq;
-}
-
-static inline int IO_APIC_irq_trigger(int irq)
-{
-       int apic, idx, pin;
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-                       idx = find_irq_entry(apic,pin,mp_INT);
-                       if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
-                               return irq_trigger(idx);
-               }
-       }
-       /*
-        * nonexistent IRQs are edge default
-        */
-       return 0;
-}
-
-/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-u8 irq_vector[NR_IRQ_VECTORS] __read_mostly;
-
-int assign_irq_vector(int irq)
-{
-       unsigned long flags;
-       int vector;
-       struct physdev_irq irq_op;
-  
-       BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
-
-       spin_lock_irqsave(&vector_lock, flags);
-
-       if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-               spin_unlock_irqrestore(&vector_lock, flags);
-               return IO_APIC_VECTOR(irq);
-       }
-
-       irq_op.irq = irq;
-       if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-               spin_unlock_irqrestore(&vector_lock, flags);
-               return -ENOSPC;
-       }
-
-       vector = irq_op.vector;
-       vector_irq[vector] = irq;
-       if (irq != AUTO_ASSIGN)
-               IO_APIC_VECTOR(irq) = vector;
-
-       spin_unlock_irqrestore(&vector_lock, flags);
-
-       return vector;
-}
-
-extern void (*interrupt[NR_IRQS])(void);
-#ifndef CONFIG_XEN
-static struct hw_interrupt_type ioapic_level_type;
-static struct hw_interrupt_type ioapic_edge_type;
-
-#define IOAPIC_AUTO    -1
-#define IOAPIC_EDGE    0
-#define IOAPIC_LEVEL   1
-
-static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-{
-       unsigned idx;
-
-       idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq;
-
-       if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-                       trigger == IOAPIC_LEVEL)
-               irq_desc[idx].chip = &ioapic_level_type;
-       else
-               irq_desc[idx].chip = &ioapic_edge_type;
-       set_intr_gate(vector, interrupt[idx]);
-}
-#else
-#define ioapic_register_intr(_irq,_vector,_trigger) ((void)0)
-#endif /* !CONFIG_XEN */
-
-static void __init setup_IO_APIC_irqs(void)
-{
-       struct IO_APIC_route_entry entry;
-       int apic, pin, idx, irq, first_notcon = 1, vector;
-       unsigned long flags;
-
-       apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-       for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-
-               /*
-                * add it to the IO-APIC irq-routing table:
-                */
-               memset(&entry,0,sizeof(entry));
-
-               entry.delivery_mode = INT_DELIVERY_MODE;
-               entry.dest_mode = INT_DEST_MODE;
-               entry.mask = 0;                         /* enable IRQ */
-               entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-
-               idx = find_irq_entry(apic,pin,mp_INT);
-               if (idx == -1) {
-                       if (first_notcon) {
-                               apic_printk(APIC_VERBOSE, KERN_DEBUG " IO-APIC (apicid-pin) %d-%d", mp_ioapics[apic].mpc_apicid, pin);
-                               first_notcon = 0;
-                       } else
-                               apic_printk(APIC_VERBOSE, ", %d-%d", mp_ioapics[apic].mpc_apicid, pin);
-                       continue;
-               }
-
-               entry.trigger = irq_trigger(idx);
-               entry.polarity = irq_polarity(idx);
-
-               if (irq_trigger(idx)) {
-                       entry.trigger = 1;
-                       entry.mask = 1;
-                       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-               }
-
-               irq = pin_2_irq(idx, apic, pin);
-               add_pin_to_irq(irq, apic, pin);
-
-               if (/* !apic && */ !IO_APIC_IRQ(irq))
-                       continue;
-
-               if (IO_APIC_IRQ(irq)) {
-                       vector = assign_irq_vector(irq);
-                       entry.vector = vector;
-
-                       ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-                       if (!apic && (irq < 16))
-                               disable_8259A_irq(irq);
-               }
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-               io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-               set_native_irq_info(irq, TARGET_CPUS);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-       }
-       }
-
-       if (!first_notcon)
-               apic_printk(APIC_VERBOSE," not connected.\n");
-}
-
-#ifndef CONFIG_XEN
-/*
- * Set up the 8259A-master output pin as broadcast to all
- * CPUs.
- */
-static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-
-       memset(&entry,0,sizeof(entry));
-
-       disable_8259A_irq(0);
-
-       /* mask LVT0 */
-       apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-
-       /*
-        * We use logical delivery to get the timer IRQ
-        * to the first CPU.
-        */
-       entry.dest_mode = INT_DEST_MODE;
-       entry.mask = 0;                                 /* unmask IRQ now */
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-       entry.delivery_mode = INT_DELIVERY_MODE;
-       entry.polarity = 0;
-       entry.trigger = 0;
-       entry.vector = vector;
-
-       /*
-        * The timer IRQ doesn't have to know that behind the
-        * scene we have a 8259A-master in AEOI mode ...
-        */
-       irq_desc[0].chip = &ioapic_edge_type;
-
-       /*
-        * Add it to the IO-APIC irq-routing table:
-        */
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-       io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       enable_8259A_irq(0);
-}
-
-void __init UNEXPECTED_IO_APIC(void)
-{
-}
-
-void __apicdebuginit print_IO_APIC(void)
-{
-       int apic, i;
-       union IO_APIC_reg_00 reg_00;
-       union IO_APIC_reg_01 reg_01;
-       union IO_APIC_reg_02 reg_02;
-       unsigned long flags;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
-       for (i = 0; i < nr_ioapics; i++)
-               printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
-                      mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
-
-       /*
-        * We are a bit conservative about what we expect.  We have to
-        * know about every hardware change ASAP.
-        */
-       printk(KERN_INFO "testing the IO APIC.......................\n");
-
-       for (apic = 0; apic < nr_ioapics; apic++) {
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(apic, 0);
-       reg_01.raw = io_apic_read(apic, 1);
-       if (reg_01.bits.version >= 0x10)
-               reg_02.raw = io_apic_read(apic, 2);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       printk("\n");
-       printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
-       printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
-       printk(KERN_DEBUG ".......    : physical APIC id: %02X\n", reg_00.bits.ID);
-       if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
-               UNEXPECTED_IO_APIC();
-
-       printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)&reg_01);
-       printk(KERN_DEBUG ".......     : max redirection entries: %04X\n", reg_01.bits.entries);
-       if (    (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
-               (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
-               (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
-               (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
-               (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
-               (reg_01.bits.entries != 0x2E) &&
-               (reg_01.bits.entries != 0x3F) &&
-               (reg_01.bits.entries != 0x03) 
-       )
-               UNEXPECTED_IO_APIC();
-
-       printk(KERN_DEBUG ".......     : PRQ implemented: %X\n", reg_01.bits.PRQ);
-       printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.bits.version);
-       if (    (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
-               (reg_01.bits.version != 0x02) && /* 82801BA IO-APICs (ICH2) */
-               (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
-               (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
-               (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
-               (reg_01.bits.version != 0x20)    /* Intel P64H (82806 AA) */
-       )
-               UNEXPECTED_IO_APIC();
-       if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
-               UNEXPECTED_IO_APIC();
-
-       if (reg_01.bits.version >= 0x10) {
-               printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
-               printk(KERN_DEBUG ".......     : arbitration: %02X\n", reg_02.bits.arbitration);
-               if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
-                       UNEXPECTED_IO_APIC();
-       }
-
-       printk(KERN_DEBUG ".... IRQ redirection table:\n");
-
-       printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
-                         " Stat Dest Deli Vect:   \n");
-
-       for (i = 0; i <= reg_01.bits.entries; i++) {
-               struct IO_APIC_route_entry entry;
-
-               spin_lock_irqsave(&ioapic_lock, flags);
-               *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
-               *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               printk(KERN_DEBUG " %02x %03X %02X  ",
-                       i,
-                       entry.dest.logical.logical_dest,
-                       entry.dest.physical.physical_dest
-               );
-
-               printk("%1d    %1d    %1d   %1d   %1d    %1d    %1d    %02X\n",
-                       entry.mask,
-                       entry.trigger,
-                       entry.irr,
-                       entry.polarity,
-                       entry.delivery_status,
-                       entry.dest_mode,
-                       entry.delivery_mode,
-                       entry.vector
-               );
-       }
-       }
-       if (use_pci_vector())
-               printk(KERN_INFO "Using vector-based indexing\n");
-       printk(KERN_DEBUG "IRQ to pin mappings:\n");
-       for (i = 0; i < NR_IRQS; i++) {
-               struct irq_pin_list *entry = irq_2_pin + i;
-               if (entry->pin < 0)
-                       continue;
-               if (use_pci_vector() && !platform_legacy_irq(i))
-                       printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
-               else
-                       printk(KERN_DEBUG "IRQ%d ", i);
-               for (;;) {
-                       printk("-> %d:%d", entry->apic, entry->pin);
-                       if (!entry->next)
-                               break;
-                       entry = irq_2_pin + entry->next;
-               }
-               printk("\n");
-       }
-
-       printk(KERN_INFO ".................................... done.\n");
-
-       return;
-}
-
-#if 0
-
-static __apicdebuginit void print_APIC_bitfield (int base)
-{
-       unsigned int v;
-       int i, j;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
-       for (i = 0; i < 8; i++) {
-               v = apic_read(base + i*0x10);
-               for (j = 0; j < 32; j++) {
-                       if (v & (1<<j))
-                               printk("1");
-                       else
-                               printk("0");
-               }
-               printk("\n");
-       }
-}
-
-void __apicdebuginit print_local_APIC(void * dummy)
-{
-       unsigned int v, ver, maxlvt;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
-               smp_processor_id(), hard_smp_processor_id());
-       v = apic_read(APIC_ID);
-       printk(KERN_INFO "... APIC ID:      %08x (%01x)\n", v, GET_APIC_ID(v));
-       v = apic_read(APIC_LVR);
-       printk(KERN_INFO "... APIC VERSION: %08x\n", v);
-       ver = GET_APIC_VERSION(v);
-       maxlvt = get_maxlvt();
-
-       v = apic_read(APIC_TASKPRI);
-       printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
-
-       v = apic_read(APIC_ARBPRI);
-       printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
-               v & APIC_ARBPRI_MASK);
-       v = apic_read(APIC_PROCPRI);
-       printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
-
-       v = apic_read(APIC_EOI);
-       printk(KERN_DEBUG "... APIC EOI: %08x\n", v);
-       v = apic_read(APIC_RRR);
-       printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
-       v = apic_read(APIC_LDR);
-       printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
-       v = apic_read(APIC_DFR);
-       printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
-       v = apic_read(APIC_SPIV);
-       printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
-
-       printk(KERN_DEBUG "... APIC ISR field:\n");
-       print_APIC_bitfield(APIC_ISR);
-       printk(KERN_DEBUG "... APIC TMR field:\n");
-       print_APIC_bitfield(APIC_TMR);
-       printk(KERN_DEBUG "... APIC IRR field:\n");
-       print_APIC_bitfield(APIC_IRR);
-
-       v = apic_read(APIC_ESR);
-       printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
-
-       v = apic_read(APIC_ICR);
-       printk(KERN_DEBUG "... APIC ICR: %08x\n", v);
-       v = apic_read(APIC_ICR2);
-       printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
-
-       v = apic_read(APIC_LVTT);
-       printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
-
-       if (maxlvt > 3) {                       /* PC is LVT#4. */
-               v = apic_read(APIC_LVTPC);
-               printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
-       }
-       v = apic_read(APIC_LVT0);
-       printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
-       v = apic_read(APIC_LVT1);
-       printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
-
-       if (maxlvt > 2) {                       /* ERR is LVT#3. */
-               v = apic_read(APIC_LVTERR);
-               printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
-       }
-
-       v = apic_read(APIC_TMICT);
-       printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
-       v = apic_read(APIC_TMCCT);
-       printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
-       v = apic_read(APIC_TDCR);
-       printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
-       printk("\n");
-}
-
-void print_all_local_APICs (void)
-{
-       on_each_cpu(print_local_APIC, NULL, 1, 1);
-}
-
-void __apicdebuginit print_PIC(void)
-{
-       unsigned int v;
-       unsigned long flags;
-
-       if (apic_verbosity == APIC_QUIET)
-               return;
-
-       printk(KERN_DEBUG "\nprinting PIC contents\n");
-
-       spin_lock_irqsave(&i8259A_lock, flags);
-
-       v = inb(0xa1) << 8 | inb(0x21);
-       printk(KERN_DEBUG "... PIC  IMR: %04x\n", v);
-
-       v = inb(0xa0) << 8 | inb(0x20);
-       printk(KERN_DEBUG "... PIC  IRR: %04x\n", v);
-
-       outb(0x0b,0xa0);
-       outb(0x0b,0x20);
-       v = inb(0xa0) << 8 | inb(0x20);
-       outb(0x0a,0xa0);
-       outb(0x0a,0x20);
-
-       spin_unlock_irqrestore(&i8259A_lock, flags);
-
-       printk(KERN_DEBUG "... PIC  ISR: %04x\n", v);
-
-       v = inb(0x4d1) << 8 | inb(0x4d0);
-       printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
-}
-
-#endif  /*  0  */
-
-#else
-void __init print_IO_APIC(void) { }
-#endif /* !CONFIG_XEN */
-
-static void __init enable_IO_APIC(void)
-{
-       union IO_APIC_reg_01 reg_01;
-#ifndef CONFIG_XEN
-       int i8259_apic, i8259_pin;
-#endif
-       int i, apic;
-       unsigned long flags;
-
-       for (i = 0; i < PIN_MAP_SIZE; i++) {
-               irq_2_pin[i].pin = -1;
-               irq_2_pin[i].next = 0;
-       }
-       if (!pirqs_enabled)
-               for (i = 0; i < MAX_PIRQS; i++)
-                       pirq_entries[i] = -1;
-
-       /*
-        * The number of IO-APIC IRQ registers (== #pins):
-        */
-       for (apic = 0; apic < nr_ioapics; apic++) {
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_01.raw = io_apic_read(apic, 1);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               nr_ioapic_registers[apic] = reg_01.bits.entries+1;
-       }
-#ifndef CONFIG_XEN
-       for(apic = 0; apic < nr_ioapics; apic++) {
-               int pin;
-               /* See if any of the pins is in ExtINT mode */
-               for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-                       struct IO_APIC_route_entry entry;
-                       spin_lock_irqsave(&ioapic_lock, flags);
-                       *(((int *)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-                       *(((int *)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-                       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-
-                       /* If the interrupt line is enabled and in ExtInt mode
-                        * I have found the pin where the i8259 is connected.
-                        */
-                       if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
-                               ioapic_i8259.apic = apic;
-                               ioapic_i8259.pin  = pin;
-                               goto found_i8259;
-                       }
-               }
-       }
- found_i8259:
-       /* Look to see what if the MP table has reported the ExtINT */
-       i8259_pin  = find_isa_irq_pin(0, mp_ExtINT);
-       i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
-       /* Trust the MP table if nothing is setup in the hardware */
-       if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
-               printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
-               ioapic_i8259.pin  = i8259_pin;
-               ioapic_i8259.apic = i8259_apic;
-       }
-       /* Complain if the MP table and the hardware disagree */
-       if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
-               (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
-       {
-               printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
-       }
-#endif
-
-       /*
-        * Do not trust the IO-APIC being empty at bootup
-        */
-       clear_IO_APIC();
-}
-
-/*
- * Not an __init, needed by the reboot code
- */
-void disable_IO_APIC(void)
-{
-       /*
-        * Clear the IO-APIC before rebooting:
-        */
-       clear_IO_APIC();
-
-#ifndef CONFIG_XEN
-       /*
-        * If the i8259 is routed through an IOAPIC
-        * Put that IOAPIC in virtual wire mode
-        * so legacy interrupts can be delivered.
-        */
-       if (ioapic_i8259.pin != -1) {
-               struct IO_APIC_route_entry entry;
-               unsigned long flags;
-
-               memset(&entry, 0, sizeof(entry));
-               entry.mask            = 0; /* Enabled */
-               entry.trigger         = 0; /* Edge */
-               entry.irr             = 0;
-               entry.polarity        = 0; /* High */
-               entry.delivery_status = 0;
-               entry.dest_mode       = 0; /* Physical */
-               entry.delivery_mode   = dest_ExtINT; /* ExtInt */
-               entry.vector          = 0;
-               entry.dest.physical.physical_dest =
-                                       GET_APIC_ID(apic_read(APIC_ID));
-
-               /*
-                * Add it to the IO-APIC irq-routing table:
-                */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(ioapic_i8259.apic, 0x11+2*ioapic_i8259.pin,
-                       *(((int *)&entry)+1));
-               io_apic_write(ioapic_i8259.apic, 0x10+2*ioapic_i8259.pin,
-                       *(((int *)&entry)+0));
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-       }
-
-       disconnect_bsp_APIC(ioapic_i8259.pin != -1);
-#endif
-}
-
-/*
- * function to set the IO-APIC physical IDs based on the
- * values stored in the MPC table.
- *
- * by Matt Domsch <Matt_Domsch@dell.com>  Tue Dec 21 12:25:05 CST 1999
- */
-
-#ifndef CONFIG_XEN
-static void __init setup_ioapic_ids_from_mpc (void)
-{
-       union IO_APIC_reg_00 reg_00;
-       int apic;
-       int i;
-       unsigned char old_id;
-       unsigned long flags;
-
-       /*
-        * Set the IOAPIC ID to the value stored in the MPC table.
-        */
-       for (apic = 0; apic < nr_ioapics; apic++) {
-
-               /* Read the register 0 value */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_00.raw = io_apic_read(apic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               
-               old_id = mp_ioapics[apic].mpc_apicid;
-
-
-               printk(KERN_INFO "Using IO-APIC %d\n", mp_ioapics[apic].mpc_apicid);
-
-
-               /*
-                * We need to adjust the IRQ routing table
-                * if the ID changed.
-                */
-               if (old_id != mp_ioapics[apic].mpc_apicid)
-                       for (i = 0; i < mp_irq_entries; i++)
-                               if (mp_irqs[i].mpc_dstapic == old_id)
-                                       mp_irqs[i].mpc_dstapic
-                                               = mp_ioapics[apic].mpc_apicid;
-
-               /*
-                * Read the right value from the MPC table and
-                * write it into the ID register.
-                */
-               apic_printk(APIC_VERBOSE,KERN_INFO "...changing IO-APIC physical APIC ID to %d ...",
-                               mp_ioapics[apic].mpc_apicid);
-
-               reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
-               spin_lock_irqsave(&ioapic_lock, flags);
-               io_apic_write(apic, 0, reg_00.raw);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-
-               /*
-                * Sanity check
-                */
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_00.raw = io_apic_read(apic, 0);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
-                       printk("could not set ID!\n");
-               else
-                       apic_printk(APIC_VERBOSE," ok.\n");
-       }
-}
-#else
-static void __init setup_ioapic_ids_from_mpc(void) { }
-#endif
-
-/*
- * There is a nasty bug in some older SMP boards, their mptable lies
- * about the timer IRQ. We do the following to work around the situation:
- *
- *     - timer IRQ defaults to IO-APIC IRQ
- *     - if this function detects that timer IRQs are defunct, then we fall
- *       back to ISA timer IRQs
- */
-#ifndef CONFIG_XEN
-static int __init timer_irq_works(void)
-{
-       unsigned long t1 = jiffies;
-
-       local_irq_enable();
-       /* Let ten ticks pass... */
-       mdelay((10 * 1000) / HZ);
-
-       /*
-        * Expect a few ticks at least, to be sure some possible
-        * glue logic does not lock up after one or two first
-        * ticks in a non-ExtINT mode.  Also the local APIC
-        * might have cached one ExtINT interrupt.  Finally, at
-        * least one tick may be lost due to delays.
-        */
-
-       /* jiffies wrap? */
-       if (jiffies - t1 > 4)
-               return 1;
-       return 0;
-}
-
-/*
- * In the SMP+IOAPIC case it might happen that there are an unspecified
- * number of pending IRQ events unhandled. These cases are very rare,
- * so we 'resend' these IRQs via IPIs, to the same CPU. It's much
- * better to do it this way as thus we do not have to be aware of
- * 'pending' interrupts in the IRQ path, except at this point.
- */
-/*
- * Edge triggered needs to resend any interrupt
- * that was delayed but this is now handled in the device
- * independent code.
- */
-
-/*
- * Starting up a edge-triggered IO-APIC interrupt is
- * nasty - we need to make sure that we get the edge.
- * If it is already asserted for some reason, we need
- * return 1 to indicate that is was pending.
- *
- * This is not complete - we should be able to fake
- * an edge even if it isn't on the 8259A...
- */
-
-static unsigned int startup_edge_ioapic_irq(unsigned int irq)
-{
-       int was_pending = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       if (irq < 16) {
-               disable_8259A_irq(irq);
-               if (i8259A_irq_pending(irq))
-                       was_pending = 1;
-       }
-       __unmask_IO_APIC_irq(irq);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return was_pending;
-}
-
-/*
- * Once we have recorded IRQ_PENDING already, we can mask the
- * interrupt for real. This prevents IRQ storms from unhandled
- * devices.
- */
-static void ack_edge_ioapic_irq(unsigned int irq)
-{
-       move_irq(irq);
-       if ((irq_desc[irq].status & (IRQ_PENDING | IRQ_DISABLED))
-                                       == (IRQ_PENDING | IRQ_DISABLED))
-               mask_IO_APIC_irq(irq);
-       ack_APIC_irq();
-}
-
-/*
- * Level triggered interrupts can just be masked,
- * and shutting down and starting up the interrupt
- * is the same as enabling and disabling them -- except
- * with a startup need to return a "was pending" value.
- *
- * Level triggered interrupts are special because we
- * do not touch any IO-APIC register while handling
- * them. We ack the APIC in the end-IRQ handler, not
- * in the start-IRQ-handler. Protection against reentrance
- * from the same interrupt is still provided, both by the
- * generic IRQ layer and by the fact that an unacked local
- * APIC does not accept IRQs.
- */
-static unsigned int startup_level_ioapic_irq (unsigned int irq)
-{
-       unmask_IO_APIC_irq(irq);
-
-       return 0; /* don't check for pending */
-}
-
-static void end_level_ioapic_irq (unsigned int irq)
-{
-       move_irq(irq);
-       ack_APIC_irq();
-}
-
-#ifdef CONFIG_PCI_MSI
-static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       return startup_edge_ioapic_irq(irq);
-}
-
-static void ack_edge_ioapic_vector(unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       move_native_irq(vector);
-       ack_edge_ioapic_irq(irq);
-}
-
-static unsigned int startup_level_ioapic_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       return startup_level_ioapic_irq (irq);
-}
-
-static void end_level_ioapic_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       move_native_irq(vector);
-       end_level_ioapic_irq(irq);
-}
-
-static void mask_IO_APIC_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       mask_IO_APIC_irq(irq);
-}
-
-static void unmask_IO_APIC_vector (unsigned int vector)
-{
-       int irq = vector_to_irq(vector);
-
-       unmask_IO_APIC_irq(irq);
-}
-
-#ifdef CONFIG_SMP
-static void set_ioapic_affinity_vector (unsigned int vector,
-                                       cpumask_t cpu_mask)
-{
-       int irq = vector_to_irq(vector);
-
-       set_native_irq_info(vector, cpu_mask);
-       set_ioapic_affinity_irq(irq, cpu_mask);
-}
-#endif // CONFIG_SMP
-#endif // CONFIG_PCI_MSI
-
-static int ioapic_retrigger(unsigned int irq)
-{
-       send_IPI_self(IO_APIC_VECTOR(irq));
-
-       return 1;
-}
-
-/*
- * Level and edge triggered IO-APIC interrupts need different handling,
- * so we use two separate IRQ descriptors. Edge triggered IRQs can be
- * handled with the level-triggered descriptor, but that one has slightly
- * more overhead. Level-triggered interrupts cannot be handled with the
- * edge-triggered handler, without risking IRQ storms and other ugly
- * races.
- */
-
-static struct hw_interrupt_type ioapic_edge_type __read_mostly = {
-       .typename = "IO-APIC-edge",
-       .startup        = startup_edge_ioapic,
-       .shutdown       = shutdown_edge_ioapic,
-       .enable         = enable_edge_ioapic,
-       .disable        = disable_edge_ioapic,
-       .ack            = ack_edge_ioapic,
-       .end            = end_edge_ioapic,
-#ifdef CONFIG_SMP
-       .set_affinity = set_ioapic_affinity,
-#endif
-       .retrigger      = ioapic_retrigger,
-};
-
-static struct hw_interrupt_type ioapic_level_type __read_mostly = {
-       .typename = "IO-APIC-level",
-       .startup        = startup_level_ioapic,
-       .shutdown       = shutdown_level_ioapic,
-       .enable         = enable_level_ioapic,
-       .disable        = disable_level_ioapic,
-       .ack            = mask_and_ack_level_ioapic,
-       .end            = end_level_ioapic,
-#ifdef CONFIG_SMP
-       .set_affinity = set_ioapic_affinity,
-#endif
-       .retrigger      = ioapic_retrigger,
-};
-#endif /* !CONFIG_XEN */
-
-static inline void init_IO_APIC_traps(void)
-{
-       int irq;
-
-       /*
-        * NOTE! The local APIC isn't very good at handling
-        * multiple interrupts at the same interrupt level.
-        * As the interrupt level is determined by taking the
-        * vector number and shifting that right by 4, we
-        * want to spread these out a bit so that they don't
-        * all fall in the same interrupt level.
-        *
-        * Also, we've got to be careful not to trash gate
-        * 0x80, because int 0x80 is hm, kind of importantish. ;)
-        */
-       for (irq = 0; irq < NR_IRQS ; irq++) {
-               int tmp = irq;
-               if (use_pci_vector()) {
-                       if (!platform_legacy_irq(tmp))
-                               if ((tmp = vector_to_irq(tmp)) == -1)
-                                       continue;
-               }
-               if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
-                       /*
-                        * Hmm.. We don't have an entry for this,
-                        * so default to an old-fashioned 8259
-                        * interrupt if we can..
-                        */
-                       if (irq < 16)
-                               make_8259A_irq(irq);
-#ifndef CONFIG_XEN
-                       else
-                               /* Strange. Oh, well.. */
-                               irq_desc[irq].chip = &no_irq_type;
-#endif
-               }
-       }
-}
-
-#ifndef CONFIG_XEN
-static void enable_lapic_irq (unsigned int irq)
-{
-       unsigned long v;
-
-       v = apic_read(APIC_LVT0);
-       apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
-}
-
-static void disable_lapic_irq (unsigned int irq)
-{
-       unsigned long v;
-
-       v = apic_read(APIC_LVT0);
-       apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
-}
-
-static void ack_lapic_irq (unsigned int irq)
-{
-       ack_APIC_irq();
-}
-
-static void end_lapic_irq (unsigned int i) { /* nothing */ }
-
-static struct hw_interrupt_type lapic_irq_type __read_mostly = {
-       .typename = "local-APIC-edge",
-       .startup = NULL, /* startup_irq() not used for IRQ0 */
-       .shutdown = NULL, /* shutdown_irq() not used for IRQ0 */
-       .enable = enable_lapic_irq,
-       .disable = disable_lapic_irq,
-       .ack = ack_lapic_irq,
-       .end = end_lapic_irq,
-};
-
-static void setup_nmi (void)
-{
-       /*
-        * Dirty trick to enable the NMI watchdog ...
-        * We put the 8259A master into AEOI mode and
-        * unmask on all local APICs LVT0 as NMI.
-        *
-        * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire')
-        * is from Maciej W. Rozycki - so we do not have to EOI from
-        * the NMI handler or the timer interrupt.
-        */ 
-       printk(KERN_INFO "activating NMI Watchdog ...");
-
-       enable_NMI_through_LVT0(NULL);
-
-       printk(" done.\n");
-}
-
-/*
- * This looks a bit hackish but it's about the only one way of sending
- * a few INTA cycles to 8259As and any associated glue logic.  ICR does
- * not support the ExtINT mode, unfortunately.  We need to send these
- * cycles as some i82489DX-based boards have glue logic that keeps the
- * 8259A interrupt line asserted until INTA.  --macro
- */
-static inline void unlock_ExtINT_logic(void)
-{
-       int apic, pin, i;
-       struct IO_APIC_route_entry entry0, entry1;
-       unsigned char save_control, save_freq_select;
-       unsigned long flags;
-
-       pin  = find_isa_irq_pin(8, mp_INT);
-       apic = find_isa_irq_apic(8, mp_INT);
-       if (pin == -1)
-               return;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       *(((int *)&entry0) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-       *(((int *)&entry0) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-       clear_IO_APIC_pin(apic, pin);
-
-       memset(&entry1, 0, sizeof(entry1));
-
-       entry1.dest_mode = 0;                   /* physical delivery */
-       entry1.mask = 0;                        /* unmask IRQ now */
-       entry1.dest.physical.physical_dest = hard_smp_processor_id();
-       entry1.delivery_mode = dest_ExtINT;
-       entry1.polarity = entry0.polarity;
-       entry1.trigger = 0;
-       entry1.vector = 0;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry1) + 1));
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry1) + 0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       save_control = CMOS_READ(RTC_CONTROL);
-       save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
-       CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
-                  RTC_FREQ_SELECT);
-       CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
-
-       i = 100;
-       while (i-- > 0) {
-               mdelay(10);
-               if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
-                       i -= 10;
-       }
-
-       CMOS_WRITE(save_control, RTC_CONTROL);
-       CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-       clear_IO_APIC_pin(apic, pin);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry0) + 1));
-       io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry0) + 0));
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
-int timer_uses_ioapic_pin_0;
-
-/*
- * This code may look a bit paranoid, but it's supposed to cooperate with
- * a wide range of boards and BIOS bugs.  Fortunately only the timer IRQ
- * is so screwy.  Thanks to Brian Perkins for testing/hacking this beast
- * fanatically on his truly buggy board.
- *
- * FIXME: really need to revamp this for modern platforms only.
- */
-static inline void check_timer(void)
-{
-       int apic1, pin1, apic2, pin2;
-       int vector;
-
-       /*
-        * get/set the timer IRQ vector:
-        */
-       disable_8259A_irq(0);
-       vector = assign_irq_vector(0);
-       set_intr_gate(vector, interrupt[0]);
-
-       /*
-        * Subtle, code in do_timer_interrupt() expects an AEOI
-        * mode for the 8259A whenever interrupts are routed
-        * through I/O APICs.  Also IRQ0 has to be enabled in
-        * the 8259A which implies the virtual wire has to be
-        * disabled in the local APIC.
-        */
-       apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-       init_8259A(1);
-       if (timer_over_8254 > 0)
-               enable_8259A_irq(0);
-
-       pin1  = find_isa_irq_pin(0, mp_INT);
-       apic1 = find_isa_irq_apic(0, mp_INT);
-       pin2  = ioapic_i8259.pin;
-       apic2 = ioapic_i8259.apic;
-
-       if (pin1 == 0)
-               timer_uses_ioapic_pin_0 = 1;
-
-       apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
-               vector, apic1, pin1, apic2, pin2);
-
-       if (pin1 != -1) {
-               /*
-                * Ok, does IRQ0 through the IOAPIC work?
-                */
-               unmask_IO_APIC_irq(0);
-               if (!no_timer_check && timer_irq_works()) {
-                       nmi_watchdog_default();
-                       if (nmi_watchdog == NMI_IO_APIC) {
-                               disable_8259A_irq(0);
-                               setup_nmi();
-                               enable_8259A_irq(0);
-                       }
-                       if (disable_timer_pin_1 > 0)
-                               clear_IO_APIC_pin(0, pin1);
-                       return;
-               }
-               clear_IO_APIC_pin(apic1, pin1);
-               apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: 8254 timer not "
-                               "connected to IO-APIC\n");
-       }
-
-       apic_printk(APIC_VERBOSE,KERN_INFO "...trying to set up timer (IRQ0) "
-                               "through the 8259A ... ");
-       if (pin2 != -1) {
-               apic_printk(APIC_VERBOSE,"\n..... (found apic %d pin %d) ...",
-                       apic2, pin2);
-               /*
-                * legacy devices should be connected to IO APIC #0
-                */
-               setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
-               if (timer_irq_works()) {
-                       apic_printk(APIC_VERBOSE," works.\n");
-                       nmi_watchdog_default();
-                       if (nmi_watchdog == NMI_IO_APIC) {
-                               setup_nmi();
-                       }
-                       return;
-               }
-               /*
-                * Cleanup, just in case ...
-                */
-               clear_IO_APIC_pin(apic2, pin2);
-       }
-       apic_printk(APIC_VERBOSE," failed.\n");
-
-       if (nmi_watchdog == NMI_IO_APIC) {
-               printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
-               nmi_watchdog = 0;
-       }
-
-       apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
-
-       disable_8259A_irq(0);
-       irq_desc[0].chip = &lapic_irq_type;
-       apic_write(APIC_LVT0, APIC_DM_FIXED | vector);  /* Fixed mode */
-       enable_8259A_irq(0);
-
-       if (timer_irq_works()) {
-               apic_printk(APIC_VERBOSE," works.\n");
-               return;
-       }
-       apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
-       apic_printk(APIC_VERBOSE," failed.\n");
-
-       apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as ExtINT IRQ...");
-
-       init_8259A(0);
-       make_8259A_irq(0);
-       apic_write(APIC_LVT0, APIC_DM_EXTINT);
-
-       unlock_ExtINT_logic();
-
-       if (timer_irq_works()) {
-               apic_printk(APIC_VERBOSE," works.\n");
-               return;
-       }
-       apic_printk(APIC_VERBOSE," failed :(.\n");
-       panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n");
-}
-#else
-#define check_timer() ((void)0)
-int timer_uses_ioapic_pin_0 = 0;
-#endif /* !CONFIG_XEN */
-
-static int __init notimercheck(char *s)
-{
-       no_timer_check = 1;
-       return 1;
-}
-__setup("no_timer_check", notimercheck);
-
-/*
- *
- * IRQ's that are handled by the PIC in the MPS IOAPIC case.
- * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
- *   Linux doesn't really care, as it's not actually used
- *   for any interrupt handling anyway.
- */
-#define PIC_IRQS       (1<<2)
-
-void __init setup_IO_APIC(void)
-{
-       enable_IO_APIC();
-
-       if (acpi_ioapic)
-               io_apic_irqs = ~0;      /* all IRQs go through IOAPIC */
-       else
-               io_apic_irqs = ~PIC_IRQS;
-
-       apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
-
-       /*
-        * Set up the IO-APIC IRQ routing table.
-        */
-       if (!acpi_ioapic)
-               setup_ioapic_ids_from_mpc();
-#ifndef CONFIG_XEN
-       sync_Arb_IDs();
-#endif /* !CONFIG_XEN */
-       setup_IO_APIC_irqs();
-       init_IO_APIC_traps();
-       check_timer();
-       if (!acpi_ioapic)
-               print_IO_APIC();
-}
-
-struct sysfs_ioapic_data {
-       struct sys_device dev;
-       struct IO_APIC_route_entry entry[0];
-};
-static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
-
-static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
-{
-       struct IO_APIC_route_entry *entry;
-       struct sysfs_ioapic_data *data;
-       unsigned long flags;
-       int i;
-
-       data = container_of(dev, struct sysfs_ioapic_data, dev);
-       entry = data->entry;
-       spin_lock_irqsave(&ioapic_lock, flags);
-       for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-               *(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i);
-               *(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i);
-       }
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-static int ioapic_resume(struct sys_device *dev)
-{
-       struct IO_APIC_route_entry *entry;
-       struct sysfs_ioapic_data *data;
-       unsigned long flags;
-       union IO_APIC_reg_00 reg_00;
-       int i;
-
-       data = container_of(dev, struct sysfs_ioapic_data, dev);
-       entry = data->entry;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_00.raw = io_apic_read(dev->id, 0);
-       if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
-               reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
-               io_apic_write(dev->id, 0, reg_00.raw);
-       }
-       for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-               io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1));
-               io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0));
-       }
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-static struct sysdev_class ioapic_sysdev_class = {
-       set_kset_name("ioapic"),
-       .suspend = ioapic_suspend,
-       .resume = ioapic_resume,
-};
-
-static int __init ioapic_init_sysfs(void)
-{
-       struct sys_device * dev;
-       int i, size, error = 0;
-
-       error = sysdev_class_register(&ioapic_sysdev_class);
-       if (error)
-               return error;
-
-       for (i = 0; i < nr_ioapics; i++ ) {
-               size = sizeof(struct sys_device) + nr_ioapic_registers[i]
-                       * sizeof(struct IO_APIC_route_entry);
-               mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
-               if (!mp_ioapic_data[i]) {
-                       printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-                       continue;
-               }
-               memset(mp_ioapic_data[i], 0, size);
-               dev = &mp_ioapic_data[i]->dev;
-               dev->id = i;
-               dev->cls = &ioapic_sysdev_class;
-               error = sysdev_register(dev);
-               if (error) {
-                       kfree(mp_ioapic_data[i]);
-                       mp_ioapic_data[i] = NULL;
-                       printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-                       continue;
-               }
-       }
-
-       return 0;
-}
-
-device_initcall(ioapic_init_sysfs);
-
-/* --------------------------------------------------------------------------
-                          ACPI-based IOAPIC Configuration
-   -------------------------------------------------------------------------- */
-
-#ifdef CONFIG_ACPI
-
-#define IO_APIC_MAX_ID         0xFE
-
-int __init io_apic_get_version (int ioapic)
-{
-       union IO_APIC_reg_01    reg_01;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_01.raw = io_apic_read(ioapic, 1);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return reg_01.bits.version;
-}
-
-
-int __init io_apic_get_redir_entries (int ioapic)
-{
-       union IO_APIC_reg_01    reg_01;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       reg_01.raw = io_apic_read(ioapic, 1);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return reg_01.bits.entries;
-}
-
-
-int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
-{
-       struct IO_APIC_route_entry entry;
-       unsigned long flags;
-
-       if (!IO_APIC_IRQ(irq)) {
-               apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
-                       ioapic);
-               return -EINVAL;
-       }
-
-       /*
-        * Generate a PCI IRQ routing entry and program the IOAPIC accordingly.
-        * Note that we mask (disable) IRQs now -- these get enabled when the
-        * corresponding device driver registers for this IRQ.
-        */
-
-       memset(&entry,0,sizeof(entry));
-
-       entry.delivery_mode = INT_DELIVERY_MODE;
-       entry.dest_mode = INT_DEST_MODE;
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-       entry.trigger = edge_level;
-       entry.polarity = active_high_low;
-       entry.mask = 1;                                  /* Disabled (masked) */
-
-       irq = gsi_irq_sharing(irq);
-       /*
-        * IRQs < 16 are already in the irq_2_pin[] map
-        */
-       if (irq >= 16)
-               add_pin_to_irq(irq, ioapic, pin);
-
-       entry.vector = assign_irq_vector(irq);
-
-       apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
-               "IRQ %d Mode:%i Active:%i)\n", ioapic, 
-              mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
-              edge_level, active_high_low);
-
-       ioapic_register_intr(irq, entry.vector, edge_level);
-
-       if (!ioapic && (irq < 16))
-               disable_8259A_irq(irq);
-
-       spin_lock_irqsave(&ioapic_lock, flags);
-       io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
-       io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
-       set_native_irq_info(use_pci_vector() ?  entry.vector : irq, TARGET_CPUS);
-       spin_unlock_irqrestore(&ioapic_lock, flags);
-
-       return 0;
-}
-
-#endif /* CONFIG_ACPI */
-
-
-#ifndef CONFIG_XEN
-/*
- * This function currently is only a helper for the i386 smp boot process where
- * we need to reprogram the ioredtbls to cater for the cpus which have come online
- * so mask in all cases should simply be TARGET_CPUS
- */
-#ifdef CONFIG_SMP
-void __init setup_ioapic_dest(void)
-{
-       int pin, ioapic, irq, irq_entry;
-
-       if (skip_ioapic_setup == 1)
-               return;
-
-       for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
-               for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
-                       irq_entry = find_irq_entry(ioapic, pin, mp_INT);
-                       if (irq_entry == -1)
-                               continue;
-                       irq = pin_2_irq(irq_entry, ioapic, pin);
-                       set_ioapic_affinity_irq(irq, TARGET_CPUS);
-               }
-
-       }
-}
-#endif
-#endif /* !CONFIG_XEN */
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/ioport-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/ioport-xen.c
deleted file mode 100644 (file)
index a57442c..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *     linux/arch/x86_64/kernel/ioport.c
- *
- * This contains the io-permission bitmap code - written by obz, with changes
- * by Linus.
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/capability.h>
-#include <linux/errno.h>
-#include <linux/types.h>
-#include <linux/ioport.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/stddef.h>
-#include <linux/slab.h>
-#include <linux/thread_info.h>
-#include <xen/interface/physdev.h>
-
-/* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
-static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
-{
-       int i;
-
-       if (new_value)
-               for (i = base; i < base + extent; i++)
-                       __set_bit(i, bitmap);
-       else
-               for (i = base; i < base + extent; i++)
-                       clear_bit(i, bitmap);
-}
-
-/*
- * this changes the io permissions bitmap in the current task.
- */
-asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-{
-       struct thread_struct * t = &current->thread;
-       unsigned long *bitmap;
-       struct physdev_set_iobitmap set_iobitmap;
-
-       if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
-               return -EINVAL;
-       if (turn_on && !capable(CAP_SYS_RAWIO))
-               return -EPERM;
-
-       /*
-        * If it's the first ioperm() call in this thread's lifetime, set the
-        * IO bitmap up. ioperm() is much less timing critical than clone(),
-        * this is why we delay this operation until now:
-        */
-       if (!t->io_bitmap_ptr) {
-               bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-               if (!bitmap)
-                       return -ENOMEM;
-
-               memset(bitmap, 0xff, IO_BITMAP_BYTES);
-               t->io_bitmap_ptr = bitmap;
-
-               set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
-               set_iobitmap.nr_ports = IO_BITMAP_BITS;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
-       }
-
-       set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
-
-       return 0;
-}
-
-/*
- * sys_iopl has to be used when you want to access the IO ports
- * beyond the 0x3ff range: to get the full 65536 ports bitmapped
- * you'd need 8kB of bitmaps/process, which is a bit excessive.
- *
- */
-
-asmlinkage long sys_iopl(unsigned int new_iopl, struct pt_regs *regs)
-{
-       unsigned int old_iopl = current->thread.iopl;
-       struct physdev_set_iopl set_iopl;
-
-       if (new_iopl > 3)
-               return -EINVAL;
-
-       /* Need "raw I/O" privileges for direct port access. */
-       if ((new_iopl > old_iopl) && !capable(CAP_SYS_RAWIO))
-               return -EPERM;
-
-       /* Change our version of the privilege levels. */
-       current->thread.iopl = new_iopl;
-
-       /* Force the change at ring 0. */
-       set_iopl.iopl = (new_iopl == 0) ? 1 : new_iopl;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c
deleted file mode 100644 (file)
index 02cd6e2..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *     linux/arch/x86_64/kernel/irq.c
- *
- *     Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
- *
- * This file contains the lowest level x86_64-specific interrupt
- * entry and irq statistics code. All the remaining irq logic is
- * done by the generic kernel/irq/ code and in the
- * x86_64-specific irq controller code. (e.g. i8259.c and
- * io_apic.c.)
- */
-
-#include <linux/kernel_stat.h>
-#include <linux/interrupt.h>
-#include <linux/seq_file.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <asm/uaccess.h>
-#include <asm/io_apic.h>
-#include <asm/idle.h>
-
-atomic_t irq_err_count;
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
-atomic_t irq_mis_count;
-#endif
-#endif
-
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
-/*
- * Probabilistic stack overflow check:
- *
- * Only check the stack in process context, because everything else
- * runs on the big interrupt stacks. Checking reliably is too expensive,
- * so we just check from interrupts.
- */
-static inline void stack_overflow_check(struct pt_regs *regs)
-{
-       u64 curbase = (u64) current->thread_info;
-       static unsigned long warned = -60*HZ;
-
-       if (regs->rsp >= curbase && regs->rsp <= curbase + THREAD_SIZE &&
-           regs->rsp <  curbase + sizeof(struct thread_info) + 128 &&
-           time_after(jiffies, warned + 60*HZ)) {
-               printk("do_IRQ: %s near stack overflow (cur:%Lx,rsp:%lx)\n",
-                      current->comm, curbase, regs->rsp);
-               show_stack(NULL,NULL);
-               warned = jiffies;
-       }
-}
-#endif
-
-/*
- * Generic, controller-independent functions:
- */
-
-int show_interrupts(struct seq_file *p, void *v)
-{
-       int i = *(loff_t *) v, j;
-       struct irqaction * action;
-       unsigned long flags;
-
-       if (i == 0) {
-               seq_printf(p, "           ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "CPU%-8d",j);
-               seq_putc(p, '\n');
-       }
-
-       if (i < NR_IRQS) {
-               spin_lock_irqsave(&irq_desc[i].lock, flags);
-               action = irq_desc[i].action;
-               if (!action) 
-                       goto skip;
-               seq_printf(p, "%3d: ",i);
-#ifndef CONFIG_SMP
-               seq_printf(p, "%10u ", kstat_irqs(i));
-#else
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
-#endif
-               seq_printf(p, " %14s", irq_desc[i].chip->typename);
-
-               seq_printf(p, "  %s", action->name);
-               for (action=action->next; action; action = action->next)
-                       seq_printf(p, ", %s", action->name);
-               seq_putc(p, '\n');
-skip:
-               spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-       } else if (i == NR_IRQS) {
-               seq_printf(p, "NMI: ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
-               seq_putc(p, '\n');
-#ifdef CONFIG_X86_LOCAL_APIC
-               seq_printf(p, "LOC: ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs);
-               seq_putc(p, '\n');
-#endif
-               seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
-               seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-#endif
-#endif
-       }
-       return 0;
-}
-
-/*
- * do_IRQ handles all normal device IRQ's (the special
- * SMP cross-CPU interrupts have their own specific
- * handlers).
- */
-asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
-{      
-       /* high bit used in ret_from_ code  */
-       unsigned irq = ~regs->orig_rax;
-
-       if (unlikely(irq >= NR_IRQS)) {
-               printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
-                                       __FUNCTION__, irq);
-               BUG();
-       }
-
-       exit_idle();
-       irq_enter();
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
-       stack_overflow_check(regs);
-#endif
-       __do_IRQ(irq, regs);
-       irq_exit();
-
-       return 1;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-void fixup_irqs(cpumask_t map)
-{
-       unsigned int irq;
-       static int warned;
-
-       for (irq = 0; irq < NR_IRQS; irq++) {
-               cpumask_t mask;
-               if (irq == 2)
-                       continue;
-
-               cpus_and(mask, irq_desc[irq].affinity, map);
-               if (any_online_cpu(mask) == NR_CPUS) {
-                       printk("Breaking affinity for irq %i\n", irq);
-                       mask = map;
-               }
-               if (irq_desc[irq].chip->set_affinity)
-                       irq_desc[irq].chip->set_affinity(irq, mask);
-               else if (irq_desc[irq].action && !(warned++))
-                       printk("Cannot set affinity for irq %i\n", irq);
-       }
-
-       /* That doesn't seem sufficient.  Give it 1ms. */
-       local_irq_enable();
-       mdelay(1);
-       local_irq_disable();
-}
-#endif
-
-extern void call_softirq(void);
-
-asmlinkage void do_softirq(void)
-{
-       __u32 pending;
-       unsigned long flags;
-
-       if (in_interrupt())
-               return;
-
-       local_irq_save(flags);
-       pending = local_softirq_pending();
-       /* Switch to interrupt stack */
-       if (pending) {
-               call_softirq();
-               WARN_ON_ONCE(softirq_count());
-       }
-       local_irq_restore(flags);
-}
-EXPORT_SYMBOL(do_softirq);
-
-#ifndef CONFIG_X86_LOCAL_APIC
-/*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
- */
-void ack_bad_irq(unsigned int irq)
-{
-        printk("unexpected IRQ trap at vector %02x\n", irq);
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/ldt-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/ldt-xen.c
deleted file mode 100644 (file)
index 6efbb64..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * linux/arch/x86_64/kernel/ldt.c
- *
- * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- * Copyright (C) 2002 Andi Kleen
- * 
- * This handles calls from both 32bit and 64bit mode.
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/vmalloc.h>
-#include <linux/slab.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/ldt.h>
-#include <asm/desc.h>
-#include <asm/proto.h>
-#include <asm/pgalloc.h>
-
-#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
-static void flush_ldt(void *null)
-{
-       if (current->active_mm)
-               load_LDT(&current->active_mm->context);
-}
-#endif
-
-static int alloc_ldt(mm_context_t *pc, unsigned mincount, int reload)
-{
-       void *oldldt;
-       void *newldt;
-       unsigned oldsize;
-
-       if (mincount <= (unsigned)pc->size)
-               return 0;
-       oldsize = pc->size;
-       mincount = (mincount+511)&(~511);
-       if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-               newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-       else
-               newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
-
-       if (!newldt)
-               return -ENOMEM;
-
-       if (oldsize)
-               memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-       oldldt = pc->ldt;
-       memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-       wmb();
-       pc->ldt = newldt;
-       wmb();
-       pc->size = mincount;
-       wmb();
-       if (reload) {
-#ifdef CONFIG_SMP
-               cpumask_t mask;
-
-               preempt_disable();
-#endif
-               make_pages_readonly(
-                       pc->ldt,
-                       (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               load_LDT(pc);
-#ifdef CONFIG_SMP
-               mask = cpumask_of_cpu(smp_processor_id());
-               if (!cpus_equal(current->mm->cpu_vm_mask, mask))
-                       smp_call_function(flush_ldt, NULL, 1, 1);
-               preempt_enable();
-#endif
-       }
-       if (oldsize) {
-               make_pages_writable(
-                       oldldt,
-                       (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-                       vfree(oldldt);
-               else
-                       kfree(oldldt);
-       }
-       return 0;
-}
-
-static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
-{
-       int err = alloc_ldt(new, old->size, 0);
-       if (err < 0)
-               return err;
-       memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
-       make_pages_readonly(
-               new->ldt,
-               (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-               XENFEAT_writable_descriptor_tables);
-       return 0;
-}
-
-/*
- * we do not have to muck with descriptors here, that is
- * done in switch_mm() as needed.
- */
-int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-{
-       struct mm_struct * old_mm;
-       int retval = 0;
-
-       memset(&mm->context, 0, sizeof(mm->context));
-       init_MUTEX(&mm->context.sem);
-       old_mm = current->mm;
-       if (old_mm && old_mm->context.size > 0) {
-               down(&old_mm->context.sem);
-               retval = copy_ldt(&mm->context, &old_mm->context);
-               up(&old_mm->context.sem);
-       }
-       if (retval == 0) {
-               spin_lock(&mm_unpinned_lock);
-               list_add(&mm->context.unpinned, &mm_unpinned);
-               spin_unlock(&mm_unpinned_lock);
-       }
-       return retval;
-}
-
-/*
- * 
- * Don't touch the LDT register - we're already in the next thread.
- */
-void destroy_context(struct mm_struct *mm)
-{
-       if (mm->context.size) {
-               if (mm == current->active_mm)
-                       clear_LDT();
-               make_pages_writable(
-                       mm->context.ldt,
-                       (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-                       XENFEAT_writable_descriptor_tables);
-               if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-                       vfree(mm->context.ldt);
-               else
-                       kfree(mm->context.ldt);
-               mm->context.size = 0;
-       }
-       if (!mm->context.pinned) {
-               spin_lock(&mm_unpinned_lock);
-               list_del(&mm->context.unpinned);
-               spin_unlock(&mm_unpinned_lock);
-       }
-}
-
-static int read_ldt(void __user * ptr, unsigned long bytecount)
-{
-       int err;
-       unsigned long size;
-       struct mm_struct * mm = current->mm;
-
-       if (!mm->context.size)
-               return 0;
-       if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
-               bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
-
-       down(&mm->context.sem);
-       size = mm->context.size*LDT_ENTRY_SIZE;
-       if (size > bytecount)
-               size = bytecount;
-
-       err = 0;
-       if (copy_to_user(ptr, mm->context.ldt, size))
-               err = -EFAULT;
-       up(&mm->context.sem);
-       if (err < 0)
-               goto error_return;
-       if (size != bytecount) {
-               /* zero-fill the rest */
-               if (clear_user(ptr+size, bytecount-size) != 0) {
-                       err = -EFAULT;
-                       goto error_return;
-               }
-       }
-       return bytecount;
-error_return:
-       return err;
-}
-
-static int read_default_ldt(void __user * ptr, unsigned long bytecount)
-{
-       /* Arbitrary number */ 
-       /* x86-64 default LDT is all zeros */
-       if (bytecount > 128) 
-               bytecount = 128;        
-       if (clear_user(ptr, bytecount))
-               return -EFAULT;
-       return bytecount; 
-}
-
-static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode)
-{
-       struct task_struct *me = current;
-       struct mm_struct * mm = me->mm;
-       __u32 entry_1, entry_2, *lp;
-       unsigned long mach_lp;
-       int error;
-       struct user_desc ldt_info;
-
-       error = -EINVAL;
-
-       if (bytecount != sizeof(ldt_info))
-               goto out;
-       error = -EFAULT;        
-       if (copy_from_user(&ldt_info, ptr, bytecount))
-               goto out;
-
-       error = -EINVAL;
-       if (ldt_info.entry_number >= LDT_ENTRIES)
-               goto out;
-       if (ldt_info.contents == 3) {
-               if (oldmode)
-                       goto out;
-               if (ldt_info.seg_not_present == 0)
-                       goto out;
-       }
-
-       down(&mm->context.sem);
-       if (ldt_info.entry_number >= (unsigned)mm->context.size) {
-               error = alloc_ldt(&current->mm->context, ldt_info.entry_number+1, 1);
-               if (error < 0)
-                       goto out_unlock;
-       }
-
-       lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt);
-       mach_lp = arbitrary_virt_to_machine(lp);
-
-       /* Allow LDTs to be cleared by the user. */
-       if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-               if (oldmode || LDT_empty(&ldt_info)) {
-                       entry_1 = 0;
-                       entry_2 = 0;
-                       goto install;
-               }
-       }
-
-       entry_1 = LDT_entry_a(&ldt_info);
-       entry_2 = LDT_entry_b(&ldt_info);
-       if (oldmode)
-               entry_2 &= ~(1 << 20);
-
-       /* Install the new entry ...  */
-install:
-       error = HYPERVISOR_update_descriptor(mach_lp, (unsigned long)((entry_1 | (unsigned long) entry_2 << 32)));
-
-out_unlock:
-       up(&mm->context.sem);
-out:
-       return error;
-}
-
-asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
-{
-       int ret = -ENOSYS;
-
-       switch (func) {
-       case 0:
-               ret = read_ldt(ptr, bytecount);
-               break;
-       case 1:
-               ret = write_ldt(ptr, bytecount, 1);
-               break;
-       case 2:
-               ret = read_default_ldt(ptr, bytecount);
-               break;
-       case 0x11:
-               ret = write_ldt(ptr, bytecount, 0);
-               break;
-       }
-       return ret;
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/machine_kexec.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/machine_kexec.c
deleted file mode 100644 (file)
index f1d9583..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * machine_kexec.c - handle transition of Linux booting another kernel
- * Copyright (C) 2002-2005 Eric Biederman  <ebiederm@xmission.com>
- *
- * This source code is licensed under the GNU General Public License,
- * Version 2.  See the file COPYING for more details.
- */
-
-#include <linux/mm.h>
-#include <linux/kexec.h>
-#include <linux/string.h>
-#include <linux/reboot.h>
-#include <asm/pgtable.h>
-#include <asm/tlbflush.h>
-#include <asm/mmu_context.h>
-#include <asm/io.h>
-
-#define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
-static u64 kexec_pgd[512] PAGE_ALIGNED;
-static u64 kexec_pud0[512] PAGE_ALIGNED;
-static u64 kexec_pmd0[512] PAGE_ALIGNED;
-static u64 kexec_pte0[512] PAGE_ALIGNED;
-static u64 kexec_pud1[512] PAGE_ALIGNED;
-static u64 kexec_pmd1[512] PAGE_ALIGNED;
-static u64 kexec_pte1[512] PAGE_ALIGNED;
-
-#ifdef CONFIG_XEN
-
-/* In the case of Xen, override hypervisor functions to be able to create
- * a regular identity mapping page table...
- */
-
-#include <xen/interface/kexec.h>
-#include <xen/interface/memory.h>
-
-#define x__pmd(x) ((pmd_t) { (x) } )
-#define x__pud(x) ((pud_t) { (x) } )
-#define x__pgd(x) ((pgd_t) { (x) } )
-
-#define x_pmd_val(x)   ((x).pmd)
-#define x_pud_val(x)   ((x).pud)
-#define x_pgd_val(x)   ((x).pgd)
-
-static inline void x_set_pmd(pmd_t *dst, pmd_t val)
-{
-       x_pmd_val(*dst) = x_pmd_val(val);
-}
-
-static inline void x_set_pud(pud_t *dst, pud_t val)
-{
-       x_pud_val(*dst) = phys_to_machine(x_pud_val(val));
-}
-
-static inline void x_pud_clear (pud_t *pud)
-{
-       x_pud_val(*pud) = 0;
-}
-
-static inline void x_set_pgd(pgd_t *dst, pgd_t val)
-{
-       x_pgd_val(*dst) = phys_to_machine(x_pgd_val(val));
-}
-
-static inline void x_pgd_clear (pgd_t * pgd)
-{
-       x_pgd_val(*pgd) = 0;
-}
-
-#define X__PAGE_KERNEL_LARGE_EXEC \
-         _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_PSE
-#define X_KERNPG_TABLE _PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY
-
-#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-
-#if PAGES_NR > KEXEC_XEN_NO_PAGES
-#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-#endif
-
-#if PA_CONTROL_PAGE != 0
-#error PA_CONTROL_PAGE is non zero - Xen support will break
-#endif
-
-void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-{
-       void *control_page;
-       void *table_page;
-
-       memset(xki->page_list, 0, sizeof(xki->page_list));
-
-       control_page = page_address(image->control_code_page) + PAGE_SIZE;
-       memcpy(control_page, relocate_kernel, PAGE_SIZE);
-
-       table_page = page_address(image->control_code_page);
-
-       xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-       xki->page_list[PA_TABLE_PAGE] = __ma(table_page);
-
-       xki->page_list[PA_PGD] = __ma(kexec_pgd);
-       xki->page_list[PA_PUD_0] = __ma(kexec_pud0);
-       xki->page_list[PA_PUD_1] = __ma(kexec_pud1);
-       xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-       xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-       xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-       xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-}
-
-#else /* CONFIG_XEN */
-
-#define x__pmd(x) __pmd(x)
-#define x__pud(x) __pud(x)
-#define x__pgd(x) __pgd(x)
-
-#define x_set_pmd(x, y) set_pmd(x, y)
-#define x_set_pud(x, y) set_pud(x, y)
-#define x_set_pgd(x, y) set_pgd(x, y)
-
-#define x_pud_clear(x) pud_clear(x)
-#define x_pgd_clear(x) pgd_clear(x)
-
-#define X__PAGE_KERNEL_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
-#define X_KERNPG_TABLE _KERNPG_TABLE
-
-#endif /* CONFIG_XEN */
-
-static void init_level2_page(pmd_t *level2p, unsigned long addr)
-{
-       unsigned long end_addr;
-
-       addr &= PAGE_MASK;
-       end_addr = addr + PUD_SIZE;
-       while (addr < end_addr) {
-               x_set_pmd(level2p++, x__pmd(addr | X__PAGE_KERNEL_LARGE_EXEC));
-               addr += PMD_SIZE;
-       }
-}
-
-static int init_level3_page(struct kimage *image, pud_t *level3p,
-                               unsigned long addr, unsigned long last_addr)
-{
-       unsigned long end_addr;
-       int result;
-
-       result = 0;
-       addr &= PAGE_MASK;
-       end_addr = addr + PGDIR_SIZE;
-       while ((addr < last_addr) && (addr < end_addr)) {
-               struct page *page;
-               pmd_t *level2p;
-
-               page = kimage_alloc_control_pages(image, 0);
-               if (!page) {
-                       result = -ENOMEM;
-                       goto out;
-               }
-               level2p = (pmd_t *)page_address(page);
-               init_level2_page(level2p, addr);
-               x_set_pud(level3p++, x__pud(__pa(level2p) | X_KERNPG_TABLE));
-               addr += PUD_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
-               x_pud_clear(level3p++);
-               addr += PUD_SIZE;
-       }
-out:
-       return result;
-}
-
-
-static int init_level4_page(struct kimage *image, pgd_t *level4p,
-                               unsigned long addr, unsigned long last_addr)
-{
-       unsigned long end_addr;
-       int result;
-
-       result = 0;
-       addr &= PAGE_MASK;
-       end_addr = addr + (PTRS_PER_PGD * PGDIR_SIZE);
-       while ((addr < last_addr) && (addr < end_addr)) {
-               struct page *page;
-               pud_t *level3p;
-
-               page = kimage_alloc_control_pages(image, 0);
-               if (!page) {
-                       result = -ENOMEM;
-                       goto out;
-               }
-               level3p = (pud_t *)page_address(page);
-               result = init_level3_page(image, level3p, addr, last_addr);
-               if (result) {
-                       goto out;
-               }
-               x_set_pgd(level4p++, x__pgd(__pa(level3p) | X_KERNPG_TABLE));
-               addr += PGDIR_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
-               x_pgd_clear(level4p++);
-               addr += PGDIR_SIZE;
-       }
-out:
-       return result;
-}
-
-
-static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
-{
-       pgd_t *level4p;
-       unsigned long x_end_pfn = end_pfn;
-
-#ifdef CONFIG_XEN
-       x_end_pfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-#endif
-
-       level4p = (pgd_t *)__va(start_pgtable);
-       return init_level4_page(image, level4p, 0, x_end_pfn << PAGE_SHIFT);
-}
-
-int machine_kexec_prepare(struct kimage *image)
-{
-       unsigned long start_pgtable;
-       int result;
-
-       /* Calculate the offsets */
-       start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
-
-       /* Setup the identity mapped 64bit page table */
-       result = init_pgtable(image, start_pgtable);
-       if (result)
-               return result;
-
-       return 0;
-}
-
-void machine_kexec_cleanup(struct kimage *image)
-{
-       return;
-}
-
-#ifndef CONFIG_XEN
-/*
- * Do not allocate memory (or fail in any way) in machine_kexec().
- * We are past the point of no return, committed to rebooting now.
- */
-NORET_TYPE void machine_kexec(struct kimage *image)
-{
-       unsigned long page_list[PAGES_NR];
-       void *control_page;
-
-       /* Interrupts aren't acceptable while we reboot */
-       local_irq_disable();
-
-       control_page = page_address(image->control_code_page) + PAGE_SIZE;
-       memcpy(control_page, relocate_kernel, PAGE_SIZE);
-
-       page_list[PA_CONTROL_PAGE] = __pa(control_page);
-       page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel;
-       page_list[PA_PGD] = __pa(kexec_pgd);
-       page_list[VA_PGD] = (unsigned long)kexec_pgd;
-       page_list[PA_PUD_0] = __pa(kexec_pud0);
-       page_list[VA_PUD_0] = (unsigned long)kexec_pud0;
-       page_list[PA_PMD_0] = __pa(kexec_pmd0);
-       page_list[VA_PMD_0] = (unsigned long)kexec_pmd0;
-       page_list[PA_PTE_0] = __pa(kexec_pte0);
-       page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-       page_list[PA_PUD_1] = __pa(kexec_pud1);
-       page_list[VA_PUD_1] = (unsigned long)kexec_pud1;
-       page_list[PA_PMD_1] = __pa(kexec_pmd1);
-       page_list[VA_PMD_1] = (unsigned long)kexec_pmd1;
-       page_list[PA_PTE_1] = __pa(kexec_pte1);
-       page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
-
-       page_list[PA_TABLE_PAGE] =
-         (unsigned long)__pa(page_address(image->control_code_page));
-
-       relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-                       image->start);
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/mpparse-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/mpparse-xen.c
deleted file mode 100644 (file)
index 5ae1c68..0000000
+++ /dev/null
@@ -1,1011 +0,0 @@
-/*
- *     Intel Multiprocessor Specification 1.1 and 1.4
- *     compliant MP-table parsing routines.
- *
- *     (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
- *     (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
- *
- *     Fixes
- *             Erich Boleyn    :       MP v1.4 and additional changes.
- *             Alan Cox        :       Added EBDA scanning
- *             Ingo Molnar     :       various cleanups and rewrites
- *             Maciej W. Rozycki:      Bits for default MP configurations
- *             Paul Diefenbaugh:       Added full ACPI support
- */
-
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/bootmem.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel_stat.h>
-#include <linux/mc146818rtc.h>
-#include <linux/acpi.h>
-#include <linux/module.h>
-
-#include <asm/smp.h>
-#include <asm/mtrr.h>
-#include <asm/mpspec.h>
-#include <asm/pgalloc.h>
-#include <asm/io_apic.h>
-#include <asm/proto.h>
-#include <asm/acpi.h>
-
-/* Have we found an MP table */
-int smp_found_config;
-unsigned int __initdata maxcpus = NR_CPUS;
-
-int acpi_found_madt;
-
-/*
- * Various Linux-internal data structures created from the
- * MP-table.
- */
-unsigned char apic_version [MAX_APICS];
-unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-
-static int mp_current_pci_id = 0;
-/* I/O APIC entries */
-struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
-
-/* # of MP IRQ source entries */
-struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
-
-/* MP IRQ source entries */
-int mp_irq_entries;
-
-int nr_ioapics;
-int pic_mode;
-unsigned long mp_lapic_addr = 0;
-
-
-
-/* Processor that is doing the boot up */
-unsigned int boot_cpu_id = -1U;
-/* Internal processor count */
-unsigned int num_processors __initdata = 0;
-
-unsigned disabled_cpus __initdata;
-
-/* Bitmask of physically existing CPUs */
-physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE;
-
-/* ACPI MADT entry parsing functions */
-#ifdef CONFIG_ACPI
-extern struct acpi_boot_flags acpi_boot;
-#ifdef CONFIG_X86_LOCAL_APIC
-extern int acpi_parse_lapic (acpi_table_entry_header *header);
-extern int acpi_parse_lapic_addr_ovr (acpi_table_entry_header *header);
-extern int acpi_parse_lapic_nmi (acpi_table_entry_header *header);
-#endif /*CONFIG_X86_LOCAL_APIC*/
-#ifdef CONFIG_X86_IO_APIC
-extern int acpi_parse_ioapic (acpi_table_entry_header *header);
-#endif /*CONFIG_X86_IO_APIC*/
-#endif /*CONFIG_ACPI*/
-
-u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-
-
-/*
- * Intel MP BIOS table parsing routines:
- */
-
-/*
- * Checksum an MP configuration block.
- */
-
-static int __init mpf_checksum(unsigned char *mp, int len)
-{
-       int sum = 0;
-
-       while (len--)
-               sum += *mp++;
-
-       return sum & 0xFF;
-}
-
-#ifndef CONFIG_XEN
-static void __cpuinit MP_processor_info (struct mpc_config_processor *m)
-{
-       int cpu;
-       unsigned char ver;
-       cpumask_t tmp_map;
-
-       if (!(m->mpc_cpuflag & CPU_ENABLED)) {
-               disabled_cpus++;
-               return;
-       }
-
-       printk(KERN_INFO "Processor #%d %d:%d APIC version %d\n",
-               m->mpc_apicid,
-              (m->mpc_cpufeature & CPU_FAMILY_MASK)>>8,
-              (m->mpc_cpufeature & CPU_MODEL_MASK)>>4,
-               m->mpc_apicver);
-
-       if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-               Dprintk("    Bootup CPU\n");
-               boot_cpu_id = m->mpc_apicid;
-       }
-       if (num_processors >= NR_CPUS) {
-               printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
-                       " Processor ignored.\n", NR_CPUS);
-               return;
-       }
-
-       num_processors++;
-       cpus_complement(tmp_map, cpu_present_map);
-       cpu = first_cpu(tmp_map);
-
-#if MAX_APICS < 255    
-       if ((int)m->mpc_apicid > MAX_APICS) {
-               printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
-                       m->mpc_apicid, MAX_APICS);
-               return;
-       }
-#endif
-       ver = m->mpc_apicver;
-
-       physid_set(m->mpc_apicid, phys_cpu_present_map);
-       /*
-        * Validate version
-        */
-       if (ver == 0x0) {
-               printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid);
-               ver = 0x10;
-       }
-       apic_version[m->mpc_apicid] = ver;
-       if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-               /*
-                * bios_cpu_apicid is required to have processors listed
-                * in same order as logical cpu numbers. Hence the first
-                * entry is BSP, and so on.
-                */
-               cpu = 0;
-       }
-       bios_cpu_apicid[cpu] = m->mpc_apicid;
-       x86_cpu_to_apicid[cpu] = m->mpc_apicid;
-
-       cpu_set(cpu, cpu_possible_map);
-       cpu_set(cpu, cpu_present_map);
-}
-#else
-static void __cpuinit MP_processor_info (struct mpc_config_processor *m)
-{
-       num_processors++;
-}
-#endif /* CONFIG_XEN */
-
-static void __init MP_bus_info (struct mpc_config_bus *m)
-{
-       char str[7];
-
-       memcpy(str, m->mpc_bustype, 6);
-       str[6] = 0;
-       Dprintk("Bus #%d is %s\n", m->mpc_busid, str);
-
-       if (strncmp(str, "ISA", 3) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
-       } else if (strncmp(str, "EISA", 4) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
-       } else if (strncmp(str, "PCI", 3) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
-               mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
-               mp_current_pci_id++;
-       } else if (strncmp(str, "MCA", 3) == 0) {
-               mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
-       } else {
-               printk(KERN_ERR "Unknown bustype %s\n", str);
-       }
-}
-
-static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
-{
-       if (!(m->mpc_flags & MPC_APIC_USABLE))
-               return;
-
-       printk("I/O APIC #%d Version %d at 0x%X.\n",
-               m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
-       if (nr_ioapics >= MAX_IO_APICS) {
-               printk(KERN_ERR "Max # of I/O APICs (%d) exceeded (found %d).\n",
-                       MAX_IO_APICS, nr_ioapics);
-               panic("Recompile kernel with bigger MAX_IO_APICS!.\n");
-       }
-       if (!m->mpc_apicaddr) {
-               printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
-                       " found in MP table, skipping!\n");
-               return;
-       }
-       mp_ioapics[nr_ioapics] = *m;
-       nr_ioapics++;
-}
-
-static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
-{
-       mp_irqs [mp_irq_entries] = *m;
-       Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
-               " IRQ %02x, APIC ID %x, APIC INT %02x\n",
-                       m->mpc_irqtype, m->mpc_irqflag & 3,
-                       (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
-                       m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
-       if (++mp_irq_entries >= MAX_IRQ_SOURCES)
-               panic("Max # of irq sources exceeded!!\n");
-}
-
-static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
-{
-       Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
-               " IRQ %02x, APIC ID %x, APIC LINT %02x\n",
-                       m->mpc_irqtype, m->mpc_irqflag & 3,
-                       (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid,
-                       m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
-       /*
-        * Well it seems all SMP boards in existence
-        * use ExtINT/LVT1 == LINT0 and
-        * NMI/LVT2 == LINT1 - the following check
-        * will show us if this assumptions is false.
-        * Until then we do not have to add baggage.
-        */
-       if ((m->mpc_irqtype == mp_ExtINT) &&
-               (m->mpc_destapiclint != 0))
-                       BUG();
-       if ((m->mpc_irqtype == mp_NMI) &&
-               (m->mpc_destapiclint != 1))
-                       BUG();
-}
-
-/*
- * Read/parse the MPC
- */
-
-static int __init smp_read_mpc(struct mp_config_table *mpc)
-{
-       char str[16];
-       int count=sizeof(*mpc);
-       unsigned char *mpt=((unsigned char *)mpc)+count;
-
-       if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-               printk("SMP mptable: bad signature [%c%c%c%c]!\n",
-                       mpc->mpc_signature[0],
-                       mpc->mpc_signature[1],
-                       mpc->mpc_signature[2],
-                       mpc->mpc_signature[3]);
-               return 0;
-       }
-       if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-               printk("SMP mptable: checksum error!\n");
-               return 0;
-       }
-       if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
-               printk(KERN_ERR "SMP mptable: bad table version (%d)!!\n",
-                       mpc->mpc_spec);
-               return 0;
-       }
-       if (!mpc->mpc_lapic) {
-               printk(KERN_ERR "SMP mptable: null local APIC address!\n");
-               return 0;
-       }
-       memcpy(str,mpc->mpc_oem,8);
-       str[8]=0;
-       printk(KERN_INFO "OEM ID: %s ",str);
-
-       memcpy(str,mpc->mpc_productid,12);
-       str[12]=0;
-       printk("Product ID: %s ",str);
-
-       printk("APIC at: 0x%X\n",mpc->mpc_lapic);
-
-       /* save the local APIC address, it might be non-default */
-       if (!acpi_lapic)
-       mp_lapic_addr = mpc->mpc_lapic;
-
-       /*
-        *      Now process the configuration blocks.
-        */
-       while (count < mpc->mpc_length) {
-               switch(*mpt) {
-                       case MP_PROCESSOR:
-                       {
-                               struct mpc_config_processor *m=
-                                       (struct mpc_config_processor *)mpt;
-                               if (!acpi_lapic)
-                               MP_processor_info(m);
-                               mpt += sizeof(*m);
-                               count += sizeof(*m);
-                               break;
-                       }
-                       case MP_BUS:
-                       {
-                               struct mpc_config_bus *m=
-                                       (struct mpc_config_bus *)mpt;
-                               MP_bus_info(m);
-                               mpt += sizeof(*m);
-                               count += sizeof(*m);
-                               break;
-                       }
-                       case MP_IOAPIC:
-                       {
-                               struct mpc_config_ioapic *m=
-                                       (struct mpc_config_ioapic *)mpt;
-                               MP_ioapic_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-                       case MP_INTSRC:
-                       {
-                               struct mpc_config_intsrc *m=
-                                       (struct mpc_config_intsrc *)mpt;
-
-                               MP_intsrc_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-                       case MP_LINTSRC:
-                       {
-                               struct mpc_config_lintsrc *m=
-                                       (struct mpc_config_lintsrc *)mpt;
-                               MP_lintsrc_info(m);
-                               mpt+=sizeof(*m);
-                               count+=sizeof(*m);
-                               break;
-                       }
-               }
-       }
-       clustered_apic_check();
-       if (!num_processors)
-               printk(KERN_ERR "SMP mptable: no processors registered!\n");
-       return num_processors;
-}
-
-static int __init ELCR_trigger(unsigned int irq)
-{
-       unsigned int port;
-
-       port = 0x4d0 + (irq >> 3);
-       return (inb(port) >> (irq & 7)) & 1;
-}
-
-static void __init construct_default_ioirq_mptable(int mpc_default_type)
-{
-       struct mpc_config_intsrc intsrc;
-       int i;
-       int ELCR_fallback = 0;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqflag = 0;                 /* conforming */
-       intsrc.mpc_srcbus = 0;
-       intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid;
-
-       intsrc.mpc_irqtype = mp_INT;
-
-       /*
-        *  If true, we have an ISA/PCI system with no IRQ entries
-        *  in the MP table. To prevent the PCI interrupts from being set up
-        *  incorrectly, we try to use the ELCR. The sanity check to see if
-        *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
-        *  never be level sensitive, so we simply see if the ELCR agrees.
-        *  If it does, we assume it's valid.
-        */
-       if (mpc_default_type == 5) {
-               printk(KERN_INFO "ISA/PCI bus type with no IRQ information... falling back to ELCR\n");
-
-               if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13))
-                       printk(KERN_ERR "ELCR contains invalid data... not using ELCR\n");
-               else {
-                       printk(KERN_INFO "Using ELCR to identify PCI interrupts\n");
-                       ELCR_fallback = 1;
-               }
-       }
-
-       for (i = 0; i < 16; i++) {
-               switch (mpc_default_type) {
-               case 2:
-                       if (i == 0 || i == 13)
-                               continue;       /* IRQ0 & IRQ13 not connected */
-                       /* fall through */
-               default:
-                       if (i == 2)
-                               continue;       /* IRQ2 is never connected */
-               }
-
-               if (ELCR_fallback) {
-                       /*
-                        *  If the ELCR indicates a level-sensitive interrupt, we
-                        *  copy that information over to the MP table in the
-                        *  irqflag field (level sensitive, active high polarity).
-                        */
-                       if (ELCR_trigger(i))
-                               intsrc.mpc_irqflag = 13;
-                       else
-                               intsrc.mpc_irqflag = 0;
-               }
-
-               intsrc.mpc_srcbusirq = i;
-               intsrc.mpc_dstirq = i ? i : 2;          /* IRQ0 to INTIN2 */
-               MP_intsrc_info(&intsrc);
-       }
-
-       intsrc.mpc_irqtype = mp_ExtINT;
-       intsrc.mpc_srcbusirq = 0;
-       intsrc.mpc_dstirq = 0;                          /* 8259A to INTIN0 */
-       MP_intsrc_info(&intsrc);
-}
-
-static inline void __init construct_default_ISA_mptable(int mpc_default_type)
-{
-       struct mpc_config_processor processor;
-       struct mpc_config_bus bus;
-       struct mpc_config_ioapic ioapic;
-       struct mpc_config_lintsrc lintsrc;
-       int linttypes[2] = { mp_ExtINT, mp_NMI };
-       int i;
-
-       /*
-        * local APIC has default address
-        */
-       mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-
-       /*
-        * 2 CPUs, numbered 0 & 1.
-        */
-       processor.mpc_type = MP_PROCESSOR;
-       /* Either an integrated APIC or a discrete 82489DX. */
-       processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-       processor.mpc_cpuflag = CPU_ENABLED;
-       processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
-                                  (boot_cpu_data.x86_model << 4) |
-                                  boot_cpu_data.x86_mask;
-       processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-       processor.mpc_reserved[0] = 0;
-       processor.mpc_reserved[1] = 0;
-       for (i = 0; i < 2; i++) {
-               processor.mpc_apicid = i;
-               MP_processor_info(&processor);
-       }
-
-       bus.mpc_type = MP_BUS;
-       bus.mpc_busid = 0;
-       switch (mpc_default_type) {
-               default:
-                       printk(KERN_ERR "???\nUnknown standard configuration %d\n",
-                               mpc_default_type);
-                       /* fall through */
-               case 1:
-               case 5:
-                       memcpy(bus.mpc_bustype, "ISA   ", 6);
-                       break;
-               case 2:
-               case 6:
-               case 3:
-                       memcpy(bus.mpc_bustype, "EISA  ", 6);
-                       break;
-               case 4:
-               case 7:
-                       memcpy(bus.mpc_bustype, "MCA   ", 6);
-       }
-       MP_bus_info(&bus);
-       if (mpc_default_type > 4) {
-               bus.mpc_busid = 1;
-               memcpy(bus.mpc_bustype, "PCI   ", 6);
-               MP_bus_info(&bus);
-       }
-
-       ioapic.mpc_type = MP_IOAPIC;
-       ioapic.mpc_apicid = 2;
-       ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-       ioapic.mpc_flags = MPC_APIC_USABLE;
-       ioapic.mpc_apicaddr = 0xFEC00000;
-       MP_ioapic_info(&ioapic);
-
-       /*
-        * We set up most of the low 16 IO-APIC pins according to MPS rules.
-        */
-       construct_default_ioirq_mptable(mpc_default_type);
-
-       lintsrc.mpc_type = MP_LINTSRC;
-       lintsrc.mpc_irqflag = 0;                /* conforming */
-       lintsrc.mpc_srcbusid = 0;
-       lintsrc.mpc_srcbusirq = 0;
-       lintsrc.mpc_destapic = MP_APIC_ALL;
-       for (i = 0; i < 2; i++) {
-               lintsrc.mpc_irqtype = linttypes[i];
-               lintsrc.mpc_destapiclint = i;
-               MP_lintsrc_info(&lintsrc);
-       }
-}
-
-static struct intel_mp_floating *mpf_found;
-
-/*
- * Scan the memory blocks for an SMP configuration block.
- */
-void __init get_smp_config (void)
-{
-       struct intel_mp_floating *mpf = mpf_found;
-
-       /*
-        * ACPI supports both logical (e.g. Hyper-Threading) and physical 
-        * processors, where MPS only supports physical.
-        */
-       if (acpi_lapic && acpi_ioapic) {
-               printk(KERN_INFO "Using ACPI (MADT) for SMP configuration information\n");
-               return;
-       }
-       else if (acpi_lapic)
-               printk(KERN_INFO "Using ACPI for processor (LAPIC) configuration information\n");
-
-       printk("Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
-       if (mpf->mpf_feature2 & (1<<7)) {
-               printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
-               pic_mode = 1;
-       } else {
-               printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
-               pic_mode = 0;
-       }
-
-       /*
-        * Now see if we need to read further.
-        */
-       if (mpf->mpf_feature1 != 0) {
-
-               printk(KERN_INFO "Default MP configuration #%d\n", mpf->mpf_feature1);
-               construct_default_ISA_mptable(mpf->mpf_feature1);
-
-       } else if (mpf->mpf_physptr) {
-
-               /*
-                * Read the physical hardware table.  Anything here will
-                * override the defaults.
-                */
-               if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr))) {
-                       smp_found_config = 0;
-                       printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
-                       printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
-                       return;
-               }
-               /*
-                * If there are no explicit MP IRQ entries, then we are
-                * broken.  We set up most of the low 16 IO-APIC pins to
-                * ISA defaults and hope it will work.
-                */
-               if (!mp_irq_entries) {
-                       struct mpc_config_bus bus;
-
-                       printk(KERN_ERR "BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n");
-
-                       bus.mpc_type = MP_BUS;
-                       bus.mpc_busid = 0;
-                       memcpy(bus.mpc_bustype, "ISA   ", 6);
-                       MP_bus_info(&bus);
-
-                       construct_default_ioirq_mptable(0);
-               }
-
-       } else
-               BUG();
-
-       printk(KERN_INFO "Processors: %d\n", num_processors);
-       /*
-        * Only use the first configuration found.
-        */
-}
-
-static int __init smp_scan_config (unsigned long base, unsigned long length)
-{
-       extern void __bad_mpf_size(void); 
-       unsigned int *bp = isa_bus_to_virt(base);
-       struct intel_mp_floating *mpf;
-
-       Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length);
-       if (sizeof(*mpf) != 16)
-               __bad_mpf_size();
-
-       while (length > 0) {
-               mpf = (struct intel_mp_floating *)bp;
-               if ((*bp == SMP_MAGIC_IDENT) &&
-                       (mpf->mpf_length == 1) &&
-                       !mpf_checksum((unsigned char *)bp, 16) &&
-                       ((mpf->mpf_specification == 1)
-                               || (mpf->mpf_specification == 4)) ) {
-
-                       smp_found_config = 1;
-                       mpf_found = mpf;
-                       return 1;
-               }
-               bp += 4;
-               length -= 16;
-       }
-       return 0;
-}
-
-void __init find_intel_smp (void)
-{
-       unsigned int address;
-
-       /*
-        * FIXME: Linux assumes you have 640K of base ram..
-        * this continues the error...
-        *
-        * 1) Scan the bottom 1K for a signature
-        * 2) Scan the top 1K of base RAM
-        * 3) Scan the 64K of bios
-        */
-       if (smp_scan_config(0x0,0x400) ||
-               smp_scan_config(639*0x400,0x400) ||
-                       smp_scan_config(0xF0000,0x10000))
-               return;
-       /*
-        * If it is an SMP machine we should know now, unless the
-        * configuration is in an EISA/MCA bus machine with an
-        * extended bios data area.
-        *
-        * there is a real-mode segmented pointer pointing to the
-        * 4K EBDA area at 0x40E, calculate and scan it here.
-        *
-        * NOTE! There are Linux loaders that will corrupt the EBDA
-        * area, and as such this kind of SMP config may be less
-        * trustworthy, simply because the SMP table may have been
-        * stomped on during early boot. These loaders are buggy and
-        * should be fixed.
-        */
-
-       address = *(unsigned short *)phys_to_virt(0x40E);
-       address <<= 4;
-       if (smp_scan_config(address, 0x1000))
-               return;
-
-       /* If we have come this far, we did not find an MP table  */
-        printk(KERN_INFO "No mptable found.\n");
-}
-
-/*
- * - Intel MP Configuration Table
- */
-void __init find_smp_config (void)
-{
-#ifdef CONFIG_X86_LOCAL_APIC
-       find_intel_smp();
-#endif
-}
-
-
-/* --------------------------------------------------------------------------
-                            ACPI-based MP Configuration
-   -------------------------------------------------------------------------- */
-
-#ifdef CONFIG_ACPI
-
-void __init mp_register_lapic_address (
-       u64                     address)
-{
-#ifndef CONFIG_XEN
-       mp_lapic_addr = (unsigned long) address;
-
-       set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
-
-       if (boot_cpu_id == -1U)
-               boot_cpu_id = GET_APIC_ID(apic_read(APIC_ID));
-
-       Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid);
-#endif
-}
-
-
-void __cpuinit mp_register_lapic (
-       u8                      id, 
-       u8                      enabled)
-{
-       struct mpc_config_processor processor;
-       int                     boot_cpu = 0;
-       
-       if (id >= MAX_APICS) {
-               printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
-                       id, MAX_APICS);
-               return;
-       }
-
-       if (id == boot_cpu_physical_apicid)
-               boot_cpu = 1;
-
-#ifndef CONFIG_XEN
-       processor.mpc_type = MP_PROCESSOR;
-       processor.mpc_apicid = id;
-       processor.mpc_apicver = GET_APIC_VERSION(apic_read(APIC_LVR));
-       processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0);
-       processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0);
-       processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | 
-               (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
-       processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-       processor.mpc_reserved[0] = 0;
-       processor.mpc_reserved[1] = 0;
-#endif
-
-       MP_processor_info(&processor);
-}
-
-#ifdef CONFIG_X86_IO_APIC
-
-#define MP_ISA_BUS             0
-#define MP_MAX_IOAPIC_PIN      127
-
-static struct mp_ioapic_routing {
-       int                     apic_id;
-       int                     gsi_start;
-       int                     gsi_end;
-       u32                     pin_programmed[4];
-} mp_ioapic_routing[MAX_IO_APICS];
-
-
-static int mp_find_ioapic (
-       int                     gsi)
-{
-       int                     i = 0;
-
-       /* Find the IOAPIC that manages this GSI. */
-       for (i = 0; i < nr_ioapics; i++) {
-               if ((gsi >= mp_ioapic_routing[i].gsi_start)
-                       && (gsi <= mp_ioapic_routing[i].gsi_end))
-                       return i;
-       }
-
-       printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
-
-       return -1;
-}
-       
-
-void __init mp_register_ioapic (
-       u8                      id, 
-       u32                     address,
-       u32                     gsi_base)
-{
-       int                     idx = 0;
-
-       if (nr_ioapics >= MAX_IO_APICS) {
-               printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
-                       "(found %d)\n", MAX_IO_APICS, nr_ioapics);
-               panic("Recompile kernel with bigger MAX_IO_APICS!\n");
-       }
-       if (!address) {
-               printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
-                       " found in MADT table, skipping!\n");
-               return;
-       }
-
-       idx = nr_ioapics++;
-
-       mp_ioapics[idx].mpc_type = MP_IOAPIC;
-       mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
-       mp_ioapics[idx].mpc_apicaddr = address;
-
-#ifndef CONFIG_XEN
-       set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-#endif
-       mp_ioapics[idx].mpc_apicid = id;
-       mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx);
-       
-       /* 
-        * Build basic IRQ lookup table to facilitate gsi->io_apic lookups
-        * and to prevent reprogramming of IOAPIC pins (PCI IRQs).
-        */
-       mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid;
-       mp_ioapic_routing[idx].gsi_start = gsi_base;
-       mp_ioapic_routing[idx].gsi_end = gsi_base + 
-               io_apic_get_redir_entries(idx);
-
-       printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
-               "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, 
-               mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr,
-               mp_ioapic_routing[idx].gsi_start,
-               mp_ioapic_routing[idx].gsi_end);
-
-       return;
-}
-
-
-void __init mp_override_legacy_irq (
-       u8                      bus_irq,
-       u8                      polarity, 
-       u8                      trigger, 
-       u32                     gsi)
-{
-       struct mpc_config_intsrc intsrc;
-       int                     ioapic = -1;
-       int                     pin = -1;
-
-       /* 
-        * Convert 'gsi' to 'ioapic.pin'.
-        */
-       ioapic = mp_find_ioapic(gsi);
-       if (ioapic < 0)
-               return;
-       pin = gsi - mp_ioapic_routing[ioapic].gsi_start;
-
-       /*
-        * TBD: This check is for faulty timer entries, where the override
-        *      erroneously sets the trigger to level, resulting in a HUGE 
-        *      increase of timer interrupts!
-        */
-       if ((bus_irq == 0) && (trigger == 3))
-               trigger = 1;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqtype = mp_INT;
-       intsrc.mpc_irqflag = (trigger << 2) | polarity;
-       intsrc.mpc_srcbus = MP_ISA_BUS;
-       intsrc.mpc_srcbusirq = bus_irq;                                /* IRQ */
-       intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;        /* APIC ID */
-       intsrc.mpc_dstirq = pin;                                    /* INTIN# */
-
-       Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n", 
-               intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-               (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-               intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
-
-       mp_irqs[mp_irq_entries] = intsrc;
-       if (++mp_irq_entries == MAX_IRQ_SOURCES)
-               panic("Max # of irq sources exceeded!\n");
-
-       return;
-}
-
-
-void __init mp_config_acpi_legacy_irqs (void)
-{
-       struct mpc_config_intsrc intsrc;
-       int                     i = 0;
-       int                     ioapic = -1;
-
-       /* 
-        * Fabricate the legacy ISA bus (bus #31).
-        */
-       mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
-       Dprintk("Bus #%d is ISA\n", MP_ISA_BUS);
-
-       /* 
-        * Locate the IOAPIC that manages the ISA IRQs (0-15). 
-        */
-       ioapic = mp_find_ioapic(0);
-       if (ioapic < 0)
-               return;
-
-       intsrc.mpc_type = MP_INTSRC;
-       intsrc.mpc_irqflag = 0;                                 /* Conforming */
-       intsrc.mpc_srcbus = MP_ISA_BUS;
-       intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
-
-       /* 
-        * Use the default configuration for the IRQs 0-15.  Unless
-        * overridden by (MADT) interrupt source override entries.
-        */
-       for (i = 0; i < 16; i++) {
-               int idx;
-
-               for (idx = 0; idx < mp_irq_entries; idx++) {
-                       struct mpc_config_intsrc *irq = mp_irqs + idx;
-
-                       /* Do we already have a mapping for this ISA IRQ? */
-                       if (irq->mpc_srcbus == MP_ISA_BUS && irq->mpc_srcbusirq == i)
-                               break;
-
-                       /* Do we already have a mapping for this IOAPIC pin */
-                       if ((irq->mpc_dstapic == intsrc.mpc_dstapic) &&
-                               (irq->mpc_dstirq == i))
-                               break;
-               }
-
-               if (idx != mp_irq_entries) {
-                       printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
-                       continue;                       /* IRQ already used */
-               }
-
-               intsrc.mpc_irqtype = mp_INT;
-               intsrc.mpc_srcbusirq = i;                  /* Identity mapped */
-               intsrc.mpc_dstirq = i;
-
-               Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, "
-                       "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-                       (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-                       intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, 
-                       intsrc.mpc_dstirq);
-
-               mp_irqs[mp_irq_entries] = intsrc;
-               if (++mp_irq_entries == MAX_IRQ_SOURCES)
-                       panic("Max # of irq sources exceeded!\n");
-       }
-
-       return;
-}
-
-#define MAX_GSI_NUM    4096
-
-int mp_register_gsi(u32 gsi, int triggering, int polarity)
-{
-       int                     ioapic = -1;
-       int                     ioapic_pin = 0;
-       int                     idx, bit = 0;
-       static int              pci_irq = 16;
-       /*
-        * Mapping between Global System Interrupts, which
-        * represent all possible interrupts, to the IRQs
-        * assigned to actual devices.
-        */
-       static int              gsi_to_irq[MAX_GSI_NUM];
-
-       if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
-               return gsi;
-
-       /* Don't set up the ACPI SCI because it's already set up */
-       if (acpi_fadt.sci_int == gsi)
-               return gsi;
-
-       ioapic = mp_find_ioapic(gsi);
-       if (ioapic < 0) {
-               printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
-               return gsi;
-       }
-
-       ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_start;
-
-       /* 
-        * Avoid pin reprogramming.  PRTs typically include entries  
-        * with redundant pin->gsi mappings (but unique PCI devices);
-        * we only program the IOAPIC on the first.
-        */
-       bit = ioapic_pin % 32;
-       idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32);
-       if (idx > 3) {
-               printk(KERN_ERR "Invalid reference to IOAPIC pin "
-                       "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, 
-                       ioapic_pin);
-               return gsi;
-       }
-       if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
-               Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n",
-                       mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-               return gsi_to_irq[gsi];
-       }
-
-       mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-
-       if (triggering == ACPI_LEVEL_SENSITIVE) {
-               /*
-                * For PCI devices assign IRQs in order, avoiding gaps
-                * due to unused I/O APIC pins.
-                */
-               int irq = gsi;
-               if (gsi < MAX_GSI_NUM) {
-                       /*
-                        * Retain the VIA chipset work-around (gsi > 15), but
-                        * avoid a problem where the 8254 timer (IRQ0) is setup
-                        * via an override (so it's not on pin 0 of the ioapic),
-                        * and at the same time, the pin 0 interrupt is a PCI
-                        * type.  The gsi > 15 test could cause these two pins
-                        * to be shared as IRQ0, and they are not shareable.
-                        * So test for this condition, and if necessary, avoid
-                        * the pin collision.
-                        */
-                       if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
-                               gsi = pci_irq++;
-                       /*
-                        * Don't assign IRQ used by ACPI SCI
-                        */
-                       if (gsi == acpi_fadt.sci_int)
-                               gsi = pci_irq++;
-                       gsi_to_irq[irq] = gsi;
-               } else {
-                       printk(KERN_ERR "GSI %u is too high\n", gsi);
-                       return gsi;
-               }
-       }
-
-       io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-               triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
-               polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
-       return gsi;
-}
-
-#endif /*CONFIG_X86_IO_APIC*/
-#endif /*CONFIG_ACPI*/
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/pci-swiotlb-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/pci-swiotlb-xen.c
deleted file mode 100644 (file)
index eed643c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Glue code to lib/swiotlb.c */
-
-#include <linux/pci.h>
-#include <linux/cache.h>
-#include <linux/module.h>
-#include <asm/dma-mapping.h>
-#include <asm/proto.h>
-#include <asm/swiotlb.h>
-#include <asm/dma.h>
-
-#if 0
-int swiotlb __read_mostly;
-EXPORT_SYMBOL(swiotlb);
-#endif
-
-struct dma_mapping_ops swiotlb_dma_ops = {
-#if 0
-       .mapping_error = swiotlb_dma_mapping_error,
-       .alloc_coherent = swiotlb_alloc_coherent,
-       .free_coherent = swiotlb_free_coherent,
-       .map_single = swiotlb_map_single,
-       .unmap_single = swiotlb_unmap_single,
-       .sync_single_for_cpu = swiotlb_sync_single_for_cpu,
-       .sync_single_for_device = swiotlb_sync_single_for_device,
-       .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu,
-       .sync_single_range_for_device = swiotlb_sync_single_range_for_device,
-       .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu,
-       .sync_sg_for_device = swiotlb_sync_sg_for_device,
-       .map_sg = swiotlb_map_sg,
-       .unmap_sg = swiotlb_unmap_sg,
-       .dma_supported = NULL,
-#endif
-};
-
-void pci_swiotlb_init(void)
-{
-#if 0
-       /* don't initialize swiotlb if iommu=off (no_iommu=1) */
-       if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN)
-              swiotlb = 1;
-       if (swiotlb_force)
-               swiotlb = 1;
-       if (swiotlb) {
-               printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n");
-               swiotlb_init();
-               dma_ops = &swiotlb_dma_ops;
-       }
-#else
-       swiotlb_init();
-       if (swiotlb) {
-               printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n");
-               dma_ops = &swiotlb_dma_ops;
-       }
-#endif
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c
deleted file mode 100644 (file)
index 41aa70c..0000000
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- *  linux/arch/x86-64/kernel/process.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- * 
- *  X86-64 port
- *     Andi Kleen.
- *
- *     CPU hotplug support - ashok.raj@intel.com
- * 
- *  Jun Nakajima <jun.nakajima@intel.com> 
- *     Modified for Xen
- */
-
-/*
- * This file handles the architecture-dependent parts of process handling..
- */
-
-#include <stdarg.h>
-
-#include <linux/cpu.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/elfcore.h>
-#include <linux/smp.h>
-#include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/module.h>
-#include <linux/a.out.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/ptrace.h>
-#include <linux/utsname.h>
-#include <linux/random.h>
-#include <linux/notifier.h>
-#include <linux/kprobes.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/mmu_context.h>
-#include <asm/pda.h>
-#include <asm/prctl.h>
-#include <asm/kdebug.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/vcpu.h>
-#include <asm/desc.h>
-#include <asm/proto.h>
-#include <asm/hardirq.h>
-#include <asm/ia32.h>
-#include <asm/idle.h>
-
-#include <xen/cpu_hotplug.h>
-
-asmlinkage extern void ret_from_fork(void);
-
-unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
-
-unsigned long boot_option_idle_override = 0;
-EXPORT_SYMBOL(boot_option_idle_override);
-
-/*
- * Powermanagement idle function, if any..
- */
-void (*pm_idle)(void);
-EXPORT_SYMBOL(pm_idle);
-static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
-
-static ATOMIC_NOTIFIER_HEAD(idle_notifier);
-
-void idle_notifier_register(struct notifier_block *n)
-{
-       atomic_notifier_chain_register(&idle_notifier, n);
-}
-EXPORT_SYMBOL_GPL(idle_notifier_register);
-
-void idle_notifier_unregister(struct notifier_block *n)
-{
-       atomic_notifier_chain_unregister(&idle_notifier, n);
-}
-EXPORT_SYMBOL(idle_notifier_unregister);
-
-enum idle_state { CPU_IDLE, CPU_NOT_IDLE };
-static DEFINE_PER_CPU(enum idle_state, idle_state) = CPU_NOT_IDLE;
-
-void enter_idle(void)
-{
-       __get_cpu_var(idle_state) = CPU_IDLE;
-       atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
-}
-
-static void __exit_idle(void)
-{
-       __get_cpu_var(idle_state) = CPU_NOT_IDLE;
-       atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
-}
-
-/* Called from interrupts to signify idle end */
-void exit_idle(void)
-{
-       if (current->pid | read_pda(irqcount))
-               return;
-       __exit_idle();
-}
-
-/*
- * On SMP it's slightly faster (but much more power-consuming!)
- * to poll the ->need_resched flag instead of waiting for the
- * cross-CPU IPI to arrive. Use this option with caution.
- */
-static void poll_idle (void)
-{
-       local_irq_enable();
-
-       asm volatile(
-               "2:"
-               "testl %0,%1;"
-               "rep; nop;"
-               "je 2b;"
-               : :
-               "i" (_TIF_NEED_RESCHED),
-               "m" (current_thread_info()->flags));
-}
-
-static void xen_idle(void)
-{
-       local_irq_disable();
-
-       if (need_resched())
-               local_irq_enable();
-       else {
-               current_thread_info()->status &= ~TS_POLLING;
-               smp_mb__after_clear_bit();
-               safe_halt();
-               current_thread_info()->status |= TS_POLLING;
-       }
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-static inline void play_dead(void)
-{
-       idle_task_exit();
-       local_irq_disable();
-       cpu_clear(smp_processor_id(), cpu_initialized);
-       preempt_enable_no_resched();
-       HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
-       cpu_bringup();
-}
-#else
-static inline void play_dead(void)
-{
-       BUG();
-}
-#endif /* CONFIG_HOTPLUG_CPU */
-
-/*
- * The idle thread. There's no useful work to be
- * done, so just try to conserve power and have a
- * low exit latency (ie sit in a loop waiting for
- * somebody to say that they'd like to reschedule)
- */
-void cpu_idle (void)
-{
-       current_thread_info()->status |= TS_POLLING;
-       /* endless idle loop with no priority at all */
-       while (1) {
-               while (!need_resched()) {
-                       void (*idle)(void);
-
-                       if (__get_cpu_var(cpu_idle_state))
-                               __get_cpu_var(cpu_idle_state) = 0;
-                       rmb();
-                       idle = xen_idle; /* no alternatives */
-                       if (cpu_is_offline(smp_processor_id()))
-                               play_dead();
-                       enter_idle();
-                       idle();
-                       __exit_idle();
-               }
-
-               preempt_enable_no_resched();
-               schedule();
-               preempt_disable();
-       }
-}
-
-void cpu_idle_wait(void)
-{
-       unsigned int cpu, this_cpu = get_cpu();
-       cpumask_t map;
-
-       set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
-       put_cpu();
-
-       cpus_clear(map);
-       for_each_online_cpu(cpu) {
-               per_cpu(cpu_idle_state, cpu) = 1;
-               cpu_set(cpu, map);
-       }
-
-       __get_cpu_var(cpu_idle_state) = 0;
-
-       wmb();
-       do {
-               ssleep(1);
-               for_each_online_cpu(cpu) {
-                       if (cpu_isset(cpu, map) &&
-                                       !per_cpu(cpu_idle_state, cpu))
-                               cpu_clear(cpu, map);
-               }
-               cpus_and(map, map, cpu_online_map);
-       } while (!cpus_empty(map));
-}
-EXPORT_SYMBOL_GPL(cpu_idle_wait);
-
-void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) 
-{
-}
-
-static int __init idle_setup (char *str)
-{
-       if (!strncmp(str, "poll", 4)) {
-               printk("using polling idle threads.\n");
-               pm_idle = poll_idle;
-       }
-
-       boot_option_idle_override = 1;
-       return 1;
-}
-
-__setup("idle=", idle_setup);
-
-/* Prints also some state that isn't saved in the pt_regs */ 
-void __show_regs(struct pt_regs * regs)
-{
-       unsigned long fs, gs, shadowgs;
-       unsigned int fsindex,gsindex;
-       unsigned int ds,cs,es; 
-
-       printk("\n");
-       print_modules();
-       printk("Pid: %d, comm: %.20s %s %s %.*s\n",
-               current->pid, current->comm, print_tainted(),
-               system_utsname.release,
-               (int)strcspn(system_utsname.version, " "),
-               system_utsname.version);
-       printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
-       printk_address(regs->rip); 
-       printk("RSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss, regs->rsp,
-               regs->eflags);
-       printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
-              regs->rax, regs->rbx, regs->rcx);
-       printk("RDX: %016lx RSI: %016lx RDI: %016lx\n",
-              regs->rdx, regs->rsi, regs->rdi); 
-       printk("RBP: %016lx R08: %016lx R09: %016lx\n",
-              regs->rbp, regs->r8, regs->r9); 
-       printk("R10: %016lx R11: %016lx R12: %016lx\n",
-              regs->r10, regs->r11, regs->r12); 
-       printk("R13: %016lx R14: %016lx R15: %016lx\n",
-              regs->r13, regs->r14, regs->r15); 
-
-       asm("mov %%ds,%0" : "=r" (ds)); 
-       asm("mov %%cs,%0" : "=r" (cs)); 
-       asm("mov %%es,%0" : "=r" (es)); 
-       asm("mov %%fs,%0" : "=r" (fsindex));
-       asm("mov %%gs,%0" : "=r" (gsindex));
-
-       rdmsrl(MSR_FS_BASE, fs);
-       rdmsrl(MSR_GS_BASE, gs); 
-       rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); 
-
-       printk("FS:  %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", 
-              fs,fsindex,gs,gsindex,shadowgs); 
-       printk("CS:  %04x DS: %04x ES: %04x\n", cs, ds, es); 
-
-}
-
-void show_regs(struct pt_regs *regs)
-{
-       printk("CPU %d:", smp_processor_id());
-       __show_regs(regs);
-       show_trace(NULL, regs, (void *)(regs + 1));
-}
-
-/*
- * Free current thread data structures etc..
- */
-void exit_thread(void)
-{
-       struct task_struct *me = current;
-       struct thread_struct *t = &me->thread;
-
-       if (me->thread.io_bitmap_ptr) { 
-#ifndef CONFIG_X86_NO_TSS
-               struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
-#endif
-#ifdef CONFIG_XEN
-               struct physdev_set_iobitmap iobmp_op;
-               memset(&iobmp_op, 0, sizeof(iobmp_op));
-#endif
-
-               kfree(t->io_bitmap_ptr);
-               t->io_bitmap_ptr = NULL;
-               /*
-                * Careful, clear this in the TSS too:
-                */
-#ifndef CONFIG_X86_NO_TSS
-               memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
-               put_cpu();
-#endif
-#ifdef CONFIG_XEN
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &iobmp_op);
-#endif
-               t->io_bitmap_max = 0;
-       }
-}
-
-void load_gs_index(unsigned gs)
-{
-       HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs);
-}
-
-void flush_thread(void)
-{
-       struct task_struct *tsk = current;
-       struct thread_info *t = current_thread_info();
-
-       if (t->flags & _TIF_ABI_PENDING) {
-               t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
-               if (t->flags & _TIF_IA32)
-                       current_thread_info()->status |= TS_COMPAT;
-       }
-
-       tsk->thread.debugreg0 = 0;
-       tsk->thread.debugreg1 = 0;
-       tsk->thread.debugreg2 = 0;
-       tsk->thread.debugreg3 = 0;
-       tsk->thread.debugreg6 = 0;
-       tsk->thread.debugreg7 = 0;
-       memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
-       /*
-        * Forget coprocessor state..
-        */
-       clear_fpu(tsk);
-       clear_used_math();
-}
-
-void release_thread(struct task_struct *dead_task)
-{
-       if (dead_task->mm) {
-               if (dead_task->mm->context.size) {
-                       printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
-                                       dead_task->comm,
-                                       dead_task->mm->context.ldt,
-                                       dead_task->mm->context.size);
-                       BUG();
-               }
-       }
-}
-
-static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
-{
-       struct user_desc ud = { 
-               .base_addr = addr,
-               .limit = 0xfffff,
-               .seg_32bit = 1,
-               .limit_in_pages = 1,
-               .useable = 1,
-       };
-       struct n_desc_struct *desc = (void *)t->thread.tls_array;
-       desc += tls;
-       desc->a = LDT_entry_a(&ud); 
-       desc->b = LDT_entry_b(&ud); 
-}
-
-static inline u32 read_32bit_tls(struct task_struct *t, int tls)
-{
-       struct desc_struct *desc = (void *)t->thread.tls_array;
-       desc += tls;
-       return desc->base0 | 
-               (((u32)desc->base1) << 16) | 
-               (((u32)desc->base2) << 24);
-}
-
-/*
- * This gets called before we allocate a new thread and copy
- * the current task into it.
- */
-void prepare_to_copy(struct task_struct *tsk)
-{
-       unlazy_fpu(tsk);
-}
-
-int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp, 
-               unsigned long unused,
-       struct task_struct * p, struct pt_regs * regs)
-{
-       int err;
-       struct pt_regs * childregs;
-       struct task_struct *me = current;
-
-       childregs = ((struct pt_regs *)
-                       (THREAD_SIZE + task_stack_page(p))) - 1;
-       *childregs = *regs;
-
-       childregs->rax = 0;
-       childregs->rsp = rsp;
-       if (rsp == ~0UL)
-               childregs->rsp = (unsigned long)childregs;
-
-       p->thread.rsp = (unsigned long) childregs;
-       p->thread.rsp0 = (unsigned long) (childregs+1);
-       p->thread.userrsp = me->thread.userrsp; 
-
-       set_tsk_thread_flag(p, TIF_FORK);
-
-       p->thread.fs = me->thread.fs;
-       p->thread.gs = me->thread.gs;
-
-       asm("mov %%gs,%0" : "=m" (p->thread.gsindex));
-       asm("mov %%fs,%0" : "=m" (p->thread.fsindex));
-       asm("mov %%es,%0" : "=m" (p->thread.es));
-       asm("mov %%ds,%0" : "=m" (p->thread.ds));
-
-       if (unlikely(me->thread.io_bitmap_ptr != NULL)) { 
-               p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-               if (!p->thread.io_bitmap_ptr) {
-                       p->thread.io_bitmap_max = 0;
-                       return -ENOMEM;
-               }
-               memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
-                               IO_BITMAP_BYTES);
-       } 
-
-       /*
-        * Set a new TLS for the child thread?
-        */
-       if (clone_flags & CLONE_SETTLS) {
-#ifdef CONFIG_IA32_EMULATION
-               if (test_thread_flag(TIF_IA32))
-                       err = ia32_child_tls(p, childregs); 
-               else                    
-#endif  
-                       err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); 
-               if (err) 
-                       goto out;
-       }
-        p->thread.iopl = current->thread.iopl;
-
-       err = 0;
-out:
-       if (err && p->thread.io_bitmap_ptr) {
-               kfree(p->thread.io_bitmap_ptr);
-               p->thread.io_bitmap_max = 0;
-       }
-       return err;
-}
-
-static inline void __save_init_fpu( struct task_struct *tsk )
-{
-       asm volatile( "rex64 ; fxsave %0 ; fnclex"
-                     : "=m" (tsk->thread.i387.fxsave));
-       tsk->thread_info->status &= ~TS_USEDFPU;
-}
-
-/*
- *     switch_to(x,y) should switch tasks from x to y.
- *
- * This could still be optimized: 
- * - fold all the options into a flag word and test it with a single test.
- * - could test fs/gs bitsliced
- *
- * Kprobes not supported here. Set the probe on schedule instead.
- */
-__kprobes struct task_struct *
-__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
-{
-       struct thread_struct *prev = &prev_p->thread,
-                                *next = &next_p->thread;
-       int cpu = smp_processor_id();  
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss = &per_cpu(init_tss, cpu);
-#endif
-       struct physdev_set_iopl iopl_op;
-       struct physdev_set_iobitmap iobmp_op;
-       multicall_entry_t _mcl[8], *mcl = _mcl;
-
-       /*
-        * This is basically '__unlazy_fpu', except that we queue a
-        * multicall to indicate FPU task switch, rather than
-        * synchronously trapping to Xen.
-        * The AMD workaround requires it to be after DS reload, or
-        * after DS has been cleared, which we do in __prepare_arch_switch.
-        */
-       if (prev_p->thread_info->status & TS_USEDFPU) {
-               __save_init_fpu(prev_p); /* _not_ save_init_fpu() */
-               mcl->op      = __HYPERVISOR_fpu_taskswitch;
-               mcl->args[0] = 1;
-               mcl++;
-       }
-
-       /*
-        * Reload esp0, LDT and the page table pointer:
-        */
-       mcl->op      = __HYPERVISOR_stack_switch;
-       mcl->args[0] = __KERNEL_DS;
-       mcl->args[1] = next->rsp0;
-       mcl++;
-
-       /*
-        * Load the per-thread Thread-Local Storage descriptor.
-        * This is load_TLS(next, cpu) with multicalls.
-        */
-#define C(i) do {                                                      \
-       if (unlikely(next->tls_array[i] != prev->tls_array[i])) {       \
-               mcl->op      = __HYPERVISOR_update_descriptor;          \
-               mcl->args[0] = virt_to_machine(                         \
-                       &cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + i]);          \
-               mcl->args[1] = next->tls_array[i];                      \
-               mcl++;                                                  \
-       }                                                               \
-} while (0)
-       C(0); C(1); C(2);
-#undef C
-
-       if (unlikely(prev->iopl != next->iopl)) {
-               iopl_op.iopl = (next->iopl == 0) ? 1 : next->iopl;
-               mcl->op      = __HYPERVISOR_physdev_op;
-               mcl->args[0] = PHYSDEVOP_set_iopl;
-               mcl->args[1] = (unsigned long)&iopl_op;
-               mcl++;
-       }
-
-       if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) {
-               set_xen_guest_handle(iobmp_op.bitmap,
-                                    (char *)next->io_bitmap_ptr);
-               iobmp_op.nr_ports = next->io_bitmap_ptr ? IO_BITMAP_BITS : 0;
-               mcl->op      = __HYPERVISOR_physdev_op;
-               mcl->args[0] = PHYSDEVOP_set_iobitmap;
-               mcl->args[1] = (unsigned long)&iobmp_op;
-               mcl++;
-       }
-
-       (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
-       /* 
-        * Switch DS and ES.
-        * This won't pick up thread selector changes, but I guess that is ok.
-        */
-       if (unlikely(next->es))
-               loadsegment(es, next->es); 
-       
-       if (unlikely(next->ds))
-               loadsegment(ds, next->ds);
-
-       /* 
-        * Switch FS and GS.
-        */
-       if (unlikely(next->fsindex))
-               loadsegment(fs, next->fsindex);
-
-       if (next->fs)
-               HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs); 
-       
-       if (unlikely(next->gsindex))
-               load_gs_index(next->gsindex);
-
-       if (next->gs)
-               HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs); 
-
-       /* 
-        * Switch the PDA context.
-        */
-       prev->userrsp = read_pda(oldrsp); 
-       write_pda(oldrsp, next->userrsp); 
-       write_pda(pcurrent, next_p); 
-       write_pda(kernelstack,
-                 task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET);
-
-       /*
-        * Now maybe reload the debug registers
-        */
-       if (unlikely(next->debugreg7)) {
-               set_debugreg(next->debugreg0, 0);
-               set_debugreg(next->debugreg1, 1);
-               set_debugreg(next->debugreg2, 2);
-               set_debugreg(next->debugreg3, 3);
-               /* no 4 and 5 */
-               set_debugreg(next->debugreg6, 6);
-               set_debugreg(next->debugreg7, 7);
-       }
-
-       return prev_p;
-}
-
-/*
- * sys_execve() executes a new program.
- */
-asmlinkage 
-long sys_execve(char __user *name, char __user * __user *argv,
-               char __user * __user *envp, struct pt_regs regs)
-{
-       long error;
-       char * filename;
-
-       filename = getname(name);
-       error = PTR_ERR(filename);
-       if (IS_ERR(filename)) 
-               return error;
-       error = do_execve(filename, argv, envp, &regs); 
-       if (error == 0) {
-               task_lock(current);
-               current->ptrace &= ~PT_DTRACE;
-               task_unlock(current);
-       }
-       putname(filename);
-       return error;
-}
-
-void set_personality_64bit(void)
-{
-       /* inherit personality from parent */
-
-       /* Make sure to be in 64bit mode */
-       clear_thread_flag(TIF_IA32); 
-
-       /* TBD: overwrites user setup. Should have two bits.
-          But 64bit processes have always behaved this way,
-          so it's not too bad. The main problem is just that
-          32bit childs are affected again. */
-       current->personality &= ~READ_IMPLIES_EXEC;
-}
-
-asmlinkage long sys_fork(struct pt_regs *regs)
-{
-       return do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL);
-}
-
-asmlinkage long
-sys_clone(unsigned long clone_flags, unsigned long newsp,
-         void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
-{
-       if (!newsp)
-               newsp = regs->rsp;
-       return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
-}
-
-/*
- * This is trivial, and on the face of it looks like it
- * could equally well be done in user mode.
- *
- * Not so, for quite unobvious reasons - register pressure.
- * In user mode vfork() cannot have a stack frame, and if
- * done by calling the "clone()" system call directly, you
- * do not have enough call-clobbered registers to hold all
- * the information you need.
- */
-asmlinkage long sys_vfork(struct pt_regs *regs)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->rsp, regs, 0,
-                   NULL, NULL);
-}
-
-unsigned long get_wchan(struct task_struct *p)
-{
-       unsigned long stack;
-       u64 fp,rip;
-       int count = 0;
-
-       if (!p || p == current || p->state==TASK_RUNNING)
-               return 0; 
-       stack = (unsigned long)task_stack_page(p);
-       if (p->thread.rsp < stack || p->thread.rsp > stack+THREAD_SIZE)
-               return 0;
-       fp = *(u64 *)(p->thread.rsp);
-       do { 
-               if (fp < (unsigned long)stack ||
-                   fp > (unsigned long)stack+THREAD_SIZE)
-                       return 0; 
-               rip = *(u64 *)(fp+8); 
-               if (!in_sched_functions(rip))
-                       return rip; 
-               fp = *(u64 *)fp; 
-       } while (count++ < 16); 
-       return 0;
-}
-
-long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
-{ 
-       int ret = 0; 
-       int doit = task == current;
-       int cpu;
-
-       switch (code) { 
-       case ARCH_SET_GS:
-               if (addr >= TASK_SIZE_OF(task))
-                       return -EPERM; 
-               cpu = get_cpu();
-               /* handle small bases via the GDT because that's faster to 
-                  switch. */
-               if (addr <= 0xffffffff) {  
-                       set_32bit_tls(task, GS_TLS, addr); 
-                       if (doit) { 
-                               load_TLS(&task->thread, cpu);
-                               load_gs_index(GS_TLS_SEL); 
-                       }
-                       task->thread.gsindex = GS_TLS_SEL; 
-                       task->thread.gs = 0;
-               } else { 
-                       task->thread.gsindex = 0;
-                       task->thread.gs = addr;
-                       if (doit) {
-                               load_gs_index(0);
-                               ret = HYPERVISOR_set_segment_base(
-                                       SEGBASE_GS_USER, addr);
-                       } 
-               }
-               put_cpu();
-               break;
-       case ARCH_SET_FS:
-               /* Not strictly needed for fs, but do it for symmetry
-                  with gs */
-               if (addr >= TASK_SIZE_OF(task))
-                       return -EPERM; 
-               cpu = get_cpu();
-               /* handle small bases via the GDT because that's faster to 
-                  switch. */
-               if (addr <= 0xffffffff) { 
-                       set_32bit_tls(task, FS_TLS, addr);
-                       if (doit) { 
-                               load_TLS(&task->thread, cpu); 
-                               asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
-                       }
-                       task->thread.fsindex = FS_TLS_SEL;
-                       task->thread.fs = 0;
-               } else { 
-                       task->thread.fsindex = 0;
-                       task->thread.fs = addr;
-                       if (doit) {
-                               /* set the selector to 0 to not confuse
-                                  __switch_to */
-                               asm volatile("movl %0,%%fs" :: "r" (0));
-                                ret = HYPERVISOR_set_segment_base(SEGBASE_FS,
-                                                                 addr);
-                       }
-               }
-               put_cpu();
-               break;
-       case ARCH_GET_FS: { 
-               unsigned long base; 
-               if (task->thread.fsindex == FS_TLS_SEL)
-                       base = read_32bit_tls(task, FS_TLS);
-               else if (doit)
-                       rdmsrl(MSR_FS_BASE, base);
-               else
-                       base = task->thread.fs;
-               ret = put_user(base, (unsigned long __user *)addr); 
-               break; 
-       }
-       case ARCH_GET_GS: { 
-               unsigned long base;
-               unsigned gsindex;
-               if (task->thread.gsindex == GS_TLS_SEL)
-                       base = read_32bit_tls(task, GS_TLS);
-               else if (doit) {
-                       asm("movl %%gs,%0" : "=r" (gsindex));
-                       if (gsindex)
-                               rdmsrl(MSR_KERNEL_GS_BASE, base);
-                       else
-                               base = task->thread.gs;
-               }
-               else
-                       base = task->thread.gs;
-               ret = put_user(base, (unsigned long __user *)addr); 
-               break;
-       }
-
-       default:
-               ret = -EINVAL;
-               break;
-       } 
-
-       return ret;     
-} 
-
-long sys_arch_prctl(int code, unsigned long addr)
-{
-       return do_arch_prctl(current, code, addr);
-} 
-
-/* 
- * Capture the user space registers if the task is not running (in user space)
- */
-int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
-{
-       struct pt_regs *pp, ptregs;
-
-       pp = task_pt_regs(tsk);
-
-       ptregs = *pp; 
-       ptregs.cs &= 0xffff;
-       ptregs.ss &= 0xffff;
-
-       elf_core_copy_regs(regs, &ptregs);
-        boot_option_idle_override = 1;
-       return 1;
-}
-
-unsigned long arch_align_stack(unsigned long sp)
-{
-       if (randomize_va_space)
-               sp -= get_random_int() % 8192;
-       return sp & ~0xf;
-}
-
-#ifndef CONFIG_SMP
-void _restore_vcpu(void)
-{
-}
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
deleted file mode 100644 (file)
index 74e8fd6..0000000
+++ /dev/null
@@ -1,1677 +0,0 @@
-/*
- *  linux/arch/x86-64/kernel/setup.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Nov 2001 Dave Jones <davej@suse.de>
- *  Forked from i386 setup code.
- */
-
-/*
- * This file handles the architecture-dependent parts of initialization
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/screen_info.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/initrd.h>
-#include <linux/highmem.h>
-#include <linux/bootmem.h>
-#include <linux/module.h>
-#include <asm/processor.h>
-#include <linux/console.h>
-#include <linux/seq_file.h>
-#include <linux/crash_dump.h>
-#include <linux/root_dev.h>
-#include <linux/pci.h>
-#include <linux/acpi.h>
-#include <linux/kallsyms.h>
-#include <linux/edd.h>
-#include <linux/mmzone.h>
-#include <linux/kexec.h>
-#include <linux/cpufreq.h>
-#include <linux/dmi.h>
-#include <linux/dma-mapping.h>
-#include <linux/ctype.h>
-
-#include <asm/mtrr.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/msr.h>
-#include <asm/desc.h>
-#include <video/edid.h>
-#include <asm/e820.h>
-#include <asm/dma.h>
-#include <asm/mpspec.h>
-#include <asm/mmu_context.h>
-#include <asm/bootsetup.h>
-#include <asm/proto.h>
-#include <asm/setup.h>
-#include <asm/mach_apic.h>
-#include <asm/numa.h>
-#include <asm/sections.h>
-#include <asm/dmi.h>
-#ifdef CONFIG_XEN
-#include <linux/percpu.h>
-#include <xen/interface/physdev.h>
-#include "setup_arch_pre.h"
-#include <asm/hypervisor.h>
-#include <xen/interface/nmi.h>
-#include <xen/features.h>
-#include <xen/xencons.h>
-#define PFN_UP(x)       (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-#define PFN_PHYS(x)     ((x) << PAGE_SHIFT)
-#include <asm/mach-xen/setup_arch_post.h>
-#include <xen/interface/memory.h>
-
-#ifdef CONFIG_XEN
-#include <xen/interface/kexec.h>
-#endif
-
-extern unsigned long start_pfn;
-extern struct edid_info edid_info;
-
-shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-EXPORT_SYMBOL(HYPERVISOR_shared_info);
-
-extern char hypercall_page[PAGE_SIZE];
-EXPORT_SYMBOL(hypercall_page);
-
-static int xen_panic_event(struct notifier_block *, unsigned long, void *);
-static struct notifier_block xen_panic_block = {
-       xen_panic_event, NULL, 0 /* try to go last */
-};
-
-unsigned long *phys_to_machine_mapping;
-unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[512];
-
-EXPORT_SYMBOL(phys_to_machine_mapping);
-
-DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]);
-DEFINE_PER_CPU(int, nr_multicall_ents);
-
-/* Raw start-of-day parameters from the hypervisor. */
-start_info_t *xen_start_info;
-EXPORT_SYMBOL(xen_start_info);
-#endif
-
-/*
- * Machine setup..
- */
-
-struct cpuinfo_x86 boot_cpu_data __read_mostly;
-EXPORT_SYMBOL(boot_cpu_data);
-
-unsigned long mmu_cr4_features;
-
-int acpi_disabled;
-EXPORT_SYMBOL(acpi_disabled);
-#ifdef CONFIG_ACPI
-extern int __initdata acpi_ht;
-extern acpi_interrupt_flags    acpi_sci_flags;
-int __initdata acpi_force = 0;
-#endif
-
-int acpi_numa __initdata;
-
-/* Boot loader ID as an integer, for the benefit of proc_dointvec */
-int bootloader_type;
-
-unsigned long saved_video_mode;
-
-/* 
- * Early DMI memory
- */
-int dmi_alloc_index;
-char dmi_alloc_data[DMI_MAX_DATA];
-
-/*
- * Setup options
- */
-struct screen_info screen_info;
-EXPORT_SYMBOL(screen_info);
-struct sys_desc_table_struct {
-       unsigned short length;
-       unsigned char table[0];
-};
-
-struct edid_info edid_info;
-EXPORT_SYMBOL_GPL(edid_info);
-struct e820map e820;
-#ifdef CONFIG_XEN
-struct e820map machine_e820;
-#endif
-
-extern int root_mountflags;
-
-char command_line[COMMAND_LINE_SIZE];
-
-struct resource standard_io_resources[] = {
-       { .name = "dma1", .start = 0x00, .end = 0x1f,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "pic1", .start = 0x20, .end = 0x21,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "timer0", .start = 0x40, .end = 0x43,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "timer1", .start = 0x50, .end = 0x53,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "keyboard", .start = 0x60, .end = 0x6f,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "dma page reg", .start = 0x80, .end = 0x8f,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "pic2", .start = 0xa0, .end = 0xa1,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "dma2", .start = 0xc0, .end = 0xdf,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-       { .name = "fpu", .start = 0xf0, .end = 0xff,
-               .flags = IORESOURCE_BUSY | IORESOURCE_IO }
-};
-
-#define STANDARD_IO_RESOURCES \
-       (sizeof standard_io_resources / sizeof standard_io_resources[0])
-
-#define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM)
-
-struct resource data_resource = {
-       .name = "Kernel data",
-       .start = 0,
-       .end = 0,
-       .flags = IORESOURCE_RAM,
-};
-struct resource code_resource = {
-       .name = "Kernel code",
-       .start = 0,
-       .end = 0,
-       .flags = IORESOURCE_RAM,
-};
-
-#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
-
-static struct resource system_rom_resource = {
-       .name = "System ROM",
-       .start = 0xf0000,
-       .end = 0xfffff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource extension_rom_resource = {
-       .name = "Extension ROM",
-       .start = 0xe0000,
-       .end = 0xeffff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource adapter_rom_resources[] = {
-       { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM }
-};
-
-#define ADAPTER_ROM_RESOURCES \
-       (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
-
-static struct resource video_rom_resource = {
-       .name = "Video ROM",
-       .start = 0xc0000,
-       .end = 0xc7fff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource video_ram_resource = {
-       .name = "Video RAM area",
-       .start = 0xa0000,
-       .end = 0xbffff,
-       .flags = IORESOURCE_RAM,
-};
-
-#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-
-static int __init romchecksum(unsigned char *rom, unsigned long length)
-{
-       unsigned char *p, sum = 0;
-
-       for (p = rom; p < rom + length; p++)
-               sum += *p;
-       return sum == 0;
-}
-
-static void __init probe_roms(void)
-{
-       unsigned long start, length, upper;
-       unsigned char *rom;
-       int           i;
-
-#ifdef CONFIG_XEN
-       /* Nothing to do if not running in dom0. */
-       if (!is_initial_xendomain())
-               return;
-#endif
-
-       /* video rom */
-       upper = adapter_rom_resources[0].start;
-       for (start = video_rom_resource.start; start < upper; start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               video_rom_resource.start = start;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* if checksum okay, trust length byte */
-               if (length && romchecksum(rom, length))
-                       video_rom_resource.end = start + length - 1;
-
-               request_resource(&iomem_resource, &video_rom_resource);
-               break;
-                       }
-
-       start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
-       if (start < upper)
-               start = upper;
-
-       /* system rom */
-       request_resource(&iomem_resource, &system_rom_resource);
-       upper = system_rom_resource.start;
-
-       /* check for extension rom (ignore length byte!) */
-       rom = isa_bus_to_virt(extension_rom_resource.start);
-       if (romsignature(rom)) {
-               length = extension_rom_resource.end - extension_rom_resource.start + 1;
-               if (romchecksum(rom, length)) {
-                       request_resource(&iomem_resource, &extension_rom_resource);
-                       upper = extension_rom_resource.start;
-               }
-       }
-
-       /* check for adapter roms on 2k boundaries */
-       for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* but accept any length that fits if checksum okay */
-               if (!length || start + length > upper || !romchecksum(rom, length))
-                       continue;
-
-               adapter_rom_resources[i].start = start;
-               adapter_rom_resources[i].end = start + length - 1;
-               request_resource(&iomem_resource, &adapter_rom_resources[i]);
-
-               start = adapter_rom_resources[i++].end & ~2047UL;
-       }
-}
-
-/* Check for full argument with no trailing characters */
-static int fullarg(char *p, char *arg)
-{
-       int l = strlen(arg);
-       return !memcmp(p, arg, l) && (p[l] == 0 || isspace(p[l]));
-}
-
-static __init void parse_cmdline_early (char ** cmdline_p)
-{
-       char c = ' ', *to = command_line, *from = COMMAND_LINE;
-       int len = 0;
-       int userdef = 0;
-
-       for (;;) {
-               if (c != ' ') 
-                       goto next_char; 
-
-#ifdef  CONFIG_SMP
-               /*
-                * If the BIOS enumerates physical processors before logical,
-                * maxcpus=N at enumeration-time can be used to disable HT.
-                */
-               else if (!memcmp(from, "maxcpus=", 8)) {
-                       extern unsigned int maxcpus;
-
-                       maxcpus = simple_strtoul(from + 8, NULL, 0);
-               }
-#endif
-#ifdef CONFIG_ACPI
-               /* "acpi=off" disables both ACPI table parsing and interpreter init */
-               if (fullarg(from,"acpi=off"))
-                       disable_acpi();
-
-               if (fullarg(from, "acpi=force")) { 
-                       /* add later when we do DMI horrors: */
-                       acpi_force = 1;
-                       acpi_disabled = 0;
-               }
-
-               /* acpi=ht just means: do ACPI MADT parsing 
-                  at bootup, but don't enable the full ACPI interpreter */
-               if (fullarg(from, "acpi=ht")) { 
-                       if (!acpi_force)
-                               disable_acpi();
-                       acpi_ht = 1; 
-               }
-                else if (fullarg(from, "pci=noacpi")) 
-                       acpi_disable_pci();
-               else if (fullarg(from, "acpi=noirq"))
-                       acpi_noirq_set();
-
-               else if (fullarg(from, "acpi_sci=edge"))
-                       acpi_sci_flags.trigger =  1;
-               else if (fullarg(from, "acpi_sci=level"))
-                       acpi_sci_flags.trigger = 3;
-               else if (fullarg(from, "acpi_sci=high"))
-                       acpi_sci_flags.polarity = 1;
-               else if (fullarg(from, "acpi_sci=low"))
-                       acpi_sci_flags.polarity = 3;
-
-               /* acpi=strict disables out-of-spec workarounds */
-               else if (fullarg(from, "acpi=strict")) {
-                       acpi_strict = 1;
-               }
-#ifdef CONFIG_X86_IO_APIC
-               else if (fullarg(from, "acpi_skip_timer_override"))
-                       acpi_skip_timer_override = 1;
-#endif
-#endif
-
-#ifndef CONFIG_XEN
-               if (fullarg(from, "nolapic") || fullarg(from, "disableapic")) {
-                       clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
-                       disable_apic = 1;
-               }
-
-               if (fullarg(from, "noapic"))
-                       skip_ioapic_setup = 1;
-
-               if (fullarg(from,"apic")) {
-                       skip_ioapic_setup = 0;
-                       ioapic_force = 1;
-               }
-#endif
-                       
-               if (!memcmp(from, "mem=", 4))
-                       parse_memopt(from+4, &from); 
-
-               if (!memcmp(from, "memmap=", 7)) {
-                       /* exactmap option is for used defined memory */
-                       if (!memcmp(from+7, "exactmap", 8)) {
-#ifdef CONFIG_CRASH_DUMP
-                               /* If we are doing a crash dump, we
-                                * still need to know the real mem
-                                * size before original memory map is
-                                * reset.
-                                */
-                               saved_max_pfn = e820_end_of_ram();
-#endif
-                               from += 8+7;
-                               end_pfn_map = 0;
-                               e820.nr_map = 0;
-                               userdef = 1;
-                       }
-                       else {
-                               parse_memmapopt(from+7, &from);
-                               userdef = 1;
-                       }
-               }
-
-#ifdef CONFIG_NUMA
-               if (!memcmp(from, "numa=", 5))
-                       numa_setup(from+5); 
-#endif
-
-               if (!memcmp(from,"iommu=",6)) { 
-                       iommu_setup(from+6); 
-               }
-
-               if (fullarg(from,"oops=panic"))
-                       panic_on_oops = 1;
-
-               if (!memcmp(from, "noexec=", 7))
-                       nonx_setup(from + 7);
-
-#ifdef CONFIG_KEXEC
-               /* crashkernel=size@addr specifies the location to reserve for
-                * a crash kernel.  By reserving this memory we guarantee
-                * that linux never set's it up as a DMA target.
-                * Useful for holding code to do something appropriate
-                * after a kernel panic.
-                */
-               else if (!memcmp(from, "crashkernel=", 12)) {
-#ifndef CONFIG_XEN
-                       unsigned long size, base;
-                       size = memparse(from+12, &from);
-                       if (*from == '@') {
-                               base = memparse(from+1, &from);
-                               /* FIXME: Do I want a sanity check
-                                * to validate the memory range?
-                                */
-                               crashk_res.start = base;
-                               crashk_res.end   = base + size - 1;
-                       }
-#else
-                       printk("Ignoring crashkernel command line, "
-                              "parameter will be supplied by xen\n");
-#endif
-               }
-#endif
-
-#ifdef CONFIG_PROC_VMCORE
-               /* elfcorehdr= specifies the location of elf core header
-                * stored by the crashed kernel. This option will be passed
-                * by kexec loader to the capture kernel.
-                */
-               else if(!memcmp(from, "elfcorehdr=", 11))
-                       elfcorehdr_addr = memparse(from+11, &from);
-#endif
-
-#if defined(CONFIG_HOTPLUG_CPU) && !defined(CONFIG_XEN)
-               else if (!memcmp(from, "additional_cpus=", 16))
-                       setup_additional_cpus(from+16);
-#endif
-
-       next_char:
-               c = *(from++);
-               if (!c)
-                       break;
-               if (COMMAND_LINE_SIZE <= ++len)
-                       break;
-               *(to++) = c;
-       }
-       if (userdef) {
-               printk(KERN_INFO "user-defined physical RAM map:\n");
-               e820_print_map("user");
-       }
-       *to = '\0';
-       *cmdline_p = command_line;
-}
-
-#ifndef CONFIG_NUMA
-static void __init
-contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
-{
-       unsigned long bootmap_size, bootmap;
-
-       bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
-       bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size);
-       if (bootmap == -1L)
-               panic("Cannot find bootmem map of size %ld\n",bootmap_size);
-       bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
-#ifdef CONFIG_XEN
-       e820_bootmem_free(NODE_DATA(0), 0, xen_start_info->nr_pages<<PAGE_SHIFT);
-#else
-       e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
-#endif
-       reserve_bootmem(bootmap, bootmap_size);
-} 
-#endif
-
-#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-struct edd edd;
-#ifdef CONFIG_EDD_MODULE
-EXPORT_SYMBOL(edd);
-#endif
-/**
- * copy_edd() - Copy the BIOS EDD information
- *              from boot_params into a safe place.
- *
- */
-static inline void copy_edd(void)
-{
-     memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
-     memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
-     edd.mbr_signature_nr = EDD_MBR_SIG_NR;
-     edd.edd_info_nr = EDD_NR;
-}
-#else
-static inline void copy_edd(void)
-{
-}
-#endif
-
-#ifndef CONFIG_XEN
-#define EBDA_ADDR_POINTER 0x40E
-
-unsigned __initdata ebda_addr;
-unsigned __initdata ebda_size;
-
-static void discover_ebda(void)
-{
-       /*
-        * there is a real-mode segmented pointer pointing to the 
-        * 4K EBDA area at 0x40E
-        */
-       ebda_addr = *(unsigned short *)EBDA_ADDR_POINTER;
-       ebda_addr <<= 4;
-
-       ebda_size = *(unsigned short *)(unsigned long)ebda_addr;
-
-       /* Round EBDA up to pages */
-       if (ebda_size == 0)
-               ebda_size = 1;
-       ebda_size <<= 10;
-       ebda_size = round_up(ebda_size + (ebda_addr & ~PAGE_MASK), PAGE_SIZE);
-       if (ebda_size > 64*1024)
-               ebda_size = 64*1024;
-}
-#else
-#define discover_ebda() ((void)0)
-#endif
-
-void __init setup_arch(char **cmdline_p)
-{
-#ifdef CONFIG_XEN
-       /* Register a call for panic conditions. */
-       atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
-
-       ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); 
-       screen_info = SCREEN_INFO;
-
-       if (is_initial_xendomain()) {
-               /* This is drawn from a dump from vgacon:startup in
-                * standard Linux. */
-               screen_info.orig_video_mode = 3;
-               screen_info.orig_video_isVGA = 1;
-               screen_info.orig_video_lines = 25;
-               screen_info.orig_video_cols = 80;
-               screen_info.orig_video_ega_bx = 3;
-               screen_info.orig_video_points = 16;
-               screen_info.orig_y = screen_info.orig_video_lines - 1;
-               if (xen_start_info->console.dom0.info_size >=
-                   sizeof(struct dom0_vga_console_info)) {
-                       const struct dom0_vga_console_info *info =
-                               (struct dom0_vga_console_info *)(
-                                       (char *)xen_start_info +
-                                       xen_start_info->console.dom0.info_off);
-                       dom0_init_screen_info(info);
-               }
-               xen_start_info->console.domU.mfn = 0;
-               xen_start_info->console.domU.evtchn = 0;
-       } else
-               screen_info.orig_video_isVGA = 0;
-
-       edid_info = EDID_INFO;
-       saved_video_mode = SAVED_VIDEO_MODE;
-       bootloader_type = LOADER_TYPE;
-
-#ifdef CONFIG_BLK_DEV_RAM
-       rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
-       rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-       rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
-
-
-#endif
-
-       HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                            VMASST_TYPE_writable_pagetables);
-
-       ARCH_SETUP
-#else
-       ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
-       screen_info = SCREEN_INFO;
-       edid_info = EDID_INFO;
-       saved_video_mode = SAVED_VIDEO_MODE;
-       bootloader_type = LOADER_TYPE;
-
-#ifdef CONFIG_BLK_DEV_RAM
-       rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
-       rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-       rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
-#endif
-#endif /* !CONFIG_XEN */
-       setup_memory_region();
-       copy_edd();
-
-       if (!MOUNT_ROOT_RDONLY)
-               root_mountflags &= ~MS_RDONLY;
-       init_mm.start_code = (unsigned long) &_text;
-       init_mm.end_code = (unsigned long) &_etext;
-       init_mm.end_data = (unsigned long) &_edata;
-       init_mm.brk = (unsigned long) &_end;
-
-       code_resource.start = virt_to_phys(&_text);
-       code_resource.end = virt_to_phys(&_etext)-1;
-       data_resource.start = virt_to_phys(&_etext);
-       data_resource.end = virt_to_phys(&_edata)-1;
-
-       parse_cmdline_early(cmdline_p);
-
-       early_identify_cpu(&boot_cpu_data);
-
-       /*
-        * partially used pages are not usable - thus
-        * we are rounding upwards:
-        */
-       end_pfn = e820_end_of_ram();
-       num_physpages = end_pfn;                /* for pfn_valid */
-
-       check_efer();
-
-       discover_ebda();
-
-       init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
-
-       if (is_initial_xendomain())
-               dmi_scan_machine();
-
-#ifdef CONFIG_ACPI_NUMA
-       /*
-        * Parse SRAT to discover nodes.
-        */
-       acpi_numa_init();
-#endif
-
-#ifdef CONFIG_NUMA
-       numa_initmem_init(0, end_pfn); 
-#else
-       contig_initmem_init(0, end_pfn);
-#endif
-
-#ifdef CONFIG_XEN
-       /*
-        * Reserve kernel, physmap, start info, initial page tables, and
-        * direct mapping.
-        */
-       reserve_bootmem_generic(__pa_symbol(&_text),
-                               (table_end << PAGE_SHIFT) - __pa_symbol(&_text));
-#else
-       /* Reserve direct mapping */
-       reserve_bootmem_generic(table_start << PAGE_SHIFT, 
-                               (table_end - table_start) << PAGE_SHIFT);
-
-       /* reserve kernel */
-       reserve_bootmem_generic(__pa_symbol(&_text),
-                               __pa_symbol(&_end) - __pa_symbol(&_text));
-
-       /*
-        * reserve physical page 0 - it's a special BIOS page on many boxes,
-        * enabling clean reboots, SMP operation, laptop functions.
-        */
-       reserve_bootmem_generic(0, PAGE_SIZE);
-
-       /* reserve ebda region */
-       if (ebda_addr)
-               reserve_bootmem_generic(ebda_addr, ebda_size);
-
-#ifdef CONFIG_SMP
-       /*
-        * But first pinch a few for the stack/trampoline stuff
-        * FIXME: Don't need the extra page at 4K, but need to fix
-        * trampoline before removing it. (see the GDT stuff)
-        */
-       reserve_bootmem_generic(PAGE_SIZE, PAGE_SIZE);
-
-       /* Reserve SMP trampoline */
-       reserve_bootmem_generic(SMP_TRAMPOLINE_BASE, PAGE_SIZE);
-#endif
-#endif
-
-#ifdef CONFIG_ACPI_SLEEP
-       /*
-        * Reserve low memory region for sleep support.
-        */
-       acpi_reserve_bootmem();
-#endif
-#ifdef CONFIG_XEN
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (xen_start_info->mod_start) {
-               if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
-                       /*reserve_bootmem_generic(INITRD_START, INITRD_SIZE);*/
-                       initrd_start = INITRD_START + PAGE_OFFSET;
-                       initrd_end = initrd_start+INITRD_SIZE;
-                       initrd_below_start_ok = 1;
-               } else {
-                       printk(KERN_ERR "initrd extends beyond end of memory "
-                               "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-                               (unsigned long)(INITRD_START + INITRD_SIZE),
-                               (unsigned long)(end_pfn << PAGE_SHIFT));
-                       initrd_start = 0;
-               }
-       }
-#endif
-#else  /* CONFIG_XEN */
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (LOADER_TYPE && INITRD_START) {
-               if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
-                       reserve_bootmem_generic(INITRD_START, INITRD_SIZE);
-                       initrd_start =
-                               INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
-                       initrd_end = initrd_start+INITRD_SIZE;
-               }
-               else {
-                       printk(KERN_ERR "initrd extends beyond end of memory "
-                           "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-                           (unsigned long)(INITRD_START + INITRD_SIZE),
-                           (unsigned long)(end_pfn << PAGE_SHIFT));
-                       initrd_start = 0;
-               }
-       }
-#endif
-#endif /* !CONFIG_XEN */
-#ifdef CONFIG_KEXEC
-#ifdef CONFIG_XEN
-       xen_machine_kexec_setup_resources();
-#else
-       if (crashk_res.start != crashk_res.end) {
-               reserve_bootmem_generic(crashk_res.start,
-                       crashk_res.end - crashk_res.start + 1);
-       }
-#endif
-#endif
-
-       paging_init();
-#ifdef CONFIG_X86_LOCAL_APIC
-       /*
-        * Find and reserve possible boot-time SMP configuration:
-        */
-       find_smp_config();
-#endif
-#ifdef CONFIG_XEN
-       {
-               int i, j, k, fpp;
-               unsigned long p2m_pages;
-
-               p2m_pages = end_pfn;
-               if (xen_start_info->nr_pages > end_pfn) {
-                       /*
-                        * the end_pfn was shrunk (probably by mem= or highmem=
-                        * kernel parameter); shrink reservation with the HV
-                        */
-                       struct xen_memory_reservation reservation = {
-                               .address_bits = 0,
-                               .extent_order = 0,
-                               .domid = DOMID_SELF
-                       };
-                       unsigned int difference;
-                       int ret;
-                       
-                       difference = xen_start_info->nr_pages - end_pfn;
-                       
-                       set_xen_guest_handle(reservation.extent_start,
-                                            ((unsigned long *)xen_start_info->mfn_list) + end_pfn);
-                       reservation.nr_extents = difference;
-                       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                                  &reservation);
-                       BUG_ON (ret != difference);
-               }
-               else if (end_pfn > xen_start_info->nr_pages)
-                       p2m_pages = xen_start_info->nr_pages;
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* Make sure we have a large enough P->M table. */
-                       phys_to_machine_mapping = alloc_bootmem_pages(
-                               end_pfn * sizeof(unsigned long));
-                       memset(phys_to_machine_mapping, ~0,
-                              end_pfn * sizeof(unsigned long));
-                       memcpy(phys_to_machine_mapping,
-                              (unsigned long *)xen_start_info->mfn_list,
-                              p2m_pages * sizeof(unsigned long));
-                       free_bootmem(
-                               __pa(xen_start_info->mfn_list),
-                               PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
-                                               sizeof(unsigned long))));
-
-                       /*
-                        * Initialise the list of the frames that specify the
-                        * list of frames that make up the p2m table. Used by
-                         * save/restore.
-                        */
-                       pfn_to_mfn_frame_list_list = alloc_bootmem_pages(PAGE_SIZE);
-
-                       fpp = PAGE_SIZE/sizeof(unsigned long);
-                       for (i=0, j=0, k=-1; i< end_pfn; i+=fpp, j++) {
-                               if ((j % fpp) == 0) {
-                                       k++;
-                                       BUG_ON(k>=fpp);
-                                       pfn_to_mfn_frame_list[k] =
-                                               alloc_bootmem_pages(PAGE_SIZE);
-                                       pfn_to_mfn_frame_list_list[k] =
-                                               virt_to_mfn(pfn_to_mfn_frame_list[k]);
-                                       j=0;
-                               }
-                               pfn_to_mfn_frame_list[k][j] =
-                                       virt_to_mfn(&phys_to_machine_mapping[i]);
-                       }
-                       HYPERVISOR_shared_info->arch.max_pfn = end_pfn;
-                       HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-                               virt_to_mfn(pfn_to_mfn_frame_list_list);
-               }
-
-       }
-
-       if (!is_initial_xendomain()) {
-               acpi_disabled = 1;
-#ifdef  CONFIG_ACPI
-               acpi_ht = 0;
-#endif
-       }
-#endif
-
-#ifndef CONFIG_XEN
-       check_ioapic();
-#endif
-
-       zap_low_mappings(0);
-
-       /*
-        * set this early, so we dont allocate cpu0
-        * if MADT list doesnt list BSP first
-        * mpparse.c/MP_processor_info() allocates logical cpu numbers.
-        */
-       cpu_set(0, cpu_present_map);
-#ifdef CONFIG_ACPI
-       /*
-        * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
-        * Call this early for SRAT node setup.
-        */
-       acpi_boot_table_init();
-
-       /*
-        * Read APIC and some other early information from ACPI tables.
-        */
-       acpi_boot_init();
-#endif
-
-       init_cpu_to_node();
-
-#ifdef CONFIG_X86_LOCAL_APIC
-       /*
-        * get boot-time SMP configuration:
-        */
-       if (smp_found_config)
-               get_smp_config();
-#ifndef CONFIG_XEN
-       init_apic_mappings();
-#endif
-#endif
-#if defined(CONFIG_XEN) && defined(CONFIG_SMP) && !defined(CONFIG_HOTPLUG_CPU)
-       prefill_possible_map();
-#endif
-
-       /*
-        * Request address space for all standard RAM and ROM resources
-        * and also for regions reported as reserved by the e820.
-        */
-       probe_roms();
-#ifdef CONFIG_XEN
-       if (is_initial_xendomain()) {
-               struct xen_memory_map memmap;
-
-               memmap.nr_entries = E820MAX;
-               set_xen_guest_handle(memmap.buffer, machine_e820.map);
-
-               if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
-                       BUG();
-               machine_e820.nr_map = memmap.nr_entries;
-
-               e820_reserve_resources(machine_e820.map, machine_e820.nr_map);
-       }
-#else
-       e820_reserve_resources(e820.map, e820.nr_map);
-#endif
-
-       request_resource(&iomem_resource, &video_ram_resource);
-
-       {
-       unsigned i;
-       /* request I/O space for devices used on all i[345]86 PCs */
-       for (i = 0; i < STANDARD_IO_RESOURCES; i++)
-               request_resource(&ioport_resource, &standard_io_resources[i]);
-       }
-
-#ifdef CONFIG_XEN
-       if (is_initial_xendomain())
-               e820_setup_gap(machine_e820.map, machine_e820.nr_map);
-#else
-       e820_setup_gap(e820.map, e820.nr_map);
-#endif
-
-#ifdef CONFIG_XEN
-       {
-               struct physdev_set_iopl set_iopl;
-
-               set_iopl.iopl = 1;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
-
-               if (is_initial_xendomain()) {
-#ifdef CONFIG_VT
-#if defined(CONFIG_VGA_CONSOLE)
-                       conswitchp = &vga_con;
-#elif defined(CONFIG_DUMMY_CONSOLE)
-                       conswitchp = &dummy_con;
-#endif
-#endif
-               } else {
-#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
-                       conswitchp = &dummy_con;
-#endif
-                }
-       }
-       xencons_early_setup();
-#else  /* CONFIG_XEN */
-
-#ifdef CONFIG_VT
-#if defined(CONFIG_VGA_CONSOLE)
-       conswitchp = &vga_con;
-#elif defined(CONFIG_DUMMY_CONSOLE)
-       conswitchp = &dummy_con;
-#endif
-#endif
-
-#endif /* !CONFIG_XEN */
-}
-
-#ifdef CONFIG_XEN
-static int
-xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-       HYPERVISOR_shutdown(SHUTDOWN_crash);
-       /* we're never actually going to get here... */
-       return NOTIFY_DONE;
-}
-#endif /* !CONFIG_XEN */
-
-
-static int __cpuinit get_model_name(struct cpuinfo_x86 *c)
-{
-       unsigned int *v;
-
-       if (c->extended_cpuid_level < 0x80000004)
-               return 0;
-
-       v = (unsigned int *) c->x86_model_id;
-       cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
-       cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
-       cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
-       c->x86_model_id[48] = 0;
-       return 1;
-}
-
-
-static void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
-{
-       unsigned int n, dummy, eax, ebx, ecx, edx;
-
-       n = c->extended_cpuid_level;
-
-       if (n >= 0x80000005) {
-               cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
-               printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-                       edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-               c->x86_cache_size=(ecx>>24)+(edx>>24);
-               /* On K8 L1 TLB is inclusive, so don't count it */
-               c->x86_tlbsize = 0;
-       }
-
-       if (n >= 0x80000006) {
-               cpuid(0x80000006, &dummy, &ebx, &ecx, &edx);
-               ecx = cpuid_ecx(0x80000006);
-               c->x86_cache_size = ecx >> 16;
-               c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
-
-               printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-               c->x86_cache_size, ecx & 0xFF);
-       }
-
-       if (n >= 0x80000007)
-               cpuid(0x80000007, &dummy, &dummy, &dummy, &c->x86_power); 
-       if (n >= 0x80000008) {
-               cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); 
-               c->x86_virt_bits = (eax >> 8) & 0xff;
-               c->x86_phys_bits = eax & 0xff;
-       }
-}
-
-#ifdef CONFIG_NUMA
-static int nearby_node(int apicid)
-{
-       int i;
-       for (i = apicid - 1; i >= 0; i--) {
-               int node = apicid_to_node[i];
-               if (node != NUMA_NO_NODE && node_online(node))
-                       return node;
-       }
-       for (i = apicid + 1; i < MAX_LOCAL_APIC; i++) {
-               int node = apicid_to_node[i];
-               if (node != NUMA_NO_NODE && node_online(node))
-                       return node;
-       }
-       return first_node(node_online_map); /* Shouldn't happen */
-}
-#endif
-
-/*
- * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
- * Assumes number of cores is a power of two.
- */
-static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
-{
-#ifdef CONFIG_SMP
-       unsigned bits;
-#ifdef CONFIG_NUMA
-       int cpu = smp_processor_id();
-       int node = 0;
-       unsigned apicid = hard_smp_processor_id();
-#endif
-       unsigned ecx = cpuid_ecx(0x80000008);
-
-       c->x86_max_cores = (ecx & 0xff) + 1;
-
-       /* CPU telling us the core id bits shift? */
-       bits = (ecx >> 12) & 0xF;
-
-       /* Otherwise recompute */
-       if (bits == 0) {
-               while ((1 << bits) < c->x86_max_cores)
-                       bits++;
-       }
-
-       /* Low order bits define the core id (index of core in socket) */
-       c->cpu_core_id = c->phys_proc_id & ((1 << bits)-1);
-       /* Convert the APIC ID into the socket ID */
-       c->phys_proc_id = phys_pkg_id(bits);
-
-#ifdef CONFIG_NUMA
-       node = c->phys_proc_id;
-       if (apicid_to_node[apicid] != NUMA_NO_NODE)
-               node = apicid_to_node[apicid];
-       if (!node_online(node)) {
-               /* Two possibilities here:
-                  - The CPU is missing memory and no node was created.
-                  In that case try picking one from a nearby CPU
-                  - The APIC IDs differ from the HyperTransport node IDs
-                  which the K8 northbridge parsing fills in.
-                  Assume they are all increased by a constant offset,
-                  but in the same order as the HT nodeids.
-                  If that doesn't result in a usable node fall back to the
-                  path for the previous case.  */
-               int ht_nodeid = apicid - (cpu_data[0].phys_proc_id << bits);
-               if (ht_nodeid >= 0 &&
-                   apicid_to_node[ht_nodeid] != NUMA_NO_NODE)
-                       node = apicid_to_node[ht_nodeid];
-               /* Pick a nearby node */
-               if (!node_online(node))
-                       node = nearby_node(apicid);
-       }
-       numa_set_node(cpu, node);
-
-       printk(KERN_INFO "CPU %d/%x -> Node %d\n", cpu, apicid, node);
-#endif
-#endif
-}
-
-static void __init init_amd(struct cpuinfo_x86 *c)
-{
-       unsigned level;
-
-#ifdef CONFIG_SMP
-       unsigned long value;
-
-       /*
-        * Disable TLB flush filter by setting HWCR.FFDIS on K8
-        * bit 6 of msr C001_0015
-        *
-        * Errata 63 for SH-B3 steppings
-        * Errata 122 for all steppings (F+ have it disabled by default)
-        */
-       if (c->x86 == 15) {
-               rdmsrl(MSR_K8_HWCR, value);
-               value |= 1 << 6;
-               wrmsrl(MSR_K8_HWCR, value);
-       }
-#endif
-
-       /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
-          3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
-       clear_bit(0*32+31, &c->x86_capability);
-       
-       /* On C+ stepping K8 rep microcode works well for copy/memset */
-       level = cpuid_eax(1);
-       if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58))
-               set_bit(X86_FEATURE_REP_GOOD, &c->x86_capability);
-
-       /* Enable workaround for FXSAVE leak */
-       if (c->x86 >= 6)
-               set_bit(X86_FEATURE_FXSAVE_LEAK, &c->x86_capability);
-
-       level = get_model_name(c);
-       if (!level) {
-               switch (c->x86) { 
-               case 15:
-                       /* Should distinguish Models here, but this is only
-                          a fallback anyways. */
-                       strcpy(c->x86_model_id, "Hammer");
-                       break; 
-               } 
-       } 
-       display_cacheinfo(c);
-
-       /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */
-       if (c->x86_power & (1<<8))
-               set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-
-       /* Multi core CPU? */
-       if (c->extended_cpuid_level >= 0x80000008)
-               amd_detect_cmp(c);
-
-       /* Fix cpuid4 emulation for more */
-       num_cache_leaves = 3;
-}
-
-static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
-{
-#ifdef CONFIG_SMP
-       u32     eax, ebx, ecx, edx;
-       int     index_msb, core_bits;
-
-       cpuid(1, &eax, &ebx, &ecx, &edx);
-
-
-       if (!cpu_has(c, X86_FEATURE_HT))
-               return;
-       if (cpu_has(c, X86_FEATURE_CMP_LEGACY))
-               goto out;
-
-       smp_num_siblings = (ebx & 0xff0000) >> 16;
-
-       if (smp_num_siblings == 1) {
-               printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-       } else if (smp_num_siblings > 1 ) {
-
-               if (smp_num_siblings > NR_CPUS) {
-                       printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
-                       smp_num_siblings = 1;
-                       return;
-               }
-
-               index_msb = get_count_order(smp_num_siblings);
-               c->phys_proc_id = phys_pkg_id(index_msb);
-
-               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
-
-               index_msb = get_count_order(smp_num_siblings) ;
-
-               core_bits = get_count_order(c->x86_max_cores);
-
-               c->cpu_core_id = phys_pkg_id(index_msb) &
-                                              ((1 << core_bits) - 1);
-       }
-out:
-       if ((c->x86_max_cores * smp_num_siblings) > 1) {
-               printk(KERN_INFO  "CPU: Physical Processor ID: %d\n", c->phys_proc_id);
-               printk(KERN_INFO  "CPU: Processor Core ID: %d\n", c->cpu_core_id);
-       }
-
-#endif
-}
-
-/*
- * find out the number of processor cores on the die
- */
-static int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
-{
-       unsigned int eax, t;
-
-       if (c->cpuid_level < 4)
-               return 1;
-
-       cpuid_count(4, 0, &eax, &t, &t, &t);
-
-       if (eax & 0x1f)
-               return ((eax >> 26) + 1);
-       else
-               return 1;
-}
-
-static void srat_detect_node(void)
-{
-#ifdef CONFIG_NUMA
-       unsigned node;
-       int cpu = smp_processor_id();
-       int apicid = hard_smp_processor_id();
-
-       /* Don't do the funky fallback heuristics the AMD version employs
-          for now. */
-       node = apicid_to_node[apicid];
-       if (node == NUMA_NO_NODE)
-               node = first_node(node_online_map);
-       numa_set_node(cpu, node);
-
-       if (acpi_numa > 0)
-               printk(KERN_INFO "CPU %d/%x -> Node %d\n", cpu, apicid, node);
-#endif
-}
-
-static void __cpuinit init_intel(struct cpuinfo_x86 *c)
-{
-       /* Cache sizes */
-       unsigned n;
-
-       init_intel_cacheinfo(c);
-       if (c->cpuid_level > 9 ) {
-               unsigned eax = cpuid_eax(10);
-               /* Check for version and the number of counters */
-               if ((eax & 0xff) && (((eax>>8) & 0xff) > 1))
-                       set_bit(X86_FEATURE_ARCH_PERFMON, &c->x86_capability);
-       }
-
-       n = c->extended_cpuid_level;
-       if (n >= 0x80000008) {
-               unsigned eax = cpuid_eax(0x80000008);
-               c->x86_virt_bits = (eax >> 8) & 0xff;
-               c->x86_phys_bits = eax & 0xff;
-               /* CPUID workaround for Intel 0F34 CPU */
-               if (c->x86_vendor == X86_VENDOR_INTEL &&
-                   c->x86 == 0xF && c->x86_model == 0x3 &&
-                   c->x86_mask == 0x4)
-                       c->x86_phys_bits = 36;
-       }
-
-       if (c->x86 == 15)
-               c->x86_cache_alignment = c->x86_clflush_size * 2;
-       if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
-           (c->x86 == 0x6 && c->x86_model >= 0x0e))
-               set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-       set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
-       c->x86_max_cores = intel_num_cpu_cores(c);
-
-       srat_detect_node();
-}
-
-static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
-{
-       char *v = c->x86_vendor_id;
-
-       if (!strcmp(v, "AuthenticAMD"))
-               c->x86_vendor = X86_VENDOR_AMD;
-       else if (!strcmp(v, "GenuineIntel"))
-               c->x86_vendor = X86_VENDOR_INTEL;
-       else
-               c->x86_vendor = X86_VENDOR_UNKNOWN;
-}
-
-struct cpu_model_info {
-       int vendor;
-       int family;
-       char *model_names[16];
-};
-
-/* Do some early cpuid on the boot CPU to get some parameter that are
-   needed before check_bugs. Everything advanced is in identify_cpu
-   below. */
-void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
-{
-       u32 tfms;
-
-       c->loops_per_jiffy = loops_per_jiffy;
-       c->x86_cache_size = -1;
-       c->x86_vendor = X86_VENDOR_UNKNOWN;
-       c->x86_model = c->x86_mask = 0; /* So far unknown... */
-       c->x86_vendor_id[0] = '\0'; /* Unset */
-       c->x86_model_id[0] = '\0';  /* Unset */
-       c->x86_clflush_size = 64;
-       c->x86_cache_alignment = c->x86_clflush_size;
-       c->x86_max_cores = 1;
-       c->extended_cpuid_level = 0;
-       memset(&c->x86_capability, 0, sizeof c->x86_capability);
-
-       /* Get vendor name */
-       cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
-             (unsigned int *)&c->x86_vendor_id[0],
-             (unsigned int *)&c->x86_vendor_id[8],
-             (unsigned int *)&c->x86_vendor_id[4]);
-               
-       get_cpu_vendor(c);
-
-       /* Initialize the standard set of capabilities */
-       /* Note that the vendor-specific code below might override */
-
-       /* Intel-defined flags: level 0x00000001 */
-       if (c->cpuid_level >= 0x00000001) {
-               __u32 misc;
-               cpuid(0x00000001, &tfms, &misc, &c->x86_capability[4],
-                     &c->x86_capability[0]);
-               c->x86 = (tfms >> 8) & 0xf;
-               c->x86_model = (tfms >> 4) & 0xf;
-               c->x86_mask = tfms & 0xf;
-               if (c->x86 == 0xf)
-                       c->x86 += (tfms >> 20) & 0xff;
-               if (c->x86 >= 0x6)
-                       c->x86_model += ((tfms >> 16) & 0xF) << 4;
-               if (c->x86_capability[0] & (1<<19)) 
-                       c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
-       } else {
-               /* Have CPUID level 0 only - unheard of */
-               c->x86 = 4;
-       }
-
-#ifdef CONFIG_SMP
-       c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
-#endif
-}
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
-{
-       int i;
-       u32 xlvl;
-
-       early_identify_cpu(c);
-
-       /* AMD-defined flags: level 0x80000001 */
-       xlvl = cpuid_eax(0x80000000);
-       c->extended_cpuid_level = xlvl;
-       if ((xlvl & 0xffff0000) == 0x80000000) {
-               if (xlvl >= 0x80000001) {
-                       c->x86_capability[1] = cpuid_edx(0x80000001);
-                       c->x86_capability[6] = cpuid_ecx(0x80000001);
-               }
-               if (xlvl >= 0x80000004)
-                       get_model_name(c); /* Default name */
-       }
-
-       /* Transmeta-defined flags: level 0x80860001 */
-       xlvl = cpuid_eax(0x80860000);
-       if ((xlvl & 0xffff0000) == 0x80860000) {
-               /* Don't set x86_cpuid_level here for now to not confuse. */
-               if (xlvl >= 0x80860001)
-                       c->x86_capability[2] = cpuid_edx(0x80860001);
-       }
-
-       c->apicid = phys_pkg_id(0);
-
-       /*
-        * Vendor-specific initialization.  In this section we
-        * canonicalize the feature flags, meaning if there are
-        * features a certain CPU supports which CPUID doesn't
-        * tell us, CPUID claiming incorrect flags, or other bugs,
-        * we handle them here.
-        *
-        * At the end of this section, c->x86_capability better
-        * indicate the features this CPU genuinely supports!
-        */
-       switch (c->x86_vendor) {
-       case X86_VENDOR_AMD:
-               init_amd(c);
-               break;
-
-       case X86_VENDOR_INTEL:
-               init_intel(c);
-               break;
-
-       case X86_VENDOR_UNKNOWN:
-       default:
-               display_cacheinfo(c);
-               break;
-       }
-
-       select_idle_routine(c);
-       detect_ht(c); 
-
-       /*
-        * On SMP, boot_cpu_data holds the common feature set between
-        * all CPUs; so make sure that we indicate which features are
-        * common between the CPUs.  The first time this routine gets
-        * executed, c == &boot_cpu_data.
-        */
-       if (c != &boot_cpu_data) {
-               /* AND the already accumulated flags with these */
-               for (i = 0 ; i < NCAPINTS ; i++)
-                       boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
-       }
-
-#ifdef CONFIG_X86_MCE
-       mcheck_init(c);
-#endif
-       if (c == &boot_cpu_data)
-               mtrr_bp_init();
-       else
-               mtrr_ap_init();
-#ifdef CONFIG_NUMA
-       numa_add_cpu(smp_processor_id());
-#endif
-}
-
-void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
-{
-       if (c->x86_model_id[0])
-               printk("%s", c->x86_model_id);
-
-       if (c->x86_mask || c->cpuid_level >= 0) 
-               printk(" stepping %02x\n", c->x86_mask);
-       else
-               printk("\n");
-}
-
-/*
- *     Get CPU information for use by the procfs.
- */
-
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
-       struct cpuinfo_x86 *c = v;
-
-       /* 
-        * These flag bits must match the definitions in <asm/cpufeature.h>.
-        * NULL means this bit is undefined or reserved; either way it doesn't
-        * have meaning as far as Linux is concerned.  Note that it's important
-        * to realize there is a difference between this table and CPUID -- if
-        * applications want to get the raw CPUID data, they should access
-        * /dev/cpu/<cpu_nr>/cpuid instead.
-        */
-       static char *x86_cap_flags[] = {
-               /* Intel-defined */
-               "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
-               "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
-               "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
-               "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL,
-
-               /* AMD-defined */
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
-               NULL, "fxsr_opt", NULL, "rdtscp", NULL, "lm", "3dnowext", "3dnow",
-
-               /* Transmeta-defined */
-               "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-               /* Other (Linux-defined) */
-               "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL,
-               "constant_tsc", NULL, NULL,
-               "up", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-               /* Intel-defined (#2) */
-               "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
-               "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-               /* VIA/Cyrix/Centaur-defined */
-               NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en",
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-               /* AMD-defined (#2) */
-               "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-       };
-       static char *x86_power_flags[] = { 
-               "ts",   /* temperature sensor */
-               "fid",  /* frequency id control */
-               "vid",  /* voltage id control */
-               "ttp",  /* thermal trip */
-               "tm",
-               "stc",
-               NULL,
-               /* nothing */   /* constant_tsc - moved to flags */
-       };
-
-
-#ifdef CONFIG_SMP
-       if (!cpu_online(c-cpu_data))
-               return 0;
-#endif
-
-       seq_printf(m,"processor\t: %u\n"
-                    "vendor_id\t: %s\n"
-                    "cpu family\t: %d\n"
-                    "model\t\t: %d\n"
-                    "model name\t: %s\n",
-                    (unsigned)(c-cpu_data),
-                    c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
-                    c->x86,
-                    (int)c->x86_model,
-                    c->x86_model_id[0] ? c->x86_model_id : "unknown");
-       
-       if (c->x86_mask || c->cpuid_level >= 0)
-               seq_printf(m, "stepping\t: %d\n", c->x86_mask);
-       else
-               seq_printf(m, "stepping\t: unknown\n");
-       
-       if (cpu_has(c,X86_FEATURE_TSC)) {
-               unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data));
-               if (!freq)
-                       freq = cpu_khz;
-               seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
-                            freq / 1000, (freq % 1000));
-       }
-
-       /* Cache size */
-       if (c->x86_cache_size >= 0) 
-               seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
-       
-#ifdef CONFIG_SMP
-       if (smp_num_siblings * c->x86_max_cores > 1) {
-               int cpu = c - cpu_data;
-               seq_printf(m, "physical id\t: %d\n", c->phys_proc_id);
-               seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
-               seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id);
-               seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
-       }
-#endif 
-
-       seq_printf(m,
-               "fpu\t\t: yes\n"
-               "fpu_exception\t: yes\n"
-               "cpuid level\t: %d\n"
-               "wp\t\t: yes\n"
-               "flags\t\t:",
-                  c->cpuid_level);
-
-       { 
-               int i; 
-               for ( i = 0 ; i < 32*NCAPINTS ; i++ )
-                       if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
-                               seq_printf(m, " %s", x86_cap_flags[i]);
-       }
-               
-       seq_printf(m, "\nbogomips\t: %lu.%02lu\n",
-                  c->loops_per_jiffy/(500000/HZ),
-                  (c->loops_per_jiffy/(5000/HZ)) % 100);
-
-       if (c->x86_tlbsize > 0) 
-               seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);
-       seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);
-       seq_printf(m, "cache_alignment\t: %d\n", c->x86_cache_alignment);
-
-       seq_printf(m, "address sizes\t: %u bits physical, %u bits virtual\n", 
-                  c->x86_phys_bits, c->x86_virt_bits);
-
-       seq_printf(m, "power management:");
-       {
-               unsigned i;
-               for (i = 0; i < 32; i++) 
-                       if (c->x86_power & (1 << i)) {
-                               if (i < ARRAY_SIZE(x86_power_flags) &&
-                                       x86_power_flags[i])
-                                       seq_printf(m, "%s%s",
-                                               x86_power_flags[i][0]?" ":"",
-                                               x86_power_flags[i]);
-                               else
-                                       seq_printf(m, " [%d]", i);
-                       }
-       }
-
-       seq_printf(m, "\n\n");
-
-       return 0;
-}
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
-       return *pos < NR_CPUS ? cpu_data + *pos : NULL;
-}
-
-static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-{
-       ++*pos;
-       return c_start(m, pos);
-}
-
-static void c_stop(struct seq_file *m, void *v)
-{
-}
-
-struct seq_operations cpuinfo_op = {
-       .start =c_start,
-       .next = c_next,
-       .stop = c_stop,
-       .show = show_cpuinfo,
-};
-
-#if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE)
-#include <linux/platform_device.h>
-static __init int add_pcspkr(void)
-{
-       struct platform_device *pd;
-       int ret;
-
-       if (!is_initial_xendomain())
-               return 0;
-
-       pd = platform_device_alloc("pcspkr", -1);
-       if (!pd)
-               return -ENOMEM;
-
-       ret = platform_device_add(pd);
-       if (ret)
-               platform_device_put(pd);
-
-       return ret;
-}
-device_initcall(add_pcspkr);
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c
deleted file mode 100644 (file)
index 2230e33..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-/* 
- * X86-64 specific CPU setup.
- * Copyright (C) 1995  Linus Torvalds
- * Copyright 2001, 2002, 2003 SuSE Labs / Andi Kleen.
- * See setup.c for older changelog.
- *
- * Jun Nakajima <jun.nakajima@intel.com> 
- *   Modified for Xen
- *
- */ 
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/bootmem.h>
-#include <linux/bitops.h>
-#include <linux/module.h>
-#include <asm/bootsetup.h>
-#include <asm/pda.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/desc.h>
-#include <asm/atomic.h>
-#include <asm/mmu_context.h>
-#include <asm/smp.h>
-#include <asm/i387.h>
-#include <asm/percpu.h>
-#include <asm/proto.h>
-#include <asm/sections.h>
-#ifdef CONFIG_XEN
-#include <asm/hypervisor.h>
-#endif
-
-char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,};
-
-cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
-
-struct x8664_pda *_cpu_pda[NR_CPUS] __read_mostly;
-EXPORT_SYMBOL(_cpu_pda);
-struct x8664_pda boot_cpu_pda[NR_CPUS] __cacheline_aligned;
-
-#ifndef CONFIG_X86_NO_IDT
-struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; 
-#endif
-
-char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
-
-unsigned long __supported_pte_mask __read_mostly = ~0UL;
-EXPORT_SYMBOL(__supported_pte_mask);
-static int do_not_nx __cpuinitdata = 0;
-
-/* noexec=on|off
-Control non executable mappings for 64bit processes.
-
-on     Enable(default)
-off    Disable
-*/ 
-int __init nonx_setup(char *str)
-{
-       if (!strncmp(str, "on", 2)) {
-                __supported_pte_mask |= _PAGE_NX; 
-               do_not_nx = 0; 
-       } else if (!strncmp(str, "off", 3)) {
-               do_not_nx = 1;
-               __supported_pte_mask &= ~_PAGE_NX;
-        }
-       return 1;
-} 
-__setup("noexec=", nonx_setup);        /* parsed early actually */
-
-int force_personality32 = 0; 
-
-/* noexec32=on|off
-Control non executable heap for 32bit processes.
-To control the stack too use noexec=off
-
-on     PROT_READ does not imply PROT_EXEC for 32bit processes
-off    PROT_READ implies PROT_EXEC (default)
-*/
-static int __init nonx32_setup(char *str)
-{
-       if (!strcmp(str, "on"))
-               force_personality32 &= ~READ_IMPLIES_EXEC;
-       else if (!strcmp(str, "off"))
-               force_personality32 |= READ_IMPLIES_EXEC;
-       return 1;
-}
-__setup("noexec32=", nonx32_setup);
-
-/*
- * Great future plan:
- * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
- * Always point %gs to its beginning
- */
-void __init setup_per_cpu_areas(void)
-{ 
-       int i;
-       unsigned long size;
-
-#ifdef CONFIG_HOTPLUG_CPU
-       prefill_possible_map();
-#endif
-
-       /* Copy section for each CPU (we discard the original) */
-       size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
-#ifdef CONFIG_MODULES
-       if (size < PERCPU_ENOUGH_ROOM)
-               size = PERCPU_ENOUGH_ROOM;
-#endif
-
-       for_each_cpu_mask (i, cpu_possible_map) {
-               char *ptr;
-
-               if (!NODE_DATA(cpu_to_node(i))) {
-                       printk("cpu with no node %d, num_online_nodes %d\n",
-                              i, num_online_nodes());
-                       ptr = alloc_bootmem(size);
-               } else { 
-                       ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node(i)), size);
-               }
-               if (!ptr)
-                       panic("Cannot allocate cpu data for CPU %d\n", i);
-               cpu_pda(i)->data_offset = ptr - __per_cpu_start;
-               memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
-       }
-} 
-
-#ifdef CONFIG_XEN
-static void switch_pt(void)
-{
-       xen_pt_switch(__pa(init_level4_pgt));
-        xen_new_user_pt(__pa(init_level4_user_pgt));
-}
-
-void __cpuinit cpu_gdt_init(struct desc_ptr *gdt_descr)
-{
-       unsigned long frames[16];
-       unsigned long va;
-       int f;
-
-       for (va = gdt_descr->address, f = 0;
-            va < gdt_descr->address + gdt_descr->size;
-            va += PAGE_SIZE, f++) {
-               frames[f] = virt_to_mfn(va);
-               make_page_readonly(
-                       (void *)va, XENFEAT_writable_descriptor_tables);
-       }
-       if (HYPERVISOR_set_gdt(frames, gdt_descr->size /
-                               sizeof (struct desc_struct)))
-               BUG();
-}
-#else
-static void switch_pt(void)
-{
-       asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
-}
-
-void __init cpu_gdt_init(struct desc_ptr *gdt_descr)
-{
-       asm volatile("lgdt %0" :: "m" (*gdt_descr));
-       asm volatile("lidt %0" :: "m" (idt_descr));
-}
-#endif
-
-void pda_init(int cpu)
-{ 
-       struct x8664_pda *pda = cpu_pda(cpu);
-
-       /* Setup up data that may be needed in __get_free_pages early */
-       asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); 
-#ifndef CONFIG_XEN
-       wrmsrl(MSR_GS_BASE, pda);
-#else
-       HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL, (unsigned long)pda);
-#endif
-       pda->cpunumber = cpu; 
-       pda->irqcount = -1;
-       pda->kernelstack = 
-               (unsigned long)stack_thread_info() - PDA_STACKOFFSET + THREAD_SIZE; 
-       pda->active_mm = &init_mm;
-       pda->mmu_state = 0;
-
-       if (cpu == 0) {
-#ifdef CONFIG_XEN
-               xen_init_pt();
-#endif
-               /* others are initialized in smpboot.c */
-               pda->pcurrent = &init_task;
-               pda->irqstackptr = boot_cpu_stack; 
-       } else {
-               pda->irqstackptr = (char *)
-                       __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
-               if (!pda->irqstackptr)
-                       panic("cannot allocate irqstack for cpu %d", cpu); 
-       }
-
-       switch_pt();
-
-       pda->irqstackptr += IRQSTACKSIZE-64;
-} 
-
-#ifndef CONFIG_X86_NO_TSS
-char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]
-__attribute__((section(".bss.page_aligned")));
-#endif
-
-/* May not be marked __init: used by software suspend */
-void syscall_init(void)
-{
-#ifndef CONFIG_XEN
-       /* 
-        * LSTAR and STAR live in a bit strange symbiosis.
-        * They both write to the same internal register. STAR allows to set CS/DS
-        * but only a 32bit target. LSTAR sets the 64bit rip.    
-        */ 
-       wrmsrl(MSR_STAR,  ((u64)__USER32_CS)<<48  | ((u64)__KERNEL_CS)<<32); 
-       wrmsrl(MSR_LSTAR, system_call); 
-
-       /* Flags to clear on syscall */
-       wrmsrl(MSR_SYSCALL_MASK, EF_TF|EF_DF|EF_IE|0x3000); 
-#endif
-#ifdef CONFIG_IA32_EMULATION                   
-       syscall32_cpu_init ();
-#endif
-}
-
-void __cpuinit check_efer(void)
-{
-       unsigned long efer;
-
-       rdmsrl(MSR_EFER, efer); 
-        if (!(efer & EFER_NX) || do_not_nx) { 
-                __supported_pte_mask &= ~_PAGE_NX; 
-        }       
-}
-
-/*
- * cpu_init() initializes state that is per-CPU. Some data is already
- * initialized (naturally) in the bootstrap process, such as the GDT
- * and IDT. We reload them nevertheless, this function acts as a
- * 'CPU state barrier', nothing should get across.
- * A lot of state is already set up in PDA init.
- */
-void __cpuinit cpu_init (void)
-{
-       int cpu = stack_smp_processor_id();
-#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *t = &per_cpu(init_tss, cpu);
-       struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu);
-       unsigned long v; 
-       char *estacks = NULL; 
-       unsigned i;
-#endif
-       struct task_struct *me;
-
-       /* CPU 0 is initialised in head64.c */
-       if (cpu != 0) {
-               pda_init(cpu);
-               zap_low_mappings(cpu);
-       }
-#ifndef CONFIG_X86_NO_TSS
-       else
-               estacks = boot_exception_stacks; 
-#endif
-
-       me = current;
-
-       if (cpu_test_and_set(cpu, cpu_initialized))
-               panic("CPU#%d already initialized!\n", cpu);
-
-       printk("Initializing CPU#%d\n", cpu);
-
-       clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
-
-       /*
-        * Initialize the per-CPU GDT with the boot GDT,
-        * and set up the GDT descriptor:
-        */
-#ifndef CONFIG_XEN 
-       if (cpu)
-               memcpy(cpu_gdt(cpu), cpu_gdt_table, GDT_SIZE);
-#endif
-
-       cpu_gdt_descr[cpu].size = GDT_SIZE;
-       cpu_gdt_init(&cpu_gdt_descr[cpu]);
-
-       memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8);
-       syscall_init();
-
-       wrmsrl(MSR_FS_BASE, 0);
-       wrmsrl(MSR_KERNEL_GS_BASE, 0);
-       barrier(); 
-
-       check_efer();
-
-#ifndef CONFIG_X86_NO_TSS
-       /*
-        * set up and load the per-CPU TSS
-        */
-       for (v = 0; v < N_EXCEPTION_STACKS; v++) {
-               if (cpu) {
-                       static const unsigned int order[N_EXCEPTION_STACKS] = {
-                               [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
-                               [DEBUG_STACK - 1] = DEBUG_STACK_ORDER
-                       };
-
-                       estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
-                       if (!estacks)
-                               panic("Cannot allocate exception stack %ld %d\n",
-                                     v, cpu); 
-               }
-               switch (v + 1) {
-#if DEBUG_STKSZ > EXCEPTION_STKSZ
-               case DEBUG_STACK:
-                       cpu_pda(cpu)->debugstack = (unsigned long)estacks;
-                       estacks += DEBUG_STKSZ;
-                       break;
-#endif
-               default:
-                       estacks += EXCEPTION_STKSZ;
-                       break;
-               }
-               orig_ist->ist[v] = t->ist[v] = (unsigned long)estacks;
-       }
-
-       t->io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
-       /*
-        * <= is required because the CPU will access up to
-        * 8 bits beyond the end of the IO permission bitmap.
-        */
-       for (i = 0; i <= IO_BITMAP_LONGS; i++)
-               t->io_bitmap[i] = ~0UL;
-#endif
-
-       atomic_inc(&init_mm.mm_count);
-       me->active_mm = &init_mm;
-       if (me->mm)
-               BUG();
-       enter_lazy_tlb(&init_mm, me);
-
-#ifndef CONFIG_X86_NO_TSS
-       set_tss_desc(cpu, t);
-#endif
-#ifndef CONFIG_XEN
-       load_TR_desc();
-#endif
-       load_LDT(&init_mm.context);
-
-       /*
-        * Clear all 6 debug registers:
-        */
-
-       set_debugreg(0UL, 0);
-       set_debugreg(0UL, 1);
-       set_debugreg(0UL, 2);
-       set_debugreg(0UL, 3);
-       set_debugreg(0UL, 6);
-       set_debugreg(0UL, 7);
-
-       fpu_init(); 
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/smp-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/smp-xen.c
deleted file mode 100644 (file)
index 32761b5..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- *     Intel SMP support routines.
- *
- *     (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
- *     (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
- *      (c) 2002,2003 Andi Kleen, SuSE Labs.
- *
- *     This code is released under the GNU General Public License version 2 or
- *     later.
- */
-
-#include <linux/init.h>
-
-#include <linux/mm.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/smp_lock.h>
-#include <linux/smp.h>
-#include <linux/kernel_stat.h>
-#include <linux/mc146818rtc.h>
-#include <linux/interrupt.h>
-
-#include <asm/mtrr.h>
-#include <asm/pgalloc.h>
-#include <asm/tlbflush.h>
-#include <asm/mach_apic.h>
-#include <asm/mmu_context.h>
-#include <asm/proto.h>
-#include <asm/apicdef.h>
-#include <asm/idle.h>
-#ifdef CONFIG_XEN
-#include <xen/evtchn.h>
-#endif
-
-#ifndef CONFIG_XEN
-/*
- *     Smarter SMP flushing macros. 
- *             c/o Linus Torvalds.
- *
- *     These mean you can really definitely utterly forget about
- *     writing to user space from interrupts. (Its not allowed anyway).
- *
- *     Optimizations Manfred Spraul <manfred@colorfullife.com>
- *
- *     More scalable flush, from Andi Kleen
- *
- *     To avoid global state use 8 different call vectors.
- *     Each CPU uses a specific vector to trigger flushes on other
- *     CPUs. Depending on the received vector the target CPUs look into
- *     the right per cpu variable for the flush data.
- *
- *     With more than 8 CPUs they are hashed to the 8 available
- *     vectors. The limited global vector space forces us to this right now.
- *     In future when interrupts are split into per CPU domains this could be
- *     fixed, at the cost of triggering multiple IPIs in some cases.
- */
-
-union smp_flush_state {
-       struct {
-               cpumask_t flush_cpumask;
-               struct mm_struct *flush_mm;
-               unsigned long flush_va;
-#define FLUSH_ALL      -1ULL
-               spinlock_t tlbstate_lock;
-       };
-       char pad[SMP_CACHE_BYTES];
-} ____cacheline_aligned;
-
-/* State is put into the per CPU data section, but padded
-   to a full cache line because other CPUs can access it and we don't
-   want false sharing in the per cpu data segment. */
-static DEFINE_PER_CPU(union smp_flush_state, flush_state);
-#endif
-
-/*
- * We cannot call mmdrop() because we are in interrupt context, 
- * instead update mm->cpu_vm_mask.
- */
-static inline void leave_mm(unsigned long cpu)
-{
-       if (read_pda(mmu_state) == TLBSTATE_OK)
-               BUG();
-       cpu_clear(cpu, read_pda(active_mm)->cpu_vm_mask);
-       load_cr3(swapper_pg_dir);
-}
-
-#ifndef CONFIG_XEN
-/*
- *
- * The flush IPI assumes that a thread switch happens in this order:
- * [cpu0: the cpu that switches]
- * 1) switch_mm() either 1a) or 1b)
- * 1a) thread switch to a different mm
- * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
- *     Stop ipi delivery for the old mm. This is not synchronized with
- *     the other cpus, but smp_invalidate_interrupt ignore flush ipis
- *     for the wrong mm, and in the worst case we perform a superfluous
- *     tlb flush.
- * 1a2) set cpu mmu_state to TLBSTATE_OK
- *     Now the smp_invalidate_interrupt won't call leave_mm if cpu0
- *     was in lazy tlb mode.
- * 1a3) update cpu active_mm
- *     Now cpu0 accepts tlb flushes for the new mm.
- * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
- *     Now the other cpus will send tlb flush ipis.
- * 1a4) change cr3.
- * 1b) thread switch without mm change
- *     cpu active_mm is correct, cpu0 already handles
- *     flush ipis.
- * 1b1) set cpu mmu_state to TLBSTATE_OK
- * 1b2) test_and_set the cpu bit in cpu_vm_mask.
- *     Atomically set the bit [other cpus will start sending flush ipis],
- *     and test the bit.
- * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
- * 2) switch %%esp, ie current
- *
- * The interrupt must handle 2 special cases:
- * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
- * - the cpu performs speculative tlb reads, i.e. even if the cpu only
- *   runs in kernel space, the cpu could load tlb entries for user space
- *   pages.
- *
- * The good news is that cpu mmu_state is local to each cpu, no
- * write/read ordering problems.
- */
-
-/*
- * TLB flush IPI:
- *
- * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
- * 2) Leave the mm if we are in the lazy tlb mode.
- *
- * Interrupts are disabled.
- */
-
-asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs)
-{
-       int cpu;
-       int sender;
-       union smp_flush_state *f;
-
-       cpu = smp_processor_id();
-       /*
-        * orig_rax contains the negated interrupt vector.
-        * Use that to determine where the sender put the data.
-        */
-       sender = ~regs->orig_rax - INVALIDATE_TLB_VECTOR_START;
-       f = &per_cpu(flush_state, sender);
-
-       if (!cpu_isset(cpu, f->flush_cpumask))
-               goto out;
-               /* 
-                * This was a BUG() but until someone can quote me the
-                * line from the intel manual that guarantees an IPI to
-                * multiple CPUs is retried _only_ on the erroring CPUs
-                * its staying as a return
-                *
-                * BUG();
-                */
-                
-       if (f->flush_mm == read_pda(active_mm)) {
-               if (read_pda(mmu_state) == TLBSTATE_OK) {
-                       if (f->flush_va == FLUSH_ALL)
-                               local_flush_tlb();
-                       else
-                               __flush_tlb_one(f->flush_va);
-               } else
-                       leave_mm(cpu);
-       }
-out:
-       ack_APIC_irq();
-       cpu_clear(cpu, f->flush_cpumask);
-}
-
-static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
-                                               unsigned long va)
-{
-       int sender;
-       union smp_flush_state *f;
-
-       /* Caller has disabled preemption */
-       sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS;
-       f = &per_cpu(flush_state, sender);
-
-       /* Could avoid this lock when
-          num_online_cpus() <= NUM_INVALIDATE_TLB_VECTORS, but it is
-          probably not worth checking this for a cache-hot lock. */
-       spin_lock(&f->tlbstate_lock);
-
-       f->flush_mm = mm;
-       f->flush_va = va;
-       cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask);
-
-       /*
-        * We have to send the IPI only to
-        * CPUs affected.
-        */
-       send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR_START + sender);
-
-       while (!cpus_empty(f->flush_cpumask))
-               cpu_relax();
-
-       f->flush_mm = NULL;
-       f->flush_va = 0;
-       spin_unlock(&f->tlbstate_lock);
-}
-
-int __cpuinit init_smp_flush(void)
-{
-       int i;
-       for_each_cpu_mask(i, cpu_possible_map) {
-               spin_lock_init(&per_cpu(flush_state, i).tlbstate_lock);
-       }
-       return 0;
-}
-
-core_initcall(init_smp_flush);
-       
-void flush_tlb_current_task(void)
-{
-       struct mm_struct *mm = current->mm;
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       local_flush_tlb();
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-       preempt_enable();
-}
-EXPORT_SYMBOL(flush_tlb_current_task);
-
-void flush_tlb_mm (struct mm_struct * mm)
-{
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       if (current->active_mm == mm) {
-               if (current->mm)
-                       local_flush_tlb();
-               else
-                       leave_mm(smp_processor_id());
-       }
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-
-       preempt_enable();
-}
-EXPORT_SYMBOL(flush_tlb_mm);
-
-void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       cpumask_t cpu_mask;
-
-       preempt_disable();
-       cpu_mask = mm->cpu_vm_mask;
-       cpu_clear(smp_processor_id(), cpu_mask);
-
-       if (current->active_mm == mm) {
-               if(current->mm)
-                       __flush_tlb_one(va);
-                else
-                       leave_mm(smp_processor_id());
-       }
-
-       if (!cpus_empty(cpu_mask))
-               flush_tlb_others(cpu_mask, mm, va);
-
-       preempt_enable();
-}
-EXPORT_SYMBOL(flush_tlb_page);
-
-static void do_flush_tlb_all(void* info)
-{
-       unsigned long cpu = smp_processor_id();
-
-       __flush_tlb_all();
-       if (read_pda(mmu_state) == TLBSTATE_LAZY)
-               leave_mm(cpu);
-}
-
-void flush_tlb_all(void)
-{
-       on_each_cpu(do_flush_tlb_all, NULL, 1, 1);
-}
-#else
-asmlinkage void smp_invalidate_interrupt (void)
-{ return; }
-void flush_tlb_current_task(void)
-{ xen_tlb_flush_mask(&current->mm->cpu_vm_mask); }
-void flush_tlb_mm (struct mm_struct * mm)
-{ xen_tlb_flush_mask(&mm->cpu_vm_mask); }
-void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
-{ xen_invlpg_mask(&vma->vm_mm->cpu_vm_mask, va); }
-void flush_tlb_all(void)
-{ xen_tlb_flush_all(); }
-#endif /* Xen */
-
-/*
- * this function sends a 'reschedule' IPI to another CPU.
- * it goes straight through and wastes no time serializing
- * anything. Worst case is that we lose a reschedule ...
- */
-
-void smp_send_reschedule(int cpu)
-{
-       send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
-}
-
-/*
- * Structure and data for smp_call_function(). This is designed to minimise
- * static memory requirements. It also looks cleaner.
- */
-static DEFINE_SPINLOCK(call_lock);
-
-struct call_data_struct {
-       void (*func) (void *info);
-       void *info;
-       atomic_t started;
-       atomic_t finished;
-       int wait;
-};
-
-static struct call_data_struct * call_data;
-
-void lock_ipi_call_lock(void)
-{
-       spin_lock_irq(&call_lock);
-}
-
-void unlock_ipi_call_lock(void)
-{
-       spin_unlock_irq(&call_lock);
-}
-
-/*
- * this function sends a 'generic call function' IPI to one other CPU
- * in the system.
- *
- * cpu is a standard Linux logical CPU number.
- */
-static void
-__smp_call_function_single(int cpu, void (*func) (void *info), void *info,
-                               int nonatomic, int wait)
-{
-       struct call_data_struct data;
-       int cpus = 1;
-
-       data.func = func;
-       data.info = info;
-       atomic_set(&data.started, 0);
-       data.wait = wait;
-       if (wait)
-               atomic_set(&data.finished, 0);
-
-       call_data = &data;
-       wmb();
-       /* Send a message to all other CPUs and wait for them to respond */
-       send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR);
-
-       /* Wait for response */
-       while (atomic_read(&data.started) != cpus)
-               cpu_relax();
-
-       if (!wait)
-               return;
-
-       while (atomic_read(&data.finished) != cpus)
-               cpu_relax();
-}
-
-/*
- * smp_call_function_single - Run a function on another CPU
- * @func: The function to run. This must be fast and non-blocking.
- * @info: An arbitrary pointer to pass to the function.
- * @nonatomic: Currently unused.
- * @wait: If true, wait until function has completed on other CPUs.
- *
- * Retrurns 0 on success, else a negative status code.
- *
- * Does not return until the remote CPU is nearly ready to execute <func>
- * or is or has executed.
- */
-
-int smp_call_function_single (int cpu, void (*func) (void *info), void *info,
-       int nonatomic, int wait)
-{
-       /* prevent preemption and reschedule on another processor */
-       int me = get_cpu();
-       if (cpu == me) {
-               WARN_ON(1);
-               put_cpu();
-               return -EBUSY;
-       }
-       spin_lock_bh(&call_lock);
-       __smp_call_function_single(cpu, func, info, nonatomic, wait);
-       spin_unlock_bh(&call_lock);
-       put_cpu();
-       return 0;
-}
-
-/*
- * this function sends a 'generic call function' IPI to all other CPUs
- * in the system.
- */
-static void __smp_call_function (void (*func) (void *info), void *info,
-                               int nonatomic, int wait)
-{
-       struct call_data_struct data;
-       int cpus = num_online_cpus()-1;
-
-       if (!cpus)
-               return;
-
-       data.func = func;
-       data.info = info;
-       atomic_set(&data.started, 0);
-       data.wait = wait;
-       if (wait)
-               atomic_set(&data.finished, 0);
-
-       call_data = &data;
-       wmb();
-       /* Send a message to all other CPUs and wait for them to respond */
-       send_IPI_allbutself(CALL_FUNCTION_VECTOR);
-
-       /* Wait for response */
-       while (atomic_read(&data.started) != cpus)
-#ifndef CONFIG_XEN
-               cpu_relax();
-#else
-               barrier();
-#endif
-
-       if (!wait)
-               return;
-
-       while (atomic_read(&data.finished) != cpus)
-#ifndef CONFIG_XEN
-               cpu_relax();
-#else
-               barrier();
-#endif
-}
-
-/*
- * smp_call_function - run a function on all other CPUs.
- * @func: The function to run. This must be fast and non-blocking.
- * @info: An arbitrary pointer to pass to the function.
- * @nonatomic: currently unused.
- * @wait: If true, wait (atomically) until function has completed on other
- *        CPUs.
- *
- * Returns 0 on success, else a negative status code. Does not return until
- * remote CPUs are nearly ready to execute func or are or have executed.
- *
- * You must not call this function with disabled interrupts or from a
- * hardware interrupt handler or from a bottom half handler.
- * Actually there are a few legal cases, like panic.
- */
-int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
-                       int wait)
-{
-       spin_lock(&call_lock);
-       __smp_call_function(func,info,nonatomic,wait);
-       spin_unlock(&call_lock);
-       return 0;
-}
-EXPORT_SYMBOL(smp_call_function);
-
-void smp_stop_cpu(void)
-{
-       unsigned long flags;
-       /*
-        * Remove this CPU:
-        */
-       cpu_clear(smp_processor_id(), cpu_online_map);
-       local_irq_save(flags);
-#ifndef CONFIG_XEN
-       disable_local_APIC();
-#endif
-       local_irq_restore(flags); 
-}
-
-static void smp_really_stop_cpu(void *dummy)
-{
-       smp_stop_cpu(); 
-       for (;;) 
-               halt();
-} 
-
-void smp_send_stop(void)
-{
-       int nolock = 0;
-#ifndef CONFIG_XEN
-       if (reboot_force)
-               return;
-#endif
-       /* Don't deadlock on the call lock in panic */
-       if (!spin_trylock(&call_lock)) {
-               /* ignore locking because we have panicked anyways */
-               nolock = 1;
-       }
-       __smp_call_function(smp_really_stop_cpu, NULL, 0, 0);
-       if (!nolock)
-               spin_unlock(&call_lock);
-
-       local_irq_disable();
-#ifndef CONFIG_XEN
-       disable_local_APIC();
-#endif
-       local_irq_enable();
-}
-
-/*
- * Reschedule call back. Nothing to do,
- * all the work is done automatically when
- * we return from the interrupt.
- */
-#ifndef CONFIG_XEN
-asmlinkage void smp_reschedule_interrupt(void)
-#else
-asmlinkage irqreturn_t smp_reschedule_interrupt(void)
-#endif
-{
-#ifndef CONFIG_XEN
-       ack_APIC_irq();
-#else
-       return IRQ_HANDLED;
-#endif
-}
-
-#ifndef CONFIG_XEN
-asmlinkage void smp_call_function_interrupt(void)
-#else
-asmlinkage irqreturn_t smp_call_function_interrupt(void)
-#endif
-{
-       void (*func) (void *info) = call_data->func;
-       void *info = call_data->info;
-       int wait = call_data->wait;
-
-#ifndef CONFIG_XEN
-       ack_APIC_irq();
-#endif
-       /*
-        * Notify initiating CPU that I've grabbed the data and am
-        * about to execute the function
-        */
-       mb();
-       atomic_inc(&call_data->started);
-       /*
-        * At this point the info structure may be out of scope unless wait==1
-        */
-       exit_idle();
-       irq_enter();
-       (*func)(info);
-       irq_exit();
-       if (wait) {
-               mb();
-               atomic_inc(&call_data->finished);
-       }
-#ifdef CONFIG_XEN
-       return IRQ_HANDLED;
-#endif
-}
-
-int safe_smp_processor_id(void)
-{
-#ifdef CONFIG_XEN
-       return smp_processor_id();
-#else
-       unsigned apicid, i;
-
-       if (disable_apic)
-               return 0;
-
-       apicid = hard_smp_processor_id();
-       if (apicid < NR_CPUS && x86_cpu_to_apicid[apicid] == apicid)
-               return apicid;
-
-       for (i = 0; i < NR_CPUS; ++i) {
-               if (x86_cpu_to_apicid[i] == apicid)
-                       return i;
-       }
-
-       /* No entries in x86_cpu_to_apicid?  Either no MPS|ACPI,
-        * or called too early.  Either way, we must be CPU 0. */
-       if (x86_cpu_to_apicid[0] == BAD_APICID)
-               return 0;
-
-       return 0; /* Should not happen */
-#endif
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c
deleted file mode 100644 (file)
index 313c73f..0000000
+++ /dev/null
@@ -1,1175 +0,0 @@
-/*
- *  linux/arch/x86-64/traps.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *  Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * 'Traps.c' handles hardware traps and faults after we have saved some
- * state in 'entry.S'.
- */
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ptrace.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/nmi.h>
-#include <linux/kprobes.h>
-#include <linux/kexec.h>
-#include <linux/unwind.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#include <asm/debugreg.h>
-#include <asm/desc.h>
-#include <asm/i387.h>
-#include <asm/kdebug.h>
-#include <asm/processor.h>
-#include <asm/unwind.h>
-#include <asm/smp.h>
-#include <asm/pgalloc.h>
-#include <asm/pda.h>
-#include <asm/proto.h>
-#include <asm/nmi.h>
-
-asmlinkage void divide_error(void);
-asmlinkage void debug(void);
-asmlinkage void nmi(void);
-asmlinkage void int3(void);
-asmlinkage void overflow(void);
-asmlinkage void bounds(void);
-asmlinkage void invalid_op(void);
-asmlinkage void device_not_available(void);
-asmlinkage void double_fault(void);
-asmlinkage void coprocessor_segment_overrun(void);
-asmlinkage void invalid_TSS(void);
-asmlinkage void segment_not_present(void);
-asmlinkage void stack_segment(void);
-asmlinkage void general_protection(void);
-asmlinkage void page_fault(void);
-asmlinkage void coprocessor_error(void);
-asmlinkage void simd_coprocessor_error(void);
-asmlinkage void reserved(void);
-asmlinkage void alignment_check(void);
-asmlinkage void machine_check(void);
-asmlinkage void spurious_interrupt_bug(void);
-
-ATOMIC_NOTIFIER_HEAD(die_chain);
-EXPORT_SYMBOL(die_chain);
-
-int register_die_notifier(struct notifier_block *nb)
-{
-       vmalloc_sync_all();
-       return atomic_notifier_chain_register(&die_chain, nb);
-}
-EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
-
-int unregister_die_notifier(struct notifier_block *nb)
-{
-       return atomic_notifier_chain_unregister(&die_chain, nb);
-}
-EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
-
-static inline void conditional_sti(struct pt_regs *regs)
-{
-       if (regs->eflags & X86_EFLAGS_IF)
-               local_irq_enable();
-}
-
-static inline void preempt_conditional_sti(struct pt_regs *regs)
-{
-       preempt_disable();
-       if (regs->eflags & X86_EFLAGS_IF)
-               local_irq_enable();
-}
-
-static inline void preempt_conditional_cli(struct pt_regs *regs)
-{
-       if (regs->eflags & X86_EFLAGS_IF)
-               local_irq_disable();
-       /* Make sure to not schedule here because we could be running
-          on an exception stack. */
-       preempt_enable_no_resched();
-}
-
-static int kstack_depth_to_print = 12;
-#ifdef CONFIG_STACK_UNWIND
-static int call_trace = 1;
-#else
-#define call_trace (-1)
-#endif
-
-#ifdef CONFIG_KALLSYMS
-# include <linux/kallsyms.h>
-void printk_address(unsigned long address)
-{
-       unsigned long offset = 0, symsize;
-       const char *symname;
-       char *modname;
-       char *delim = ":";
-       char namebuf[128];
-
-       symname = kallsyms_lookup(address, &symsize, &offset,
-                                       &modname, namebuf);
-       if (!symname) {
-               printk(" [<%016lx>]\n", address);
-               return;
-       }
-       if (!modname)
-               modname = delim = "";           
-       printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
-               address, delim, modname, delim, symname, offset, symsize);
-}
-#else
-void printk_address(unsigned long address)
-{
-       printk(" [<%016lx>]\n", address);
-}
-#endif
-
-static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
-                                       unsigned *usedp, const char **idp)
-{
-#ifndef CONFIG_X86_NO_TSS
-       static char ids[][8] = {
-               [DEBUG_STACK - 1] = "#DB",
-               [NMI_STACK - 1] = "NMI",
-               [DOUBLEFAULT_STACK - 1] = "#DF",
-               [STACKFAULT_STACK - 1] = "#SS",
-               [MCE_STACK - 1] = "#MC",
-#if DEBUG_STKSZ > EXCEPTION_STKSZ
-               [N_EXCEPTION_STACKS ... N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
-#endif
-       };
-       unsigned k;
-
-       /*
-        * Iterate over all exception stacks, and figure out whether
-        * 'stack' is in one of them:
-        */
-       for (k = 0; k < N_EXCEPTION_STACKS; k++) {
-               unsigned long end;
-
-               /*
-                * set 'end' to the end of the exception stack.
-                */
-               switch (k + 1) {
-               /*
-                * TODO: this block is not needed i think, because
-                * setup64.c:cpu_init() sets up t->ist[DEBUG_STACK]
-                * properly too.
-                */
-#if DEBUG_STKSZ > EXCEPTION_STKSZ
-               case DEBUG_STACK:
-                       end = cpu_pda(cpu)->debugstack + DEBUG_STKSZ;
-                       break;
-#endif
-               default:
-                       end = per_cpu(orig_ist, cpu).ist[k];
-                       break;
-               }
-               /*
-                * Is 'stack' above this exception frame's end?
-                * If yes then skip to the next frame.
-                */
-               if (stack >= end)
-                       continue;
-               /*
-                * Is 'stack' above this exception frame's start address?
-                * If yes then we found the right frame.
-                */
-               if (stack >= end - EXCEPTION_STKSZ) {
-                       /*
-                        * Make sure we only iterate through an exception
-                        * stack once. If it comes up for the second time
-                        * then there's something wrong going on - just
-                        * break out and return NULL:
-                        */
-                       if (*usedp & (1U << k))
-                               break;
-                       *usedp |= 1U << k;
-                       *idp = ids[k];
-                       return (unsigned long *)end;
-               }
-               /*
-                * If this is a debug stack, and if it has a larger size than
-                * the usual exception stacks, then 'stack' might still
-                * be within the lower portion of the debug stack:
-                */
-#if DEBUG_STKSZ > EXCEPTION_STKSZ
-               if (k == DEBUG_STACK - 1 && stack >= end - DEBUG_STKSZ) {
-                       unsigned j = N_EXCEPTION_STACKS - 1;
-
-                       /*
-                        * Black magic. A large debug stack is composed of
-                        * multiple exception stack entries, which we
-                        * iterate through now. Dont look:
-                        */
-                       do {
-                               ++j;
-                               end -= EXCEPTION_STKSZ;
-                               ids[j][4] = '1' + (j - N_EXCEPTION_STACKS);
-                       } while (stack < end - EXCEPTION_STKSZ);
-                       if (*usedp & (1U << j))
-                               break;
-                       *usedp |= 1U << j;
-                       *idp = ids[j];
-                       return (unsigned long *)end;
-               }
-#endif
-       }
-#endif
-       return NULL;
-}
-
-static int show_trace_unwind(struct unwind_frame_info *info, void *context)
-{
-       int n = 0;
-
-       while (unwind(info) == 0 && UNW_PC(info)) {
-               n++;
-               printk_address(UNW_PC(info));
-               if (arch_unw_user_mode(info))
-                       break;
-       }
-       return n;
-}
-
-/*
- * x86-64 can have upto three kernel stacks: 
- * process stack
- * interrupt stack
- * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
- */
-
-void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack)
-{
-       const unsigned cpu = safe_smp_processor_id();
-       unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
-       unsigned used = 0;
-
-       printk("\nCall Trace:\n");
-
-       if (!tsk)
-               tsk = current;
-
-       if (call_trace >= 0) {
-               int unw_ret = 0;
-               struct unwind_frame_info info;
-
-               if (regs) {
-                       if (unwind_init_frame_info(&info, tsk, regs) == 0)
-                               unw_ret = show_trace_unwind(&info, NULL);
-               } else if (tsk == current)
-                       unw_ret = unwind_init_running(&info, show_trace_unwind, NULL);
-               else {
-                       if (unwind_init_blocked(&info, tsk) == 0)
-                               unw_ret = show_trace_unwind(&info, NULL);
-               }
-               if (unw_ret > 0) {
-                       if (call_trace == 1 && !arch_unw_user_mode(&info)) {
-                               print_symbol("DWARF2 unwinder stuck at %s\n",
-                                            UNW_PC(&info));
-                               if ((long)UNW_SP(&info) < 0) {
-                                       printk("Leftover inexact backtrace:\n");
-                                       stack = (unsigned long *)UNW_SP(&info);
-                               } else
-                                       printk("Full inexact backtrace again:\n");
-                       } else if (call_trace >= 1)
-                               return;
-                       else
-                               printk("Full inexact backtrace again:\n");
-               } else
-                       printk("Inexact backtrace:\n");
-       }
-
-       /*
-        * Print function call entries within a stack. 'cond' is the
-        * "end of stackframe" condition, that the 'stack++'
-        * iteration will eventually trigger.
-        */
-#define HANDLE_STACK(cond) \
-       do while (cond) { \
-               unsigned long addr = *stack++; \
-               if (kernel_text_address(addr)) { \
-                       /* \
-                        * If the address is either in the text segment of the \
-                        * kernel, or in the region which contains vmalloc'ed \
-                        * memory, it *may* be the address of a calling \
-                        * routine; if so, print it so that someone tracing \
-                        * down the cause of the crash will be able to figure \
-                        * out the call path that was taken. \
-                        */ \
-                       printk_address(addr); \
-               } \
-       } while (0)
-
-       /*
-        * Print function call entries in all stacks, starting at the
-        * current stack address. If the stacks consist of nested
-        * exceptions
-        */
-       for ( ; ; ) {
-               const char *id;
-               unsigned long *estack_end;
-               estack_end = in_exception_stack(cpu, (unsigned long)stack,
-                                               &used, &id);
-
-               if (estack_end) {
-                       printk(" <%s>", id);
-                       HANDLE_STACK (stack < estack_end);
-                       printk(" <EOE>");
-                       /*
-                        * We link to the next stack via the
-                        * second-to-last pointer (index -2 to end) in the
-                        * exception stack:
-                        */
-                       stack = (unsigned long *) estack_end[-2];
-                       continue;
-               }
-               if (irqstack_end) {
-                       unsigned long *irqstack;
-                       irqstack = irqstack_end -
-                               (IRQSTACKSIZE - 64) / sizeof(*irqstack);
-
-                       if (stack >= irqstack && stack < irqstack_end) {
-                               printk(" <IRQ>");
-                               HANDLE_STACK (stack < irqstack_end);
-                               /*
-                                * We link to the next stack (which would be
-                                * the process stack normally) the last
-                                * pointer (index -1 to end) in the IRQ stack:
-                                */
-                               stack = (unsigned long *) (irqstack_end[-1]);
-                               irqstack_end = NULL;
-                               printk(" <EOI>");
-                               continue;
-                       }
-               }
-               break;
-       }
-
-       /*
-        * This prints the process stack:
-        */
-       HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
-#undef HANDLE_STACK
-
-       printk("\n");
-}
-
-static void _show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned long * rsp)
-{
-       unsigned long *stack;
-       int i;
-       const int cpu = safe_smp_processor_id();
-       unsigned long *irqstack_end = (unsigned long *) (cpu_pda(cpu)->irqstackptr);
-       unsigned long *irqstack = (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE);
-
-       // debugging aid: "show_stack(NULL, NULL);" prints the
-       // back trace for this cpu.
-
-       if (rsp == NULL) {
-               if (tsk)
-                       rsp = (unsigned long *)tsk->thread.rsp;
-               else
-                       rsp = (unsigned long *)&rsp;
-       }
-
-       stack = rsp;
-       for(i=0; i < kstack_depth_to_print; i++) {
-               if (stack >= irqstack && stack <= irqstack_end) {
-                       if (stack == irqstack_end) {
-                               stack = (unsigned long *) (irqstack_end[-1]);
-                               printk(" <EOI> ");
-                       }
-               } else {
-               if (((long) stack & (THREAD_SIZE-1)) == 0)
-                       break;
-               }
-               if (i && ((i % 4) == 0))
-                       printk("\n");
-               printk(" %016lx", *stack++);
-               touch_nmi_watchdog();
-       }
-       show_trace(tsk, regs, rsp);
-}
-
-void show_stack(struct task_struct *tsk, unsigned long * rsp)
-{
-       _show_stack(tsk, NULL, rsp);
-}
-
-/*
- * The architecture-independent dump_stack generator
- */
-void dump_stack(void)
-{
-       unsigned long dummy;
-       show_trace(NULL, NULL, &dummy);
-}
-
-EXPORT_SYMBOL(dump_stack);
-
-void show_registers(struct pt_regs *regs)
-{
-       int i;
-       int in_kernel = !user_mode(regs);
-       unsigned long rsp;
-       const int cpu = safe_smp_processor_id(); 
-       struct task_struct *cur = cpu_pda(cpu)->pcurrent;
-
-               rsp = regs->rsp;
-
-       printk("CPU %d ", cpu);
-       __show_regs(regs);
-       printk("Process %s (pid: %d, threadinfo %p, task %p)\n",
-               cur->comm, cur->pid, task_thread_info(cur), cur);
-
-       /*
-        * When in-kernel, we also print out the stack and code at the
-        * time of the fault..
-        */
-       if (in_kernel) {
-
-               printk("Stack: ");
-               _show_stack(NULL, regs, (unsigned long*)rsp);
-
-               printk("\nCode: ");
-               if (regs->rip < PAGE_OFFSET)
-                       goto bad;
-
-               for (i=0; i<20; i++) {
-                       unsigned char c;
-                       if (__get_user(c, &((unsigned char*)regs->rip)[i])) {
-bad:
-                               printk(" Bad RIP value.");
-                               break;
-                       }
-                       printk("%02x ", c);
-               }
-       }
-       printk("\n");
-}      
-
-void handle_BUG(struct pt_regs *regs)
-{ 
-       struct bug_frame f;
-       long len;
-       const char *prefix = "";
-
-       if (user_mode(regs))
-               return; 
-       if (__copy_from_user(&f, (const void __user *) regs->rip,
-                            sizeof(struct bug_frame)))
-               return; 
-       if (f.filename >= 0 ||
-           f.ud2[0] != 0x0f || f.ud2[1] != 0x0b) 
-               return;
-       len = __strnlen_user((char *)(long)f.filename, PATH_MAX) - 1;
-       if (len < 0 || len >= PATH_MAX)
-               f.filename = (int)(long)"unmapped filename";
-       else if (len > 50) {
-               f.filename += len - 50;
-               prefix = "...";
-       }
-       printk("----------- [cut here ] --------- [please bite here ] ---------\n");
-       printk(KERN_ALERT "Kernel BUG at %s%.50s:%d\n", prefix, (char *)(long)f.filename, f.line);
-} 
-
-#ifdef CONFIG_BUG
-void out_of_line_bug(void)
-{ 
-       BUG(); 
-} 
-EXPORT_SYMBOL(out_of_line_bug);
-#endif
-
-static DEFINE_SPINLOCK(die_lock);
-static int die_owner = -1;
-static unsigned int die_nest_count;
-
-unsigned __kprobes long oops_begin(void)
-{
-       int cpu = safe_smp_processor_id();
-       unsigned long flags;
-
-       /* racy, but better than risking deadlock. */
-       local_irq_save(flags);
-       if (!spin_trylock(&die_lock)) { 
-               if (cpu == die_owner) 
-                       /* nested oops. should stop eventually */;
-               else
-                       spin_lock(&die_lock);
-       }
-       die_nest_count++;
-       die_owner = cpu;
-       console_verbose();
-       bust_spinlocks(1);
-       return flags;
-}
-
-void __kprobes oops_end(unsigned long flags)
-{ 
-       die_owner = -1;
-       bust_spinlocks(0);
-       die_nest_count--;
-       if (die_nest_count)
-               /* We still own the lock */
-               local_irq_restore(flags);
-       else
-               /* Nest count reaches zero, release the lock. */
-               spin_unlock_irqrestore(&die_lock, flags);
-       if (panic_on_oops)
-               panic("Fatal exception");
-}
-
-void __kprobes __die(const char * str, struct pt_regs * regs, long err)
-{
-       static int die_counter;
-       printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff,++die_counter);
-#ifdef CONFIG_PREEMPT
-       printk("PREEMPT ");
-#endif
-#ifdef CONFIG_SMP
-       printk("SMP ");
-#endif
-#ifdef CONFIG_DEBUG_PAGEALLOC
-       printk("DEBUG_PAGEALLOC");
-#endif
-       printk("\n");
-       notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV);
-       show_registers(regs);
-       /* Executive summary in case the oops scrolled away */
-       printk(KERN_ALERT "RIP ");
-       printk_address(regs->rip); 
-       printk(" RSP <%016lx>\n", regs->rsp); 
-       if (kexec_should_crash(current))
-               crash_kexec(regs);
-}
-
-void die(const char * str, struct pt_regs * regs, long err)
-{
-       unsigned long flags = oops_begin();
-
-       handle_BUG(regs);
-       __die(str, regs, err);
-       oops_end(flags);
-       do_exit(SIGSEGV); 
-}
-
-#ifdef CONFIG_X86_LOCAL_APIC
-void __kprobes die_nmi(char *str, struct pt_regs *regs)
-{
-       unsigned long flags = oops_begin();
-
-       /*
-        * We are in trouble anyway, lets at least try
-        * to get a message out.
-        */
-       printk(str, safe_smp_processor_id());
-       show_registers(regs);
-       if (kexec_should_crash(current))
-               crash_kexec(regs);
-       if (panic_on_timeout || panic_on_oops)
-               panic("nmi watchdog");
-       printk("console shuts up ...\n");
-       oops_end(flags);
-       nmi_exit();
-       local_irq_enable();
-       do_exit(SIGSEGV);
-}
-#endif
-
-static void __kprobes do_trap(int trapnr, int signr, char *str,
-                             struct pt_regs * regs, long error_code,
-                             siginfo_t *info)
-{
-       struct task_struct *tsk = current;
-
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = trapnr;
-
-       if (user_mode(regs)) {
-               if (exception_trace && unhandled_signal(tsk, signr))
-                       printk(KERN_INFO
-                              "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n",
-                              tsk->comm, tsk->pid, str,
-                              regs->rip, regs->rsp, error_code); 
-
-               if (info)
-                       force_sig_info(signr, info, tsk);
-               else
-                       force_sig(signr, tsk);
-               return;
-       }
-
-
-       /* kernel trap */ 
-       {            
-               const struct exception_table_entry *fixup;
-               fixup = search_exception_tables(regs->rip);
-               if (fixup)
-                       regs->rip = fixup->fixup;
-               else    
-                       die(str, regs, error_code);
-               return;
-       }
-}
-
-#define DO_ERROR(trapnr, signr, str, name) \
-asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                                       == NOTIFY_STOP) \
-               return; \
-       conditional_sti(regs);                                          \
-       do_trap(trapnr, signr, str, regs, error_code, NULL); \
-}
-
-#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       siginfo_t info; \
-       info.si_signo = signr; \
-       info.si_errno = 0; \
-       info.si_code = sicode; \
-       info.si_addr = (void __user *)siaddr; \
-       if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-                                                       == NOTIFY_STOP) \
-               return; \
-       conditional_sti(regs);                                          \
-       do_trap(trapnr, signr, str, regs, error_code, &info); \
-}
-
-DO_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->rip)
-DO_ERROR( 4, SIGSEGV, "overflow", overflow)
-DO_ERROR( 5, SIGSEGV, "bounds", bounds)
-DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->rip)
-DO_ERROR( 7, SIGSEGV, "device not available", device_not_available)
-DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
-DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
-DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
-DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
-DO_ERROR(18, SIGSEGV, "reserved", reserved)
-
-/* Runs on IST stack */
-asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code)
-{
-       if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
-                       12, SIGBUS) == NOTIFY_STOP)
-               return;
-       preempt_conditional_sti(regs);
-       do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
-       preempt_conditional_cli(regs);
-}
-
-asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
-{
-       static const char str[] = "double fault";
-       struct task_struct *tsk = current;
-
-       /* Return not checked because double check cannot be ignored */
-       notify_die(DIE_TRAP, str, regs, error_code, 8, SIGSEGV);
-
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = 8;
-
-       /* This is always a kernel trap and never fixable (and thus must
-          never return). */
-       for (;;)
-               die(str, regs, error_code);
-}
-
-asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
-                                               long error_code)
-{
-       struct task_struct *tsk = current;
-
-       conditional_sti(regs);
-
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = 13;
-
-       if (user_mode(regs)) {
-               if (exception_trace && unhandled_signal(tsk, SIGSEGV))
-                       printk(KERN_INFO
-                      "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n",
-                              tsk->comm, tsk->pid,
-                              regs->rip, regs->rsp, error_code); 
-
-               force_sig(SIGSEGV, tsk);
-               return;
-       } 
-
-       /* kernel gp */
-       {
-               const struct exception_table_entry *fixup;
-               fixup = search_exception_tables(regs->rip);
-               if (fixup) {
-                       regs->rip = fixup->fixup;
-                       return;
-               }
-               if (notify_die(DIE_GPF, "general protection fault", regs,
-                                       error_code, 13, SIGSEGV) == NOTIFY_STOP)
-                       return;
-               die("general protection fault", regs, error_code);
-       }
-}
-
-static __kprobes void
-mem_parity_error(unsigned char reason, struct pt_regs * regs)
-{
-       printk("Uhhuh. NMI received. Dazed and confused, but trying to continue\n");
-       printk("You probably have a hardware problem with your RAM chips\n");
-
-#if 0 /* XEN */
-       /* Clear and disable the memory parity error line. */
-       reason = (reason & 0xf) | 4;
-       outb(reason, 0x61);
-#endif /* XEN */
-}
-
-static __kprobes void
-io_check_error(unsigned char reason, struct pt_regs * regs)
-{
-       printk("NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-
-#if 0 /* XEN */
-       /* Re-enable the IOCK line, wait for a few seconds */
-       reason = (reason & 0xf) | 8;
-       outb(reason, 0x61);
-       mdelay(2000);
-       reason &= ~8;
-       outb(reason, 0x61);
-#endif /* XEN */
-}
-
-static __kprobes void
-unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-{      printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
-       printk("Dazed and confused, but trying to continue\n");
-       printk("Do you have a strange power saving mode enabled?\n");
-}
-
-/* Runs on IST stack. This code must keep interrupts off all the time.
-   Nested NMIs are prevented by the CPU. */
-asmlinkage __kprobes void default_do_nmi(struct pt_regs *regs)
-{
-       unsigned char reason = 0;
-       int cpu;
-
-       cpu = smp_processor_id();
-
-       /* Only the BSP gets external NMIs from the system.  */
-       if (!cpu)
-               reason = get_nmi_reason();
-
-       if (!(reason & 0xc0)) {
-               if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
-                                                               == NOTIFY_STOP)
-                       return;
-#ifdef CONFIG_X86_LOCAL_APIC
-               /*
-                * Ok, so this is none of the documented NMI sources,
-                * so it must be the NMI watchdog.
-                */
-               if (nmi_watchdog > 0) {
-                       nmi_watchdog_tick(regs,reason);
-                       return;
-               }
-#endif
-               unknown_nmi_error(reason, regs);
-               return;
-       }
-       if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
-               return; 
-
-       /* AK: following checks seem to be broken on modern chipsets. FIXME */
-
-       if (reason & 0x80)
-               mem_parity_error(reason, regs);
-       if (reason & 0x40)
-               io_check_error(reason, regs);
-}
-
-/* runs on IST stack. */
-asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code)
-{
-       if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) {
-               return;
-       }
-       preempt_conditional_sti(regs);
-       do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
-       preempt_conditional_cli(regs);
-}
-
-/* Help handler running on IST stack to switch back to user stack
-   for scheduling or signal handling. The actual stack switch is done in
-   entry.S */
-asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
-{
-       struct pt_regs *regs = eregs;
-       /* Did already sync */
-       if (eregs == (struct pt_regs *)eregs->rsp)
-               ;
-       /* Exception from user space */
-       else if (user_mode(eregs))
-               regs = task_pt_regs(current);
-       /* Exception from kernel and interrupts are enabled. Move to
-          kernel process stack. */
-       else if (eregs->eflags & X86_EFLAGS_IF)
-               regs = (struct pt_regs *)(eregs->rsp -= sizeof(struct pt_regs));
-       if (eregs != regs)
-               *regs = *eregs;
-       return regs;
-}
-
-/* runs on IST stack. */
-asmlinkage void __kprobes do_debug(struct pt_regs * regs,
-                                  unsigned long error_code)
-{
-       unsigned long condition;
-       struct task_struct *tsk = current;
-       siginfo_t info;
-
-       get_debugreg(condition, 6);
-
-       if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
-                                               SIGTRAP) == NOTIFY_STOP)
-               return;
-
-       preempt_conditional_sti(regs);
-
-       /* Mask out spurious debug traps due to lazy DR7 setting */
-       if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
-               if (!tsk->thread.debugreg7) { 
-                       goto clear_dr7;
-               }
-       }
-
-       tsk->thread.debugreg6 = condition;
-
-       /* Mask out spurious TF errors due to lazy TF clearing */
-       if (condition & DR_STEP) {
-               /*
-                * The TF error should be masked out only if the current
-                * process is not traced and if the TRAP flag has been set
-                * previously by a tracing process (condition detected by
-                * the PT_DTRACE flag); remember that the i386 TRAP flag
-                * can be modified by the process itself in user mode,
-                * allowing programs to debug themselves without the ptrace()
-                * interface.
-                */
-                if (!user_mode(regs))
-                       goto clear_TF_reenable;
-               /*
-                * Was the TF flag set by a debugger? If so, clear it now,
-                * so that register information is correct.
-                */
-               if (tsk->ptrace & PT_DTRACE) {
-                       regs->eflags &= ~TF_MASK;
-                       tsk->ptrace &= ~PT_DTRACE;
-               }
-       }
-
-       /* Ok, finally something we can handle */
-       tsk->thread.trap_no = 1;
-       tsk->thread.error_code = error_code;
-       info.si_signo = SIGTRAP;
-       info.si_errno = 0;
-       info.si_code = TRAP_BRKPT;
-       info.si_addr = user_mode(regs) ? (void __user *)regs->rip : NULL;
-       force_sig_info(SIGTRAP, &info, tsk);
-
-clear_dr7:
-       set_debugreg(0UL, 7);
-       preempt_conditional_cli(regs);
-       return;
-
-clear_TF_reenable:
-       set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
-       regs->eflags &= ~TF_MASK;
-       preempt_conditional_cli(regs);
-}
-
-static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr)
-{
-       const struct exception_table_entry *fixup;
-       fixup = search_exception_tables(regs->rip);
-       if (fixup) {
-               regs->rip = fixup->fixup;
-               return 1;
-       }
-       notify_die(DIE_GPF, str, regs, 0, trapnr, SIGFPE);
-       /* Illegal floating point operation in the kernel */
-       current->thread.trap_no = trapnr;
-       die(str, regs, 0);
-       return 0;
-}
-
-/*
- * Note that we play around with the 'TS' bit in an attempt to get
- * the correct behaviour even in the presence of the asynchronous
- * IRQ13 behaviour
- */
-asmlinkage void do_coprocessor_error(struct pt_regs *regs)
-{
-       void __user *rip = (void __user *)(regs->rip);
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short cwd, swd;
-
-       conditional_sti(regs);
-       if (!user_mode(regs) &&
-           kernel_math_error(regs, "kernel x87 math error", 16))
-               return;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 16;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = rip;
-       /*
-        * (~cwd & swd) will mask out exceptions that are not set to unmasked
-        * status.  0x3f is the exception bits in these regs, 0x200 is the
-        * C1 reg you need in case of a stack fault, 0x040 is the stack
-        * fault bit.  We should only be taking one exception at a time,
-        * so if this combination doesn't produce any single exception,
-        * then we have a bad program that isn't synchronizing its FPU usage
-        * and it will suffer the consequences since we won't be able to
-        * fully reproduce the context of the exception
-        */
-       cwd = get_fpu_cwd(task);
-       swd = get_fpu_swd(task);
-       switch (swd & ~cwd & 0x3f) {
-               case 0x000:
-               default:
-                       break;
-               case 0x001: /* Invalid Op */
-                       /*
-                        * swd & 0x240 == 0x040: Stack Underflow
-                        * swd & 0x240 == 0x240: Stack Overflow
-                        * User must clear the SF bit (0x40) if set
-                        */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-asmlinkage void bad_intr(void)
-{
-       printk("bad interrupt"); 
-}
-
-asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
-{
-       void __user *rip = (void __user *)(regs->rip);
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short mxcsr;
-
-       conditional_sti(regs);
-       if (!user_mode(regs) &&
-               kernel_math_error(regs, "kernel simd math error", 19))
-               return;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 19;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = rip;
-       /*
-        * The SIMD FPU exceptions are handled a little differently, as there
-        * is only a single status/control register.  Thus, to determine which
-        * unmasked exception was caught we must mask the exception mask bits
-        * at 0x1f80, and then use these to mask the exception bits at 0x3f.
-        */
-       mxcsr = get_fpu_mxcsr(task);
-       switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
-               case 0x000:
-               default:
-                       break;
-               case 0x001: /* Invalid Op */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs)
-{
-}
-
-#if 0
-asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
-{
-}
-#endif
-
-asmlinkage void __attribute__((weak)) mce_threshold_interrupt(void)
-{
-}
-
-/*
- *  'math_state_restore()' saves the current math information in the
- * old math state array, and gets the new ones from the current task
- *
- * Careful.. There are problems with IBM-designed IRQ13 behaviour.
- * Don't touch unless you *really* know how it works.
- */
-asmlinkage void math_state_restore(void)
-{
-       struct task_struct *me = current;
-        /* clts(); */ /* 'clts' is done for us by Xen during virtual trap. */
-
-       if (!used_math())
-               init_fpu(me);
-       restore_fpu_checking(&me->thread.i387.fxsave);
-       task_thread_info(me)->status |= TS_USEDFPU;
-}
-
-
-/*
- * NB. All these are "interrupt gates" (i.e. events_mask is set) because we
- * specify <dpl>|4 in the second field.
- */
-static trap_info_t trap_table[] = {
-        {  0, 0|4, __KERNEL_CS, (unsigned long)divide_error               },
-        {  1, 0|4, __KERNEL_CS, (unsigned long)debug                      },
-        {  3, 3|4, __KERNEL_CS, (unsigned long)int3                       },
-        {  4, 3|4, __KERNEL_CS, (unsigned long)overflow                   },
-        {  5, 0|4, __KERNEL_CS, (unsigned long)bounds                     },
-        {  6, 0|4, __KERNEL_CS, (unsigned long)invalid_op                 },
-        {  7, 0|4, __KERNEL_CS, (unsigned long)device_not_available       },
-        {  9, 0|4, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun},
-        { 10, 0|4, __KERNEL_CS, (unsigned long)invalid_TSS                },
-        { 11, 0|4, __KERNEL_CS, (unsigned long)segment_not_present        },
-        { 12, 0|4, __KERNEL_CS, (unsigned long)stack_segment              },
-        { 13, 0|4, __KERNEL_CS, (unsigned long)general_protection         },
-        { 14, 0|4, __KERNEL_CS, (unsigned long)page_fault                 },
-        { 15, 0|4, __KERNEL_CS, (unsigned long)spurious_interrupt_bug     },
-        { 16, 0|4, __KERNEL_CS, (unsigned long)coprocessor_error          },
-        { 17, 0|4, __KERNEL_CS, (unsigned long)alignment_check            },
-#ifdef CONFIG_X86_MCE
-        { 18, 0|4, __KERNEL_CS, (unsigned long)machine_check              },
-#endif
-        { 19, 0|4, __KERNEL_CS, (unsigned long)simd_coprocessor_error     },
-#ifdef CONFIG_IA32_EMULATION
-       { IA32_SYSCALL_VECTOR, 3|4, __KERNEL_CS, (unsigned long)ia32_syscall},
-#endif
-        {  0, 0,           0, 0                                              }
-};
-
-void __init trap_init(void)
-{
-        int ret;
-
-        ret = HYPERVISOR_set_trap_table(trap_table);
-        
-        if (ret) 
-                printk("HYPERVISOR_set_trap_table faild: error %d\n",
-                       ret);
-
-       /*
-        * Should be a barrier for any external CPU state.
-        */
-       cpu_init();
-}
-
-void smp_trap_init(trap_info_t *trap_ctxt)
-{
-       trap_info_t *t = trap_table;
-
-       for (t = trap_table; t->address; t++) {
-               trap_ctxt[t->vector].flags = t->flags;
-               trap_ctxt[t->vector].cs = t->cs;
-               trap_ctxt[t->vector].address = t->address;
-       }
-}
-
-
-/* Actual parsing is done early in setup.c. */
-static int __init oops_dummy(char *s)
-{ 
-       panic_on_oops = 1;
-       return 1;
-} 
-__setup("oops=", oops_dummy); 
-
-static int __init kstack_setup(char *s)
-{
-       kstack_depth_to_print = simple_strtoul(s,NULL,0);
-       return 1;
-}
-__setup("kstack=", kstack_setup);
-
-#ifdef CONFIG_STACK_UNWIND
-static int __init call_trace_setup(char *s)
-{
-       if (strcmp(s, "old") == 0)
-               call_trace = -1;
-       else if (strcmp(s, "both") == 0)
-               call_trace = 0;
-       else if (strcmp(s, "newfallback") == 0)
-               call_trace = 1;
-       else if (strcmp(s, "new") == 0)
-               call_trace = 2;
-       return 1;
-}
-__setup("call_trace=", call_trace_setup);
-#endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/vsyscall-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/vsyscall-xen.c
deleted file mode 100644 (file)
index ed452ce..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  linux/arch/x86_64/kernel/vsyscall.c
- *
- *  Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
- *  Copyright 2003 Andi Kleen, SuSE Labs.
- *
- *  Thanks to hpa@transmeta.com for some useful hint.
- *  Special thanks to Ingo Molnar for his early experience with
- *  a different vsyscall implementation for Linux/IA32 and for the name.
- *
- *  vsyscall 1 is located at -10Mbyte, vsyscall 2 is located
- *  at virtual address -10Mbyte+1024bytes etc... There are at max 4
- *  vsyscalls. One vsyscall can reserve more than 1 slot to avoid
- *  jumping out of line if necessary. We cannot add more with this
- *  mechanism because older kernels won't return -ENOSYS.
- *  If we want more than four we need a vDSO.
- *
- *  Note: the concept clashes with user mode linux. If you use UML and
- *  want per guest time just set the kernel.vsyscall64 sysctl to 0.
- */
-
-#include <linux/time.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/timer.h>
-#include <linux/seqlock.h>
-#include <linux/jiffies.h>
-#include <linux/sysctl.h>
-
-#include <asm/vsyscall.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/fixmap.h>
-#include <asm/errno.h>
-#include <asm/io.h>
-
-#define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
-
-int __sysctl_vsyscall __section_sysctl_vsyscall = 1;
-seqlock_t __xtime_lock __section_xtime_lock = SEQLOCK_UNLOCKED;
-
-#include <asm/unistd.h>
-
-static __always_inline void timeval_normalize(struct timeval * tv)
-{
-       time_t __sec;
-
-       __sec = tv->tv_usec / 1000000;
-       if (__sec) {
-               tv->tv_usec %= 1000000;
-               tv->tv_sec += __sec;
-       }
-}
-
-static __always_inline void do_vgettimeofday(struct timeval * tv)
-{
-       long sequence, t;
-       unsigned long sec, usec;
-
-       do {
-               sequence = read_seqbegin(&__xtime_lock);
-               
-               sec = __xtime.tv_sec;
-               usec = (__xtime.tv_nsec / 1000) +
-                       (__jiffies - __wall_jiffies) * (1000000 / HZ);
-
-               if (__vxtime.mode != VXTIME_HPET) {
-                       t = get_cycles_sync();
-                       if (t < __vxtime.last_tsc)
-                               t = __vxtime.last_tsc;
-                       usec += ((t - __vxtime.last_tsc) *
-                                __vxtime.tsc_quot) >> 32;
-                       /* See comment in x86_64 do_gettimeofday. */
-               } else {
-                       usec += ((readl((void *)fix_to_virt(VSYSCALL_HPET) + 0xf0) -
-                                 __vxtime.last) * __vxtime.quot) >> 32;
-               }
-       } while (read_seqretry(&__xtime_lock, sequence));
-
-       tv->tv_sec = sec + usec / 1000000;
-       tv->tv_usec = usec % 1000000;
-}
-
-/* RED-PEN may want to readd seq locking, but then the variable should be write-once. */
-static __always_inline void do_get_tz(struct timezone * tz)
-{
-       *tz = __sys_tz;
-}
-
-static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
-{
-       int ret;
-       asm volatile("vsysc2: syscall"
-               : "=a" (ret)
-               : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) : __syscall_clobber );
-       return ret;
-}
-
-static __always_inline long time_syscall(long *t)
-{
-       long secs;
-       asm volatile("vsysc1: syscall"
-               : "=a" (secs)
-               : "0" (__NR_time),"D" (t) : __syscall_clobber);
-       return secs;
-}
-
-int __vsyscall(0) vgettimeofday(struct timeval * tv, struct timezone * tz)
-{
-       if (!__sysctl_vsyscall)
-               return gettimeofday(tv,tz);
-       if (tv)
-               do_vgettimeofday(tv);
-       if (tz)
-               do_get_tz(tz);
-       return 0;
-}
-
-/* This will break when the xtime seconds get inaccurate, but that is
- * unlikely */
-time_t __vsyscall(1) vtime(time_t *t)
-{
-       if (!__sysctl_vsyscall)
-               return time_syscall(t);
-       else if (t)
-               *t = __xtime.tv_sec;            
-       return __xtime.tv_sec;
-}
-
-long __vsyscall(2) venosys_0(void)
-{
-       return -ENOSYS;
-}
-
-long __vsyscall(3) venosys_1(void)
-{
-       return -ENOSYS;
-}
-
-#ifdef CONFIG_SYSCTL
-
-#define SYSCALL 0x050f
-#define NOP2    0x9090
-
-/*
- * NOP out syscall in vsyscall page when not needed.
- */
-static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
-                        void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       extern u16 vsysc1, vsysc2;
-       u16 *map1, *map2;
-       int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
-       if (!write)
-               return ret;
-       /* gcc has some trouble with __va(__pa()), so just do it this
-          way. */
-       map1 = ioremap(__pa_symbol(&vsysc1), 2);
-       if (!map1)
-               return -ENOMEM;
-       map2 = ioremap(__pa_symbol(&vsysc2), 2);
-       if (!map2) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       if (!sysctl_vsyscall) {
-               *map1 = SYSCALL;
-               *map2 = SYSCALL;
-       } else {
-               *map1 = NOP2;
-               *map2 = NOP2;
-       }
-       iounmap(map2);
-out:
-       iounmap(map1);
-       return ret;
-}
-
-static int vsyscall_sysctl_nostrat(ctl_table *t, int __user *name, int nlen,
-                               void __user *oldval, size_t __user *oldlenp,
-                               void __user *newval, size_t newlen,
-                               void **context)
-{
-       return -ENOSYS;
-}
-
-static ctl_table kernel_table2[] = {
-       { .ctl_name = 99, .procname = "vsyscall64",
-         .data = &sysctl_vsyscall, .maxlen = sizeof(int), .mode = 0644,
-         .strategy = vsyscall_sysctl_nostrat,
-         .proc_handler = vsyscall_sysctl_change },
-       { 0, }
-};
-
-static ctl_table kernel_root_table2[] = {
-       { .ctl_name = CTL_KERN, .procname = "kernel", .mode = 0555,
-         .child = kernel_table2 },
-       { 0 },
-};
-
-#endif
-
-static void __init map_vsyscall(void)
-{
-       extern char __vsyscall_0;
-       unsigned long physaddr_page0 = __pa_symbol(&__vsyscall_0);
-
-       __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_page0, PAGE_KERNEL_VSYSCALL);
-}
-
-#ifdef CONFIG_XEN
-static void __init map_vsyscall_user(void)
-{
-       extern void __set_fixmap_user(enum fixed_addresses, unsigned long, pgprot_t);
-       extern char __vsyscall_0;
-       unsigned long physaddr_page0 = __pa_symbol(&__vsyscall_0);
-
-       __set_fixmap_user(VSYSCALL_FIRST_PAGE, physaddr_page0, PAGE_KERNEL_VSYSCALL);
-}
-#endif
-
-static int __init vsyscall_init(void)
-{
-       BUG_ON(((unsigned long) &vgettimeofday !=
-                       VSYSCALL_ADDR(__NR_vgettimeofday)));
-       BUG_ON((unsigned long) &vtime != VSYSCALL_ADDR(__NR_vtime));
-       BUG_ON((VSYSCALL_ADDR(0) != __fix_to_virt(VSYSCALL_FIRST_PAGE)));
-       map_vsyscall();
-#ifdef CONFIG_XEN
-       map_vsyscall_user();
-       sysctl_vsyscall = 0; /* disable vgettimeofay() */
-#endif
-#ifdef CONFIG_SYSCTL
-       register_sysctl_table(kernel_root_table2, 0);
-#endif
-       return 0;
-}
-
-__initcall(vsyscall_init);
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/xen_entry.S b/linux-2.6-xen-sparse/arch/x86_64/kernel/xen_entry.S
deleted file mode 100644 (file)
index b3d7f19..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copied from arch/xen/i386/kernel/entry.S
- */                        
-/* Offsets into shared_info_t. */                
-#define evtchn_upcall_pending          /* 0 */
-#define evtchn_upcall_mask             1
-
-#define sizeof_vcpu_shift              6
-
-#ifdef CONFIG_SMP
-//#define preempt_disable(reg) incl threadinfo_preempt_count(reg)
-//#define preempt_enable(reg)  decl threadinfo_preempt_count(reg)
-#define preempt_disable(reg)
-#define preempt_enable(reg)
-#define XEN_GET_VCPU_INFO(reg) preempt_disable(%rbp)                   ; \
-                               movq %gs:pda_cpunumber,reg              ; \
-                               shl  $32, reg                           ; \
-                               shr  $32-sizeof_vcpu_shift,reg          ; \
-                               addq HYPERVISOR_shared_info,reg
-#define XEN_PUT_VCPU_INFO(reg) preempt_enable(%rbp)                    ; \
-#define XEN_PUT_VCPU_INFO_fixup .byte 0xff,0xff,0xff
-#else
-#define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info,reg
-#define XEN_PUT_VCPU_INFO(reg)
-#define XEN_PUT_VCPU_INFO_fixup
-#endif
-
-#define XEN_LOCKED_BLOCK_EVENTS(reg)   movb $1,evtchn_upcall_mask(reg)
-#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg)
-#define XEN_BLOCK_EVENTS(reg)  XEN_GET_VCPU_INFO(reg)                  ; \
-                               XEN_LOCKED_BLOCK_EVENTS(reg)            ; \
-                               XEN_PUT_VCPU_INFO(reg)
-#define XEN_UNBLOCK_EVENTS(reg)        XEN_GET_VCPU_INFO(reg)                  ; \
-                               XEN_LOCKED_UNBLOCK_EVENTS(reg)          ; \
-                               XEN_PUT_VCPU_INFO(reg)
-#define XEN_TEST_PENDING(reg)  testb $0xFF,evtchn_upcall_pending(reg)
-
-VGCF_IN_SYSCALL = (1<<8)
-        
-       
diff --git a/linux-2.6-xen-sparse/arch/x86_64/mm/Makefile b/linux-2.6-xen-sparse/arch/x86_64/mm/Makefile
deleted file mode 100644 (file)
index 7d6ceae..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Makefile for the linux x86_64-specific parts of the memory manager.
-#
-
-obj-y   := init.o fault.o ioremap.o extable.o pageattr.o mmap.o
-obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
-obj-$(CONFIG_NUMA) += numa.o
-obj-$(CONFIG_K8_NUMA) += k8topology.o
-obj-$(CONFIG_ACPI_NUMA) += srat.o
-
-hugetlbpage-y = ../../i386/mm/hugetlbpage.o
-
-ifdef CONFIG_XEN
-include $(srctree)/scripts/Makefile.xen
-
-ioremap-y      += ../../i386/mm/ioremap-xen.o
-hypervisor-y   += ../../i386/mm/hypervisor.o
-obj-y          += hypervisor.o
-
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c b/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c
deleted file mode 100644 (file)
index 5c832c8..0000000
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- *  linux/arch/x86-64/mm/fault.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *  Copyright (C) 2001,2002 Andi Kleen, SuSE Labs.
- */
-
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/tty.h>
-#include <linux/vt_kern.h>             /* For unblank_screen() */
-#include <linux/compiler.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/smp.h>
-#include <asm/tlbflush.h>
-#include <asm/proto.h>
-#include <asm/kdebug.h>
-#include <asm-generic/sections.h>
-
-/* Page fault error code bits */
-#define PF_PROT        (1<<0)          /* or no page found */
-#define PF_WRITE       (1<<1)
-#define PF_USER        (1<<2)
-#define PF_RSVD        (1<<3)
-#define PF_INSTR       (1<<4)
-
-#ifdef CONFIG_KPROBES
-ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
-
-/* Hook to register for page fault notifications */
-int register_page_fault_notifier(struct notifier_block *nb)
-{
-       vmalloc_sync_all();
-       return atomic_notifier_chain_register(&notify_page_fault_chain, nb);
-}
-
-int unregister_page_fault_notifier(struct notifier_block *nb)
-{
-       return atomic_notifier_chain_unregister(&notify_page_fault_chain, nb);
-}
-
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
-{
-       struct die_args args = {
-               .regs = regs,
-               .str = str,
-               .err = err,
-               .trapnr = trap,
-               .signr = sig
-       };
-       return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-}
-#else
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
-{
-       return NOTIFY_DONE;
-}
-#endif
-
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-       if (yes) {
-               oops_in_progress = 1;
-       } else {
-#ifdef CONFIG_VT
-               unblank_screen();
-#endif
-               oops_in_progress = 0;
-               /*
-                * OK, the message is on the console.  Now we call printk()
-                * without oops_in_progress set so that printk will give klogd
-                * a poke.  Hold onto your hats...
-                */
-               console_loglevel = 15;          /* NMI oopser may have shut the console up */
-               printk(" ");
-               console_loglevel = loglevel_save;
-       }
-}
-
-/* Sometimes the CPU reports invalid exceptions on prefetch.
-   Check that here and ignore.
-   Opcode checker based on code by Richard Brunner */
-static noinline int is_prefetch(struct pt_regs *regs, unsigned long addr,
-                               unsigned long error_code)
-{ 
-       unsigned char *instr;
-       int scan_more = 1;
-       int prefetch = 0; 
-       unsigned char *max_instr;
-
-       /* If it was a exec fault ignore */
-       if (error_code & PF_INSTR)
-               return 0;
-       
-       instr = (unsigned char *)convert_rip_to_linear(current, regs);
-       max_instr = instr + 15;
-
-       if (user_mode(regs) && instr >= (unsigned char *)TASK_SIZE)
-               return 0;
-
-       while (scan_more && instr < max_instr) { 
-               unsigned char opcode;
-               unsigned char instr_hi;
-               unsigned char instr_lo;
-
-               if (__get_user(opcode, instr))
-                       break; 
-
-               instr_hi = opcode & 0xf0; 
-               instr_lo = opcode & 0x0f; 
-               instr++;
-
-               switch (instr_hi) { 
-               case 0x20:
-               case 0x30:
-                       /* Values 0x26,0x2E,0x36,0x3E are valid x86
-                          prefixes.  In long mode, the CPU will signal
-                          invalid opcode if some of these prefixes are
-                          present so we will never get here anyway */
-                       scan_more = ((instr_lo & 7) == 0x6);
-                       break;
-                       
-               case 0x40:
-                       /* In AMD64 long mode, 0x40 to 0x4F are valid REX prefixes
-                          Need to figure out under what instruction mode the
-                          instruction was issued ... */
-                       /* Could check the LDT for lm, but for now it's good
-                          enough to assume that long mode only uses well known
-                          segments or kernel. */
-                       scan_more = (!user_mode(regs)) || (regs->cs == __USER_CS);
-                       break;
-                       
-               case 0x60:
-                       /* 0x64 thru 0x67 are valid prefixes in all modes. */
-                       scan_more = (instr_lo & 0xC) == 0x4;
-                       break;          
-               case 0xF0:
-                       /* 0xF0, 0xF2, and 0xF3 are valid prefixes in all modes. */
-                       scan_more = !instr_lo || (instr_lo>>1) == 1;
-                       break;                  
-               case 0x00:
-                       /* Prefetch instruction is 0x0F0D or 0x0F18 */
-                       scan_more = 0;
-                       if (__get_user(opcode, instr)) 
-                               break;
-                       prefetch = (instr_lo == 0xF) &&
-                               (opcode == 0x0D || opcode == 0x18);
-                       break;                  
-               default:
-                       scan_more = 0;
-                       break;
-               } 
-       }
-       return prefetch;
-}
-
-static int bad_address(void *p) 
-{ 
-       unsigned long dummy;
-       return __get_user(dummy, (unsigned long *)p);
-} 
-
-void dump_pagetable(unsigned long address)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
-       pgd += pgd_index(address);
-       if (bad_address(pgd)) goto bad;
-       printk("PGD %lx ", pgd_val(*pgd));
-       if (!pgd_present(*pgd)) goto ret; 
-
-       pud = pud_offset(pgd, address);
-       if (bad_address(pud)) goto bad;
-       printk("PUD %lx ", pud_val(*pud));
-       if (!pud_present(*pud)) goto ret;
-
-       pmd = pmd_offset(pud, address);
-       if (bad_address(pmd)) goto bad;
-       printk("PMD %lx ", pmd_val(*pmd));
-       if (!pmd_present(*pmd)) goto ret;        
-
-       pte = pte_offset_kernel(pmd, address);
-       if (bad_address(pte)) goto bad;
-       printk("PTE %lx", pte_val(*pte)); 
-ret:
-       printk("\n");
-       return;
-bad:
-       printk("BAD\n");
-}
-
-static const char errata93_warning[] = 
-KERN_ERR "******* Your BIOS seems to not contain a fix for K8 errata #93\n"
-KERN_ERR "******* Working around it, but it may cause SEGVs or burn power.\n"
-KERN_ERR "******* Please consider a BIOS update.\n"
-KERN_ERR "******* Disabling USB legacy in the BIOS may also help.\n";
-
-/* Workaround for K8 erratum #93 & buggy BIOS.
-   BIOS SMM functions are required to use a specific workaround
-   to avoid corruption of the 64bit RIP register on C stepping K8. 
-   A lot of BIOS that didn't get tested properly miss this. 
-   The OS sees this as a page fault with the upper 32bits of RIP cleared.
-   Try to work around it here.
-   Note we only handle faults in kernel here. */
-
-static int is_errata93(struct pt_regs *regs, unsigned long address) 
-{
-       static int warned;
-       if (address != regs->rip)
-               return 0;
-       if ((address >> 32) != 0) 
-               return 0;
-       address |= 0xffffffffUL << 32;
-       if ((address >= (u64)_stext && address <= (u64)_etext) || 
-           (address >= MODULES_VADDR && address <= MODULES_END)) { 
-               if (!warned) {
-                       printk(errata93_warning);               
-                       warned = 1;
-               }
-               regs->rip = address;
-               return 1;
-       }
-       return 0;
-} 
-
-int unhandled_signal(struct task_struct *tsk, int sig)
-{
-       if (tsk->pid == 1)
-               return 1;
-       if (tsk->ptrace & PT_PTRACED)
-               return 0;
-       return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
-               (tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);
-}
-
-static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,
-                                unsigned long error_code)
-{
-       unsigned long flags = oops_begin();
-       struct task_struct *tsk;
-
-       printk(KERN_ALERT "%s: Corrupted page table at address %lx\n",
-              current->comm, address);
-       dump_pagetable(address);
-       tsk = current;
-       tsk->thread.cr2 = address;
-       tsk->thread.trap_no = 14;
-       tsk->thread.error_code = error_code;
-       __die("Bad pagetable", regs, error_code);
-       oops_end(flags);
-       do_exit(SIGKILL);
-}
-
-/*
- * Handle a fault on the vmalloc area
- *
- * This assumes no large pages in there.
- */
-static int vmalloc_fault(unsigned long address)
-{
-       pgd_t *pgd, *pgd_ref;
-       pud_t *pud, *pud_ref;
-       pmd_t *pmd, *pmd_ref;
-       pte_t *pte, *pte_ref;
-
-       /* Copy kernel mappings over when needed. This can also
-          happen within a race in page table update. In the later
-          case just flush. */
-
-       /* On Xen the line below does not always work. Needs investigating! */
-       /*pgd = pgd_offset(current->mm ?: &init_mm, address);*/
-       pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
-       pgd += pgd_index(address);
-       pgd_ref = pgd_offset_k(address);
-       if (pgd_none(*pgd_ref))
-               return -1;
-       if (pgd_none(*pgd))
-               set_pgd(pgd, *pgd_ref);
-       else
-               BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref));
-
-       /* Below here mismatches are bugs because these lower tables
-          are shared */
-
-       pud = pud_offset(pgd, address);
-       pud_ref = pud_offset(pgd_ref, address);
-       if (pud_none(*pud_ref))
-               return -1;
-       if (pud_none(*pud) || pud_page(*pud) != pud_page(*pud_ref))
-               BUG();
-       pmd = pmd_offset(pud, address);
-       pmd_ref = pmd_offset(pud_ref, address);
-       if (pmd_none(*pmd_ref))
-               return -1;
-       if (pmd_none(*pmd) || pmd_page(*pmd) != pmd_page(*pmd_ref))
-               BUG();
-       pte_ref = pte_offset_kernel(pmd_ref, address);
-       if (!pte_present(*pte_ref))
-               return -1;
-       pte = pte_offset_kernel(pmd, address);
-       /* Don't use pte_page here, because the mappings can point
-          outside mem_map, and the NUMA hash lookup cannot handle
-          that. */
-       if (!pte_present(*pte) || pte_pfn(*pte) != pte_pfn(*pte_ref))
-               BUG();
-       return 0;
-}
-
-int page_fault_trace = 0;
-int exception_trace = 1;
-
-
-#define MEM_VERBOSE 1
-
-#ifdef MEM_VERBOSE
-#define MEM_LOG(_f, _a...)                     \
-       printk("fault.c:[%d]-> " _f "\n",       \
-       __LINE__ , ## _a )
-#else
-#define MEM_LOG(_f, _a...) ((void)0)
-#endif
-
-static int spurious_fault(struct pt_regs *regs,
-                         unsigned long address,
-                         unsigned long error_code)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-#ifdef CONFIG_XEN
-       /* Faults in hypervisor area are never spurious. */
-       if ((address >= HYPERVISOR_VIRT_START) &&
-           (address < HYPERVISOR_VIRT_END))
-               return 0;
-#endif
-
-       /* Reserved-bit violation or user access to kernel space? */
-       if (error_code & (PF_RSVD|PF_USER))
-               return 0;
-
-       pgd = init_mm.pgd + pgd_index(address);
-       if (!pgd_present(*pgd))
-               return 0;
-
-       pud = pud_offset(pgd, address);
-       if (!pud_present(*pud))
-               return 0;
-
-       pmd = pmd_offset(pud, address);
-       if (!pmd_present(*pmd))
-               return 0;
-
-       pte = pte_offset_kernel(pmd, address);
-       if (!pte_present(*pte))
-               return 0;
-       if ((error_code & PF_WRITE) && !pte_write(*pte))
-               return 0;
-       if ((error_code & PF_INSTR) && (pte_val(*pte) & _PAGE_NX))
-               return 0;
-
-       return 1;
-}
-
-/*
- * This routine handles page faults.  It determines the address,
- * and the problem, and then passes it off to one of the appropriate
- * routines.
- */
-asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
-                                       unsigned long error_code)
-{
-       struct task_struct *tsk;
-       struct mm_struct *mm;
-       struct vm_area_struct * vma;
-       unsigned long address;
-       const struct exception_table_entry *fixup;
-       int write;
-       unsigned long flags;
-       siginfo_t info;
-
-       if (!user_mode(regs))
-               error_code &= ~PF_USER; /* means kernel */
-
-       tsk = current;
-       mm = tsk->mm;
-       prefetchw(&mm->mmap_sem);
-
-       /* get the address */
-       address = current_vcpu_info()->arch.cr2;
-
-       info.si_code = SEGV_MAPERR;
-
-
-       /*
-        * We fault-in kernel-space virtual memory on-demand. The
-        * 'reference' page table is init_mm.pgd.
-        *
-        * NOTE! We MUST NOT take any locks for this case. We may
-        * be in an interrupt or a critical region, and should
-        * only copy the information from the master page table,
-        * nothing more.
-        *
-        * This verifies that the fault happens in kernel space
-        * (error_code & 4) == 0, and that the fault was not a
-        * protection error (error_code & 9) == 0.
-        */
-       if (unlikely(address >= TASK_SIZE64)) {
-               /*
-                * Don't check for the module range here: its PML4
-                * is always initialized because it's shared with the main
-                * kernel text. Only vmalloc may need PML4 syncups.
-                */
-               if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) &&
-                     ((address >= VMALLOC_START && address < VMALLOC_END))) {
-                       if (vmalloc_fault(address) >= 0)
-                               return;
-               }
-               /* Can take a spurious fault if mapping changes R/O -> R/W. */
-               if (spurious_fault(regs, address, error_code))
-                       return;
-               if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                               SIGSEGV) == NOTIFY_STOP)
-                       return;
-               /*
-                * Don't take the mm semaphore here. If we fixup a prefetch
-                * fault we could otherwise deadlock.
-                */
-               goto bad_area_nosemaphore;
-       }
-
-       if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                       SIGSEGV) == NOTIFY_STOP)
-               return;
-
-       if (likely(regs->eflags & X86_EFLAGS_IF))
-               local_irq_enable();
-
-       if (unlikely(page_fault_trace))
-               printk("pagefault rip:%lx rsp:%lx cs:%lu ss:%lu address %lx error %lx\n",
-                      regs->rip,regs->rsp,regs->cs,regs->ss,address,error_code); 
-
-       if (unlikely(error_code & PF_RSVD))
-               pgtable_bad(address, regs, error_code);
-
-       /*
-        * If we're in an interrupt or have no user
-        * context, we must not take the fault..
-        */
-       if (unlikely(in_atomic() || !mm))
-               goto bad_area_nosemaphore;
-
- again:
-       /* When running in the kernel we expect faults to occur only to
-        * addresses in user space.  All other faults represent errors in the
-        * kernel and should generate an OOPS.  Unfortunatly, in the case of an
-        * erroneous fault occurring in a code path which already holds mmap_sem
-        * we will deadlock attempting to validate the fault against the
-        * address space.  Luckily the kernel only validly references user
-        * space from well defined areas of code, which are listed in the
-        * exceptions table.
-        *
-        * As the vast majority of faults will be valid we will only perform
-        * the source reference check when there is a possibilty of a deadlock.
-        * Attempt to lock the address space, if we cannot we then validate the
-        * source.  If this is invalid we can skip the address space check,
-        * thus avoiding the deadlock.
-        */
-       if (!down_read_trylock(&mm->mmap_sem)) {
-               if ((error_code & PF_USER) == 0 &&
-                   !search_exception_tables(regs->rip))
-                       goto bad_area_nosemaphore;
-               down_read(&mm->mmap_sem);
-       }
-
-       vma = find_vma(mm, address);
-       if (!vma)
-               goto bad_area;
-       if (likely(vma->vm_start <= address))
-               goto good_area;
-       if (!(vma->vm_flags & VM_GROWSDOWN))
-               goto bad_area;
-       if (error_code & 4) {
-               /* Allow userspace just enough access below the stack pointer
-                * to let the 'enter' instruction work.
-                */
-               if (address + 65536 + 32 * sizeof(unsigned long) < regs->rsp)
-                       goto bad_area;
-       }
-       if (expand_stack(vma, address))
-               goto bad_area;
-/*
- * Ok, we have a good vm_area for this memory access, so
- * we can handle it..
- */
-good_area:
-       info.si_code = SEGV_ACCERR;
-       write = 0;
-       switch (error_code & (PF_PROT|PF_WRITE)) {
-               default:        /* 3: write, present */
-                       /* fall through */
-               case PF_WRITE:          /* write, not present */
-                       if (!(vma->vm_flags & VM_WRITE))
-                               goto bad_area;
-                       write++;
-                       break;
-               case PF_PROT:           /* read, present */
-                       goto bad_area;
-               case 0:                 /* read, not present */
-                       if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-                               goto bad_area;
-       }
-
-       /*
-        * If for any reason at all we couldn't handle the fault,
-        * make sure we exit gracefully rather than endlessly redo
-        * the fault.
-        */
-       switch (handle_mm_fault(mm, vma, address, write)) {
-       case VM_FAULT_MINOR:
-               tsk->min_flt++;
-               break;
-       case VM_FAULT_MAJOR:
-               tsk->maj_flt++;
-               break;
-       case VM_FAULT_SIGBUS:
-               goto do_sigbus;
-       default:
-               goto out_of_memory;
-       }
-
-       up_read(&mm->mmap_sem);
-       return;
-
-/*
- * Something tried to access memory that isn't in our memory map..
- * Fix it, but check if it's kernel or user first..
- */
-bad_area:
-       up_read(&mm->mmap_sem);
-
-bad_area_nosemaphore:
-       /* User mode accesses just cause a SIGSEGV */
-       if (error_code & PF_USER) {
-               if (is_prefetch(regs, address, error_code))
-                       return;
-
-               /* Work around K8 erratum #100 K8 in compat mode
-                  occasionally jumps to illegal addresses >4GB.  We
-                  catch this here in the page fault handler because
-                  these addresses are not reachable. Just detect this
-                  case and return.  Any code segment in LDT is
-                  compatibility mode. */
-               if ((regs->cs == __USER32_CS || (regs->cs & (1<<2))) &&
-                   (address >> 32))
-                       return;
-
-               if (exception_trace && unhandled_signal(tsk, SIGSEGV)) {
-                       printk(
-                      "%s%s[%d]: segfault at %016lx rip %016lx rsp %016lx error %lx\n",
-                                       tsk->pid > 1 ? KERN_INFO : KERN_EMERG,
-                                       tsk->comm, tsk->pid, address, regs->rip,
-                                       regs->rsp, error_code);
-               }
-       
-               tsk->thread.cr2 = address;
-               /* Kernel addresses are always protection faults */
-               tsk->thread.error_code = error_code | (address >= TASK_SIZE);
-               tsk->thread.trap_no = 14;
-               info.si_signo = SIGSEGV;
-               info.si_errno = 0;
-               /* info.si_code has been set above */
-               info.si_addr = (void __user *)address;
-               force_sig_info(SIGSEGV, &info, tsk);
-               return;
-       }
-
-no_context:
-       
-       /* Are we prepared to handle this kernel fault?  */
-       fixup = search_exception_tables(regs->rip);
-       if (fixup) {
-               regs->rip = fixup->fixup;
-               return;
-       }
-
-       /* 
-        * Hall of shame of CPU/BIOS bugs.
-        */
-
-       if (is_prefetch(regs, address, error_code))
-               return;
-
-       if (is_errata93(regs, address))
-               return; 
-
-/*
- * Oops. The kernel tried to access some bad page. We'll have to
- * terminate things with extreme prejudice.
- */
-
-       flags = oops_begin();
-
-       if (address < PAGE_SIZE)
-               printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
-       else
-               printk(KERN_ALERT "Unable to handle kernel paging request");
-       printk(" at %016lx RIP: \n" KERN_ALERT,address);
-       printk_address(regs->rip);
-       dump_pagetable(address);
-       tsk->thread.cr2 = address;
-       tsk->thread.trap_no = 14;
-       tsk->thread.error_code = error_code;
-       __die("Oops", regs, error_code);
-       /* Executive summary in case the body of the oops scrolled away */
-       printk(KERN_EMERG "CR2: %016lx\n", address);
-       oops_end(flags);
-       do_exit(SIGKILL);
-
-/*
- * We ran out of memory, or some other thing happened to us that made
- * us unable to handle the page fault gracefully.
- */
-out_of_memory:
-       up_read(&mm->mmap_sem);
-       if (current->pid == 1) { 
-               yield();
-               goto again;
-       }
-       printk("VM: killing process %s\n", tsk->comm);
-       if (error_code & 4)
-               do_exit(SIGKILL);
-       goto no_context;
-
-do_sigbus:
-       up_read(&mm->mmap_sem);
-
-       /* Kernel mode? Handle exceptions or die */
-       if (!(error_code & PF_USER))
-               goto no_context;
-
-       tsk->thread.cr2 = address;
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = 14;
-       info.si_signo = SIGBUS;
-       info.si_errno = 0;
-       info.si_code = BUS_ADRERR;
-       info.si_addr = (void __user *)address;
-       force_sig_info(SIGBUS, &info, tsk);
-       return;
-}
-
-DEFINE_SPINLOCK(pgd_lock);
-struct page *pgd_list;
-
-void vmalloc_sync_all(void)
-{
-       /* Note that races in the updates of insync and start aren't 
-          problematic:
-          insync can only get set bits added, and updates to start are only
-          improving performance (without affecting correctness if undone). */
-       static DECLARE_BITMAP(insync, PTRS_PER_PGD);
-       static unsigned long start = VMALLOC_START & PGDIR_MASK;
-       unsigned long address;
-
-       for (address = start; address <= VMALLOC_END; address += PGDIR_SIZE) {
-               if (!test_bit(pgd_index(address), insync)) {
-                       const pgd_t *pgd_ref = pgd_offset_k(address);
-                       struct page *page;
-
-                       if (pgd_none(*pgd_ref))
-                               continue;
-                       spin_lock(&pgd_lock);
-                       for (page = pgd_list; page;
-                            page = (struct page *)page->index) {
-                               pgd_t *pgd;
-                               pgd = (pgd_t *)page_address(page) + pgd_index(address);
-                               if (pgd_none(*pgd))
-                                       set_pgd(pgd, *pgd_ref);
-                               else
-                                       BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref));
-                       }
-                       spin_unlock(&pgd_lock);
-                       set_bit(pgd_index(address), insync);
-               }
-               if (address == start)
-                       start = address + PGDIR_SIZE;
-       }
-       /* Check that there is no need to do the same for the modules area. */
-       BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL));
-       BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == 
-                               (__START_KERNEL & PGDIR_MASK)));
-}
-
-static int __init enable_pagefaulttrace(char *str)
-{
-       page_fault_trace = 1;
-       return 1;
-}
-__setup("pagefaulttrace", enable_pagefaulttrace);
diff --git a/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c b/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c
deleted file mode 100644 (file)
index ad72d27..0000000
+++ /dev/null
@@ -1,1238 +0,0 @@
-/*
- *  linux/arch/x86_64/mm/init.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *  Copyright (C) 2000  Pavel Machek <pavel@suse.cz>
- *  Copyright (C) 2002,2003 Andi Kleen <ak@suse.de>
- *
- *  Jun Nakajima <jun.nakajima@intel.com>
- *     Modified for Xen.
- */
-
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/pagemap.h>
-#include <linux/bootmem.h>
-#include <linux/proc_fs.h>
-#include <linux/pci.h>
-#include <linux/poison.h>
-#include <linux/dma-mapping.h>
-#include <linux/module.h>
-#include <linux/memory_hotplug.h>
-
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/dma.h>
-#include <asm/fixmap.h>
-#include <asm/e820.h>
-#include <asm/apic.h>
-#include <asm/tlb.h>
-#include <asm/mmu_context.h>
-#include <asm/proto.h>
-#include <asm/smp.h>
-#include <asm/sections.h>
-
-#include <xen/features.h>
-
-#ifndef Dprintk
-#define Dprintk(x...)
-#endif
-
-struct dma_mapping_ops* dma_ops;
-EXPORT_SYMBOL(dma_ops);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-unsigned int __kernel_page_user;
-EXPORT_SYMBOL(__kernel_page_user);
-#endif
-
-extern unsigned long *contiguous_bitmap;
-
-static unsigned long dma_reserve __initdata;
-
-DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
-extern unsigned long start_pfn;
-
-/*
- * Use this until direct mapping is established, i.e. before __va() is 
- * available in init_memory_mapping().
- */
-
-#define addr_to_page(addr, page)                               \
-       (addr) &= PHYSICAL_PAGE_MASK;                           \
-       (page) = ((unsigned long *) ((unsigned long)            \
-       (((mfn_to_pfn((addr) >> PAGE_SHIFT)) << PAGE_SHIFT) +   \
-       __START_KERNEL_map)))
-
-static void __meminit early_make_page_readonly(void *va, unsigned int feature)
-{
-       unsigned long addr, _va = (unsigned long)va;
-       pte_t pte, *ptep;
-       unsigned long *page = (unsigned long *) init_level4_pgt;
-
-       if (xen_feature(feature))
-               return;
-
-       addr = (unsigned long) page[pgd_index(_va)];
-       addr_to_page(addr, page);
-
-       addr = page[pud_index(_va)];
-       addr_to_page(addr, page);
-
-       addr = page[pmd_index(_va)];
-       addr_to_page(addr, page);
-
-       ptep = (pte_t *) &page[pte_index(_va)];
-
-       pte.pte = ptep->pte & ~_PAGE_RW;
-       if (HYPERVISOR_update_va_mapping(_va, pte, 0))
-               BUG();
-}
-
-static void __make_page_readonly(void *va)
-{
-       pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
-       unsigned long addr = (unsigned long) va;
-
-       pgd = pgd_offset_k(addr);
-       pud = pud_offset(pgd, addr);
-       pmd = pmd_offset(pud, addr);
-       ptep = pte_offset_kernel(pmd, addr);
-
-       pte.pte = ptep->pte & ~_PAGE_RW;
-       if (HYPERVISOR_update_va_mapping(addr, pte, 0))
-               xen_l1_entry_update(ptep, pte); /* fallback */
-
-       if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
-               __make_page_readonly(__va(pte_pfn(pte) << PAGE_SHIFT));
-}
-
-static void __make_page_writable(void *va)
-{
-       pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
-       unsigned long addr = (unsigned long) va;
-
-       pgd = pgd_offset_k(addr);
-       pud = pud_offset(pgd, addr);
-       pmd = pmd_offset(pud, addr);
-       ptep = pte_offset_kernel(pmd, addr);
-
-       pte.pte = ptep->pte | _PAGE_RW;
-       if (HYPERVISOR_update_va_mapping(addr, pte, 0))
-               xen_l1_entry_update(ptep, pte); /* fallback */
-
-       if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
-               __make_page_writable(__va(pte_pfn(pte) << PAGE_SHIFT));
-}
-
-void make_page_readonly(void *va, unsigned int feature)
-{
-       if (!xen_feature(feature))
-               __make_page_readonly(va);
-}
-
-void make_page_writable(void *va, unsigned int feature)
-{
-       if (!xen_feature(feature))
-               __make_page_writable(va);
-}
-
-void make_pages_readonly(void *va, unsigned nr, unsigned int feature)
-{
-       if (xen_feature(feature))
-               return;
-
-       while (nr-- != 0) {
-               __make_page_readonly(va);
-               va = (void*)((unsigned long)va + PAGE_SIZE);
-       }
-}
-
-void make_pages_writable(void *va, unsigned nr, unsigned int feature)
-{
-       if (xen_feature(feature))
-               return;
-
-       while (nr-- != 0) {
-               __make_page_writable(va);
-               va = (void*)((unsigned long)va + PAGE_SIZE);
-       }
-}
-
-/*
- * NOTE: pagetable_init alloc all the fixmap pagetables contiguous on the
- * physical space so we can cache the place of the first one and move
- * around without checking the pgd every time.
- */
-
-void show_mem(void)
-{
-       long i, total = 0, reserved = 0;
-       long shared = 0, cached = 0;
-       pg_data_t *pgdat;
-       struct page *page;
-
-       printk(KERN_INFO "Mem-info:\n");
-       show_free_areas();
-       printk(KERN_INFO "Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-
-       for_each_online_pgdat(pgdat) {
-               for (i = 0; i < pgdat->node_spanned_pages; ++i) {
-                       page = pfn_to_page(pgdat->node_start_pfn + i);
-                       total++;
-                       if (PageReserved(page))
-                               reserved++;
-                       else if (PageSwapCache(page))
-                               cached++;
-                       else if (page_count(page))
-                               shared += page_count(page) - 1;
-               }
-       }
-       printk(KERN_INFO "%lu pages of RAM\n", total);
-       printk(KERN_INFO "%lu reserved pages\n",reserved);
-       printk(KERN_INFO "%lu pages shared\n",shared);
-       printk(KERN_INFO "%lu pages swap cached\n",cached);
-}
-
-int after_bootmem;
-
-static __init void *spp_getpage(void)
-{ 
-       void *ptr;
-       if (after_bootmem)
-               ptr = (void *) get_zeroed_page(GFP_ATOMIC); 
-       else if (start_pfn < table_end) {
-               ptr = __va(start_pfn << PAGE_SHIFT);
-               start_pfn++;
-               memset(ptr, 0, PAGE_SIZE);
-       } else
-               ptr = alloc_bootmem_pages(PAGE_SIZE);
-       if (!ptr || ((unsigned long)ptr & ~PAGE_MASK))
-               panic("set_pte_phys: cannot allocate page data %s\n", after_bootmem?"after bootmem":"");
-
-       Dprintk("spp_getpage %p\n", ptr);
-       return ptr;
-} 
-
-#define pgd_offset_u(address) (pgd_t *)(init_level4_user_pgt + pgd_index(address))
-
-static inline pud_t *pud_offset_u(unsigned long address)
-{
-       pud_t *pud = level3_user_pgt;
-
-       return pud + pud_index(address);
-}
-
-static __init void set_pte_phys(unsigned long vaddr,
-                        unsigned long phys, pgprot_t prot, int user_mode)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte, new_pte;
-
-       Dprintk("set_pte_phys %lx to %lx\n", vaddr, phys);
-
-       pgd = (user_mode ? pgd_offset_u(vaddr) : pgd_offset_k(vaddr));
-       if (pgd_none(*pgd)) {
-               printk("PGD FIXMAP MISSING, it should be setup in head.S!\n");
-               return;
-       }
-       pud = (user_mode ? pud_offset_u(vaddr) : pud_offset(pgd, vaddr));
-       if (pud_none(*pud)) {
-               pmd = (pmd_t *) spp_getpage(); 
-               make_page_readonly(pmd, XENFEAT_writable_page_tables);
-               set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
-               if (pmd != pmd_offset(pud, 0)) {
-                       printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
-                       return;
-               }
-       }
-       pmd = pmd_offset(pud, vaddr);
-       if (pmd_none(*pmd)) {
-               pte = (pte_t *) spp_getpage();
-               make_page_readonly(pte, XENFEAT_writable_page_tables);
-               set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
-               if (pte != pte_offset_kernel(pmd, 0)) {
-                       printk("PAGETABLE BUG #02!\n");
-                       return;
-               }
-       }
-       if (pgprot_val(prot))
-               new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
-       else
-               new_pte = __pte(0);
-
-       pte = pte_offset_kernel(pmd, vaddr);
-       if (!pte_none(*pte) &&
-           pte_val(*pte) != (pte_val(new_pte) & __supported_pte_mask))
-               pte_ERROR(*pte);
-       set_pte(pte, new_pte);
-
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-static __init void set_pte_phys_ma(unsigned long vaddr,
-                                  unsigned long phys, pgprot_t prot)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte, new_pte;
-
-       Dprintk("set_pte_phys %lx to %lx\n", vaddr, phys);
-
-       pgd = pgd_offset_k(vaddr);
-       if (pgd_none(*pgd)) {
-               printk("PGD FIXMAP MISSING, it should be setup in head.S!\n");
-               return;
-       }
-       pud = pud_offset(pgd, vaddr);
-       if (pud_none(*pud)) {
-
-               pmd = (pmd_t *) spp_getpage(); 
-               make_page_readonly(pmd, XENFEAT_writable_page_tables);
-               set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
-               if (pmd != pmd_offset(pud, 0)) {
-                       printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
-                       return;
-               }
-       }
-       pmd = pmd_offset(pud, vaddr);
-       if (pmd_none(*pmd)) {
-               pte = (pte_t *) spp_getpage();
-               make_page_readonly(pte, XENFEAT_writable_page_tables);
-               set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
-               if (pte != pte_offset_kernel(pmd, 0)) {
-                       printk("PAGETABLE BUG #02!\n");
-                       return;
-               }
-       }
-       new_pte = pfn_pte_ma(phys >> PAGE_SHIFT, prot);
-
-       pte = pte_offset_kernel(pmd, vaddr);
-       set_pte(pte, new_pte);
-
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-#define SET_FIXMAP_KERNEL 0
-#define SET_FIXMAP_USER   1
-
-/* NOTE: this is meant to be run only at boot */
-void __init 
-__set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
-{
-       unsigned long address = __fix_to_virt(idx);
-
-       if (idx >= __end_of_fixed_addresses) {
-               printk("Invalid __set_fixmap\n");
-               return;
-       }
-       switch (idx) {
-       case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE:
-               set_pte_phys(address, phys, prot, SET_FIXMAP_KERNEL);
-               break;
-       default:
-               set_pte_phys_ma(address, phys, prot);
-               break;
-       }
-}
-
-/*
- * This only supports vsyscall area.
- */
-void __init
-__set_fixmap_user (enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
-{
-       unsigned long address = __fix_to_virt(idx);
-
-       if (idx >= __end_of_fixed_addresses) {
-               printk("Invalid __set_fixmap\n");
-               return;
-       }
-
-       set_pte_phys(address, phys, prot, SET_FIXMAP_USER); 
-}
-
-unsigned long __initdata table_start, table_end; 
-
-static __meminit void *alloc_static_page(unsigned long *phys)
-{
-       unsigned long va = (start_pfn << PAGE_SHIFT) + __START_KERNEL_map;
-
-       if (after_bootmem) {
-               void *adr = (void *)get_zeroed_page(GFP_ATOMIC);
-
-               *phys = __pa(adr);
-               return adr;
-       }
-
-       *phys = start_pfn << PAGE_SHIFT;
-       start_pfn++;
-       memset((void *)va, 0, PAGE_SIZE);
-       return (void *)va;
-} 
-
-#define PTE_SIZE PAGE_SIZE
-
-static inline void __set_pte(pte_t *dst, pte_t val)
-{
-       *dst = val;
-}
-
-static inline int make_readonly(unsigned long paddr)
-{
-       extern char __vsyscall_0;
-       int readonly = 0;
-
-       /* Make new page tables read-only. */
-       if (!xen_feature(XENFEAT_writable_page_tables)
-           && (paddr >= (table_start << PAGE_SHIFT))
-           && (paddr < (table_end << PAGE_SHIFT)))
-               readonly = 1;
-       /* Make old page tables read-only. */
-       if (!xen_feature(XENFEAT_writable_page_tables)
-           && (paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
-           && (paddr < (start_pfn << PAGE_SHIFT)))
-               readonly = 1;
-
-       /*
-        * No need for writable mapping of kernel image. This also ensures that
-        * page and descriptor tables embedded inside don't have writable
-        * mappings. Exclude the vsyscall area here, allowing alternative
-        * instruction patching to work.
-        */
-       if ((paddr >= __pa_symbol(&_text)) && (paddr < __pa_symbol(&_end))
-           && !(paddr >= __pa_symbol(&__vsyscall_0)
-                && paddr < __pa_symbol(&__vsyscall_0) + PAGE_SIZE))
-               readonly = 1;
-
-       return readonly;
-}
-
-#ifndef CONFIG_XEN
-/* Must run before zap_low_mappings */
-__init void *early_ioremap(unsigned long addr, unsigned long size)
-{
-       unsigned long map = round_down(addr, LARGE_PAGE_SIZE);
-
-       /* actually usually some more */
-       if (size >= LARGE_PAGE_SIZE) {
-               printk("SMBIOS area too long %lu\n", size);
-               return NULL;
-       }
-       set_pmd(temp_mappings[0].pmd,  __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
-       map += LARGE_PAGE_SIZE;
-       set_pmd(temp_mappings[1].pmd,  __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
-       __flush_tlb();
-       return temp_mappings[0].address + (addr & (LARGE_PAGE_SIZE-1));
-}
-
-/* To avoid virtual aliases later */
-__init void early_iounmap(void *addr, unsigned long size)
-{
-       if ((void *)round_down((unsigned long)addr, LARGE_PAGE_SIZE) != temp_mappings[0].address)
-               printk("early_iounmap: bad address %p\n", addr);
-       set_pmd(temp_mappings[0].pmd, __pmd(0));
-       set_pmd(temp_mappings[1].pmd, __pmd(0));
-       __flush_tlb();
-}
-#endif
-
-static void __meminit
-phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end)
-{
-       int i, k;
-
-       for (i = 0; i < PTRS_PER_PMD; pmd++, i++) {
-               unsigned long pte_phys;
-               pte_t *pte, *pte_save;
-
-               if (address >= end) {
-                       if (!after_bootmem)
-                               for (; i < PTRS_PER_PMD; i++, pmd++)
-                                       set_pmd(pmd, __pmd(0));
-                       break;
-               }
-               pte = alloc_static_page(&pte_phys);
-               pte_save = pte;
-               for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) {
-                       unsigned long pteval = address | _PAGE_NX | _KERNPG_TABLE;
-
-                       if ((address >= end) ||
-                           ((address >> PAGE_SHIFT) >=
-                            xen_start_info->nr_pages))
-                               pteval = 0;
-                       else if (make_readonly(address))
-                               pteval &= ~_PAGE_RW;
-                       __set_pte(pte, __pte(pteval & __supported_pte_mask));
-               }
-               pte = pte_save;
-               early_make_page_readonly(pte, XENFEAT_writable_page_tables);
-               set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
-       }
-}
-
-static void __meminit
-phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end)
-{
-       pmd_t *pmd = pmd_offset(pud, (unsigned long)__va(address));
-
-       if (pmd_none(*pmd)) {
-               spin_lock(&init_mm.page_table_lock);
-               phys_pmd_init(pmd, address, end);
-               spin_unlock(&init_mm.page_table_lock);
-               __flush_tlb_all();
-       }
-}
-
-static void __meminit phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
-{ 
-       long i = pud_index(address);
-
-       pud = pud + i;
-
-       if (after_bootmem && pud_val(*pud)) {
-               phys_pmd_update(pud, address, end);
-               return;
-       }
-
-       for (; i < PTRS_PER_PUD; pud++, i++) {
-               unsigned long paddr, pmd_phys;
-               pmd_t *pmd;
-
-               paddr = (address & PGDIR_MASK) + i*PUD_SIZE;
-               if (paddr >= end)
-                       break;
-
-               pmd = alloc_static_page(&pmd_phys);
-               early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
-               spin_lock(&init_mm.page_table_lock);
-               set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
-               phys_pmd_init(pmd, paddr, end);
-               spin_unlock(&init_mm.page_table_lock);
-       }
-       __flush_tlb();
-} 
-
-void __init xen_init_pt(void)
-{
-       unsigned long addr, *page;
-
-       /* Find the initial pte page that was built for us. */
-       page = (unsigned long *)xen_start_info->pt_base;
-       addr = page[pgd_index(__START_KERNEL_map)];
-       addr_to_page(addr, page);
-       addr = page[pud_index(__START_KERNEL_map)];
-       addr_to_page(addr, page);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       /* On Xen 3.0.2 and older we may need to explicitly specify _PAGE_USER
-          in kernel PTEs. We check that here. */
-       if (HYPERVISOR_xen_version(XENVER_version, NULL) <= 0x30000) {
-               unsigned long *pg;
-               pte_t pte;
-
-               /* Mess with the initial mapping of page 0. It's not needed. */
-               BUILD_BUG_ON(__START_KERNEL <= __START_KERNEL_map);
-               addr = page[pmd_index(__START_KERNEL_map)];
-               addr_to_page(addr, pg);
-               pte.pte = pg[pte_index(__START_KERNEL_map)];
-               BUG_ON(!(pte.pte & _PAGE_PRESENT));
-
-               /* If _PAGE_USER isn't set, we obviously do not need it. */
-               if (pte.pte & _PAGE_USER) {
-                       /* _PAGE_USER is needed, but is it set implicitly? */
-                       pte.pte &= ~_PAGE_USER;
-                       if ((HYPERVISOR_update_va_mapping(__START_KERNEL_map,
-                                                         pte, 0) != 0) ||
-                           !(pg[pte_index(__START_KERNEL_map)] & _PAGE_USER))
-                               /* We need to explicitly specify _PAGE_USER. */
-                               __kernel_page_user = _PAGE_USER;
-               }
-       }
-#endif
-
-       /* Construct mapping of initial pte page in our own directories. */
-       init_level4_pgt[pgd_index(__START_KERNEL_map)] = 
-               __pgd(__pa_symbol(level3_kernel_pgt) | _PAGE_TABLE);
-       level3_kernel_pgt[pud_index(__START_KERNEL_map)] = 
-               __pud(__pa_symbol(level2_kernel_pgt) |
-                     _KERNPG_TABLE);
-       memcpy((void *)level2_kernel_pgt, page, PAGE_SIZE);
-
-       early_make_page_readonly(init_level4_pgt,
-                                XENFEAT_writable_page_tables);
-       early_make_page_readonly(init_level4_user_pgt,
-                                XENFEAT_writable_page_tables);
-       early_make_page_readonly(level3_kernel_pgt,
-                                XENFEAT_writable_page_tables);
-       early_make_page_readonly(level3_user_pgt,
-                                XENFEAT_writable_page_tables);
-       early_make_page_readonly(level2_kernel_pgt,
-                                XENFEAT_writable_page_tables);
-
-       if (!xen_feature(XENFEAT_writable_page_tables)) {
-               xen_pgd_pin(__pa_symbol(init_level4_pgt));
-               xen_pgd_pin(__pa_symbol(init_level4_user_pgt));
-       }
-
-       set_pgd((pgd_t *)(init_level4_user_pgt + 511), 
-               mk_kernel_pgd(__pa_symbol(level3_user_pgt)));
-}
-
-static void __init extend_init_mapping(unsigned long tables_space)
-{
-       unsigned long va = __START_KERNEL_map;
-       unsigned long phys, addr, *pte_page;
-       pmd_t *pmd;
-       pte_t *pte, new_pte;
-       unsigned long *page = (unsigned long *)init_level4_pgt;
-
-       addr = page[pgd_index(va)];
-       addr_to_page(addr, page);
-       addr = page[pud_index(va)];
-       addr_to_page(addr, page);
-
-       /* Kill mapping of low 1MB. */
-       while (va < (unsigned long)&_text) {
-               HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
-               va += PAGE_SIZE;
-       }
-
-       /* Ensure init mappings cover kernel text/data and initial tables. */
-       while (va < (__START_KERNEL_map
-                    + (start_pfn << PAGE_SHIFT)
-                    + tables_space)) {
-               pmd = (pmd_t *)&page[pmd_index(va)];
-               if (pmd_none(*pmd)) {
-                       pte_page = alloc_static_page(&phys);
-                       early_make_page_readonly(
-                               pte_page, XENFEAT_writable_page_tables);
-                       set_pmd(pmd, __pmd(phys | _KERNPG_TABLE));
-               } else {
-                       addr = page[pmd_index(va)];
-                       addr_to_page(addr, pte_page);
-               }
-               pte = (pte_t *)&pte_page[pte_index(va)];
-               if (pte_none(*pte)) {
-                       new_pte = pfn_pte(
-                               (va - __START_KERNEL_map) >> PAGE_SHIFT, 
-                               __pgprot(_KERNPG_TABLE));
-                       xen_l1_entry_update(pte, new_pte);
-               }
-               va += PAGE_SIZE;
-       }
-
-       /* Finally, blow away any spurious initial mappings. */
-       while (1) {
-               pmd = (pmd_t *)&page[pmd_index(va)];
-               if (pmd_none(*pmd))
-                       break;
-               HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
-               va += PAGE_SIZE;
-       }
-}
-
-static void __init find_early_table_space(unsigned long end)
-{
-       unsigned long puds, pmds, ptes, tables;
-
-       puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
-       pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
-       ptes = (end + PTE_SIZE - 1) >> PAGE_SHIFT;
-
-       tables = round_up(puds * 8, PAGE_SIZE) + 
-               round_up(pmds * 8, PAGE_SIZE) + 
-               round_up(ptes * 8, PAGE_SIZE); 
-
-       extend_init_mapping(tables);
-
-       table_start = start_pfn;
-       table_end = table_start + (tables>>PAGE_SHIFT);
-
-       early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n",
-               end, table_start << PAGE_SHIFT,
-               (table_start << PAGE_SHIFT) + tables);
-}
-
-static void xen_finish_init_mapping(void)
-{
-       unsigned long i, start, end;
-
-       /* Re-vector virtual addresses pointing into the initial
-          mapping to the just-established permanent ones. */
-       xen_start_info = __va(__pa(xen_start_info));
-       xen_start_info->pt_base = (unsigned long)
-               __va(__pa(xen_start_info->pt_base));
-       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-               phys_to_machine_mapping =
-                       __va(__pa(xen_start_info->mfn_list));
-               xen_start_info->mfn_list = (unsigned long)
-                       phys_to_machine_mapping;
-       }
-       if (xen_start_info->mod_start)
-               xen_start_info->mod_start = (unsigned long)
-                       __va(__pa(xen_start_info->mod_start));
-
-       /* Destroy the Xen-created mappings beyond the kernel image as
-        * well as the temporary mappings created above. Prevents
-        * overlap with modules area (if init mapping is very big).
-        */
-       start = PAGE_ALIGN((unsigned long)_end);
-       end   = __START_KERNEL_map + (table_end << PAGE_SHIFT);
-       for (; start < end; start += PAGE_SIZE)
-               WARN_ON(HYPERVISOR_update_va_mapping(
-                       start, __pte_ma(0), 0));
-
-       /* Allocate pte's for initial fixmaps from 'start_pfn' allocator. */
-       table_end = ~0UL;
-
-       /*
-        * Prefetch pte's for the bt_ioremap() area. It gets used before the
-        * boot-time allocator is online, so allocate-on-demand would fail.
-        */
-       for (i = FIX_BTMAP_END; i <= FIX_BTMAP_BEGIN; i++)
-               __set_fixmap(i, 0, __pgprot(0));
-
-       /* Switch to the real shared_info page, and clear the dummy page. */
-       set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
-       HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-       memset(empty_zero_page, 0, sizeof(empty_zero_page));
-
-       /* Set up mapping of lowest 1MB of physical memory. */
-       for (i = 0; i < NR_FIX_ISAMAPS; i++)
-               if (is_initial_xendomain())
-                       set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
-               else
-                       __set_fixmap(FIX_ISAMAP_BEGIN - i,
-                                    virt_to_mfn(empty_zero_page)
-                                    << PAGE_SHIFT,
-                                    PAGE_KERNEL_RO);
-
-       /* Disable the 'start_pfn' allocator. */
-       table_end = start_pfn;
-}
-
-/* Setup the direct mapping of the physical memory at PAGE_OFFSET.
-   This runs before bootmem is initialized and gets pages directly from the 
-   physical memory. To access them they are temporarily mapped. */
-void __meminit init_memory_mapping(unsigned long start, unsigned long end)
-{ 
-       unsigned long next;
-
-       Dprintk("init_memory_mapping\n");
-
-       /* 
-        * Find space for the kernel direct mapping tables.
-        * Later we should allocate these tables in the local node of the memory
-        * mapped.  Unfortunately this is done currently before the nodes are 
-        * discovered.
-        */
-       if (!after_bootmem)
-               find_early_table_space(end);
-
-       start = (unsigned long)__va(start);
-       end = (unsigned long)__va(end);
-
-       for (; start < end; start = next) {
-               unsigned long pud_phys; 
-               pgd_t *pgd = pgd_offset_k(start);
-               pud_t *pud;
-
-               if (after_bootmem) {
-                       pud = pud_offset(pgd, start & PGDIR_MASK);
-                       make_page_readonly(pud, XENFEAT_writable_page_tables);
-                       pud_phys = __pa(pud);
-               } else {
-                       pud = alloc_static_page(&pud_phys);
-                       early_make_page_readonly(pud, XENFEAT_writable_page_tables);
-               }
-               next = start + PGDIR_SIZE;
-               if (next > end) 
-                       next = end; 
-               phys_pud_init(pud, __pa(start), __pa(next));
-               if (!after_bootmem)
-                       set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
-       }
-
-       if (!after_bootmem) {
-               BUG_ON(start_pfn != table_end);
-               xen_finish_init_mapping();
-       }
-
-       __flush_tlb_all();
-}
-
-void __cpuinit zap_low_mappings(int cpu)
-{
-       /* this is not required for Xen */
-#if 0
-       swap_low_mappings();
-#endif
-}
-
-/* Compute zone sizes for the DMA and DMA32 zones in a node. */
-__init void
-size_zones(unsigned long *z, unsigned long *h,
-          unsigned long start_pfn, unsigned long end_pfn)
-{
-       int i;
-#ifndef CONFIG_XEN
-       unsigned long w;
-#endif
-
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               z[i] = 0;
-
-#ifndef CONFIG_XEN
-       if (start_pfn < MAX_DMA_PFN)
-               z[ZONE_DMA] = MAX_DMA_PFN - start_pfn;
-       if (start_pfn < MAX_DMA32_PFN) {
-               unsigned long dma32_pfn = MAX_DMA32_PFN;
-               if (dma32_pfn > end_pfn)
-                       dma32_pfn = end_pfn;
-               z[ZONE_DMA32] = dma32_pfn - start_pfn;
-       }
-       z[ZONE_NORMAL] = end_pfn - start_pfn;
-
-       /* Remove lower zones from higher ones. */
-       w = 0;
-       for (i = 0; i < MAX_NR_ZONES; i++) {
-               if (z[i])
-                       z[i] -= w;
-               w += z[i];
-       }
-
-       /* Compute holes */
-       w = start_pfn;
-       for (i = 0; i < MAX_NR_ZONES; i++) {
-               unsigned long s = w;
-               w += z[i];
-               h[i] = e820_hole_size(s, w);
-       }
-
-       /* Add the space pace needed for mem_map to the holes too. */
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               h[i] += (z[i] * sizeof(struct page)) / PAGE_SIZE;
-
-       /* The 16MB DMA zone has the kernel and other misc mappings.
-          Account them too */
-       if (h[ZONE_DMA]) {
-               h[ZONE_DMA] += dma_reserve;
-               if (h[ZONE_DMA] >= z[ZONE_DMA]) {
-                       printk(KERN_WARNING
-                               "Kernel too large and filling up ZONE_DMA?\n");
-                       h[ZONE_DMA] = z[ZONE_DMA];
-               }
-       }
-#else
-       z[ZONE_DMA] = end_pfn;
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               h[i] = 0;
-#endif
-}
-
-#ifndef CONFIG_NUMA
-void __init paging_init(void)
-{
-       unsigned long zones[MAX_NR_ZONES], holes[MAX_NR_ZONES];
-
-       memory_present(0, 0, end_pfn);
-       sparse_init();
-       size_zones(zones, holes, 0, end_pfn);
-       free_area_init_node(0, NODE_DATA(0), zones,
-                           __pa(PAGE_OFFSET) >> PAGE_SHIFT, holes);
-
-       init_mm.context.pinned = 1;
-}
-#endif
-
-/* Unmap a kernel mapping if it exists. This is useful to avoid prefetches
-   from the CPU leading to inconsistent cache lines. address and size
-   must be aligned to 2MB boundaries. 
-   Does nothing when the mapping doesn't exist. */
-void __init clear_kernel_mapping(unsigned long address, unsigned long size) 
-{
-       unsigned long end = address + size;
-
-       BUG_ON(address & ~LARGE_PAGE_MASK);
-       BUG_ON(size & ~LARGE_PAGE_MASK); 
-       
-       for (; address < end; address += LARGE_PAGE_SIZE) { 
-               pgd_t *pgd = pgd_offset_k(address);
-               pud_t *pud;
-               pmd_t *pmd;
-               if (pgd_none(*pgd))
-                       continue;
-               pud = pud_offset(pgd, address);
-               if (pud_none(*pud))
-                       continue; 
-               pmd = pmd_offset(pud, address);
-               if (!pmd || pmd_none(*pmd))
-                       continue; 
-               if (0 == (pmd_val(*pmd) & _PAGE_PSE)) { 
-                       /* Could handle this, but it should not happen currently. */
-                       printk(KERN_ERR 
-              "clear_kernel_mapping: mapping has been split. will leak memory\n"); 
-                       pmd_ERROR(*pmd); 
-               }
-               set_pmd(pmd, __pmd(0));                 
-       }
-       __flush_tlb_all();
-} 
-
-/*
- * Memory hotplug specific functions
- */
-void online_page(struct page *page)
-{
-       ClearPageReserved(page);
-       init_page_count(page);
-       __free_page(page);
-       totalram_pages++;
-       num_physpages++;
-}
-
-#ifdef CONFIG_MEMORY_HOTPLUG
-/*
- * XXX: memory_add_physaddr_to_nid() is to find node id from physical address
- *     via probe interface of sysfs. If acpi notifies hot-add event, then it
- *     can tell node id by searching dsdt. But, probe interface doesn't have
- *     node id. So, return 0 as node id at this time.
- */
-#ifdef CONFIG_NUMA
-int memory_add_physaddr_to_nid(u64 start)
-{
-       return 0;
-}
-#endif
-
-/*
- * Memory is added always to NORMAL zone. This means you will never get
- * additional DMA/DMA32 memory.
- */
-int arch_add_memory(int nid, u64 start, u64 size)
-{
-       struct pglist_data *pgdat = NODE_DATA(nid);
-       struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
-       unsigned long start_pfn = start >> PAGE_SHIFT;
-       unsigned long nr_pages = size >> PAGE_SHIFT;
-       int ret;
-
-       ret = __add_pages(zone, start_pfn, nr_pages);
-       if (ret)
-               goto error;
-
-       init_memory_mapping(start, (start + size -1));
-
-       return ret;
-error:
-       printk("%s: Problem encountered in __add_pages!\n", __func__);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(arch_add_memory);
-
-int remove_memory(u64 start, u64 size)
-{
-       return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(remove_memory);
-
-#else /* CONFIG_MEMORY_HOTPLUG */
-/*
- * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance,
- * just online the pages.
- */
-int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
-{
-       int err = -EIO;
-       unsigned long pfn;
-       unsigned long total = 0, mem = 0;
-       for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) {
-               if (pfn_valid(pfn)) {
-                       online_page(pfn_to_page(pfn));
-                       err = 0;
-                       mem++;
-               }
-               total++;
-       }
-       if (!err) {
-               z->spanned_pages += total;
-               z->present_pages += mem;
-               z->zone_pgdat->node_spanned_pages += total;
-               z->zone_pgdat->node_present_pages += mem;
-       }
-       return err;
-}
-#endif /* CONFIG_MEMORY_HOTPLUG */
-
-static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
-                        kcore_vsyscall;
-
-void __init mem_init(void)
-{
-       long codesize, reservedpages, datasize, initsize;
-       unsigned long pfn;
-
-       contiguous_bitmap = alloc_bootmem_low_pages(
-               (end_pfn + 2*BITS_PER_LONG) >> 3);
-       BUG_ON(!contiguous_bitmap);
-       memset(contiguous_bitmap, 0, (end_pfn + 2*BITS_PER_LONG) >> 3);
-
-       pci_iommu_alloc();
-
-       /* How many end-of-memory variables you have, grandma! */
-       max_low_pfn = end_pfn;
-       max_pfn = end_pfn;
-       num_physpages = end_pfn;
-       high_memory = (void *) __va(end_pfn * PAGE_SIZE);
-
-       /* clear the zero-page */
-       memset(empty_zero_page, 0, PAGE_SIZE);
-
-       reservedpages = 0;
-
-       /* this will put all low memory onto the freelists */
-#ifdef CONFIG_NUMA
-       totalram_pages = numa_free_all_bootmem();
-#else
-       totalram_pages = free_all_bootmem();
-#endif
-       /* XEN: init and count pages outside initial allocation. */
-       for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
-               ClearPageReserved(pfn_to_page(pfn));
-               init_page_count(pfn_to_page(pfn));
-               totalram_pages++;
-       }
-       reservedpages = end_pfn - totalram_pages - e820_hole_size(0, end_pfn);
-
-       after_bootmem = 1;
-
-       codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-       datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-       initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-
-       /* Register memory areas for /proc/kcore */
-       kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 
-       kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 
-                  VMALLOC_END-VMALLOC_START);
-       kclist_add(&kcore_kernel, &_stext, _end - _stext);
-       kclist_add(&kcore_modules, (void *)MODULES_VADDR, MODULES_LEN);
-       kclist_add(&kcore_vsyscall, (void *)VSYSCALL_START, 
-                                VSYSCALL_END - VSYSCALL_START);
-
-       printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n",
-               (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-               end_pfn << (PAGE_SHIFT-10),
-               codesize >> 10,
-               reservedpages << (PAGE_SHIFT-10),
-               datasize >> 10,
-               initsize >> 10);
-
-#ifndef CONFIG_XEN
-#ifdef CONFIG_SMP
-       /*
-        * Sync boot_level4_pgt mappings with the init_level4_pgt
-        * except for the low identity mappings which are already zapped
-        * in init_level4_pgt. This sync-up is essential for AP's bringup
-        */
-       memcpy(boot_level4_pgt+1, init_level4_pgt+1, (PTRS_PER_PGD-1)*sizeof(pgd_t));
-#endif
-#endif
-}
-
-void free_init_pages(char *what, unsigned long begin, unsigned long end)
-{
-       unsigned long addr;
-
-       if (begin >= end)
-               return;
-
-       printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
-       for (addr = begin; addr < end; addr += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(addr));
-               init_page_count(virt_to_page(addr));
-               memset((void *)(addr & ~(PAGE_SIZE-1)),
-                      POISON_FREE_INITMEM, PAGE_SIZE); 
-               if (addr >= __START_KERNEL_map) {
-                       /* make_readonly() reports all kernel addresses. */
-                       __make_page_writable(__va(__pa(addr)));
-                       if (HYPERVISOR_update_va_mapping(addr, __pte(0), 0)) {
-                               pgd_t *pgd = pgd_offset_k(addr);
-                               pud_t *pud = pud_offset(pgd, addr);
-                               pmd_t *pmd = pmd_offset(pud, addr);
-                               pte_t *pte = pte_offset_kernel(pmd, addr);
-
-                               xen_l1_entry_update(pte, __pte(0)); /* fallback */
-                       }
-               }
-               free_page(addr);
-               totalram_pages++;
-       }
-}
-
-void free_initmem(void)
-{
-       memset(__initdata_begin, POISON_FREE_INITDATA,
-               __initdata_end - __initdata_begin);
-       free_init_pages("unused kernel memory",
-                       (unsigned long)(&__init_begin),
-                       (unsigned long)(&__init_end));
-}
-
-#ifdef CONFIG_DEBUG_RODATA
-
-void mark_rodata_ro(void)
-{
-       unsigned long addr = (unsigned long)__start_rodata;
-
-       for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
-               change_page_attr_addr(addr, 1, PAGE_KERNEL_RO);
-
-       printk ("Write protecting the kernel read-only data: %luk\n",
-                       (__end_rodata - __start_rodata) >> 10);
-
-       /*
-        * change_page_attr_addr() requires a global_flush_tlb() call after it.
-        * We do this after the printk so that if something went wrong in the
-        * change, the printk gets out at least to give a better debug hint
-        * of who is the culprit.
-        */
-       global_flush_tlb();
-}
-#endif
-
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-       free_init_pages("initrd memory", start, end);
-}
-#endif
-
-void __init reserve_bootmem_generic(unsigned long phys, unsigned len) 
-{ 
-       /* Should check here against the e820 map to avoid double free */ 
-#ifdef CONFIG_NUMA
-       int nid = phys_to_nid(phys);
-       reserve_bootmem_node(NODE_DATA(nid), phys, len);
-#else                  
-       reserve_bootmem(phys, len);    
-#endif
-       if (phys+len <= MAX_DMA_PFN*PAGE_SIZE)
-               dma_reserve += len / PAGE_SIZE;
-}
-
-int kern_addr_valid(unsigned long addr) 
-{ 
-       unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT;
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       if (above != 0 && above != -1UL)
-               return 0; 
-       
-       pgd = pgd_offset_k(addr);
-       if (pgd_none(*pgd))
-               return 0;
-
-       pud = pud_offset(pgd, addr);
-       if (pud_none(*pud))
-               return 0; 
-
-       pmd = pmd_offset(pud, addr);
-       if (pmd_none(*pmd))
-               return 0;
-       if (pmd_large(*pmd))
-               return pfn_valid(pmd_pfn(*pmd));
-
-       pte = pte_offset_kernel(pmd, addr);
-       if (pte_none(*pte))
-               return 0;
-       return pfn_valid(pte_pfn(*pte));
-}
-
-#ifdef CONFIG_SYSCTL
-#include <linux/sysctl.h>
-
-extern int exception_trace, page_fault_trace;
-
-static ctl_table debug_table2[] = {
-       { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL,
-         proc_dointvec },
-       { 0, }
-}; 
-
-static ctl_table debug_root_table2[] = { 
-       { .ctl_name = CTL_DEBUG, .procname = "debug", .mode = 0555, 
-          .child = debug_table2 }, 
-       { 0 }, 
-}; 
-
-static __init int x8664_sysctl_init(void)
-{ 
-       register_sysctl_table(debug_root_table2, 1);
-       return 0;
-}
-__initcall(x8664_sysctl_init);
-#endif
-
-/* A pseudo VMAs to allow ptrace access for the vsyscall page.   This only
-   covers the 64bit vsyscall page now. 32bit has a real VMA now and does
-   not need special handling anymore. */
-
-static struct vm_area_struct gate_vma = {
-       .vm_start = VSYSCALL_START,
-       .vm_end = VSYSCALL_END,
-       .vm_page_prot = PAGE_READONLY
-};
-
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
-{
-#ifdef CONFIG_IA32_EMULATION
-       if (test_tsk_thread_flag(tsk, TIF_IA32))
-               return NULL;
-#endif
-       return &gate_vma;
-}
-
-int in_gate_area(struct task_struct *task, unsigned long addr)
-{
-       struct vm_area_struct *vma = get_gate_vma(task);
-       if (!vma)
-               return 0;
-       return (addr >= vma->vm_start) && (addr < vma->vm_end);
-}
-
-/* Use this when you have no reliable task/vma, typically from interrupt
- * context.  It is less reliable than using the task's vma and may give
- * false positives.
- */
-int in_gate_area_no_task(unsigned long addr)
-{
-       return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END);
-}
diff --git a/linux-2.6-xen-sparse/arch/x86_64/mm/pageattr-xen.c b/linux-2.6-xen-sparse/arch/x86_64/mm/pageattr-xen.c
deleted file mode 100644 (file)
index 3b5fc26..0000000
+++ /dev/null
@@ -1,433 +0,0 @@
-/* 
- * Copyright 2002 Andi Kleen, SuSE Labs. 
- * Thanks to Ben LaHaise for precious feedback.
- */ 
-
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/highmem.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <asm/uaccess.h>
-#include <asm/processor.h>
-#include <asm/tlbflush.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_XEN
-#include <asm/pgalloc.h>
-#include <asm/mmu_context.h>
-
-LIST_HEAD(mm_unpinned);
-DEFINE_SPINLOCK(mm_unpinned_lock);
-
-static inline void mm_walk_set_prot(void *pt, pgprot_t flags)
-{
-       struct page *page = virt_to_page(pt);
-       unsigned long pfn = page_to_pfn(page);
-       int rc;
-
-       rc = HYPERVISOR_update_va_mapping(
-               (unsigned long)__va(pfn << PAGE_SHIFT),
-               pfn_pte(pfn, flags), 0);
-       if (rc)
-               BUG();
-}
-
-static void mm_walk(struct mm_struct *mm, pgprot_t flags)
-{
-       pgd_t       *pgd;
-       pud_t       *pud;
-       pmd_t       *pmd;
-       pte_t       *pte;
-       int          g,u,m;
-
-       pgd = mm->pgd;
-       /*
-        * Cannot iterate up to USER_PTRS_PER_PGD as these pagetables may not
-        * be the 'current' task's pagetables (e.g., current may be 32-bit,
-        * but the pagetables may be for a 64-bit task).
-        * Subtracting 1 from TASK_SIZE64 means the loop limit is correct
-        * regardless of whether TASK_SIZE64 is a multiple of PGDIR_SIZE.
-        */
-       for (g = 0; g <= ((TASK_SIZE64-1) / PGDIR_SIZE); g++, pgd++) {
-               if (pgd_none(*pgd))
-                       continue;
-               pud = pud_offset(pgd, 0);
-               if (PTRS_PER_PUD > 1) /* not folded */ 
-                       mm_walk_set_prot(pud,flags);
-               for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-                       if (pud_none(*pud))
-                               continue;
-                       pmd = pmd_offset(pud, 0);
-                       if (PTRS_PER_PMD > 1) /* not folded */ 
-                               mm_walk_set_prot(pmd,flags);
-                       for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-                               if (pmd_none(*pmd))
-                                       continue;
-                               pte = pte_offset_kernel(pmd,0);
-                               mm_walk_set_prot(pte,flags);
-                       }
-               }
-       }
-}
-
-void mm_pin(struct mm_struct *mm)
-{
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-
-       spin_lock(&mm->page_table_lock);
-
-       mm_walk(mm, PAGE_KERNEL_RO);
-       if (HYPERVISOR_update_va_mapping(
-               (unsigned long)mm->pgd,
-               pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL_RO),
-               UVMF_TLB_FLUSH))
-               BUG();
-       if (HYPERVISOR_update_va_mapping(
-               (unsigned long)__user_pgd(mm->pgd),
-               pfn_pte(virt_to_phys(__user_pgd(mm->pgd))>>PAGE_SHIFT,
-                       PAGE_KERNEL_RO),
-               UVMF_TLB_FLUSH))
-               BUG();
-       xen_pgd_pin(__pa(mm->pgd)); /* kernel */
-       xen_pgd_pin(__pa(__user_pgd(mm->pgd))); /* user */
-       mm->context.pinned = 1;
-       spin_lock(&mm_unpinned_lock);
-       list_del(&mm->context.unpinned);
-       spin_unlock(&mm_unpinned_lock);
-
-       spin_unlock(&mm->page_table_lock);
-}
-
-void mm_unpin(struct mm_struct *mm)
-{
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-
-       spin_lock(&mm->page_table_lock);
-
-       xen_pgd_unpin(__pa(mm->pgd));
-       xen_pgd_unpin(__pa(__user_pgd(mm->pgd)));
-       if (HYPERVISOR_update_va_mapping(
-               (unsigned long)mm->pgd,
-               pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL), 0))
-               BUG();
-       if (HYPERVISOR_update_va_mapping(
-               (unsigned long)__user_pgd(mm->pgd),
-               pfn_pte(virt_to_phys(__user_pgd(mm->pgd))>>PAGE_SHIFT,
-                       PAGE_KERNEL), 0))
-               BUG();
-       mm_walk(mm, PAGE_KERNEL);
-       xen_tlb_flush();
-       mm->context.pinned = 0;
-       spin_lock(&mm_unpinned_lock);
-       list_add(&mm->context.unpinned, &mm_unpinned);
-       spin_unlock(&mm_unpinned_lock);
-
-       spin_unlock(&mm->page_table_lock);
-}
-
-void mm_pin_all(void)
-{
-       if (xen_feature(XENFEAT_writable_page_tables))
-               return;
-
-       /*
-        * Allow uninterrupted access to the mm_unpinned list. We don't
-        * actually take the mm_unpinned_lock as it is taken inside mm_pin().
-        * All other CPUs must be at a safe point (e.g., in stop_machine
-        * or offlined entirely).
-        */
-       preempt_disable();
-       while (!list_empty(&mm_unpinned))       
-               mm_pin(list_entry(mm_unpinned.next, struct mm_struct,
-                                 context.unpinned));
-       preempt_enable();
-}
-
-void _arch_dup_mmap(struct mm_struct *mm)
-{
-       if (!mm->context.pinned)
-               mm_pin(mm);
-}
-
-void _arch_exit_mmap(struct mm_struct *mm)
-{
-       struct task_struct *tsk = current;
-
-       task_lock(tsk);
-
-       /*
-        * We aggressively remove defunct pgd from cr3. We execute unmap_vmas()
-        * *much* faster this way, as no tlb flushes means bigger wrpt batches.
-        */
-       if (tsk->active_mm == mm) {
-               tsk->active_mm = &init_mm;
-               atomic_inc(&init_mm.mm_count);
-
-               switch_mm(mm, &init_mm, tsk);
-
-               atomic_dec(&mm->mm_count);
-               BUG_ON(atomic_read(&mm->mm_count) == 0);
-       }
-
-       task_unlock(tsk);
-
-       if ( mm->context.pinned && (atomic_read(&mm->mm_count) == 1) &&
-            !mm->context.has_foreign_mappings )
-               mm_unpin(mm);
-}
-
-struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-{
-       struct page *pte;
-
-       pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
-       if (pte) {
-               SetPageForeign(pte, pte_free);
-               init_page_count(pte);
-       }
-       return pte;
-}
-
-void pte_free(struct page *pte)
-{
-       unsigned long va = (unsigned long)__va(page_to_pfn(pte)<<PAGE_SHIFT);
-
-       if (!pte_write(*virt_to_ptep(va)))
-               if (HYPERVISOR_update_va_mapping(
-                       va, pfn_pte(page_to_pfn(pte), PAGE_KERNEL), 0))
-                       BUG();
-
-       ClearPageForeign(pte);
-       init_page_count(pte);
-
-       __free_page(pte);
-}
-#endif /* CONFIG_XEN */
-
-static inline pte_t *lookup_address(unsigned long address) 
-{ 
-       pgd_t *pgd = pgd_offset_k(address);
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-       if (pgd_none(*pgd))
-               return NULL;
-       pud = pud_offset(pgd, address);
-       if (!pud_present(*pud))
-               return NULL; 
-       pmd = pmd_offset(pud, address);
-       if (!pmd_present(*pmd))
-               return NULL; 
-       if (pmd_large(*pmd))
-               return (pte_t *)pmd;
-       pte = pte_offset_kernel(pmd, address);
-       if (pte && !pte_present(*pte))
-               pte = NULL; 
-       return pte;
-} 
-
-static struct page *split_large_page(unsigned long address, pgprot_t prot,
-                                    pgprot_t ref_prot)
-{ 
-       int i; 
-       unsigned long addr;
-       struct page *base = alloc_pages(GFP_KERNEL, 0);
-       pte_t *pbase;
-       if (!base) 
-               return NULL;
-       /*
-        * page_private is used to track the number of entries in
-        * the page table page have non standard attributes.
-        */
-       SetPagePrivate(base);
-       page_private(base) = 0;
-
-       address = __pa(address);
-       addr = address & LARGE_PAGE_MASK; 
-       pbase = (pte_t *)page_address(base);
-       for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) {
-               pbase[i] = pfn_pte(addr >> PAGE_SHIFT, 
-                                  addr == address ? prot : ref_prot);
-       }
-       return base;
-} 
-
-
-static void flush_kernel_map(void *address) 
-{
-       if (0 && address && cpu_has_clflush) {
-               /* is this worth it? */ 
-               int i;
-               for (i = 0; i < PAGE_SIZE; i += boot_cpu_data.x86_clflush_size) 
-                       asm volatile("clflush (%0)" :: "r" (address + i)); 
-       } else
-               asm volatile("wbinvd":::"memory"); 
-       if (address)
-               __flush_tlb_one(address);
-       else
-               __flush_tlb_all();
-}
-
-
-static inline void flush_map(unsigned long address)
-{      
-       on_each_cpu(flush_kernel_map, (void *)address, 1, 1);
-}
-
-static struct page *deferred_pages; /* protected by init_mm.mmap_sem */
-
-static inline void save_page(struct page *fpage)
-{
-       fpage->lru.next = (struct list_head *)deferred_pages;
-       deferred_pages = fpage;
-}
-
-/* 
- * No more special protections in this 2/4MB area - revert to a
- * large page again. 
- */
-static void revert_page(unsigned long address, pgprot_t ref_prot)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t large_pte;
-
-       pgd = pgd_offset_k(address);
-       BUG_ON(pgd_none(*pgd));
-       pud = pud_offset(pgd,address);
-       BUG_ON(pud_none(*pud));
-       pmd = pmd_offset(pud, address);
-       BUG_ON(pmd_val(*pmd) & _PAGE_PSE);
-       pgprot_val(ref_prot) |= _PAGE_PSE;
-       large_pte = mk_pte_phys(__pa(address) & LARGE_PAGE_MASK, ref_prot);
-       set_pte((pte_t *)pmd, large_pte);
-}      
-
-static int
-__change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot,
-                                  pgprot_t ref_prot)
-{ 
-       pte_t *kpte; 
-       struct page *kpte_page;
-       unsigned kpte_flags;
-       pgprot_t ref_prot2;
-       kpte = lookup_address(address);
-       if (!kpte) return 0;
-       kpte_page = virt_to_page(((unsigned long)kpte) & PAGE_MASK);
-       kpte_flags = pte_val(*kpte); 
-       if (pgprot_val(prot) != pgprot_val(ref_prot)) { 
-               if ((kpte_flags & _PAGE_PSE) == 0) { 
-                       set_pte(kpte, pfn_pte(pfn, prot));
-               } else {
-                       /*
-                        * split_large_page will take the reference for this
-                        * change_page_attr on the split page.
-                        */
-
-                       struct page *split;
-                       ref_prot2 = __pgprot(pgprot_val(pte_pgprot(*lookup_address(address))) & ~(1<<_PAGE_BIT_PSE));
-
-                       split = split_large_page(address, prot, ref_prot2);
-                       if (!split)
-                               return -ENOMEM;
-                       set_pte(kpte,mk_pte(split, ref_prot2));
-                       kpte_page = split;
-               }       
-               page_private(kpte_page)++;
-       } else if ((kpte_flags & _PAGE_PSE) == 0) { 
-               set_pte(kpte, pfn_pte(pfn, ref_prot));
-               BUG_ON(page_private(kpte_page) == 0);
-               page_private(kpte_page)--;
-       } else
-               BUG();
-
-       /* on x86-64 the direct mapping set at boot is not using 4k pages */
-       /*
-        * ..., but the XEN guest kernels (currently) do:
-        * If the pte was reserved, it means it was created at boot
-        * time (not via split_large_page) and in turn we must not
-        * replace it with a large page.
-        */
-#ifndef CONFIG_XEN
-       BUG_ON(PageReserved(kpte_page));
-#else
-       if (PageReserved(kpte_page))
-               return 0;
-#endif
-
-       if (page_private(kpte_page) == 0) {
-               save_page(kpte_page);
-               revert_page(address, ref_prot);
-       }
-       return 0;
-} 
-
-/*
- * Change the page attributes of an page in the linear mapping.
- *
- * This should be used when a page is mapped with a different caching policy
- * than write-back somewhere - some CPUs do not like it when mappings with
- * different caching policies exist. This changes the page attributes of the
- * in kernel linear mapping too.
- * 
- * The caller needs to ensure that there are no conflicting mappings elsewhere.
- * This function only deals with the kernel linear map.
- * 
- * Caller must call global_flush_tlb() after this.
- */
-int change_page_attr_addr(unsigned long address, int numpages, pgprot_t prot)
-{
-       int err = 0; 
-       int i; 
-
-       down_write(&init_mm.mmap_sem);
-       for (i = 0; i < numpages; i++, address += PAGE_SIZE) {
-               unsigned long pfn = __pa(address) >> PAGE_SHIFT;
-
-               err = __change_page_attr(address, pfn, prot, PAGE_KERNEL);
-               if (err) 
-                       break; 
-               /* Handle kernel mapping too which aliases part of the
-                * lowmem */
-               if (__pa(address) < KERNEL_TEXT_SIZE) {
-                       unsigned long addr2;
-                       pgprot_t prot2 = prot;
-                       addr2 = __START_KERNEL_map + __pa(address);
-                       pgprot_val(prot2) &= ~_PAGE_NX;
-                       err = __change_page_attr(addr2, pfn, prot2, PAGE_KERNEL_EXEC);
-               } 
-       }       
-       up_write(&init_mm.mmap_sem); 
-       return err;
-}
-
-/* Don't call this for MMIO areas that may not have a mem_map entry */
-int change_page_attr(struct page *page, int numpages, pgprot_t prot)
-{
-       unsigned long addr = (unsigned long)page_address(page);
-       return change_page_attr_addr(addr, numpages, prot);
-}
-
-void global_flush_tlb(void)
-{ 
-       struct page *dpage;
-
-       down_read(&init_mm.mmap_sem);
-       dpage = xchg(&deferred_pages, NULL);
-       up_read(&init_mm.mmap_sem);
-
-       flush_map((dpage && !dpage->lru.next) ? (unsigned long)page_address(dpage) : 0);
-       while (dpage) {
-               struct page *tmp = dpage;
-               dpage = (struct page *)dpage->lru.next;
-               ClearPagePrivate(tmp);
-               __free_page(tmp);
-       } 
-} 
-
-EXPORT_SYMBOL(change_page_attr);
-EXPORT_SYMBOL(global_flush_tlb);
diff --git a/linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile b/linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile
deleted file mode 100644 (file)
index cc3b993..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# oprofile for x86-64.
-# Just reuse the one from i386. 
-#
-
-obj-$(CONFIG_OPROFILE) += oprofile.o
-DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \
-       oprof.o cpu_buffer.o buffer_sync.o \
-       event_buffer.o oprofile_files.o \
-       oprofilefs.o oprofile_stats.o \
-       timer_int.o )
-
-ifdef CONFIG_XEN
-XENOPROF_COMMON_OBJS = $(addprefix ../../../drivers/xen/xenoprof/, \
-                        xenoprofile.o)
-OPROFILE-y := xenoprof.o
-else
-OPROFILE-y := init.o backtrace.o
-OPROFILE-$(CONFIG_X86_LOCAL_APIC) += nmi_int.o op_model_athlon.o op_model_p4.o \
-                                    op_model_ppro.o
-OPROFILE-$(CONFIG_X86_IO_APIC)    += nmi_timer_int.o 
-endif
-oprofile-y = $(DRIVER_OBJS) $(XENOPROF_COMMON_OBJS) \
-            $(addprefix ../../i386/oprofile/, $(OPROFILE-y))
diff --git a/linux-2.6-xen-sparse/arch/x86_64/pci/Makefile b/linux-2.6-xen-sparse/arch/x86_64/pci/Makefile
deleted file mode 100644 (file)
index 1ea6ea9..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Makefile for X86_64 specific PCI routines
-#
-# Reuse the i386 PCI subsystem
-#
-CFLAGS += -Iarch/i386/pci
-
-obj-y          := i386.o
-obj-$(CONFIG_PCI_DIRECT)+= direct.o
-obj-y          += fixup.o init.o
-obj-$(CONFIG_ACPI)     += acpi.o
-obj-y                  += legacy.o irq.o common.o
-# mmconfig has a 64bit special
-obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o
-
-obj-$(CONFIG_NUMA)     += k8-bus.o
-
-# pcifront should be after mmconfig.o and direct.o as it should only
-# take over if direct access to the PCI bus is unavailable
-obj-$(CONFIG_XEN_PCIDEV_FRONTEND)      += pcifront.o
-
-direct-y += ../../i386/pci/direct.o
-acpi-y   += ../../i386/pci/acpi.o
-pcifront-y += ../../i386/pci/pcifront.o
-legacy-y += ../../i386/pci/legacy.o
-irq-y    += ../../i386/pci/irq.o
-common-y += ../../i386/pci/common.o
-fixup-y  += ../../i386/pci/fixup.o
-i386-y  += ../../i386/pci/i386.o
-init-y += ../../i386/pci/init.o
-
-ifdef CONFIG_XEN
-irq-y          := ../../i386/pci/irq-xen.o
-include $(srctree)/scripts/Makefile.xen
-
-obj-y := $(call cherrypickxen, $(obj-y))
-endif
diff --git a/linux-2.6-xen-sparse/drivers/Makefile b/linux-2.6-xen-sparse/drivers/Makefile
deleted file mode 100644 (file)
index 2a2ef08..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-#
-# Makefile for the Linux kernel device drivers.
-#
-# 15 Sep 2000, Christoph Hellwig <hch@infradead.org>
-# Rewritten to use lists instead of if-statements.
-#
-
-obj-$(CONFIG_PCI)              += pci/
-obj-$(CONFIG_PARISC)           += parisc/
-obj-$(CONFIG_RAPIDIO)          += rapidio/
-obj-y                          += video/
-obj-$(CONFIG_ACPI)             += acpi/
-# PnP must come after ACPI since it will eventually need to check if acpi
-# was used and do nothing if so
-obj-$(CONFIG_PNP)              += pnp/
-obj-$(CONFIG_ARM_AMBA)         += amba/
-
-# char/ comes before serial/ etc so that the VT console is the boot-time
-# default.
-obj-y                          += char/
-
-obj-$(CONFIG_CONNECTOR)                += connector/
-
-# i810fb and intelfb depend on char/agp/
-obj-$(CONFIG_FB_I810)           += video/i810/
-obj-$(CONFIG_FB_INTEL)          += video/intelfb/
-
-obj-y                          += serial/
-obj-$(CONFIG_PARPORT)          += parport/
-obj-y                          += base/ block/ misc/ mfd/ net/ media/
-obj-$(CONFIG_NUBUS)            += nubus/
-obj-$(CONFIG_ATM)              += atm/
-obj-$(CONFIG_PPC_PMAC)         += macintosh/
-obj-$(CONFIG_XEN)              += xen/
-obj-$(CONFIG_IDE)              += ide/
-obj-$(CONFIG_FC4)              += fc4/
-obj-$(CONFIG_SCSI)             += scsi/
-obj-$(CONFIG_FUSION)           += message/
-obj-$(CONFIG_IEEE1394)         += ieee1394/
-obj-y                          += cdrom/
-obj-$(CONFIG_MTD)              += mtd/
-obj-$(CONFIG_SPI)              += spi/
-obj-$(CONFIG_PCCARD)           += pcmcia/
-obj-$(CONFIG_DIO)              += dio/
-obj-$(CONFIG_SBUS)             += sbus/
-obj-$(CONFIG_ZORRO)            += zorro/
-obj-$(CONFIG_MAC)              += macintosh/
-obj-$(CONFIG_ATA_OVER_ETH)     += block/aoe/
-obj-$(CONFIG_PARIDE)           += block/paride/
-obj-$(CONFIG_TC)               += tc/
-obj-$(CONFIG_USB)              += usb/
-obj-$(CONFIG_PCI)              += usb/
-obj-$(CONFIG_USB_GADGET)       += usb/gadget/
-obj-$(CONFIG_SERIO)            += input/serio/
-obj-$(CONFIG_GAMEPORT)         += input/gameport/
-obj-$(CONFIG_INPUT)            += input/
-obj-$(CONFIG_I2O)              += message/
-obj-$(CONFIG_RTC_LIB)          += rtc/
-obj-$(CONFIG_I2C)              += i2c/
-obj-$(CONFIG_W1)               += w1/
-obj-$(CONFIG_HWMON)            += hwmon/
-obj-$(CONFIG_PHONE)            += telephony/
-obj-$(CONFIG_MD)               += md/
-obj-$(CONFIG_BT)               += bluetooth/
-obj-$(CONFIG_ISDN)             += isdn/
-obj-$(CONFIG_EDAC)             += edac/
-obj-$(CONFIG_MCA)              += mca/
-obj-$(CONFIG_EISA)             += eisa/
-obj-$(CONFIG_CPU_FREQ)         += cpufreq/
-obj-$(CONFIG_MMC)              += mmc/
-obj-$(CONFIG_NEW_LEDS)         += leds/
-obj-$(CONFIG_INFINIBAND)       += infiniband/
-obj-$(CONFIG_IPATH_CORE)       += infiniband/
-obj-$(CONFIG_SGI_SN)           += sn/
-obj-y                          += firmware/
-obj-$(CONFIG_CRYPTO)           += crypto/
-obj-$(CONFIG_SUPERH)           += sh/
-obj-$(CONFIG_GENERIC_TIME)     += clocksource/
-obj-$(CONFIG_DMA_ENGINE)       += dma/
diff --git a/linux-2.6-xen-sparse/drivers/acpi/Kconfig b/linux-2.6-xen-sparse/drivers/acpi/Kconfig
deleted file mode 100644 (file)
index 2129645..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-#
-# ACPI Configuration
-#
-
-menu "ACPI (Advanced Configuration and Power Interface) Support"
-       depends on !X86_VISWS
-       depends on !IA64_HP_SIM
-       depends on IA64 || X86
-
-config ACPI
-       bool "ACPI Support"
-       depends on IA64 || X86
-       depends on PCI
-       select PM
-       default y
-       ---help---
-         Advanced Configuration and Power Interface (ACPI) support for 
-         Linux requires an ACPI compliant platform (hardware/firmware),
-         and assumes the presence of OS-directed configuration and power
-         management (OSPM) software.  This option will enlarge your 
-         kernel by about 70K.
-
-         Linux ACPI provides a robust functional replacement for several 
-         legacy configuration and power management interfaces, including
-         the Plug-and-Play BIOS specification (PnP BIOS), the 
-         MultiProcessor Specification (MPS), and the Advanced Power 
-         Management (APM) specification.  If both ACPI and APM support 
-         are configured, whichever is loaded first shall be used.
-
-         The ACPI SourceForge project contains the latest source code, 
-         documentation, tools, mailing list subscription, and other 
-         information.  This project is available at:
-         <http://sourceforge.net/projects/acpi>
-
-         Linux support for ACPI is based on Intel Corporation's ACPI
-         Component Architecture (ACPI CA).  For more information see:
-         <http://developer.intel.com/technology/iapc/acpi>
-
-         ACPI is an open industry specification co-developed by Compaq, 
-         Intel, Microsoft, Phoenix, and Toshiba.  The specification is 
-         available at:
-         <http://www.acpi.info>
-
-if ACPI
-
-config ACPI_SLEEP
-       bool "Sleep States"
-       depends on X86 && (!SMP || SUSPEND_SMP) && !XEN
-       depends on PM
-       default y
-       ---help---
-         This option adds support for ACPI suspend states. 
-
-         With this option, you will be able to put the system "to sleep". 
-         Sleep states are low power states for the system and devices. All
-         of the system operating state is saved to either memory or disk
-         (depending on the state), to allow the system to resume operation
-         quickly at your request.
-
-         Although this option sounds really nifty, barely any of the device
-         drivers have been converted to the new driver model and hence few
-         have proper power management support. 
-
-         This option is not recommended for anyone except those doing driver
-         power management development.
-
-config ACPI_SLEEP_PROC_FS
-       bool
-       depends on ACPI_SLEEP && PROC_FS
-       default y
-
-config ACPI_SLEEP_PROC_SLEEP
-       bool "/proc/acpi/sleep (deprecated)"
-       depends on ACPI_SLEEP_PROC_FS
-       default n
-       ---help---
-         Create /proc/acpi/sleep
-         Deprecated by /sys/power/state
-
-config ACPI_AC
-       tristate "AC Adapter"
-       depends on X86
-       default y
-       help
-         This driver adds support for the AC Adapter object, which indicates
-         whether a system is on AC, or not. If you have a system that can
-         switch between A/C and battery, say Y.
-
-config ACPI_BATTERY
-       tristate "Battery"
-       depends on X86
-       default y
-       help
-         This driver adds support for battery information through
-         /proc/acpi/battery. If you have a mobile system with a battery, 
-         say Y.
-
-config ACPI_BUTTON
-       tristate "Button"
-       default y
-       help
-         This driver handles events on the power, sleep and lid buttons.
-         A daemon reads /proc/acpi/event and perform user-defined actions
-         such as shutting down the system.  This is necessary for
-         software controlled poweroff.
-
-config ACPI_VIDEO
-       tristate "Video"
-       depends on X86
-       help
-         This driver implement the ACPI Extensions For Display Adapters
-         for integrated graphics devices on motherboard, as specified in
-         ACPI 2.0 Specification, Appendix B, allowing to perform some basic
-         control like defining the video POST device, retrieving EDID information
-         or to setup a video output, etc.
-         Note that this is an ref. implementation only.  It may or may not work
-         for your integrated video device.
-
-config ACPI_HOTKEY
-       tristate "Generic Hotkey (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       depends on X86
-       default n
-       help
-         Experimental consolidated hotkey driver.
-         If you are unsure, say N.
-
-config ACPI_FAN
-       tristate "Fan"
-       default y
-       help
-         This driver adds support for ACPI fan devices, allowing user-mode 
-         applications to perform basic fan control (on, off, status).
-
-config ACPI_DOCK
-       tristate "Dock"
-       depends on EXPERIMENTAL
-       help
-         This driver adds support for ACPI controlled docking stations
-
-config ACPI_PROCESSOR
-       tristate "Processor"
-       default y
-       help
-         This driver installs ACPI as the idle handler for Linux, and uses
-         ACPI C2 and C3 processor states to save power, on systems that
-         support it.  It is required by several flavors of cpufreq
-         Performance-state drivers.
-
-config ACPI_HOTPLUG_CPU
-       bool
-       depends on ACPI_PROCESSOR && HOTPLUG_CPU
-       select ACPI_CONTAINER
-       default y
-
-config ACPI_THERMAL
-       tristate "Thermal Zone"
-       depends on ACPI_PROCESSOR
-       default y
-       help
-         This driver adds support for ACPI thermal zones.  Most mobile and
-         some desktop systems support ACPI thermal zones.  It is HIGHLY
-         recommended that this option be enabled, as your processor(s)
-         may be damaged without it.
-
-config ACPI_NUMA
-       bool "NUMA support"
-       depends on NUMA
-       depends on (X86 || IA64)
-       default y if IA64_GENERIC || IA64_SGI_SN2
-
-config ACPI_ASUS
-        tristate "ASUS/Medion Laptop Extras"
-       depends on X86
-        ---help---
-          This driver provides support for extra features of ACPI-compatible
-          ASUS laptops. As some of Medion laptops are made by ASUS, it may also
-          support some Medion laptops (such as 9675 for example).  It makes all
-          the extra buttons generate standard ACPI events that go through
-          /proc/acpi/events, and (on some models) adds support for changing the
-          display brightness and output, switching the LCD backlight on and off,
-          and most importantly, allows you to blink those fancy LEDs intended
-          for reporting mail and wireless status.
-
-         Note: display switching code is currently considered EXPERIMENTAL,
-         toying with these values may even lock your machine.
-          
-          All settings are changed via /proc/acpi/asus directory entries. Owner
-          and group for these entries can be set with asus_uid and asus_gid
-          parameters.
-          
-          More information and a userspace daemon for handling the extra buttons
-          at <http://sourceforge.net/projects/acpi4asus/>.
-          
-          If you have an ACPI-compatible ASUS laptop, say Y or M here. This
-          driver is still under development, so if your laptop is unsupported or
-          something works not quite as expected, please use the mailing list
-          available on the above page (acpi4asus-user@lists.sourceforge.net)
-          
-config ACPI_IBM
-       tristate "IBM ThinkPad Laptop Extras"
-       depends on X86
-       ---help---
-         This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds
-         support for Fn-Fx key combinations, Bluetooth control, video
-         output switching, ThinkLight control, UltraBay eject and more.
-         For more information about this driver see <file:Documentation/ibm-acpi.txt>
-         and <http://ibm-acpi.sf.net/> .
-
-         If you have an IBM ThinkPad laptop, say Y or M here.
-
-config ACPI_IBM_DOCK
-       bool "Legacy Docking Station Support"
-       depends on ACPI_IBM
-       depends on ACPI_DOCK=n
-       default n
-       ---help---
-         Allows the ibm_acpi driver to handle docking station events.
-         This support is obsoleted by CONFIG_HOTPLUG_PCI_ACPI.  It will
-         allow locking and removing the laptop from the docking station,
-         but will not properly connect PCI devices.
-
-         If you are not sure, say N here.
-
-config ACPI_TOSHIBA
-       tristate "Toshiba Laptop Extras"
-       depends on X86
-       ---help---
-         This driver adds support for access to certain system settings
-         on "legacy free" Toshiba laptops.  These laptops can be recognized by
-         their lack of a BIOS setup menu and APM support.
-
-         On these machines, all system configuration is handled through the
-         ACPI.  This driver is required for access to controls not covered
-         by the general ACPI drivers, such as LCD brightness, video output,
-         etc.
-
-         This driver differs from the non-ACPI Toshiba laptop driver (located
-         under "Processor type and features") in several aspects.
-         Configuration is accessed by reading and writing text files in the
-         /proc tree instead of by program interface to /dev.  Furthermore, no
-         power management functions are exposed, as those are handled by the
-         general ACPI drivers.
-
-         More information about this driver is available at
-         <http://memebeam.org/toys/ToshibaAcpiDriver>.
-
-         If you have a legacy free Toshiba laptop (such as the Libretto L1
-         series), say Y.
-
-config ACPI_CUSTOM_DSDT
-       bool "Include Custom DSDT"
-       depends on !STANDALONE
-       default n 
-       help
-         Thist option is to load a custom ACPI DSDT
-         If you don't know what that is, say N.
-
-config ACPI_CUSTOM_DSDT_FILE
-       string "Custom DSDT Table file to include"
-       depends on ACPI_CUSTOM_DSDT
-       default ""
-       help
-         Enter the full path name to the file which includes the AmlCode
-         declaration.
-
-config ACPI_BLACKLIST_YEAR
-       int "Disable ACPI for systems before Jan 1st this year" if X86_32
-       default 0
-       help
-         enter a 4-digit year, eg. 2001 to disable ACPI by default
-         on platforms with DMI BIOS date before January 1st that year.
-         "acpi=force" can be used to override this mechanism.
-
-         Enter 0 to disable this mechanism and allow ACPI to
-         run by default no matter what the year.  (default)
-
-config ACPI_DEBUG
-       bool "Debug Statements"
-       default n
-       help
-         The ACPI driver can optionally report errors with a great deal
-         of verbosity. Saying Y enables these statements. This will increase
-         your kernel size by around 50K.
-
-config ACPI_EC
-       bool
-       default y
-       help
-         This driver is required on some systems for the proper operation of
-         the battery and thermal drivers.  If you are compiling for a 
-         mobile system, say Y.
-
-config ACPI_POWER
-       bool
-       default y
-
-config ACPI_SYSTEM
-       bool
-       default y
-       help
-         This driver will enable your system to shut down using ACPI, and
-         dump your ACPI DSDT table using /proc/acpi/dsdt.
-
-config X86_PM_TIMER
-       bool "Power Management Timer Support" if EMBEDDED
-       depends on X86
-       depends on !XEN
-       default y
-       help
-         The Power Management Timer is available on all ACPI-capable,
-         in most cases even if ACPI is unusable or blacklisted.
-
-         This timing source is not affected by powermanagement features
-         like aggressive processor idling, throttling, frequency and/or
-         voltage scaling, unlike the commonly used Time Stamp Counter
-         (TSC) timing source.
-
-         You should nearly always say Y here because many modern
-         systems require this timer. 
-
-config ACPI_CONTAINER
-       tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
-        ---help---
-         This allows _physical_ insertion and removal of CPUs and memory.
-         This can be useful, for example, on NUMA machines that support
-         ACPI based physical hotplug of nodes, or non-NUMA machines that
-         support physical cpu/memory hot-plug.
-
-         If one selects "m", this driver can be loaded with
-         "modprobe acpi_container".
-
-config ACPI_HOTPLUG_MEMORY
-       tristate "Memory Hotplug"
-       depends on ACPI
-       depends on MEMORY_HOTPLUG
-       default n
-       help
-         This driver adds supports for ACPI Memory Hotplug.  This driver
-         provides support for fielding notifications on ACPI memory
-         devices (PNP0C80) which represent memory ranges that may be
-         onlined or offlined during runtime.  
-
-         Enabling this driver assumes that your platform hardware
-         and firmware have support for hot-plugging physical memory. If
-         your system does not support physically adding or ripping out 
-         memory DIMMs at some platfrom defined granularity (individually 
-         or as a bank) at runtime, then you need not enable this driver.
-
-         If one selects "m," this driver can be loaded using the following
-         command: 
-               $>modprobe acpi_memhotplug 
-
-config ACPI_SBS
-       tristate "Smart Battery System (EXPERIMENTAL)"
-       depends on X86 && I2C
-       depends on EXPERIMENTAL
-       help
-         This driver adds support for the Smart Battery System.
-         Depends on I2C (Device Drivers ---> I2C support)
-         A "Smart Battery" is quite old and quite rare compared
-         to today's ACPI "Control Method" battery.
-
-endif  # ACPI
-
-endmenu
diff --git a/linux-2.6-xen-sparse/drivers/char/mem.c b/linux-2.6-xen-sparse/drivers/char/mem.c
deleted file mode 100644 (file)
index 4bfcfb8..0000000
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
- *  linux/drivers/char/mem.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Added devfs support. 
- *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
- *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
- */
-
-#include <linux/mm.h>
-#include <linux/miscdevice.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/mman.h>
-#include <linux/random.h>
-#include <linux/init.h>
-#include <linux/raw.h>
-#include <linux/tty.h>
-#include <linux/capability.h>
-#include <linux/smp_lock.h>
-#include <linux/ptrace.h>
-#include <linux/device.h>
-#include <linux/highmem.h>
-#include <linux/crash_dump.h>
-#include <linux/backing-dev.h>
-#include <linux/bootmem.h>
-#include <linux/pipe_fs_i.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_IA64
-# include <linux/efi.h>
-#endif
-
-/*
- * Architectures vary in how they handle caching for addresses
- * outside of main memory.
- *
- */
-static inline int uncached_access(struct file *file, unsigned long addr)
-{
-#if defined(__i386__)
-       /*
-        * On the PPro and successors, the MTRRs are used to set
-        * memory types for physical addresses outside main memory,
-        * so blindly setting PCD or PWT on those pages is wrong.
-        * For Pentiums and earlier, the surround logic should disable
-        * caching for the high addresses through the KEN pin, but
-        * we maintain the tradition of paranoia in this code.
-        */
-       if (file->f_flags & O_SYNC)
-               return 1;
-       return !( test_bit(X86_FEATURE_MTRR, boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_K6_MTRR, boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_CYRIX_ARR, boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_CENTAUR_MCR, boot_cpu_data.x86_capability) )
-         && addr >= __pa(high_memory);
-#elif defined(__x86_64__)
-       /* 
-        * This is broken because it can generate memory type aliases,
-        * which can cause cache corruptions
-        * But it is only available for root and we have to be bug-to-bug
-        * compatible with i386.
-        */
-       if (file->f_flags & O_SYNC)
-               return 1;
-       /* same behaviour as i386. PAT always set to cached and MTRRs control the
-          caching behaviour. 
-          Hopefully a full PAT implementation will fix that soon. */      
-       return 0;
-#elif defined(CONFIG_IA64)
-       /*
-        * On ia64, we ignore O_SYNC because we cannot tolerate memory attribute aliases.
-        */
-       return !(efi_mem_attributes(addr) & EFI_MEMORY_WB);
-#else
-       /*
-        * Accessing memory above the top the kernel knows about or through a file pointer
-        * that was marked O_SYNC will be done non-cached.
-        */
-       if (file->f_flags & O_SYNC)
-               return 1;
-       return addr >= __pa(high_memory);
-#endif
-}
-
-#ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
-static inline int valid_phys_addr_range(unsigned long addr, size_t count)
-{
-       if (addr + count > __pa(high_memory))
-               return 0;
-
-       return 1;
-}
-
-static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
-{
-       return 1;
-}
-#endif
-
-#ifndef ARCH_HAS_DEV_MEM
-/*
- * This funcion reads the *physical* memory. The f_pos points directly to the 
- * memory location. 
- */
-static ssize_t read_mem(struct file * file, char __user * buf,
-                       size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t read, sz;
-       char *ptr;
-
-       if (!valid_phys_addr_range(p, count))
-               return -EFAULT;
-       read = 0;
-#ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED
-       /* we don't have page 0 mapped on sparc and m68k.. */
-       if (p < PAGE_SIZE) {
-               sz = PAGE_SIZE - p;
-               if (sz > count) 
-                       sz = count; 
-               if (sz > 0) {
-                       if (clear_user(buf, sz))
-                               return -EFAULT;
-                       buf += sz; 
-                       p += sz; 
-                       count -= sz; 
-                       read += sz; 
-               }
-       }
-#endif
-
-       while (count > 0) {
-               /*
-                * Handle first page in case it's not aligned
-                */
-               if (-p & (PAGE_SIZE - 1))
-                       sz = -p & (PAGE_SIZE - 1);
-               else
-                       sz = PAGE_SIZE;
-
-               sz = min_t(unsigned long, sz, count);
-
-               /*
-                * On ia64 if a page has been mapped somewhere as
-                * uncached, then it must also be accessed uncached
-                * by the kernel or data corruption may occur
-                */
-               ptr = xlate_dev_mem_ptr(p);
-
-               if (copy_to_user(buf, ptr, sz))
-                       return -EFAULT;
-               buf += sz;
-               p += sz;
-               count -= sz;
-               read += sz;
-       }
-
-       *ppos += read;
-       return read;
-}
-
-static ssize_t write_mem(struct file * file, const char __user * buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t written, sz;
-       unsigned long copied;
-       void *ptr;
-
-       if (!valid_phys_addr_range(p, count))
-               return -EFAULT;
-
-       written = 0;
-
-#ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED
-       /* we don't have page 0 mapped on sparc and m68k.. */
-       if (p < PAGE_SIZE) {
-               unsigned long sz = PAGE_SIZE - p;
-               if (sz > count)
-                       sz = count;
-               /* Hmm. Do something? */
-               buf += sz;
-               p += sz;
-               count -= sz;
-               written += sz;
-       }
-#endif
-
-       while (count > 0) {
-               /*
-                * Handle first page in case it's not aligned
-                */
-               if (-p & (PAGE_SIZE - 1))
-                       sz = -p & (PAGE_SIZE - 1);
-               else
-                       sz = PAGE_SIZE;
-
-               sz = min_t(unsigned long, sz, count);
-
-               /*
-                * On ia64 if a page has been mapped somewhere as
-                * uncached, then it must also be accessed uncached
-                * by the kernel or data corruption may occur
-                */
-               ptr = xlate_dev_mem_ptr(p);
-
-               copied = copy_from_user(ptr, buf, sz);
-               if (copied) {
-                       written += sz - copied;
-                       if (written)
-                               break;
-                       return -EFAULT;
-               }
-               buf += sz;
-               p += sz;
-               count -= sz;
-               written += sz;
-       }
-
-       *ppos += written;
-       return written;
-}
-#endif
-
-#ifndef __HAVE_PHYS_MEM_ACCESS_PROT
-static pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
-                                    unsigned long size, pgprot_t vma_prot)
-{
-#ifdef pgprot_noncached
-       unsigned long offset = pfn << PAGE_SHIFT;
-
-       if (uncached_access(file, offset))
-               return pgprot_noncached(vma_prot);
-#endif
-       return vma_prot;
-}
-#endif
-
-static int mmap_mem(struct file * file, struct vm_area_struct * vma)
-{
-       size_t size = vma->vm_end - vma->vm_start;
-
-       if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size))
-               return -EINVAL;
-
-       vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff,
-                                                size,
-                                                vma->vm_page_prot);
-
-       /* Remap-pfn-range will mark the range VM_IO and VM_RESERVED */
-       if (remap_pfn_range(vma,
-                           vma->vm_start,
-                           vma->vm_pgoff,
-                           size,
-                           vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-}
-
-static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
-{
-       unsigned long pfn;
-
-       /* Turn a kernel-virtual address into a physical page frame */
-       pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT;
-
-       /*
-        * RED-PEN: on some architectures there is more mapped memory
-        * than available in mem_map which pfn_valid checks
-        * for. Perhaps should add a new macro here.
-        *
-        * RED-PEN: vmalloc is not supported right now.
-        */
-       if (!pfn_valid(pfn))
-               return -EIO;
-
-       vma->vm_pgoff = pfn;
-       return mmap_mem(file, vma);
-}
-
-#ifdef CONFIG_CRASH_DUMP
-/*
- * Read memory corresponding to the old kernel.
- */
-static ssize_t read_oldmem(struct file *file, char __user *buf,
-                               size_t count, loff_t *ppos)
-{
-       unsigned long pfn, offset;
-       size_t read = 0, csize;
-       int rc = 0;
-
-       while (count) {
-               pfn = *ppos / PAGE_SIZE;
-               if (pfn > saved_max_pfn)
-                       return read;
-
-               offset = (unsigned long)(*ppos % PAGE_SIZE);
-               if (count > PAGE_SIZE - offset)
-                       csize = PAGE_SIZE - offset;
-               else
-                       csize = count;
-
-               rc = copy_oldmem_page(pfn, buf, csize, offset, 1);
-               if (rc < 0)
-                       return rc;
-               buf += csize;
-               *ppos += csize;
-               read += csize;
-               count -= csize;
-       }
-       return read;
-}
-#endif
-
-extern long vread(char *buf, char *addr, unsigned long count);
-extern long vwrite(char *buf, char *addr, unsigned long count);
-
-/*
- * This function reads the *virtual* memory as seen by the kernel.
- */
-static ssize_t read_kmem(struct file *file, char __user *buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t low_count, read, sz;
-       char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
-
-       read = 0;
-       if (p < (unsigned long) high_memory) {
-               low_count = count;
-               if (count > (unsigned long) high_memory - p)
-                       low_count = (unsigned long) high_memory - p;
-
-#ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED
-               /* we don't have page 0 mapped on sparc and m68k.. */
-               if (p < PAGE_SIZE && low_count > 0) {
-                       size_t tmp = PAGE_SIZE - p;
-                       if (tmp > low_count) tmp = low_count;
-                       if (clear_user(buf, tmp))
-                               return -EFAULT;
-                       buf += tmp;
-                       p += tmp;
-                       read += tmp;
-                       low_count -= tmp;
-                       count -= tmp;
-               }
-#endif
-               while (low_count > 0) {
-                       /*
-                        * Handle first page in case it's not aligned
-                        */
-                       if (-p & (PAGE_SIZE - 1))
-                               sz = -p & (PAGE_SIZE - 1);
-                       else
-                               sz = PAGE_SIZE;
-
-                       sz = min_t(unsigned long, sz, low_count);
-
-                       /*
-                        * On ia64 if a page has been mapped somewhere as
-                        * uncached, then it must also be accessed uncached
-                        * by the kernel or data corruption may occur
-                        */
-                       kbuf = xlate_dev_kmem_ptr((char *)p);
-
-                       if (copy_to_user(buf, kbuf, sz))
-                               return -EFAULT;
-                       buf += sz;
-                       p += sz;
-                       read += sz;
-                       low_count -= sz;
-                       count -= sz;
-               }
-       }
-
-       if (count > 0) {
-               kbuf = (char *)__get_free_page(GFP_KERNEL);
-               if (!kbuf)
-                       return -ENOMEM;
-               while (count > 0) {
-                       int len = count;
-
-                       if (len > PAGE_SIZE)
-                               len = PAGE_SIZE;
-                       len = vread(kbuf, (char *)p, len);
-                       if (!len)
-                               break;
-                       if (copy_to_user(buf, kbuf, len)) {
-                               free_page((unsigned long)kbuf);
-                               return -EFAULT;
-                       }
-                       count -= len;
-                       buf += len;
-                       read += len;
-                       p += len;
-               }
-               free_page((unsigned long)kbuf);
-       }
-       *ppos = p;
-       return read;
-}
-
-
-static inline ssize_t
-do_write_kmem(void *p, unsigned long realp, const char __user * buf,
-             size_t count, loff_t *ppos)
-{
-       ssize_t written, sz;
-       unsigned long copied;
-
-       written = 0;
-#ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED
-       /* we don't have page 0 mapped on sparc and m68k.. */
-       if (realp < PAGE_SIZE) {
-               unsigned long sz = PAGE_SIZE - realp;
-               if (sz > count)
-                       sz = count;
-               /* Hmm. Do something? */
-               buf += sz;
-               p += sz;
-               realp += sz;
-               count -= sz;
-               written += sz;
-       }
-#endif
-
-       while (count > 0) {
-               char *ptr;
-               /*
-                * Handle first page in case it's not aligned
-                */
-               if (-realp & (PAGE_SIZE - 1))
-                       sz = -realp & (PAGE_SIZE - 1);
-               else
-                       sz = PAGE_SIZE;
-
-               sz = min_t(unsigned long, sz, count);
-
-               /*
-                * On ia64 if a page has been mapped somewhere as
-                * uncached, then it must also be accessed uncached
-                * by the kernel or data corruption may occur
-                */
-               ptr = xlate_dev_kmem_ptr(p);
-
-               copied = copy_from_user(ptr, buf, sz);
-               if (copied) {
-                       written += sz - copied;
-                       if (written)
-                               break;
-                       return -EFAULT;
-               }
-               buf += sz;
-               p += sz;
-               realp += sz;
-               count -= sz;
-               written += sz;
-       }
-
-       *ppos += written;
-       return written;
-}
-
-
-/*
- * This function writes to the *virtual* memory as seen by the kernel.
- */
-static ssize_t write_kmem(struct file * file, const char __user * buf, 
-                         size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t wrote = 0;
-       ssize_t virtr = 0;
-       ssize_t written;
-       char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
-
-       if (p < (unsigned long) high_memory) {
-
-               wrote = count;
-               if (count > (unsigned long) high_memory - p)
-                       wrote = (unsigned long) high_memory - p;
-
-               written = do_write_kmem((void*)p, p, buf, wrote, ppos);
-               if (written != wrote)
-                       return written;
-               wrote = written;
-               p += wrote;
-               buf += wrote;
-               count -= wrote;
-       }
-
-       if (count > 0) {
-               kbuf = (char *)__get_free_page(GFP_KERNEL);
-               if (!kbuf)
-                       return wrote ? wrote : -ENOMEM;
-               while (count > 0) {
-                       int len = count;
-
-                       if (len > PAGE_SIZE)
-                               len = PAGE_SIZE;
-                       if (len) {
-                               written = copy_from_user(kbuf, buf, len);
-                               if (written) {
-                                       if (wrote + virtr)
-                                               break;
-                                       free_page((unsigned long)kbuf);
-                                       return -EFAULT;
-                               }
-                       }
-                       len = vwrite(kbuf, (char *)p, len);
-                       count -= len;
-                       buf += len;
-                       virtr += len;
-                       p += len;
-               }
-               free_page((unsigned long)kbuf);
-       }
-
-       *ppos = p;
-       return virtr + wrote;
-}
-
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-static ssize_t read_port(struct file * file, char __user * buf,
-                        size_t count, loff_t *ppos)
-{
-       unsigned long i = *ppos;
-       char __user *tmp = buf;
-
-       if (!access_ok(VERIFY_WRITE, buf, count))
-               return -EFAULT; 
-       while (count-- > 0 && i < 65536) {
-               if (__put_user(inb(i),tmp) < 0) 
-                       return -EFAULT;  
-               i++;
-               tmp++;
-       }
-       *ppos = i;
-       return tmp-buf;
-}
-
-static ssize_t write_port(struct file * file, const char __user * buf,
-                         size_t count, loff_t *ppos)
-{
-       unsigned long i = *ppos;
-       const char __user * tmp = buf;
-
-       if (!access_ok(VERIFY_READ,buf,count))
-               return -EFAULT;
-       while (count-- > 0 && i < 65536) {
-               char c;
-               if (__get_user(c, tmp)) {
-                       if (tmp > buf)
-                               break;
-                       return -EFAULT; 
-               }
-               outb(c,i);
-               i++;
-               tmp++;
-       }
-       *ppos = i;
-       return tmp-buf;
-}
-#endif
-
-static ssize_t read_null(struct file * file, char __user * buf,
-                        size_t count, loff_t *ppos)
-{
-       return 0;
-}
-
-static ssize_t write_null(struct file * file, const char __user * buf,
-                         size_t count, loff_t *ppos)
-{
-       return count;
-}
-
-static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,
-                       struct splice_desc *sd)
-{
-       return sd->len;
-}
-
-static ssize_t splice_write_null(struct pipe_inode_info *pipe,struct file *out,
-                                loff_t *ppos, size_t len, unsigned int flags)
-{
-       return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null);
-}
-
-#ifdef CONFIG_MMU
-/*
- * For fun, we are using the MMU for this.
- */
-static inline size_t read_zero_pagealigned(char __user * buf, size_t size)
-{
-       struct mm_struct *mm;
-       struct vm_area_struct * vma;
-       unsigned long addr=(unsigned long)buf;
-
-       mm = current->mm;
-       /* Oops, this was forgotten before. -ben */
-       down_read(&mm->mmap_sem);
-
-       /* For private mappings, just map in zero pages. */
-       for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {
-               unsigned long count;
-
-               if (vma->vm_start > addr || (vma->vm_flags & VM_WRITE) == 0)
-                       goto out_up;
-               if (vma->vm_flags & (VM_SHARED | VM_HUGETLB))
-                       break;
-               count = vma->vm_end - addr;
-               if (count > size)
-                       count = size;
-
-               zap_page_range(vma, addr, count, NULL);
-               zeromap_page_range(vma, addr, count, PAGE_COPY);
-
-               size -= count;
-               buf += count;
-               addr += count;
-               if (size == 0)
-                       goto out_up;
-       }
-
-       up_read(&mm->mmap_sem);
-       
-       /* The shared case is hard. Let's do the conventional zeroing. */ 
-       do {
-               unsigned long unwritten = clear_user(buf, PAGE_SIZE);
-               if (unwritten)
-                       return size + unwritten - PAGE_SIZE;
-               cond_resched();
-               buf += PAGE_SIZE;
-               size -= PAGE_SIZE;
-       } while (size);
-
-       return size;
-out_up:
-       up_read(&mm->mmap_sem);
-       return size;
-}
-
-static ssize_t read_zero(struct file * file, char __user * buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long left, unwritten, written = 0;
-
-       if (!count)
-               return 0;
-
-       if (!access_ok(VERIFY_WRITE, buf, count))
-               return -EFAULT;
-
-       left = count;
-
-       /* do we want to be clever? Arbitrary cut-off */
-       if (count >= PAGE_SIZE*4) {
-               unsigned long partial;
-
-               /* How much left of the page? */
-               partial = (PAGE_SIZE-1) & -(unsigned long) buf;
-               unwritten = clear_user(buf, partial);
-               written = partial - unwritten;
-               if (unwritten)
-                       goto out;
-               left -= partial;
-               buf += partial;
-               unwritten = read_zero_pagealigned(buf, left & PAGE_MASK);
-               written += (left & PAGE_MASK) - unwritten;
-               if (unwritten)
-                       goto out;
-               buf += left & PAGE_MASK;
-               left &= ~PAGE_MASK;
-       }
-       unwritten = clear_user(buf, left);
-       written += left - unwritten;
-out:
-       return written ? written : -EFAULT;
-}
-
-static int mmap_zero(struct file * file, struct vm_area_struct * vma)
-{
-       if (vma->vm_flags & VM_SHARED)
-               return shmem_zero_setup(vma);
-       if (zeromap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-}
-#else /* CONFIG_MMU */
-static ssize_t read_zero(struct file * file, char * buf, 
-                        size_t count, loff_t *ppos)
-{
-       size_t todo = count;
-
-       while (todo) {
-               size_t chunk = todo;
-
-               if (chunk > 4096)
-                       chunk = 4096;   /* Just for latency reasons */
-               if (clear_user(buf, chunk))
-                       return -EFAULT;
-               buf += chunk;
-               todo -= chunk;
-               cond_resched();
-       }
-       return count;
-}
-
-static int mmap_zero(struct file * file, struct vm_area_struct * vma)
-{
-       return -ENOSYS;
-}
-#endif /* CONFIG_MMU */
-
-static ssize_t write_full(struct file * file, const char __user * buf,
-                         size_t count, loff_t *ppos)
-{
-       return -ENOSPC;
-}
-
-/*
- * Special lseek() function for /dev/null and /dev/zero.  Most notably, you
- * can fopen() both devices with "a" now.  This was previously impossible.
- * -- SRB.
- */
-
-static loff_t null_lseek(struct file * file, loff_t offset, int orig)
-{
-       return file->f_pos = 0;
-}
-
-/*
- * The memory devices use the full 32/64 bits of the offset, and so we cannot
- * check against negative addresses: they are ok. The return value is weird,
- * though, in that case (0).
- *
- * also note that seeking relative to the "end of file" isn't supported:
- * it has no meaning, so it returns -EINVAL.
- */
-static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
-{
-       loff_t ret;
-
-       mutex_lock(&file->f_dentry->d_inode->i_mutex);
-       switch (orig) {
-               case 0:
-                       file->f_pos = offset;
-                       ret = file->f_pos;
-                       force_successful_syscall_return();
-                       break;
-               case 1:
-                       file->f_pos += offset;
-                       ret = file->f_pos;
-                       force_successful_syscall_return();
-                       break;
-               default:
-                       ret = -EINVAL;
-       }
-       mutex_unlock(&file->f_dentry->d_inode->i_mutex);
-       return ret;
-}
-
-static int open_port(struct inode * inode, struct file * filp)
-{
-       return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-}
-
-#define zero_lseek     null_lseek
-#define full_lseek      null_lseek
-#define write_zero     write_null
-#define read_full       read_zero
-#define open_mem       open_port
-#define open_kmem      open_mem
-#define open_oldmem    open_mem
-
-#ifndef ARCH_HAS_DEV_MEM
-static const struct file_operations mem_fops = {
-       .llseek         = memory_lseek,
-       .read           = read_mem,
-       .write          = write_mem,
-       .mmap           = mmap_mem,
-       .open           = open_mem,
-};
-#else
-extern const struct file_operations mem_fops;
-#endif
-
-static const struct file_operations kmem_fops = {
-       .llseek         = memory_lseek,
-       .read           = read_kmem,
-       .write          = write_kmem,
-       .mmap           = mmap_kmem,
-       .open           = open_kmem,
-};
-
-static const struct file_operations null_fops = {
-       .llseek         = null_lseek,
-       .read           = read_null,
-       .write          = write_null,
-       .splice_write   = splice_write_null,
-};
-
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-static const struct file_operations port_fops = {
-       .llseek         = memory_lseek,
-       .read           = read_port,
-       .write          = write_port,
-       .open           = open_port,
-};
-#endif
-
-static const struct file_operations zero_fops = {
-       .llseek         = zero_lseek,
-       .read           = read_zero,
-       .write          = write_zero,
-       .mmap           = mmap_zero,
-};
-
-static struct backing_dev_info zero_bdi = {
-       .capabilities   = BDI_CAP_MAP_COPY,
-};
-
-static const struct file_operations full_fops = {
-       .llseek         = full_lseek,
-       .read           = read_full,
-       .write          = write_full,
-};
-
-#ifdef CONFIG_CRASH_DUMP
-static const struct file_operations oldmem_fops = {
-       .read   = read_oldmem,
-       .open   = open_oldmem,
-};
-#endif
-
-static ssize_t kmsg_write(struct file * file, const char __user * buf,
-                         size_t count, loff_t *ppos)
-{
-       char *tmp;
-       ssize_t ret;
-
-       tmp = kmalloc(count + 1, GFP_KERNEL);
-       if (tmp == NULL)
-               return -ENOMEM;
-       ret = -EFAULT;
-       if (!copy_from_user(tmp, buf, count)) {
-               tmp[count] = 0;
-               ret = printk("%s", tmp);
-               if (ret > count)
-                       /* printk can add a prefix */
-                       ret = count;
-       }
-       kfree(tmp);
-       return ret;
-}
-
-static const struct file_operations kmsg_fops = {
-       .write =        kmsg_write,
-};
-
-static int memory_open(struct inode * inode, struct file * filp)
-{
-       switch (iminor(inode)) {
-               case 1:
-                       filp->f_op = &mem_fops;
-                       break;
-               case 2:
-                       filp->f_op = &kmem_fops;
-                       break;
-               case 3:
-                       filp->f_op = &null_fops;
-                       break;
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-               case 4:
-                       filp->f_op = &port_fops;
-                       break;
-#endif
-               case 5:
-                       filp->f_mapping->backing_dev_info = &zero_bdi;
-                       filp->f_op = &zero_fops;
-                       break;
-               case 7:
-                       filp->f_op = &full_fops;
-                       break;
-               case 8:
-                       filp->f_op = &random_fops;
-                       break;
-               case 9:
-                       filp->f_op = &urandom_fops;
-                       break;
-               case 11:
-                       filp->f_op = &kmsg_fops;
-                       break;
-#ifdef CONFIG_CRASH_DUMP
-               case 12:
-                       filp->f_op = &oldmem_fops;
-                       break;
-#endif
-               default:
-                       return -ENXIO;
-       }
-       if (filp->f_op && filp->f_op->open)
-               return filp->f_op->open(inode,filp);
-       return 0;
-}
-
-static const struct file_operations memory_fops = {
-       .open           = memory_open,  /* just a selector for the real open */
-};
-
-static const struct {
-       unsigned int            minor;
-       char                    *name;
-       umode_t                 mode;
-       const struct file_operations    *fops;
-} devlist[] = { /* list of minor devices */
-       {1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
-       {2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
-       {3, "null",    S_IRUGO | S_IWUGO,           &null_fops},
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-       {4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
-#endif
-       {5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},
-       {7, "full",    S_IRUGO | S_IWUGO,           &full_fops},
-       {8, "random",  S_IRUGO | S_IWUSR,           &random_fops},
-       {9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops},
-       {11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
-#ifdef CONFIG_CRASH_DUMP
-       {12,"oldmem",    S_IRUSR | S_IWUSR | S_IRGRP, &oldmem_fops},
-#endif
-};
-
-static struct class *mem_class;
-
-static int __init chr_dev_init(void)
-{
-       int i;
-
-       if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
-               printk("unable to get major %d for memory devs\n", MEM_MAJOR);
-
-       mem_class = class_create(THIS_MODULE, "mem");
-       for (i = 0; i < ARRAY_SIZE(devlist); i++)
-               class_device_create(mem_class, NULL,
-                                       MKDEV(MEM_MAJOR, devlist[i].minor),
-                                       NULL, devlist[i].name);
-       
-       return 0;
-}
-
-fs_initcall(chr_dev_init);
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/Kconfig b/linux-2.6-xen-sparse/drivers/char/tpm/Kconfig
deleted file mode 100644 (file)
index ec930cf..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# TPM device configuration
-#
-
-menu "TPM devices"
-
-config TCG_TPM
-       tristate "TPM Hardware Support"
-       depends on EXPERIMENTAL
-       ---help---
-         If you have a TPM security chip in your system, which
-         implements the Trusted Computing Group's specification,
-         say Yes and it will be accessible from within Linux.  For
-         more information see <http://www.trustedcomputinggroup.org>. 
-         An implementation of the Trusted Software Stack (TSS), the 
-         userspace enablement piece of the specification, can be 
-         obtained at: <http://sourceforge.net/projects/trousers>.  To 
-         compile this driver as a module, choose M here; the module 
-         will be called tpm. If unsure, say N.
-         Note: For more TPM drivers enable CONFIG_PNP, CONFIG_ACPI
-         and CONFIG_PNPACPI.
-
-config TCG_TIS
-       tristate "TPM Interface Specification 1.2 Interface"
-       depends on TCG_TPM && PNPACPI
-       ---help---
-         If you have a TPM security chip that is compliant with the
-         TCG TIS 1.2 TPM specification say Yes and it will be accessible
-         from within Linux.  To compile this driver as a module, choose
-         M here; the module will be called tpm_tis.
-
-config TCG_NSC
-       tristate "National Semiconductor TPM Interface"
-       depends on TCG_TPM && PNPACPI
-       ---help---
-         If you have a TPM security chip from National Semicondutor 
-         say Yes and it will be accessible from within Linux.  To 
-         compile this driver as a module, choose M here; the module 
-         will be called tpm_nsc.
-
-config TCG_ATMEL
-       tristate "Atmel TPM Interface"
-       depends on TCG_TPM
-       ---help---
-         If you have a TPM security chip from Atmel say Yes and it 
-         will be accessible from within Linux.  To compile this driver 
-         as a module, choose M here; the module will be called tpm_atmel.
-
-config TCG_INFINEON
-       tristate "Infineon Technologies TPM Interface"
-       depends on TCG_TPM && PNPACPI
-       ---help---
-         If you have a TPM security chip from Infineon Technologies
-         (either SLD 9630 TT 1.1 or SLB 9635 TT 1.2) say Yes and it
-         will be accessible from within Linux.
-         To compile this driver as a module, choose M here; the module
-         will be called tpm_infineon.
-         Further information on this driver and the supported hardware
-         can be found at http://www.prosec.rub.de/tpm
-
-config TCG_XEN
-       tristate "XEN TPM Interface"
-       depends on TCG_TPM && XEN
-       ---help---
-         If you want to make TPM support available to a Xen user domain,
-         say Yes and it will be accessible from within Linux.
-         To compile this driver as a module, choose M here; the module
-         will be called tpm_xenu.
-
-endmenu
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/Makefile b/linux-2.6-xen-sparse/drivers/char/tpm/Makefile
deleted file mode 100644 (file)
index b5cea0a..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Makefile for the kernel tpm device drivers.
-#
-obj-$(CONFIG_TCG_TPM) += tpm.o
-ifdef CONFIG_ACPI
-       obj-$(CONFIG_TCG_TPM) += tpm_bios.o
-endif
-obj-$(CONFIG_TCG_TIS) += tpm_tis.o
-obj-$(CONFIG_TCG_NSC) += tpm_nsc.o
-obj-$(CONFIG_TCG_ATMEL) += tpm_atmel.o
-obj-$(CONFIG_TCG_INFINEON) += tpm_infineon.o
-obj-$(CONFIG_TCG_XEN) += tpm_xenu.o
-tpm_xenu-y = tpm_xen.o tpm_vtpm.o
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/tpm.h b/linux-2.6-xen-sparse/drivers/char/tpm/tpm.h
deleted file mode 100644 (file)
index 93f8c74..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2004 IBM Corporation
- *
- * Authors:
- * Leendert van Doorn <leendert@watson.ibm.com>
- * Dave Safford <safford@watson.ibm.com>
- * Reiner Sailer <sailer@watson.ibm.com>
- * Kylene Hall <kjhall@us.ibm.com>
- *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
- *
- * Device driver for TCG/TCPA TPM (trusted platform module).
- * Specifications at www.trustedcomputinggroup.org      
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- * 
- */
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/delay.h>
-#include <linux/fs.h>
-#include <linux/miscdevice.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-
-enum tpm_timeout {
-       TPM_TIMEOUT = 5,        /* msecs */
-};
-
-/* TPM addresses */
-enum tpm_addr {
-       TPM_SUPERIO_ADDR = 0x2E,
-       TPM_ADDR = 0x4E,
-};
-
-extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr,
-                               const char *, size_t);
-extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
-                               char *);
-extern ssize_t tpm_show_temp_deactivated(struct device *,
-                                        struct device_attribute *attr, char *);
-
-struct tpm_chip;
-
-struct tpm_vendor_specific {
-       const u8 req_complete_mask;
-       const u8 req_complete_val;
-       const u8 req_canceled;
-       void __iomem *iobase;           /* ioremapped address */
-       unsigned long base;             /* TPM base address */
-
-       int irq;
-
-       int region_size;
-       int have_region;
-
-       int (*recv) (struct tpm_chip *, u8 *, size_t);
-       int (*send) (struct tpm_chip *, u8 *, size_t);
-       void (*cancel) (struct tpm_chip *);
-       u8 (*status) (struct tpm_chip *);
-       struct miscdevice miscdev;
-       struct attribute_group *attr_group;
-       struct list_head list;
-       int locality;
-       unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
-       unsigned long duration[3]; /* jiffies */
-
-       wait_queue_head_t read_queue;
-       wait_queue_head_t int_queue;
-};
-
-struct tpm_chip {
-       struct device *dev;     /* Device stuff */
-
-       int dev_num;            /* /dev/tpm# */
-       int num_opens;          /* only one allowed */
-       int time_expired;
-
-       /* Data passed to and from the tpm via the read/write calls */
-       u8 *data_buffer;
-       atomic_t data_pending;
-       struct semaphore buffer_mutex;
-
-       struct timer_list user_read_timer;      /* user needs to claim result */
-       struct work_struct work;
-       struct semaphore tpm_mutex;     /* tpm is processing */
-
-       struct tpm_vendor_specific vendor;
-
-       struct dentry **bios_dir;
-
-       struct list_head list;
-#ifdef CONFIG_XEN
-       void *priv;
-#endif
-};
-
-#define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor)
-
-static inline int tpm_read_index(int base, int index)
-{
-       outb(index, base);
-       return inb(base+1) & 0xFF;
-}
-
-static inline void tpm_write_index(int base, int index, int value)
-{
-       outb(index, base);
-       outb(value & 0xFF, base+1);
-}
-
-#ifdef CONFIG_XEN
-static inline void *chip_get_private(const struct tpm_chip *chip)
-{
-       return chip->priv;
-}
-
-static inline void chip_set_private(struct tpm_chip *chip, void *priv)
-{
-       chip->priv = priv;
-}
-#endif
-
-extern void tpm_get_timeouts(struct tpm_chip *);
-extern void tpm_gen_interrupt(struct tpm_chip *);
-extern void tpm_continue_selftest(struct tpm_chip *);
-extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
-extern struct tpm_chip* tpm_register_hardware(struct device *,
-                                const struct tpm_vendor_specific *);
-extern int tpm_open(struct inode *, struct file *);
-extern int tpm_release(struct inode *, struct file *);
-extern ssize_t tpm_write(struct file *, const char __user *, size_t,
-                        loff_t *);
-extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
-extern void tpm_remove_hardware(struct device *);
-extern int tpm_pm_suspend(struct device *, pm_message_t);
-extern int tpm_pm_resume(struct device *);
-
-#ifdef CONFIG_ACPI
-extern struct dentry ** tpm_bios_log_setup(char *);
-extern void tpm_bios_log_teardown(struct dentry **);
-#else
-static inline struct dentry ** tpm_bios_log_setup(char *name)
-{
-       return NULL;
-}
-static inline void tpm_bios_log_teardown(struct dentry **dir)
-{
-}
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.c b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.c
deleted file mode 100644 (file)
index 1f6982e..0000000
+++ /dev/null
@@ -1,542 +0,0 @@
-/*
- * Copyright (C) 2006 IBM Corporation
- *
- * Authors:
- * Stefan Berger <stefanb@us.ibm.com>
- *
- * Generic device driver part for device drivers in a virtualized
- * environment.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- */
-
-#include <asm/uaccess.h>
-#include <linux/list.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include "tpm.h"
-#include "tpm_vtpm.h"
-
-/* read status bits */
-enum {
-       STATUS_BUSY = 0x01,
-       STATUS_DATA_AVAIL = 0x02,
-       STATUS_READY = 0x04
-};
-
-struct transmission {
-       struct list_head next;
-
-       unsigned char *request;
-       size_t  request_len;
-       size_t  request_buflen;
-
-       unsigned char *response;
-       size_t  response_len;
-       size_t  response_buflen;
-
-       unsigned int flags;
-};
-
-enum {
-       TRANSMISSION_FLAG_WAS_QUEUED = 0x1
-};
-
-
-enum {
-       DATAEX_FLAG_QUEUED_ONLY = 0x1
-};
-
-
-/* local variables */
-
-/* local function prototypes */
-static int _vtpm_send_queued(struct tpm_chip *chip);
-
-
-/* =============================================================
- * Some utility functions
- * =============================================================
- */
-static void vtpm_state_init(struct vtpm_state *vtpms)
-{
-       vtpms->current_request = NULL;
-       spin_lock_init(&vtpms->req_list_lock);
-       init_waitqueue_head(&vtpms->req_wait_queue);
-       INIT_LIST_HEAD(&vtpms->queued_requests);
-
-       vtpms->current_response = NULL;
-       spin_lock_init(&vtpms->resp_list_lock);
-       init_waitqueue_head(&vtpms->resp_wait_queue);
-
-       vtpms->disconnect_time = jiffies;
-}
-
-
-static inline struct transmission *transmission_alloc(void)
-{
-       return kzalloc(sizeof(struct transmission), GFP_ATOMIC);
-}
-
-static unsigned char *
-transmission_set_req_buffer(struct transmission *t,
-                            unsigned char *buffer, size_t len)
-{
-       if (t->request_buflen < len) {
-               kfree(t->request);
-               t->request = kmalloc(len, GFP_KERNEL);
-               if (!t->request) {
-                       t->request_buflen = 0;
-                       return NULL;
-               }
-               t->request_buflen = len;
-       }
-
-       memcpy(t->request, buffer, len);
-       t->request_len = len;
-
-       return t->request;
-}
-
-static unsigned char *
-transmission_set_res_buffer(struct transmission *t,
-                            const unsigned char *buffer, size_t len)
-{
-       if (t->response_buflen < len) {
-               kfree(t->response);
-               t->response = kmalloc(len, GFP_ATOMIC);
-               if (!t->response) {
-                       t->response_buflen = 0;
-                       return NULL;
-               }
-               t->response_buflen = len;
-       }
-
-       memcpy(t->response, buffer, len);
-       t->response_len = len;
-
-       return t->response;
-}
-
-static inline void transmission_free(struct transmission *t)
-{
-       kfree(t->request);
-       kfree(t->response);
-       kfree(t);
-}
-
-/* =============================================================
- * Interface with the lower layer driver
- * =============================================================
- */
-/*
- * Lower layer uses this function to make a response available.
- */
-int vtpm_vd_recv(const struct tpm_chip *chip,
-                 const unsigned char *buffer, size_t count,
-                 void *ptr)
-{
-       unsigned long flags;
-       int ret_size = 0;
-       struct transmission *t;
-       struct vtpm_state *vtpms;
-
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       /*
-        * The list with requests must contain one request
-        * only and the element there must be the one that
-        * was passed to me from the front-end.
-        */
-       spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-       if (vtpms->current_request != ptr) {
-               spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-               return 0;
-       }
-
-       if ((t = vtpms->current_request)) {
-               transmission_free(t);
-               vtpms->current_request = NULL;
-       }
-
-       t = transmission_alloc();
-       if (t) {
-               if (!transmission_set_res_buffer(t, buffer, count)) {
-                       transmission_free(t);
-                       spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-                       return -ENOMEM;
-               }
-               ret_size = count;
-               vtpms->current_response = t;
-               wake_up_interruptible(&vtpms->resp_wait_queue);
-       }
-       spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-
-       return ret_size;
-}
-
-
-/*
- * Lower layer indicates its status (connected/disconnected)
- */
-void vtpm_vd_status(const struct tpm_chip *chip, u8 vd_status)
-{
-       struct vtpm_state *vtpms;
-
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       vtpms->vd_status = vd_status;
-       if ((vtpms->vd_status & TPM_VD_STATUS_CONNECTED) == 0) {
-               vtpms->disconnect_time = jiffies;
-       }
-}
-
-/* =============================================================
- * Interface with the generic TPM driver
- * =============================================================
- */
-static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
-{
-       int rc = 0;
-       unsigned long flags;
-       struct vtpm_state *vtpms;
-
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       /*
-        * Check if the previous operation only queued the command
-        * In this case there won't be a response, so I just
-        * return from here and reset that flag. In any other
-        * case I should receive a response from the back-end.
-        */
-       spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-       if ((vtpms->flags & DATAEX_FLAG_QUEUED_ONLY) != 0) {
-               vtpms->flags &= ~DATAEX_FLAG_QUEUED_ONLY;
-               spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-               /*
-                * The first few commands (measurements) must be
-                * queued since it might not be possible to talk to the
-                * TPM, yet.
-                * Return a response of up to 30 '0's.
-                */
-
-               count = min_t(size_t, count, 30);
-               memset(buf, 0x0, count);
-               return count;
-       }
-       /*
-        * Check whether something is in the responselist and if
-        * there's nothing in the list wait for something to appear.
-        */
-
-       if (!vtpms->current_response) {
-               spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-               interruptible_sleep_on_timeout(&vtpms->resp_wait_queue,
-                                              1000);
-               spin_lock_irqsave(&vtpms->resp_list_lock ,flags);
-       }
-
-       if (vtpms->current_response) {
-               struct transmission *t = vtpms->current_response;
-               vtpms->current_response = NULL;
-               rc = min(count, t->response_len);
-               memcpy(buf, t->response, rc);
-               transmission_free(t);
-       }
-
-       spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-       return rc;
-}
-
-static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
-{
-       int rc = 0;
-       unsigned long flags;
-       struct transmission *t = transmission_alloc();
-       struct vtpm_state *vtpms;
-
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       if (!t)
-               return -ENOMEM;
-       /*
-        * If there's a current request, it must be the
-        * previous request that has timed out.
-        */
-       spin_lock_irqsave(&vtpms->req_list_lock, flags);
-       if (vtpms->current_request != NULL) {
-               printk("WARNING: Sending although there is a request outstanding.\n"
-                      "         Previous request must have timed out.\n");
-               transmission_free(vtpms->current_request);
-               vtpms->current_request = NULL;
-       }
-       spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-
-       /*
-        * Queue the packet if the driver below is not
-        * ready, yet, or there is any packet already
-        * in the queue.
-        * If the driver below is ready, unqueue all
-        * packets first before sending our current
-        * packet.
-        * For each unqueued packet, except for the
-        * last (=current) packet, call the function
-        * tpm_xen_recv to wait for the response to come
-        * back.
-        */
-       if ((vtpms->vd_status & TPM_VD_STATUS_CONNECTED) == 0) {
-               if (time_after(jiffies,
-                              vtpms->disconnect_time + HZ * 10)) {
-                       rc = -ENOENT;
-               } else {
-                       goto queue_it;
-               }
-       } else {
-               /*
-                * Send all queued packets.
-                */
-               if (_vtpm_send_queued(chip) == 0) {
-
-                       vtpms->current_request = t;
-
-                       rc = vtpm_vd_send(vtpms->tpm_private,
-                                         buf,
-                                         count,
-                                         t);
-                       /*
-                        * The generic TPM driver will call
-                        * the function to receive the response.
-                        */
-                       if (rc < 0) {
-                               vtpms->current_request = NULL;
-                               goto queue_it;
-                       }
-               } else {
-queue_it:
-                       if (!transmission_set_req_buffer(t, buf, count)) {
-                               transmission_free(t);
-                               rc = -ENOMEM;
-                               goto exit;
-                       }
-                       /*
-                        * An error occurred. Don't event try
-                        * to send the current request. Just
-                        * queue it.
-                        */
-                       spin_lock_irqsave(&vtpms->req_list_lock, flags);
-                       vtpms->flags |= DATAEX_FLAG_QUEUED_ONLY;
-                       list_add_tail(&t->next, &vtpms->queued_requests);
-                       spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-               }
-       }
-
-exit:
-       return rc;
-}
-
-
-/*
- * Send all queued requests.
- */
-static int _vtpm_send_queued(struct tpm_chip *chip)
-{
-       int rc;
-       int error = 0;
-       long flags;
-       unsigned char buffer[1];
-       struct vtpm_state *vtpms;
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       spin_lock_irqsave(&vtpms->req_list_lock, flags);
-
-       while (!list_empty(&vtpms->queued_requests)) {
-               /*
-                * Need to dequeue them.
-                * Read the result into a dummy buffer.
-                */
-               struct transmission *qt = (struct transmission *)
-                                         vtpms->queued_requests.next;
-               list_del(&qt->next);
-               vtpms->current_request = qt;
-               spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-
-               rc = vtpm_vd_send(vtpms->tpm_private,
-                                 qt->request,
-                                 qt->request_len,
-                                 qt);
-
-               if (rc < 0) {
-                       spin_lock_irqsave(&vtpms->req_list_lock, flags);
-                       if ((qt = vtpms->current_request) != NULL) {
-                               /*
-                                * requeue it at the beginning
-                                * of the list
-                                */
-                               list_add(&qt->next,
-                                        &vtpms->queued_requests);
-                       }
-                       vtpms->current_request = NULL;
-                       error = 1;
-                       break;
-               }
-               /*
-                * After this point qt is not valid anymore!
-                * It is freed when the front-end is delivering
-                * the data by calling tpm_recv
-                */
-               /*
-                * Receive response into provided dummy buffer
-                */
-               rc = vtpm_recv(chip, buffer, sizeof(buffer));
-               spin_lock_irqsave(&vtpms->req_list_lock, flags);
-       }
-
-       spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-
-       return error;
-}
-
-static void vtpm_cancel(struct tpm_chip *chip)
-{
-       unsigned long flags;
-       struct vtpm_state *vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       spin_lock_irqsave(&vtpms->resp_list_lock,flags);
-
-       if (!vtpms->current_response && vtpms->current_request) {
-               spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-               interruptible_sleep_on(&vtpms->resp_wait_queue);
-               spin_lock_irqsave(&vtpms->resp_list_lock,flags);
-       }
-
-       if (vtpms->current_response) {
-               struct transmission *t = vtpms->current_response;
-               vtpms->current_response = NULL;
-               transmission_free(t);
-       }
-
-       spin_unlock_irqrestore(&vtpms->resp_list_lock,flags);
-}
-
-static u8 vtpm_status(struct tpm_chip *chip)
-{
-       u8 rc = 0;
-       unsigned long flags;
-       struct vtpm_state *vtpms;
-
-       vtpms = (struct vtpm_state *)chip_get_private(chip);
-
-       spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-       /*
-        * Data are available if:
-        *  - there's a current response
-        *  - the last packet was queued only (this is fake, but necessary to
-        *      get the generic TPM layer to call the receive function.)
-        */
-       if (vtpms->current_response ||
-           0 != (vtpms->flags & DATAEX_FLAG_QUEUED_ONLY)) {
-               rc = STATUS_DATA_AVAIL;
-       } else if (!vtpms->current_response && !vtpms->current_request) {
-               rc = STATUS_READY;
-       }
-
-       spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-       return rc;
-}
-
-static struct file_operations vtpm_ops = {
-       .owner = THIS_MODULE,
-       .llseek = no_llseek,
-       .open = tpm_open,
-       .read = tpm_read,
-       .write = tpm_write,
-       .release = tpm_release,
-};
-
-static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
-static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
-static DEVICE_ATTR(enabled, S_IRUGO, tpm_show_enabled, NULL);
-static DEVICE_ATTR(active, S_IRUGO, tpm_show_active, NULL);
-static DEVICE_ATTR(owned, S_IRUGO, tpm_show_owned, NULL);
-static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
-                  NULL);
-static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL);
-static DEVICE_ATTR(cancel, S_IWUSR |S_IWGRP, NULL, tpm_store_cancel);
-
-static struct attribute *vtpm_attrs[] = {
-       &dev_attr_pubek.attr,
-       &dev_attr_pcrs.attr,
-       &dev_attr_enabled.attr,
-       &dev_attr_active.attr,
-       &dev_attr_owned.attr,
-       &dev_attr_temp_deactivated.attr,
-       &dev_attr_caps.attr,
-       &dev_attr_cancel.attr,
-       NULL,
-};
-
-static struct attribute_group vtpm_attr_grp = { .attrs = vtpm_attrs };
-
-#define TPM_LONG_TIMEOUT   (10 * 60 * HZ)
-
-static struct tpm_vendor_specific tpm_vtpm = {
-       .recv = vtpm_recv,
-       .send = vtpm_send,
-       .cancel = vtpm_cancel,
-       .status = vtpm_status,
-       .req_complete_mask = STATUS_BUSY | STATUS_DATA_AVAIL,
-       .req_complete_val  = STATUS_DATA_AVAIL,
-       .req_canceled = STATUS_READY,
-       .attr_group = &vtpm_attr_grp,
-       .miscdev = {
-               .fops = &vtpm_ops,
-       },
-       .duration = {
-               TPM_LONG_TIMEOUT,
-               TPM_LONG_TIMEOUT,
-               TPM_LONG_TIMEOUT,
-       },
-};
-
-struct tpm_chip *init_vtpm(struct device *dev,
-                           struct tpm_private *tp)
-{
-       long rc;
-       struct tpm_chip *chip;
-       struct vtpm_state *vtpms;
-
-       vtpms = kzalloc(sizeof(struct vtpm_state), GFP_KERNEL);
-       if (!vtpms)
-               return ERR_PTR(-ENOMEM);
-
-       vtpm_state_init(vtpms);
-       vtpms->tpm_private = tp;
-
-       chip = tpm_register_hardware(dev, &tpm_vtpm);
-       if (!chip) {
-               rc = -ENODEV;
-               goto err_free_mem;
-       }
-
-       chip_set_private(chip, vtpms);
-
-       return chip;
-
-err_free_mem:
-       kfree(vtpms);
-
-       return ERR_PTR(rc);
-}
-
-void cleanup_vtpm(struct device *dev)
-{
-       struct tpm_chip *chip = dev_get_drvdata(dev);
-       struct vtpm_state *vtpms = (struct vtpm_state*)chip_get_private(chip);
-       tpm_remove_hardware(dev);
-       kfree(vtpms);
-}
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.h b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_vtpm.h
deleted file mode 100644 (file)
index 77aa342..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef TPM_VTPM_H
-#define TPM_VTPM_H
-
-struct tpm_chip;
-struct tpm_private;
-
-struct vtpm_state {
-       struct transmission *current_request;
-       spinlock_t           req_list_lock;
-       wait_queue_head_t    req_wait_queue;
-
-       struct list_head     queued_requests;
-
-       struct transmission *current_response;
-       spinlock_t           resp_list_lock;
-       wait_queue_head_t    resp_wait_queue;     // processes waiting for responses
-
-       u8                   vd_status;
-       u8                   flags;
-
-       unsigned long        disconnect_time;
-
-       /*
-        * The following is a private structure of the underlying
-        * driver. It is passed as parameter in the send function.
-        */
-       struct tpm_private *tpm_private;
-};
-
-
-enum vdev_status {
-       TPM_VD_STATUS_DISCONNECTED = 0x0,
-       TPM_VD_STATUS_CONNECTED = 0x1
-};
-
-/* this function is called from tpm_vtpm.c */
-int vtpm_vd_send(struct tpm_private * tp,
-                 const u8 * buf, size_t count, void *ptr);
-
-/* these functions are offered by tpm_vtpm.c */
-struct tpm_chip *init_vtpm(struct device *,
-                           struct tpm_private *);
-void cleanup_vtpm(struct device *);
-int vtpm_vd_recv(const struct tpm_chip* chip,
-                 const unsigned char *buffer, size_t count, void *ptr);
-void vtpm_vd_status(const struct tpm_chip *, u8 status);
-
-static inline struct tpm_private *tpm_private_from_dev(struct device *dev)
-{
-       struct tpm_chip *chip = dev_get_drvdata(dev);
-       struct vtpm_state *vtpms = chip_get_private(chip);
-       return vtpms->tpm_private;
-}
-
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
deleted file mode 100644 (file)
index 5488217..0000000
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- * Copyright (c) 2005, IBM Corporation
- *
- * Author: Stefan Berger, stefanb@us.ibm.com
- * Grant table support: Mahadevan Gomathisankaran
- *
- * This code has been derived from drivers/xen/netfront/netfront.c
- *
- * Copyright (c) 2002-2004, K A Fraser
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-#include <asm/uaccess.h>
-#include <xen/evtchn.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/io/tpmif.h>
-#include <xen/gnttab.h>
-#include <xen/xenbus.h>
-#include "tpm.h"
-#include "tpm_vtpm.h"
-
-#undef DEBUG
-
-/* local structures */
-struct tpm_private {
-       struct tpm_chip *chip;
-
-       tpmif_tx_interface_t *tx;
-       atomic_t refcnt;
-       unsigned int irq;
-       u8 is_connected;
-       u8 is_suspended;
-
-       spinlock_t tx_lock;
-
-       struct tx_buffer *tx_buffers[TPMIF_TX_RING_SIZE];
-
-       atomic_t tx_busy;
-       void *tx_remember;
-
-       domid_t backend_id;
-       wait_queue_head_t wait_q;
-
-       struct xenbus_device *dev;
-       int ring_ref;
-};
-
-struct tx_buffer {
-       unsigned int size;      // available space in data
-       unsigned int len;       // used space in data
-       unsigned char *data;    // pointer to a page
-};
-
-
-/* locally visible variables */
-static grant_ref_t gref_head;
-static struct tpm_private *my_priv;
-
-/* local function prototypes */
-static irqreturn_t tpmif_int(int irq,
-                             void *tpm_priv,
-                             struct pt_regs *ptregs);
-static void tpmif_rx_action(unsigned long unused);
-static int tpmif_connect(struct xenbus_device *dev,
-                         struct tpm_private *tp,
-                         domid_t domid);
-static DECLARE_TASKLET(tpmif_rx_tasklet, tpmif_rx_action, 0);
-static int tpmif_allocate_tx_buffers(struct tpm_private *tp);
-static void tpmif_free_tx_buffers(struct tpm_private *tp);
-static void tpmif_set_connected_state(struct tpm_private *tp,
-                                      u8 newstate);
-static int tpm_xmit(struct tpm_private *tp,
-                    const u8 * buf, size_t count, int userbuffer,
-                    void *remember);
-static void destroy_tpmring(struct tpm_private *tp);
-void __exit tpmif_exit(void);
-
-#define DPRINTK(fmt, args...) \
-    pr_debug("xen_tpm_fr (%s:%d) " fmt, __FUNCTION__, __LINE__, ##args)
-#define IPRINTK(fmt, args...) \
-    printk(KERN_INFO "xen_tpm_fr: " fmt, ##args)
-#define WPRINTK(fmt, args...) \
-    printk(KERN_WARNING "xen_tpm_fr: " fmt, ##args)
-
-#define GRANT_INVALID_REF      0
-
-
-static inline int
-tx_buffer_copy(struct tx_buffer *txb, const u8 *src, int len,
-               int isuserbuffer)
-{
-       int copied = len;
-
-       if (len > txb->size)
-               copied = txb->size;
-       if (isuserbuffer) {
-               if (copy_from_user(txb->data, src, copied))
-                       return -EFAULT;
-       } else {
-               memcpy(txb->data, src, copied);
-       }
-       txb->len = len;
-       return copied;
-}
-
-static inline struct tx_buffer *tx_buffer_alloc(void)
-{
-       struct tx_buffer *txb;
-
-       txb = kzalloc(sizeof(struct tx_buffer), GFP_KERNEL);
-       if (!txb)
-               return NULL;
-
-       txb->len = 0;
-       txb->size = PAGE_SIZE;
-       txb->data = (unsigned char *)__get_free_page(GFP_KERNEL);
-       if (txb->data == NULL) {
-               kfree(txb);
-               txb = NULL;
-       }
-
-       return txb;
-}
-
-
-static inline void tx_buffer_free(struct tx_buffer *txb)
-{
-       if (txb) {
-               free_page((long)txb->data);
-               kfree(txb);
-       }
-}
-
-/**************************************************************
- Utility function for the tpm_private structure
-**************************************************************/
-static void tpm_private_init(struct tpm_private *tp)
-{
-       spin_lock_init(&tp->tx_lock);
-       init_waitqueue_head(&tp->wait_q);
-       atomic_set(&tp->refcnt, 1);
-}
-
-static void tpm_private_put(void)
-{
-       if (!atomic_dec_and_test(&my_priv->refcnt))
-               return;
-
-       tpmif_free_tx_buffers(my_priv);
-       kfree(my_priv);
-       my_priv = NULL;
-}
-
-static struct tpm_private *tpm_private_get(void)
-{
-       int err;
-
-       if (my_priv) {
-               atomic_inc(&my_priv->refcnt);
-               return my_priv;
-       }
-
-       my_priv = kzalloc(sizeof(struct tpm_private), GFP_KERNEL);
-       if (!my_priv)
-               return NULL;
-
-       tpm_private_init(my_priv);
-       err = tpmif_allocate_tx_buffers(my_priv);
-       if (err < 0)
-               tpm_private_put();
-
-       return my_priv;
-}
-
-/**************************************************************
-
- The interface to let the tpm plugin register its callback
- function and send data to another partition using this module
-
-**************************************************************/
-
-static DEFINE_MUTEX(suspend_lock);
-/*
- * Send data via this module by calling this function
- */
-int vtpm_vd_send(struct tpm_private *tp,
-                 const u8 * buf, size_t count, void *ptr)
-{
-       int sent;
-
-       mutex_lock(&suspend_lock);
-       sent = tpm_xmit(tp, buf, count, 0, ptr);
-       mutex_unlock(&suspend_lock);
-
-       return sent;
-}
-
-/**************************************************************
- XENBUS support code
-**************************************************************/
-
-static int setup_tpmring(struct xenbus_device *dev,
-                         struct tpm_private *tp)
-{
-       tpmif_tx_interface_t *sring;
-       int err;
-
-       tp->ring_ref = GRANT_INVALID_REF;
-
-       sring = (void *)__get_free_page(GFP_KERNEL);
-       if (!sring) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
-               return -ENOMEM;
-       }
-       tp->tx = sring;
-
-       err = xenbus_grant_ring(dev, virt_to_mfn(tp->tx));
-       if (err < 0) {
-               free_page((unsigned long)sring);
-               tp->tx = NULL;
-               xenbus_dev_fatal(dev, err, "allocating grant reference");
-               goto fail;
-       }
-       tp->ring_ref = err;
-
-       err = tpmif_connect(dev, tp, dev->otherend_id);
-       if (err)
-               goto fail;
-
-       return 0;
-fail:
-       destroy_tpmring(tp);
-       return err;
-}
-
-
-static void destroy_tpmring(struct tpm_private *tp)
-{
-       tpmif_set_connected_state(tp, 0);
-
-       if (tp->ring_ref != GRANT_INVALID_REF) {
-               gnttab_end_foreign_access(tp->ring_ref, 0,
-                                         (unsigned long)tp->tx);
-               tp->ring_ref = GRANT_INVALID_REF;
-               tp->tx = NULL;
-       }
-
-       if (tp->irq)
-               unbind_from_irqhandler(tp->irq, tp);
-
-       tp->irq = 0;
-}
-
-
-static int talk_to_backend(struct xenbus_device *dev,
-                           struct tpm_private *tp)
-{
-       const char *message = NULL;
-       int err;
-       struct xenbus_transaction xbt;
-
-       err = setup_tpmring(dev, tp);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "setting up ring");
-               goto out;
-       }
-
-again:
-       err = xenbus_transaction_start(&xbt);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "starting transaction");
-               goto destroy_tpmring;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename,
-                           "ring-ref","%u", tp->ring_ref);
-       if (err) {
-               message = "writing ring-ref";
-               goto abort_transaction;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           irq_to_evtchn_port(tp->irq));
-       if (err) {
-               message = "writing event-channel";
-               goto abort_transaction;
-       }
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err == -EAGAIN)
-               goto again;
-       if (err) {
-               xenbus_dev_fatal(dev, err, "completing transaction");
-               goto destroy_tpmring;
-       }
-
-       xenbus_switch_state(dev, XenbusStateConnected);
-
-       return 0;
-
-abort_transaction:
-       xenbus_transaction_end(xbt, 1);
-       if (message)
-               xenbus_dev_error(dev, err, "%s", message);
-destroy_tpmring:
-       destroy_tpmring(tp);
-out:
-       return err;
-}
-
-/**
- * Callback received when the backend's state changes.
- */
-static void backend_changed(struct xenbus_device *dev,
-                           enum xenbus_state backend_state)
-{
-       struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-       DPRINTK("\n");
-
-       switch (backend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitWait:
-       case XenbusStateInitialised:
-       case XenbusStateUnknown:
-               break;
-
-       case XenbusStateConnected:
-               tpmif_set_connected_state(tp, 1);
-               break;
-
-       case XenbusStateClosing:
-               tpmif_set_connected_state(tp, 0);
-               xenbus_frontend_closed(dev);
-               break;
-
-       case XenbusStateClosed:
-               tpmif_set_connected_state(tp, 0);
-               if (tp->is_suspended == 0)
-                       device_unregister(&dev->dev);
-               xenbus_frontend_closed(dev);
-               break;
-       }
-}
-
-static int tpmfront_probe(struct xenbus_device *dev,
-                          const struct xenbus_device_id *id)
-{
-       int err;
-       int handle;
-       struct tpm_private *tp = tpm_private_get();
-
-       if (!tp)
-               return -ENOMEM;
-
-       tp->chip = init_vtpm(&dev->dev, tp);
-       if (IS_ERR(tp->chip))
-               return PTR_ERR(tp->chip);
-
-       err = xenbus_scanf(XBT_NIL, dev->nodename,
-                          "handle", "%i", &handle);
-       if (XENBUS_EXIST_ERR(err))
-               return err;
-
-       if (err < 0) {
-               xenbus_dev_fatal(dev,err,"reading virtual-device");
-               return err;
-       }
-
-       tp->dev = dev;
-
-       err = talk_to_backend(dev, tp);
-       if (err) {
-               tpm_private_put();
-               return err;
-       }
-
-       return 0;
-}
-
-
-static int tpmfront_remove(struct xenbus_device *dev)
-{
-       struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-       destroy_tpmring(tp);
-       cleanup_vtpm(&dev->dev);
-       return 0;
-}
-
-static int tpmfront_suspend(struct xenbus_device *dev)
-{
-       struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-       u32 ctr;
-
-       /* Take the lock, preventing any application from sending. */
-       mutex_lock(&suspend_lock);
-       tp->is_suspended = 1;
-
-       for (ctr = 0; atomic_read(&tp->tx_busy); ctr++) {
-               if ((ctr % 10) == 0)
-                       printk("TPM-FE [INFO]: Waiting for outstanding "
-                              "request.\n");
-               /* Wait for a request to be responded to. */
-               interruptible_sleep_on_timeout(&tp->wait_q, 100);
-       }
-
-       return 0;
-}
-
-static int tpmfront_suspend_finish(struct tpm_private *tp)
-{
-       tp->is_suspended = 0;
-       /* Allow applications to send again. */
-       mutex_unlock(&suspend_lock);
-       return 0;
-}
-
-static int tpmfront_suspend_cancel(struct xenbus_device *dev)
-{
-       struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-       return tpmfront_suspend_finish(tp);
-}
-
-static int tpmfront_resume(struct xenbus_device *dev)
-{
-       struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-       destroy_tpmring(tp);
-       return talk_to_backend(dev, tp);
-}
-
-static int tpmif_connect(struct xenbus_device *dev,
-                         struct tpm_private *tp,
-                         domid_t domid)
-{
-       int err;
-
-       tp->backend_id = domid;
-
-       err = bind_listening_port_to_irqhandler(
-               domid, tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
-       if (err <= 0) {
-               WPRINTK("bind_listening_port_to_irqhandler failed "
-                       "(err=%d)\n", err);
-               return err;
-       }
-       tp->irq = err;
-
-       return 0;
-}
-
-static struct xenbus_device_id tpmfront_ids[] = {
-       { "vtpm" },
-       { "" }
-};
-
-static struct xenbus_driver tpmfront = {
-       .name = "vtpm",
-       .owner = THIS_MODULE,
-       .ids = tpmfront_ids,
-       .probe = tpmfront_probe,
-       .remove =  tpmfront_remove,
-       .resume = tpmfront_resume,
-       .otherend_changed = backend_changed,
-       .suspend = tpmfront_suspend,
-       .suspend_cancel = tpmfront_suspend_cancel,
-};
-
-static void __init init_tpm_xenbus(void)
-{
-       xenbus_register_frontend(&tpmfront);
-}
-
-static int tpmif_allocate_tx_buffers(struct tpm_private *tp)
-{
-       unsigned int i;
-
-       for (i = 0; i < TPMIF_TX_RING_SIZE; i++) {
-               tp->tx_buffers[i] = tx_buffer_alloc();
-               if (!tp->tx_buffers[i]) {
-                       tpmif_free_tx_buffers(tp);
-                       return -ENOMEM;
-               }
-       }
-       return 0;
-}
-
-static void tpmif_free_tx_buffers(struct tpm_private *tp)
-{
-       unsigned int i;
-
-       for (i = 0; i < TPMIF_TX_RING_SIZE; i++)
-               tx_buffer_free(tp->tx_buffers[i]);
-}
-
-static void tpmif_rx_action(unsigned long priv)
-{
-       struct tpm_private *tp = (struct tpm_private *)priv;
-       int i = 0;
-       unsigned int received;
-       unsigned int offset = 0;
-       u8 *buffer;
-       tpmif_tx_request_t *tx = &tp->tx->ring[i].req;
-
-       atomic_set(&tp->tx_busy, 0);
-       wake_up_interruptible(&tp->wait_q);
-
-       received = tx->size;
-
-       buffer = kmalloc(received, GFP_ATOMIC);
-       if (!buffer)
-               return;
-
-       for (i = 0; i < TPMIF_TX_RING_SIZE && offset < received; i++) {
-               struct tx_buffer *txb = tp->tx_buffers[i];
-               tpmif_tx_request_t *tx;
-               unsigned int tocopy;
-
-               tx = &tp->tx->ring[i].req;
-               tocopy = tx->size;
-               if (tocopy > PAGE_SIZE)
-                       tocopy = PAGE_SIZE;
-
-               memcpy(&buffer[offset], txb->data, tocopy);
-
-               gnttab_release_grant_reference(&gref_head, tx->ref);
-
-               offset += tocopy;
-       }
-
-       vtpm_vd_recv(tp->chip, buffer, received, tp->tx_remember);
-       kfree(buffer);
-}
-
-
-static irqreturn_t tpmif_int(int irq, void *tpm_priv, struct pt_regs *ptregs)
-{
-       struct tpm_private *tp = tpm_priv;
-       unsigned long flags;
-
-       spin_lock_irqsave(&tp->tx_lock, flags);
-       tpmif_rx_tasklet.data = (unsigned long)tp;
-       tasklet_schedule(&tpmif_rx_tasklet);
-       spin_unlock_irqrestore(&tp->tx_lock, flags);
-
-       return IRQ_HANDLED;
-}
-
-
-static int tpm_xmit(struct tpm_private *tp,
-                    const u8 * buf, size_t count, int isuserbuffer,
-                    void *remember)
-{
-       tpmif_tx_request_t *tx;
-       TPMIF_RING_IDX i;
-       unsigned int offset = 0;
-
-       spin_lock_irq(&tp->tx_lock);
-
-       if (unlikely(atomic_read(&tp->tx_busy))) {
-               printk("tpm_xmit: There's an outstanding request/response "
-                      "on the way!\n");
-               spin_unlock_irq(&tp->tx_lock);
-               return -EBUSY;
-       }
-
-       if (tp->is_connected != 1) {
-               spin_unlock_irq(&tp->tx_lock);
-               return -EIO;
-       }
-
-       for (i = 0; count > 0 && i < TPMIF_TX_RING_SIZE; i++) {
-               struct tx_buffer *txb = tp->tx_buffers[i];
-               int copied;
-
-               if (!txb) {
-                       DPRINTK("txb (i=%d) is NULL. buffers initilized?\n"
-                               "Not transmitting anything!\n", i);
-                       spin_unlock_irq(&tp->tx_lock);
-                       return -EFAULT;
-               }
-
-               copied = tx_buffer_copy(txb, &buf[offset], count,
-                                       isuserbuffer);
-               if (copied < 0) {
-                       /* An error occurred */
-                       spin_unlock_irq(&tp->tx_lock);
-                       return copied;
-               }
-               count -= copied;
-               offset += copied;
-
-               tx = &tp->tx->ring[i].req;
-               tx->addr = virt_to_machine(txb->data);
-               tx->size = txb->len;
-
-               DPRINTK("First 4 characters sent by TPM-FE are "
-                       "0x%02x 0x%02x 0x%02x 0x%02x\n",
-                       txb->data[0],txb->data[1],txb->data[2],txb->data[3]);
-
-               /* Get the granttable reference for this page. */
-               tx->ref = gnttab_claim_grant_reference(&gref_head);
-               if (tx->ref == -ENOSPC) {
-                       spin_unlock_irq(&tp->tx_lock);
-                       DPRINTK("Grant table claim reference failed in "
-                               "func:%s line:%d file:%s\n",
-                               __FUNCTION__, __LINE__, __FILE__);
-                       return -ENOSPC;
-               }
-               gnttab_grant_foreign_access_ref(tx->ref,
-                                               tp->backend_id,
-                                               virt_to_mfn(txb->data),
-                                               0 /*RW*/);
-               wmb();
-       }
-
-       atomic_set(&tp->tx_busy, 1);
-       tp->tx_remember = remember;
-
-       mb();
-
-       notify_remote_via_irq(tp->irq);
-
-       spin_unlock_irq(&tp->tx_lock);
-       return offset;
-}
-
-
-static void tpmif_notify_upperlayer(struct tpm_private *tp)
-{
-       /* Notify upper layer about the state of the connection to the BE. */
-       vtpm_vd_status(tp->chip, (tp->is_connected
-                                 ? TPM_VD_STATUS_CONNECTED
-                                 : TPM_VD_STATUS_DISCONNECTED));
-}
-
-
-static void tpmif_set_connected_state(struct tpm_private *tp, u8 is_connected)
-{
-       /*
-        * Don't notify upper layer if we are in suspend mode and
-        * should disconnect - assumption is that we will resume
-        * The mutex keeps apps from sending.
-        */
-       if (is_connected == 0 && tp->is_suspended == 1)
-               return;
-
-       /*
-        * Unlock the mutex if we are connected again
-        * after being suspended - now resuming.
-        * This also removes the suspend state.
-        */
-       if (is_connected == 1 && tp->is_suspended == 1)
-               tpmfront_suspend_finish(tp);
-
-       if (is_connected != tp->is_connected) {
-               tp->is_connected = is_connected;
-               tpmif_notify_upperlayer(tp);
-       }
-}
-
-
-
-/* =================================================================
- * Initialization function.
- * =================================================================
- */
-
-
-static int __init tpmif_init(void)
-{
-       struct tpm_private *tp;
-
-       if (is_initial_xendomain())
-               return -EPERM;
-
-       tp = tpm_private_get();
-       if (!tp)
-               return -ENOMEM;
-
-       IPRINTK("Initialising the vTPM driver.\n");
-       if (gnttab_alloc_grant_references(TPMIF_TX_RING_SIZE,
-                                         &gref_head) < 0) {
-               tpm_private_put();
-               return -EFAULT;
-       }
-
-       init_tpm_xenbus();
-       return 0;
-}
-
-
-module_init(tpmif_init);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/char/tty_io.c b/linux-2.6-xen-sparse/drivers/char/tty_io.c
deleted file mode 100644 (file)
index 20b4f57..0000000
+++ /dev/null
@@ -1,3927 +0,0 @@
-/*
- *  linux/drivers/char/tty_io.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
- * or rs-channels. It also implements echoing, cooked mode etc.
- *
- * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
- *
- * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
- * tty_struct and tty_queue structures.  Previously there was an array
- * of 256 tty_struct's which was statically allocated, and the
- * tty_queue structures were allocated at boot time.  Both are now
- * dynamically allocated only when the tty is open.
- *
- * Also restructured routines so that there is more of a separation
- * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
- * the low-level tty routines (serial.c, pty.c, console.c).  This
- * makes for cleaner and more compact code.  -TYT, 9/17/92 
- *
- * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
- * which can be dynamically activated and de-activated by the line
- * discipline handling modules (like SLIP).
- *
- * NOTE: pay no attention to the line discipline code (yet); its
- * interface is still subject to change in this version...
- * -- TYT, 1/31/92
- *
- * Added functionality to the OPOST tty handling.  No delays, but all
- * other bits should be there.
- *     -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
- *
- * Rewrote canonical mode and added more termios flags.
- *     -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
- *
- * Reorganized FASYNC support so mouse code can share it.
- *     -- ctm@ardi.com, 9Sep95
- *
- * New TIOCLINUX variants added.
- *     -- mj@k332.feld.cvut.cz, 19-Nov-95
- * 
- * Restrict vt switching via ioctl()
- *      -- grif@cs.ucr.edu, 5-Dec-95
- *
- * Move console and virtual terminal code to more appropriate files,
- * implement CONFIG_VT and generalize console device interface.
- *     -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
- *
- * Rewrote init_dev and release_dev to eliminate races.
- *     -- Bill Hawes <whawes@star.net>, June 97
- *
- * Added devfs support.
- *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
- *
- * Added support for a Unix98-style ptmx device.
- *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
- *
- * Reduced memory usage for older ARM systems
- *      -- Russell King <rmk@arm.linux.org.uk>
- *
- * Move do_SAK() into process context.  Less stack use in devfs functions.
- * alloc_tty_struct() always uses kmalloc() -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
- */
-
-#include <linux/types.h>
-#include <linux/major.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/fcntl.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_driver.h>
-#include <linux/tty_flip.h>
-#include <linux/devpts_fs.h>
-#include <linux/file.h>
-#include <linux/console.h>
-#include <linux/timer.h>
-#include <linux/ctype.h>
-#include <linux/kd.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/poll.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/smp_lock.h>
-#include <linux/device.h>
-#include <linux/idr.h>
-#include <linux/wait.h>
-#include <linux/bitops.h>
-#include <linux/delay.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/selection.h>
-
-#include <linux/kmod.h>
-
-#undef TTY_DEBUG_HANGUP
-
-#define TTY_PARANOIA_CHECK 1
-#define CHECK_TTY_COUNT 1
-
-struct termios tty_std_termios = {     /* for the benefit of tty drivers  */
-       .c_iflag = ICRNL | IXON,
-       .c_oflag = OPOST | ONLCR,
-       .c_cflag = B38400 | CS8 | CREAD | HUPCL,
-       .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
-                  ECHOCTL | ECHOKE | IEXTEN,
-       .c_cc = INIT_C_CC
-};
-
-EXPORT_SYMBOL(tty_std_termios);
-
-/* This list gets poked at by procfs and various bits of boot up code. This
-   could do with some rationalisation such as pulling the tty proc function
-   into this file */
-   
-LIST_HEAD(tty_drivers);                        /* linked list of tty drivers */
-
-/* Semaphore to protect creating and releasing a tty. This is shared with
-   vt.c for deeply disgusting hack reasons */
-DEFINE_MUTEX(tty_mutex);
-
-int console_use_vt = 1;
-
-#ifdef CONFIG_UNIX98_PTYS
-extern struct tty_driver *ptm_driver;  /* Unix98 pty masters; for /dev/ptmx */
-extern int pty_limit;          /* Config limit on Unix98 ptys */
-static DEFINE_IDR(allocated_ptys);
-static DECLARE_MUTEX(allocated_ptys_lock);
-static int ptmx_open(struct inode *, struct file *);
-#endif
-
-extern void disable_early_printk(void);
-
-static void initialize_tty_struct(struct tty_struct *tty);
-
-static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
-static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *);
-ssize_t redirected_tty_write(struct file *, const char __user *, size_t, loff_t *);
-static unsigned int tty_poll(struct file *, poll_table *);
-static int tty_open(struct inode *, struct file *);
-static int tty_release(struct inode *, struct file *);
-int tty_ioctl(struct inode * inode, struct file * file,
-             unsigned int cmd, unsigned long arg);
-static int tty_fasync(int fd, struct file * filp, int on);
-static void release_mem(struct tty_struct *tty, int idx);
-
-/**
- *     alloc_tty_struct        -       allocate a tty object
- *
- *     Return a new empty tty structure. The data fields have not
- *     been initialized in any way but has been zeroed
- *
- *     Locking: none
- *     FIXME: use kzalloc
- */
-
-static struct tty_struct *alloc_tty_struct(void)
-{
-       struct tty_struct *tty;
-
-       tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
-       if (tty)
-               memset(tty, 0, sizeof(struct tty_struct));
-       return tty;
-}
-
-static void tty_buffer_free_all(struct tty_struct *);
-
-/**
- *     free_tty_struct         -       free a disused tty
- *     @tty: tty struct to free
- *
- *     Free the write buffers, tty queue and tty memory itself.
- *
- *     Locking: none. Must be called after tty is definitely unused
- */
-
-static inline void free_tty_struct(struct tty_struct *tty)
-{
-       kfree(tty->write_buf);
-       tty_buffer_free_all(tty);
-       kfree(tty);
-}
-
-#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
-
-/**
- *     tty_name        -       return tty naming
- *     @tty: tty structure
- *     @buf: buffer for output
- *
- *     Convert a tty structure into a name. The name reflects the kernel
- *     naming policy and if udev is in use may not reflect user space
- *
- *     Locking: none
- */
-
-char *tty_name(struct tty_struct *tty, char *buf)
-{
-       if (!tty) /* Hmm.  NULL pointer.  That's fun. */
-               strcpy(buf, "NULL tty");
-       else
-               strcpy(buf, tty->name);
-       return buf;
-}
-
-EXPORT_SYMBOL(tty_name);
-
-int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
-                             const char *routine)
-{
-#ifdef TTY_PARANOIA_CHECK
-       if (!tty) {
-               printk(KERN_WARNING
-                       "null TTY for (%d:%d) in %s\n",
-                       imajor(inode), iminor(inode), routine);
-               return 1;
-       }
-       if (tty->magic != TTY_MAGIC) {
-               printk(KERN_WARNING
-                       "bad magic number for tty struct (%d:%d) in %s\n",
-                       imajor(inode), iminor(inode), routine);
-               return 1;
-       }
-#endif
-       return 0;
-}
-
-static int check_tty_count(struct tty_struct *tty, const char *routine)
-{
-#ifdef CHECK_TTY_COUNT
-       struct list_head *p;
-       int count = 0;
-       
-       file_list_lock();
-       list_for_each(p, &tty->tty_files) {
-               count++;
-       }
-       file_list_unlock();
-       if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver->subtype == PTY_TYPE_SLAVE &&
-           tty->link && tty->link->count)
-               count++;
-       if (tty->count != count) {
-               printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
-                                   "!= #fd's(%d) in %s\n",
-                      tty->name, tty->count, count, routine);
-               return count;
-       }       
-#endif
-       return 0;
-}
-
-/*
- * Tty buffer allocation management
- */
-
-
-/**
- *     tty_buffer_free_all             -       free buffers used by a tty
- *     @tty: tty to free from
- *
- *     Remove all the buffers pending on a tty whether queued with data
- *     or in the free ring. Must be called when the tty is no longer in use
- *
- *     Locking: none
- */
-
-
-/**
- *     tty_buffer_free_all             -       free buffers used by a tty
- *     @tty: tty to free from
- *
- *     Remove all the buffers pending on a tty whether queued with data
- *     or in the free ring. Must be called when the tty is no longer in use
- *
- *     Locking: none
- */
-
-static void tty_buffer_free_all(struct tty_struct *tty)
-{
-       struct tty_buffer *thead;
-       while((thead = tty->buf.head) != NULL) {
-               tty->buf.head = thead->next;
-               kfree(thead);
-       }
-       while((thead = tty->buf.free) != NULL) {
-               tty->buf.free = thead->next;
-               kfree(thead);
-       }
-       tty->buf.tail = NULL;
-       tty->buf.memory_used = 0;
-}
-
-/**
- *     tty_buffer_init         -       prepare a tty buffer structure
- *     @tty: tty to initialise
- *
- *     Set up the initial state of the buffer management for a tty device.
- *     Must be called before the other tty buffer functions are used.
- *
- *     Locking: none
- */
-
-static void tty_buffer_init(struct tty_struct *tty)
-{
-       spin_lock_init(&tty->buf.lock);
-       tty->buf.head = NULL;
-       tty->buf.tail = NULL;
-       tty->buf.free = NULL;
-       tty->buf.memory_used = 0;
-}
-
-/**
- *     tty_buffer_alloc        -       allocate a tty buffer
- *     @tty: tty device
- *     @size: desired size (characters)
- *
- *     Allocate a new tty buffer to hold the desired number of characters.
- *     Return NULL if out of memory or the allocation would exceed the
- *     per device queue
- *
- *     Locking: Caller must hold tty->buf.lock
- */
-
-static struct tty_buffer *tty_buffer_alloc(struct tty_struct *tty, size_t size)
-{
-       struct tty_buffer *p;
-
-       if (tty->buf.memory_used + size > 65536)
-               return NULL;
-       p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
-       if(p == NULL)
-               return NULL;
-       p->used = 0;
-       p->size = size;
-       p->next = NULL;
-       p->commit = 0;
-       p->read = 0;
-       p->char_buf_ptr = (char *)(p->data);
-       p->flag_buf_ptr = (unsigned char *)p->char_buf_ptr + size;
-       tty->buf.memory_used += size;
-       return p;
-}
-
-/**
- *     tty_buffer_free         -       free a tty buffer
- *     @tty: tty owning the buffer
- *     @b: the buffer to free
- *
- *     Free a tty buffer, or add it to the free list according to our
- *     internal strategy
- *
- *     Locking: Caller must hold tty->buf.lock
- */
-
-static void tty_buffer_free(struct tty_struct *tty, struct tty_buffer *b)
-{
-       /* Dumb strategy for now - should keep some stats */
-       tty->buf.memory_used -= b->size;
-       WARN_ON(tty->buf.memory_used < 0);
-
-       if(b->size >= 512)
-               kfree(b);
-       else {
-               b->next = tty->buf.free;
-               tty->buf.free = b;
-       }
-}
-
-/**
- *     tty_buffer_find         -       find a free tty buffer
- *     @tty: tty owning the buffer
- *     @size: characters wanted
- *
- *     Locate an existing suitable tty buffer or if we are lacking one then
- *     allocate a new one. We round our buffers off in 256 character chunks
- *     to get better allocation behaviour.
- *
- *     Locking: Caller must hold tty->buf.lock
- */
-
-static struct tty_buffer *tty_buffer_find(struct tty_struct *tty, size_t size)
-{
-       struct tty_buffer **tbh = &tty->buf.free;
-       while((*tbh) != NULL) {
-               struct tty_buffer *t = *tbh;
-               if(t->size >= size) {
-                       *tbh = t->next;
-                       t->next = NULL;
-                       t->used = 0;
-                       t->commit = 0;
-                       t->read = 0;
-                       tty->buf.memory_used += t->size;
-                       return t;
-               }
-               tbh = &((*tbh)->next);
-       }
-       /* Round the buffer size out */
-       size = (size + 0xFF) & ~ 0xFF;
-       return tty_buffer_alloc(tty, size);
-       /* Should possibly check if this fails for the largest buffer we
-          have queued and recycle that ? */
-}
-
-/**
- *     tty_buffer_request_room         -       grow tty buffer if needed
- *     @tty: tty structure
- *     @size: size desired
- *
- *     Make at least size bytes of linear space available for the tty
- *     buffer. If we fail return the size we managed to find.
- *
- *     Locking: Takes tty->buf.lock
- */
-int tty_buffer_request_room(struct tty_struct *tty, size_t size)
-{
-       struct tty_buffer *b, *n;
-       int left;
-       unsigned long flags;
-
-       spin_lock_irqsave(&tty->buf.lock, flags);
-
-       /* OPTIMISATION: We could keep a per tty "zero" sized buffer to
-          remove this conditional if its worth it. This would be invisible
-          to the callers */
-       if ((b = tty->buf.tail) != NULL)
-               left = b->size - b->used;
-       else
-               left = 0;
-
-       if (left < size) {
-               /* This is the slow path - looking for new buffers to use */
-               if ((n = tty_buffer_find(tty, size)) != NULL) {
-                       if (b != NULL) {
-                               b->next = n;
-                               b->commit = b->used;
-                       } else
-                               tty->buf.head = n;
-                       tty->buf.tail = n;
-               } else
-                       size = left;
-       }
-
-       spin_unlock_irqrestore(&tty->buf.lock, flags);
-       return size;
-}
-EXPORT_SYMBOL_GPL(tty_buffer_request_room);
-
-/**
- *     tty_insert_flip_string  -       Add characters to the tty buffer
- *     @tty: tty structure
- *     @chars: characters
- *     @size: size
- *
- *     Queue a series of bytes to the tty buffering. All the characters
- *     passed are marked as without error. Returns the number added.
- *
- *     Locking: Called functions may take tty->buf.lock
- */
-
-int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
-                               size_t size)
-{
-       int copied = 0;
-       do {
-               int space = tty_buffer_request_room(tty, size - copied);
-               struct tty_buffer *tb = tty->buf.tail;
-               /* If there is no space then tb may be NULL */
-               if(unlikely(space == 0))
-                       break;
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
-               tb->used += space;
-               copied += space;
-               chars += space;
-       }
-       /* There is a small chance that we need to split the data over
-          several buffers. If this is the case we must loop */
-       while (unlikely(size > copied));
-       return copied;
-}
-EXPORT_SYMBOL(tty_insert_flip_string);
-
-/**
- *     tty_insert_flip_string_flags    -       Add characters to the tty buffer
- *     @tty: tty structure
- *     @chars: characters
- *     @flags: flag bytes
- *     @size: size
- *
- *     Queue a series of bytes to the tty buffering. For each character
- *     the flags array indicates the status of the character. Returns the
- *     number added.
- *
- *     Locking: Called functions may take tty->buf.lock
- */
-
-int tty_insert_flip_string_flags(struct tty_struct *tty,
-               const unsigned char *chars, const char *flags, size_t size)
-{
-       int copied = 0;
-       do {
-               int space = tty_buffer_request_room(tty, size - copied);
-               struct tty_buffer *tb = tty->buf.tail;
-               /* If there is no space then tb may be NULL */
-               if(unlikely(space == 0))
-                       break;
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memcpy(tb->flag_buf_ptr + tb->used, flags, space);
-               tb->used += space;
-               copied += space;
-               chars += space;
-               flags += space;
-       }
-       /* There is a small chance that we need to split the data over
-          several buffers. If this is the case we must loop */
-       while (unlikely(size > copied));
-       return copied;
-}
-EXPORT_SYMBOL(tty_insert_flip_string_flags);
-
-/**
- *     tty_schedule_flip       -       push characters to ldisc
- *     @tty: tty to push from
- *
- *     Takes any pending buffers and transfers their ownership to the
- *     ldisc side of the queue. It then schedules those characters for
- *     processing by the line discipline.
- *
- *     Locking: Takes tty->buf.lock
- */
-
-void tty_schedule_flip(struct tty_struct *tty)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&tty->buf.lock, flags);
-       if (tty->buf.tail != NULL)
-               tty->buf.tail->commit = tty->buf.tail->used;
-       spin_unlock_irqrestore(&tty->buf.lock, flags);
-       schedule_delayed_work(&tty->buf.work, 1);
-}
-EXPORT_SYMBOL(tty_schedule_flip);
-
-/**
- *     tty_prepare_flip_string         -       make room for characters
- *     @tty: tty
- *     @chars: return pointer for character write area
- *     @size: desired size
- *
- *     Prepare a block of space in the buffer for data. Returns the length
- *     available and buffer pointer to the space which is now allocated and
- *     accounted for as ready for normal characters. This is used for drivers
- *     that need their own block copy routines into the buffer. There is no
- *     guarantee the buffer is a DMA target!
- *
- *     Locking: May call functions taking tty->buf.lock
- */
-
-int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size)
-{
-       int space = tty_buffer_request_room(tty, size);
-       if (likely(space)) {
-               struct tty_buffer *tb = tty->buf.tail;
-               *chars = tb->char_buf_ptr + tb->used;
-               memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
-               tb->used += space;
-       }
-       return space;
-}
-
-EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
-
-/**
- *     tty_prepare_flip_string_flags   -       make room for characters
- *     @tty: tty
- *     @chars: return pointer for character write area
- *     @flags: return pointer for status flag write area
- *     @size: desired size
- *
- *     Prepare a block of space in the buffer for data. Returns the length
- *     available and buffer pointer to the space which is now allocated and
- *     accounted for as ready for characters. This is used for drivers
- *     that need their own block copy routines into the buffer. There is no
- *     guarantee the buffer is a DMA target!
- *
- *     Locking: May call functions taking tty->buf.lock
- */
-
-int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size)
-{
-       int space = tty_buffer_request_room(tty, size);
-       if (likely(space)) {
-               struct tty_buffer *tb = tty->buf.tail;
-               *chars = tb->char_buf_ptr + tb->used;
-               *flags = tb->flag_buf_ptr + tb->used;
-               tb->used += space;
-       }
-       return space;
-}
-
-EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
-
-
-
-/**
- *     tty_set_termios_ldisc           -       set ldisc field
- *     @tty: tty structure
- *     @num: line discipline number
- *
- *     This is probably overkill for real world processors but
- *     they are not on hot paths so a little discipline won't do 
- *     any harm.
- *
- *     Locking: takes termios_sem
- */
-static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
-{
-       down(&tty->termios_sem);
-       tty->termios->c_line = num;
-       up(&tty->termios_sem);
-}
-
-/*
- *     This guards the refcounted line discipline lists. The lock
- *     must be taken with irqs off because there are hangup path
- *     callers who will do ldisc lookups and cannot sleep.
- */
-static DEFINE_SPINLOCK(tty_ldisc_lock);
-static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
-static struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
-
-/**
- *     tty_register_ldisc      -       install a line discipline
- *     @disc: ldisc number
- *     @new_ldisc: pointer to the ldisc object
- *
- *     Installs a new line discipline into the kernel. The discipline
- *     is set up as unreferenced and then made available to the kernel
- *     from this point onwards.
- *
- *     Locking:
- *             takes tty_ldisc_lock to guard against ldisc races
- */
-
-int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
-{
-       unsigned long flags;
-       int ret = 0;
-       
-       if (disc < N_TTY || disc >= NR_LDISCS)
-               return -EINVAL;
-       
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       tty_ldiscs[disc] = *new_ldisc;
-       tty_ldiscs[disc].num = disc;
-       tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
-       tty_ldiscs[disc].refcount = 0;
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-       
-       return ret;
-}
-EXPORT_SYMBOL(tty_register_ldisc);
-
-/**
- *     tty_unregister_ldisc    -       unload a line discipline
- *     @disc: ldisc number
- *     @new_ldisc: pointer to the ldisc object
- *
- *     Remove a line discipline from the kernel providing it is not
- *     currently in use.
- *
- *     Locking:
- *             takes tty_ldisc_lock to guard against ldisc races
- */
-
-int tty_unregister_ldisc(int disc)
-{
-       unsigned long flags;
-       int ret = 0;
-
-       if (disc < N_TTY || disc >= NR_LDISCS)
-               return -EINVAL;
-
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       if (tty_ldiscs[disc].refcount)
-               ret = -EBUSY;
-       else
-               tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-
-       return ret;
-}
-EXPORT_SYMBOL(tty_unregister_ldisc);
-
-/**
- *     tty_ldisc_get           -       take a reference to an ldisc
- *     @disc: ldisc number
- *
- *     Takes a reference to a line discipline. Deals with refcounts and
- *     module locking counts. Returns NULL if the discipline is not available.
- *     Returns a pointer to the discipline and bumps the ref count if it is
- *     available
- *
- *     Locking:
- *             takes tty_ldisc_lock to guard against ldisc races
- */
-
-struct tty_ldisc *tty_ldisc_get(int disc)
-{
-       unsigned long flags;
-       struct tty_ldisc *ld;
-
-       if (disc < N_TTY || disc >= NR_LDISCS)
-               return NULL;
-       
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-
-       ld = &tty_ldiscs[disc];
-       /* Check the entry is defined */
-       if(ld->flags & LDISC_FLAG_DEFINED)
-       {
-               /* If the module is being unloaded we can't use it */
-               if (!try_module_get(ld->owner))
-                       ld = NULL;
-               else /* lock it */
-                       ld->refcount++;
-       }
-       else
-               ld = NULL;
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-       return ld;
-}
-
-EXPORT_SYMBOL_GPL(tty_ldisc_get);
-
-/**
- *     tty_ldisc_put           -       drop ldisc reference
- *     @disc: ldisc number
- *
- *     Drop a reference to a line discipline. Manage refcounts and
- *     module usage counts
- *
- *     Locking:
- *             takes tty_ldisc_lock to guard against ldisc races
- */
-
-void tty_ldisc_put(int disc)
-{
-       struct tty_ldisc *ld;
-       unsigned long flags;
-       
-       BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
-               
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       ld = &tty_ldiscs[disc];
-       BUG_ON(ld->refcount == 0);
-       ld->refcount--;
-       module_put(ld->owner);
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-}
-       
-EXPORT_SYMBOL_GPL(tty_ldisc_put);
-
-/**
- *     tty_ldisc_assign        -       set ldisc on a tty
- *     @tty: tty to assign
- *     @ld: line discipline
- *
- *     Install an instance of a line discipline into a tty structure. The
- *     ldisc must have a reference count above zero to ensure it remains/
- *     The tty instance refcount starts at zero.
- *
- *     Locking:
- *             Caller must hold references
- */
-
-static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
-{
-       tty->ldisc = *ld;
-       tty->ldisc.refcount = 0;
-}
-
-/**
- *     tty_ldisc_try           -       internal helper
- *     @tty: the tty
- *
- *     Make a single attempt to grab and bump the refcount on
- *     the tty ldisc. Return 0 on failure or 1 on success. This is
- *     used to implement both the waiting and non waiting versions
- *     of tty_ldisc_ref
- *
- *     Locking: takes tty_ldisc_lock
- */
-
-static int tty_ldisc_try(struct tty_struct *tty)
-{
-       unsigned long flags;
-       struct tty_ldisc *ld;
-       int ret = 0;
-       
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       ld = &tty->ldisc;
-       if(test_bit(TTY_LDISC, &tty->flags))
-       {
-               ld->refcount++;
-               ret = 1;
-       }
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-       return ret;
-}
-
-/**
- *     tty_ldisc_ref_wait      -       wait for the tty ldisc
- *     @tty: tty device
- *
- *     Dereference the line discipline for the terminal and take a 
- *     reference to it. If the line discipline is in flux then 
- *     wait patiently until it changes.
- *
- *     Note: Must not be called from an IRQ/timer context. The caller
- *     must also be careful not to hold other locks that will deadlock
- *     against a discipline change, such as an existing ldisc reference
- *     (which we check for)
- *
- *     Locking: call functions take tty_ldisc_lock
- */
-struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
-{
-       /* wait_event is a macro */
-       wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
-       if(tty->ldisc.refcount == 0)
-               printk(KERN_ERR "tty_ldisc_ref_wait\n");
-       return &tty->ldisc;
-}
-
-EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
-
-/**
- *     tty_ldisc_ref           -       get the tty ldisc
- *     @tty: tty device
- *
- *     Dereference the line discipline for the terminal and take a 
- *     reference to it. If the line discipline is in flux then 
- *     return NULL. Can be called from IRQ and timer functions.
- *
- *     Locking: called functions take tty_ldisc_lock
- */
-struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
-{
-       if(tty_ldisc_try(tty))
-               return &tty->ldisc;
-       return NULL;
-}
-
-EXPORT_SYMBOL_GPL(tty_ldisc_ref);
-
-/**
- *     tty_ldisc_deref         -       free a tty ldisc reference
- *     @ld: reference to free up
- *
- *     Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
- *     be called in IRQ context.
- *
- *     Locking: takes tty_ldisc_lock
- */
-void tty_ldisc_deref(struct tty_ldisc *ld)
-{
-       unsigned long flags;
-
-       BUG_ON(ld == NULL);
-               
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       if(ld->refcount == 0)
-               printk(KERN_ERR "tty_ldisc_deref: no references.\n");
-       else
-               ld->refcount--;
-       if(ld->refcount == 0)
-               wake_up(&tty_ldisc_wait);
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-}
-
-EXPORT_SYMBOL_GPL(tty_ldisc_deref);
-
-/**
- *     tty_ldisc_enable        -       allow ldisc use
- *     @tty: terminal to activate ldisc on
- *
- *     Set the TTY_LDISC flag when the line discipline can be called
- *     again. Do neccessary wakeups for existing sleepers.
- *
- *     Note: nobody should set this bit except via this function. Clearing
- *     directly is allowed.
- */
-
-static void tty_ldisc_enable(struct tty_struct *tty)
-{
-       set_bit(TTY_LDISC, &tty->flags);
-       wake_up(&tty_ldisc_wait);
-}
-       
-/**
- *     tty_set_ldisc           -       set line discipline
- *     @tty: the terminal to set
- *     @ldisc: the line discipline
- *
- *     Set the discipline of a tty line. Must be called from a process
- *     context.
- *
- *     Locking: takes tty_ldisc_lock.
- *             called functions take termios_sem
- */
-static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
-{
-       int retval = 0;
-       struct tty_ldisc o_ldisc;
-       char buf[64];
-       int work;
-       unsigned long flags;
-       struct tty_ldisc *ld;
-       struct tty_struct *o_tty;
-
-       if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
-               return -EINVAL;
-
-restart:
-
-       ld = tty_ldisc_get(ldisc);
-       /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
-       /* Cyrus Durgin <cider@speakeasy.org> */
-       if (ld == NULL) {
-               request_module("tty-ldisc-%d", ldisc);
-               ld = tty_ldisc_get(ldisc);
-       }
-       if (ld == NULL)
-               return -EINVAL;
-
-       /*
-        *      No more input please, we are switching. The new ldisc
-        *      will update this value in the ldisc open function
-        */
-
-       tty->receive_room = 0;
-
-       /*
-        *      Problem: What do we do if this blocks ?
-        */
-
-       tty_wait_until_sent(tty, 0);
-
-       if (tty->ldisc.num == ldisc) {
-               tty_ldisc_put(ldisc);
-               return 0;
-       }
-
-       o_ldisc = tty->ldisc;
-       o_tty = tty->link;
-
-       /*
-        *      Make sure we don't change while someone holds a
-        *      reference to the line discipline. The TTY_LDISC bit
-        *      prevents anyone taking a reference once it is clear.
-        *      We need the lock to avoid racing reference takers.
-        */
-
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       if (tty->ldisc.refcount || (o_tty && o_tty->ldisc.refcount)) {
-               if(tty->ldisc.refcount) {
-                       /* Free the new ldisc we grabbed. Must drop the lock
-                          first. */
-                       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-                       tty_ldisc_put(ldisc);
-                       /*
-                        * There are several reasons we may be busy, including
-                        * random momentary I/O traffic. We must therefore
-                        * retry. We could distinguish between blocking ops
-                        * and retries if we made tty_ldisc_wait() smarter. That
-                        * is up for discussion.
-                        */
-                       if (wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
-                               return -ERESTARTSYS;
-                       goto restart;
-               }
-               if(o_tty && o_tty->ldisc.refcount) {
-                       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-                       tty_ldisc_put(ldisc);
-                       if (wait_event_interruptible(tty_ldisc_wait, o_tty->ldisc.refcount == 0) < 0)
-                               return -ERESTARTSYS;
-                       goto restart;
-               }
-       }
-
-       /* if the TTY_LDISC bit is set, then we are racing against another ldisc change */
-
-       if (!test_bit(TTY_LDISC, &tty->flags)) {
-               spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-               tty_ldisc_put(ldisc);
-               ld = tty_ldisc_ref_wait(tty);
-               tty_ldisc_deref(ld);
-               goto restart;
-       }
-
-       clear_bit(TTY_LDISC, &tty->flags);
-       if (o_tty)
-               clear_bit(TTY_LDISC, &o_tty->flags);
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-
-       /*
-        *      From this point on we know nobody has an ldisc
-        *      usage reference, nor can they obtain one until
-        *      we say so later on.
-        */
-
-       work = cancel_delayed_work(&tty->buf.work);
-       /*
-        * Wait for ->hangup_work and ->buf.work handlers to terminate
-        */
-        
-       flush_scheduled_work();
-       /* Shutdown the current discipline. */
-       if (tty->ldisc.close)
-               (tty->ldisc.close)(tty);
-
-       /* Now set up the new line discipline. */
-       tty_ldisc_assign(tty, ld);
-       tty_set_termios_ldisc(tty, ldisc);
-       if (tty->ldisc.open)
-               retval = (tty->ldisc.open)(tty);
-       if (retval < 0) {
-               tty_ldisc_put(ldisc);
-               /* There is an outstanding reference here so this is safe */
-               tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
-               tty_set_termios_ldisc(tty, tty->ldisc.num);
-               if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
-                       tty_ldisc_put(o_ldisc.num);
-                       /* This driver is always present */
-                       tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-                       tty_set_termios_ldisc(tty, N_TTY);
-                       if (tty->ldisc.open) {
-                               int r = tty->ldisc.open(tty);
-
-                               if (r < 0)
-                                       panic("Couldn't open N_TTY ldisc for "
-                                             "%s --- error %d.",
-                                             tty_name(tty, buf), r);
-                       }
-               }
-       }
-       /* At this point we hold a reference to the new ldisc and a
-          a reference to the old ldisc. If we ended up flipping back
-          to the existing ldisc we have two references to it */
-       
-       if (tty->ldisc.num != o_ldisc.num && tty->driver->set_ldisc)
-               tty->driver->set_ldisc(tty);
-               
-       tty_ldisc_put(o_ldisc.num);
-       
-       /*
-        *      Allow ldisc referencing to occur as soon as the driver
-        *      ldisc callback completes.
-        */
-        
-       tty_ldisc_enable(tty);
-       if (o_tty)
-               tty_ldisc_enable(o_tty);
-       
-       /* Restart it in case no characters kick it off. Safe if
-          already running */
-       if (work)
-               schedule_delayed_work(&tty->buf.work, 1);
-       return retval;
-}
-
-/**
- *     get_tty_driver          -       find device of a tty
- *     @dev_t: device identifier
- *     @index: returns the index of the tty
- *
- *     This routine returns a tty driver structure, given a device number
- *     and also passes back the index number.
- *
- *     Locking: caller must hold tty_mutex
- */
-
-static struct tty_driver *get_tty_driver(dev_t device, int *index)
-{
-       struct tty_driver *p;
-
-       list_for_each_entry(p, &tty_drivers, tty_drivers) {
-               dev_t base = MKDEV(p->major, p->minor_start);
-               if (device < base || device >= base + p->num)
-                       continue;
-               *index = device - base;
-               return p;
-       }
-       return NULL;
-}
-
-/**
- *     tty_check_change        -       check for POSIX terminal changes
- *     @tty: tty to check
- *
- *     If we try to write to, or set the state of, a terminal and we're
- *     not in the foreground, send a SIGTTOU.  If the signal is blocked or
- *     ignored, go ahead and perform the operation.  (POSIX 7.2)
- *
- *     Locking: none
- */
-
-int tty_check_change(struct tty_struct * tty)
-{
-       if (current->signal->tty != tty)
-               return 0;
-       if (tty->pgrp <= 0) {
-               printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
-               return 0;
-       }
-       if (process_group(current) == tty->pgrp)
-               return 0;
-       if (is_ignored(SIGTTOU))
-               return 0;
-       if (is_orphaned_pgrp(process_group(current)))
-               return -EIO;
-       (void) kill_pg(process_group(current), SIGTTOU, 1);
-       return -ERESTARTSYS;
-}
-
-EXPORT_SYMBOL(tty_check_change);
-
-static ssize_t hung_up_tty_read(struct file * file, char __user * buf,
-                               size_t count, loff_t *ppos)
-{
-       return 0;
-}
-
-static ssize_t hung_up_tty_write(struct file * file, const char __user * buf,
-                                size_t count, loff_t *ppos)
-{
-       return -EIO;
-}
-
-/* No kernel lock held - none needed ;) */
-static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
-{
-       return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
-}
-
-static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
-                            unsigned int cmd, unsigned long arg)
-{
-       return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
-}
-
-static const struct file_operations tty_fops = {
-       .llseek         = no_llseek,
-       .read           = tty_read,
-       .write          = tty_write,
-       .poll           = tty_poll,
-       .ioctl          = tty_ioctl,
-       .open           = tty_open,
-       .release        = tty_release,
-       .fasync         = tty_fasync,
-};
-
-#ifdef CONFIG_UNIX98_PTYS
-static const struct file_operations ptmx_fops = {
-       .llseek         = no_llseek,
-       .read           = tty_read,
-       .write          = tty_write,
-       .poll           = tty_poll,
-       .ioctl          = tty_ioctl,
-       .open           = ptmx_open,
-       .release        = tty_release,
-       .fasync         = tty_fasync,
-};
-#endif
-
-static const struct file_operations console_fops = {
-       .llseek         = no_llseek,
-       .read           = tty_read,
-       .write          = redirected_tty_write,
-       .poll           = tty_poll,
-       .ioctl          = tty_ioctl,
-       .open           = tty_open,
-       .release        = tty_release,
-       .fasync         = tty_fasync,
-};
-
-static const struct file_operations hung_up_tty_fops = {
-       .llseek         = no_llseek,
-       .read           = hung_up_tty_read,
-       .write          = hung_up_tty_write,
-       .poll           = hung_up_tty_poll,
-       .ioctl          = hung_up_tty_ioctl,
-       .release        = tty_release,
-};
-
-static DEFINE_SPINLOCK(redirect_lock);
-static struct file *redirect;
-
-/**
- *     tty_wakeup      -       request more data
- *     @tty: terminal
- *
- *     Internal and external helper for wakeups of tty. This function
- *     informs the line discipline if present that the driver is ready
- *     to receive more output data.
- */
-void tty_wakeup(struct tty_struct *tty)
-{
-       struct tty_ldisc *ld;
-       
-       if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
-               ld = tty_ldisc_ref(tty);
-               if(ld) {
-                       if(ld->write_wakeup)
-                               ld->write_wakeup(tty);
-                       tty_ldisc_deref(ld);
-               }
-       }
-       wake_up_interruptible(&tty->write_wait);
-}
-
-EXPORT_SYMBOL_GPL(tty_wakeup);
-
-/**
- *     tty_ldisc_flush -       flush line discipline queue
- *     @tty: tty
- *
- *     Flush the line discipline queue (if any) for this tty. If there
- *     is no line discipline active this is a no-op.
- */
-void tty_ldisc_flush(struct tty_struct *tty)
-{
-       struct tty_ldisc *ld = tty_ldisc_ref(tty);
-       if(ld) {
-               if(ld->flush_buffer)
-                       ld->flush_buffer(tty);
-               tty_ldisc_deref(ld);
-       }
-}
-
-EXPORT_SYMBOL_GPL(tty_ldisc_flush);
-       
-/**
- *     do_tty_hangup           -       actual handler for hangup events
- *     @data: tty device
- *
- *     This can be called by the "eventd" kernel thread.  That is process
- *     synchronous but doesn't hold any locks, so we need to make sure we
- *     have the appropriate locks for what we're doing.
- *
- *     The hangup event clears any pending redirections onto the hung up
- *     device. It ensures future writes will error and it does the needed
- *     line discipline hangup and signal delivery. The tty object itself
- *     remains intact.
- *
- *     Locking:
- *             BKL
- *             redirect lock for undoing redirection
- *             file list lock for manipulating list of ttys
- *             tty_ldisc_lock from called functions
- *             termios_sem resetting termios data
- *             tasklist_lock to walk task list for hangup event
- *
- */
-static void do_tty_hangup(void *data)
-{
-       struct tty_struct *tty = (struct tty_struct *) data;
-       struct file * cons_filp = NULL;
-       struct file *filp, *f = NULL;
-       struct task_struct *p;
-       struct tty_ldisc *ld;
-       int    closecount = 0, n;
-
-       if (!tty)
-               return;
-
-       /* inuse_filps is protected by the single kernel lock */
-       lock_kernel();
-
-       spin_lock(&redirect_lock);
-       if (redirect && redirect->private_data == tty) {
-               f = redirect;
-               redirect = NULL;
-       }
-       spin_unlock(&redirect_lock);
-       
-       check_tty_count(tty, "do_tty_hangup");
-       file_list_lock();
-       /* This breaks for file handles being sent over AF_UNIX sockets ? */
-       list_for_each_entry(filp, &tty->tty_files, f_u.fu_list) {
-               if (filp->f_op->write == redirected_tty_write)
-                       cons_filp = filp;
-               if (filp->f_op->write != tty_write)
-                       continue;
-               closecount++;
-               tty_fasync(-1, filp, 0);        /* can't block */
-               filp->f_op = &hung_up_tty_fops;
-       }
-       file_list_unlock();
-       
-       /* FIXME! What are the locking issues here? This may me overdoing things..
-        * this question is especially important now that we've removed the irqlock. */
-
-       ld = tty_ldisc_ref(tty);
-       if(ld != NULL)  /* We may have no line discipline at this point */
-       {
-               if (ld->flush_buffer)
-                       ld->flush_buffer(tty);
-               if (tty->driver->flush_buffer)
-                       tty->driver->flush_buffer(tty);
-               if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
-                   ld->write_wakeup)
-                       ld->write_wakeup(tty);
-               if (ld->hangup)
-                       ld->hangup(tty);
-       }
-
-       /* FIXME: Once we trust the LDISC code better we can wait here for
-          ldisc completion and fix the driver call race */
-          
-       wake_up_interruptible(&tty->write_wait);
-       wake_up_interruptible(&tty->read_wait);
-
-       /*
-        * Shutdown the current line discipline, and reset it to
-        * N_TTY.
-        */
-       if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
-       {
-               down(&tty->termios_sem);
-               *tty->termios = tty->driver->init_termios;
-               up(&tty->termios_sem);
-       }
-       
-       /* Defer ldisc switch */
-       /* tty_deferred_ldisc_switch(N_TTY);
-       
-         This should get done automatically when the port closes and
-         tty_release is called */
-       
-       read_lock(&tasklist_lock);
-       if (tty->session > 0) {
-               do_each_task_pid(tty->session, PIDTYPE_SID, p) {
-                       if (p->signal->tty == tty)
-                               p->signal->tty = NULL;
-                       if (!p->signal->leader)
-                               continue;
-                       group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p);
-                       group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p);
-                       if (tty->pgrp > 0)
-                               p->signal->tty_old_pgrp = tty->pgrp;
-               } while_each_task_pid(tty->session, PIDTYPE_SID, p);
-       }
-       read_unlock(&tasklist_lock);
-
-       tty->flags = 0;
-       tty->session = 0;
-       tty->pgrp = -1;
-       tty->ctrl_status = 0;
-       /*
-        *      If one of the devices matches a console pointer, we
-        *      cannot just call hangup() because that will cause
-        *      tty->count and state->count to go out of sync.
-        *      So we just call close() the right number of times.
-        */
-       if (cons_filp) {
-               if (tty->driver->close)
-                       for (n = 0; n < closecount; n++)
-                               tty->driver->close(tty, cons_filp);
-       } else if (tty->driver->hangup)
-               (tty->driver->hangup)(tty);
-               
-       /* We don't want to have driver/ldisc interactions beyond
-          the ones we did here. The driver layer expects no
-          calls after ->hangup() from the ldisc side. However we
-          can't yet guarantee all that */
-
-       set_bit(TTY_HUPPED, &tty->flags);
-       if (ld) {
-               tty_ldisc_enable(tty);
-               tty_ldisc_deref(ld);
-       }
-       unlock_kernel();
-       if (f)
-               fput(f);
-}
-
-/**
- *     tty_hangup              -       trigger a hangup event
- *     @tty: tty to hangup
- *
- *     A carrier loss (virtual or otherwise) has occurred on this like
- *     schedule a hangup sequence to run after this event.
- */
-
-void tty_hangup(struct tty_struct * tty)
-{
-#ifdef TTY_DEBUG_HANGUP
-       char    buf[64];
-       
-       printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
-#endif
-       schedule_work(&tty->hangup_work);
-}
-
-EXPORT_SYMBOL(tty_hangup);
-
-/**
- *     tty_vhangup             -       process vhangup
- *     @tty: tty to hangup
- *
- *     The user has asked via system call for the terminal to be hung up.
- *     We do this synchronously so that when the syscall returns the process
- *     is complete. That guarantee is neccessary for security reasons.
- */
-
-void tty_vhangup(struct tty_struct * tty)
-{
-#ifdef TTY_DEBUG_HANGUP
-       char    buf[64];
-
-       printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
-#endif
-       do_tty_hangup((void *) tty);
-}
-EXPORT_SYMBOL(tty_vhangup);
-
-/**
- *     tty_hung_up_p           -       was tty hung up
- *     @filp: file pointer of tty
- *
- *     Return true if the tty has been subject to a vhangup or a carrier
- *     loss
- */
-
-int tty_hung_up_p(struct file * filp)
-{
-       return (filp->f_op == &hung_up_tty_fops);
-}
-
-EXPORT_SYMBOL(tty_hung_up_p);
-
-/**
- *     disassociate_ctty       -       disconnect controlling tty
- *     @on_exit: true if exiting so need to "hang up" the session
- *
- *     This function is typically called only by the session leader, when
- *     it wants to disassociate itself from its controlling tty.
- *
- *     It performs the following functions:
- *     (1)  Sends a SIGHUP and SIGCONT to the foreground process group
- *     (2)  Clears the tty from being controlling the session
- *     (3)  Clears the controlling tty for all processes in the
- *             session group.
- *
- *     The argument on_exit is set to 1 if called when a process is
- *     exiting; it is 0 if called by the ioctl TIOCNOTTY.
- *
- *     Locking: tty_mutex is taken to protect current->signal->tty
- *             BKL is taken for hysterical raisins
- *             Tasklist lock is taken (under tty_mutex) to walk process
- *             lists for the session.
- */
-
-void disassociate_ctty(int on_exit)
-{
-       struct tty_struct *tty;
-       struct task_struct *p;
-       int tty_pgrp = -1;
-
-       lock_kernel();
-
-       mutex_lock(&tty_mutex);
-       tty = current->signal->tty;
-       if (tty) {
-               tty_pgrp = tty->pgrp;
-               mutex_unlock(&tty_mutex);
-               if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
-                       tty_vhangup(tty);
-       } else {
-               if (current->signal->tty_old_pgrp) {
-                       kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit);
-                       kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit);
-               }
-               mutex_unlock(&tty_mutex);
-               unlock_kernel();        
-               return;
-       }
-       if (tty_pgrp > 0) {
-               kill_pg(tty_pgrp, SIGHUP, on_exit);
-               if (!on_exit)
-                       kill_pg(tty_pgrp, SIGCONT, on_exit);
-       }
-
-       /* Must lock changes to tty_old_pgrp */
-       mutex_lock(&tty_mutex);
-       current->signal->tty_old_pgrp = 0;
-       tty->session = 0;
-       tty->pgrp = -1;
-
-       /* Now clear signal->tty under the lock */
-       read_lock(&tasklist_lock);
-       do_each_task_pid(current->signal->session, PIDTYPE_SID, p) {
-               p->signal->tty = NULL;
-       } while_each_task_pid(current->signal->session, PIDTYPE_SID, p);
-       read_unlock(&tasklist_lock);
-       mutex_unlock(&tty_mutex);
-       unlock_kernel();
-}
-
-
-/**
- *     stop_tty        -       propogate flow control
- *     @tty: tty to stop
- *
- *     Perform flow control to the driver. For PTY/TTY pairs we
- *     must also propogate the TIOCKPKT status. May be called
- *     on an already stopped device and will not re-call the driver
- *     method.
- *
- *     This functionality is used by both the line disciplines for
- *     halting incoming flow and by the driver. It may therefore be
- *     called from any context, may be under the tty atomic_write_lock
- *     but not always.
- *
- *     Locking:
- *             Broken. Relies on BKL which is unsafe here.
- */
-
-void stop_tty(struct tty_struct *tty)
-{
-       if (tty->stopped)
-               return;
-       tty->stopped = 1;
-       if (tty->link && tty->link->packet) {
-               tty->ctrl_status &= ~TIOCPKT_START;
-               tty->ctrl_status |= TIOCPKT_STOP;
-               wake_up_interruptible(&tty->link->read_wait);
-       }
-       if (tty->driver->stop)
-               (tty->driver->stop)(tty);
-}
-
-EXPORT_SYMBOL(stop_tty);
-
-/**
- *     start_tty       -       propogate flow control
- *     @tty: tty to start
- *
- *     Start a tty that has been stopped if at all possible. Perform
- *     any neccessary wakeups and propogate the TIOCPKT status. If this
- *     is the tty was previous stopped and is being started then the
- *     driver start method is invoked and the line discipline woken.
- *
- *     Locking:
- *             Broken. Relies on BKL which is unsafe here.
- */
-
-void start_tty(struct tty_struct *tty)
-{
-       if (!tty->stopped || tty->flow_stopped)
-               return;
-       tty->stopped = 0;
-       if (tty->link && tty->link->packet) {
-               tty->ctrl_status &= ~TIOCPKT_STOP;
-               tty->ctrl_status |= TIOCPKT_START;
-               wake_up_interruptible(&tty->link->read_wait);
-       }
-       if (tty->driver->start)
-               (tty->driver->start)(tty);
-
-       /* If we have a running line discipline it may need kicking */
-       tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
-}
-
-EXPORT_SYMBOL(start_tty);
-
-/**
- *     tty_read        -       read method for tty device files
- *     @file: pointer to tty file
- *     @buf: user buffer
- *     @count: size of user buffer
- *     @ppos: unused
- *
- *     Perform the read system call function on this terminal device. Checks
- *     for hung up devices before calling the line discipline method.
- *
- *     Locking:
- *             Locks the line discipline internally while needed
- *             For historical reasons the line discipline read method is
- *     invoked under the BKL. This will go away in time so do not rely on it
- *     in new code. Multiple read calls may be outstanding in parallel.
- */
-
-static ssize_t tty_read(struct file * file, char __user * buf, size_t count, 
-                       loff_t *ppos)
-{
-       int i;
-       struct tty_struct * tty;
-       struct inode *inode;
-       struct tty_ldisc *ld;
-
-       tty = (struct tty_struct *)file->private_data;
-       inode = file->f_dentry->d_inode;
-       if (tty_paranoia_check(tty, inode, "tty_read"))
-               return -EIO;
-       if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
-               return -EIO;
-
-       /* We want to wait for the line discipline to sort out in this
-          situation */
-       ld = tty_ldisc_ref_wait(tty);
-       lock_kernel();
-       if (ld->read)
-               i = (ld->read)(tty,file,buf,count);
-       else
-               i = -EIO;
-       tty_ldisc_deref(ld);
-       unlock_kernel();
-       if (i > 0)
-               inode->i_atime = current_fs_time(inode->i_sb);
-       return i;
-}
-
-/*
- * Split writes up in sane blocksizes to avoid
- * denial-of-service type attacks
- */
-static inline ssize_t do_tty_write(
-       ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
-       struct tty_struct *tty,
-       struct file *file,
-       const char __user *buf,
-       size_t count)
-{
-       ssize_t ret = 0, written = 0;
-       unsigned int chunk;
-       
-       /* FIXME: O_NDELAY ... */
-       if (mutex_lock_interruptible(&tty->atomic_write_lock)) {
-               return -ERESTARTSYS;
-       }
-
-       /*
-        * We chunk up writes into a temporary buffer. This
-        * simplifies low-level drivers immensely, since they
-        * don't have locking issues and user mode accesses.
-        *
-        * But if TTY_NO_WRITE_SPLIT is set, we should use a
-        * big chunk-size..
-        *
-        * The default chunk-size is 2kB, because the NTTY
-        * layer has problems with bigger chunks. It will
-        * claim to be able to handle more characters than
-        * it actually does.
-        *
-        * FIXME: This can probably go away now except that 64K chunks
-        * are too likely to fail unless switched to vmalloc...
-        */
-       chunk = 2048;
-       if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
-               chunk = 65536;
-       if (count < chunk)
-               chunk = count;
-
-       /* write_buf/write_cnt is protected by the atomic_write_lock mutex */
-       if (tty->write_cnt < chunk) {
-               unsigned char *buf;
-
-               if (chunk < 1024)
-                       chunk = 1024;
-
-               buf = kmalloc(chunk, GFP_KERNEL);
-               if (!buf) {
-                       mutex_unlock(&tty->atomic_write_lock);
-                       return -ENOMEM;
-               }
-               kfree(tty->write_buf);
-               tty->write_cnt = chunk;
-               tty->write_buf = buf;
-       }
-
-       /* Do the write .. */
-       for (;;) {
-               size_t size = count;
-               if (size > chunk)
-                       size = chunk;
-               ret = -EFAULT;
-               if (copy_from_user(tty->write_buf, buf, size))
-                       break;
-               lock_kernel();
-               ret = write(tty, file, tty->write_buf, size);
-               unlock_kernel();
-               if (ret <= 0)
-                       break;
-               written += ret;
-               buf += ret;
-               count -= ret;
-               if (!count)
-                       break;
-               ret = -ERESTARTSYS;
-               if (signal_pending(current))
-                       break;
-               cond_resched();
-       }
-       if (written) {
-               struct inode *inode = file->f_dentry->d_inode;
-               inode->i_mtime = current_fs_time(inode->i_sb);
-               ret = written;
-       }
-       mutex_unlock(&tty->atomic_write_lock);
-       return ret;
-}
-
-
-/**
- *     tty_write               -       write method for tty device file
- *     @file: tty file pointer
- *     @buf: user data to write
- *     @count: bytes to write
- *     @ppos: unused
- *
- *     Write data to a tty device via the line discipline.
- *
- *     Locking:
- *             Locks the line discipline as required
- *             Writes to the tty driver are serialized by the atomic_write_lock
- *     and are then processed in chunks to the device. The line discipline
- *     write method will not be involked in parallel for each device
- *             The line discipline write method is called under the big
- *     kernel lock for historical reasons. New code should not rely on this.
- */
-
-static ssize_t tty_write(struct file * file, const char __user * buf, size_t count,
-                        loff_t *ppos)
-{
-       struct tty_struct * tty;
-       struct inode *inode = file->f_dentry->d_inode;
-       ssize_t ret;
-       struct tty_ldisc *ld;
-       
-       tty = (struct tty_struct *)file->private_data;
-       if (tty_paranoia_check(tty, inode, "tty_write"))
-               return -EIO;
-       if (!tty || !tty->driver->write || (test_bit(TTY_IO_ERROR, &tty->flags)))
-               return -EIO;
-
-       ld = tty_ldisc_ref_wait(tty);           
-       if (!ld->write)
-               ret = -EIO;
-       else
-               ret = do_tty_write(ld->write, tty, file, buf, count);
-       tty_ldisc_deref(ld);
-       return ret;
-}
-
-ssize_t redirected_tty_write(struct file * file, const char __user * buf, size_t count,
-                        loff_t *ppos)
-{
-       struct file *p = NULL;
-
-       spin_lock(&redirect_lock);
-       if (redirect) {
-               get_file(redirect);
-               p = redirect;
-       }
-       spin_unlock(&redirect_lock);
-
-       if (p) {
-               ssize_t res;
-               res = vfs_write(p, buf, count, &p->f_pos);
-               fput(p);
-               return res;
-       }
-
-       return tty_write(file, buf, count, ppos);
-}
-
-static char ptychar[] = "pqrstuvwxyzabcde";
-
-/**
- *     pty_line_name   -       generate name for a pty
- *     @driver: the tty driver in use
- *     @index: the minor number
- *     @p: output buffer of at least 6 bytes
- *
- *     Generate a name from a driver reference and write it to the output
- *     buffer.
- *
- *     Locking: None
- */
-static void pty_line_name(struct tty_driver *driver, int index, char *p)
-{
-       int i = index + driver->name_base;
-       /* ->name is initialized to "ttyp", but "tty" is expected */
-       sprintf(p, "%s%c%x",
-                       driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
-                       ptychar[i >> 4 & 0xf], i & 0xf);
-}
-
-/**
- *     pty_line_name   -       generate name for a tty
- *     @driver: the tty driver in use
- *     @index: the minor number
- *     @p: output buffer of at least 7 bytes
- *
- *     Generate a name from a driver reference and write it to the output
- *     buffer.
- *
- *     Locking: None
- */
-static void tty_line_name(struct tty_driver *driver, int index, char *p)
-{
-       sprintf(p, "%s%d", driver->name, index + driver->name_base);
-}
-
-/**
- *     init_dev                -       initialise a tty device
- *     @driver: tty driver we are opening a device on
- *     @idx: device index
- *     @tty: returned tty structure
- *
- *     Prepare a tty device. This may not be a "new" clean device but
- *     could also be an active device. The pty drivers require special
- *     handling because of this.
- *
- *     Locking:
- *             The function is called under the tty_mutex, which
- *     protects us from the tty struct or driver itself going away.
- *
- *     On exit the tty device has the line discipline attached and
- *     a reference count of 1. If a pair was created for pty/tty use
- *     and the other was a pty master then it too has a reference count of 1.
- *
- * WSH 06/09/97: Rewritten to remove races and properly clean up after a
- * failed open.  The new code protects the open with a mutex, so it's
- * really quite straightforward.  The mutex locking can probably be
- * relaxed for the (most common) case of reopening a tty.
- */
-
-static int init_dev(struct tty_driver *driver, int idx,
-       struct tty_struct **ret_tty)
-{
-       struct tty_struct *tty, *o_tty;
-       struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
-       struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
-       int retval = 0;
-
-       /* check whether we're reopening an existing tty */
-       if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
-               tty = devpts_get_tty(idx);
-               if (tty && driver->subtype == PTY_TYPE_MASTER)
-                       tty = tty->link;
-       } else {
-               tty = driver->ttys[idx];
-       }
-       if (tty) goto fast_track;
-
-       /*
-        * First time open is complex, especially for PTY devices.
-        * This code guarantees that either everything succeeds and the
-        * TTY is ready for operation, or else the table slots are vacated
-        * and the allocated memory released.  (Except that the termios 
-        * and locked termios may be retained.)
-        */
-
-       if (!try_module_get(driver->owner)) {
-               retval = -ENODEV;
-               goto end_init;
-       }
-
-       o_tty = NULL;
-       tp = o_tp = NULL;
-       ltp = o_ltp = NULL;
-
-       tty = alloc_tty_struct();
-       if(!tty)
-               goto fail_no_mem;
-       initialize_tty_struct(tty);
-       tty->driver = driver;
-       tty->index = idx;
-       tty_line_name(driver, idx, tty->name);
-
-       if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
-               tp_loc = &tty->termios;
-               ltp_loc = &tty->termios_locked;
-       } else {
-               tp_loc = &driver->termios[idx];
-               ltp_loc = &driver->termios_locked[idx];
-       }
-
-       if (!*tp_loc) {
-               tp = (struct termios *) kmalloc(sizeof(struct termios),
-                                               GFP_KERNEL);
-               if (!tp)
-                       goto free_mem_out;
-               *tp = driver->init_termios;
-       }
-
-       if (!*ltp_loc) {
-               ltp = (struct termios *) kmalloc(sizeof(struct termios),
-                                                GFP_KERNEL);
-               if (!ltp)
-                       goto free_mem_out;
-               memset(ltp, 0, sizeof(struct termios));
-       }
-
-       if (driver->type == TTY_DRIVER_TYPE_PTY) {
-               o_tty = alloc_tty_struct();
-               if (!o_tty)
-                       goto free_mem_out;
-               initialize_tty_struct(o_tty);
-               o_tty->driver = driver->other;
-               o_tty->index = idx;
-               tty_line_name(driver->other, idx, o_tty->name);
-
-               if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
-                       o_tp_loc = &o_tty->termios;
-                       o_ltp_loc = &o_tty->termios_locked;
-               } else {
-                       o_tp_loc = &driver->other->termios[idx];
-                       o_ltp_loc = &driver->other->termios_locked[idx];
-               }
-
-               if (!*o_tp_loc) {
-                       o_tp = (struct termios *)
-                               kmalloc(sizeof(struct termios), GFP_KERNEL);
-                       if (!o_tp)
-                               goto free_mem_out;
-                       *o_tp = driver->other->init_termios;
-               }
-
-               if (!*o_ltp_loc) {
-                       o_ltp = (struct termios *)
-                               kmalloc(sizeof(struct termios), GFP_KERNEL);
-                       if (!o_ltp)
-                               goto free_mem_out;
-                       memset(o_ltp, 0, sizeof(struct termios));
-               }
-
-               /*
-                * Everything allocated ... set up the o_tty structure.
-                */
-               if (!(driver->other->flags & TTY_DRIVER_DEVPTS_MEM)) {
-                       driver->other->ttys[idx] = o_tty;
-               }
-               if (!*o_tp_loc)
-                       *o_tp_loc = o_tp;
-               if (!*o_ltp_loc)
-                       *o_ltp_loc = o_ltp;
-               o_tty->termios = *o_tp_loc;
-               o_tty->termios_locked = *o_ltp_loc;
-               driver->other->refcount++;
-               if (driver->subtype == PTY_TYPE_MASTER)
-                       o_tty->count++;
-
-               /* Establish the links in both directions */
-               tty->link   = o_tty;
-               o_tty->link = tty;
-       }
-
-       /* 
-        * All structures have been allocated, so now we install them.
-        * Failures after this point use release_mem to clean up, so 
-        * there's no need to null out the local pointers.
-        */
-       if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
-               driver->ttys[idx] = tty;
-       }
-       
-       if (!*tp_loc)
-               *tp_loc = tp;
-       if (!*ltp_loc)
-               *ltp_loc = ltp;
-       tty->termios = *tp_loc;
-       tty->termios_locked = *ltp_loc;
-       driver->refcount++;
-       tty->count++;
-
-       /* 
-        * Structures all installed ... call the ldisc open routines.
-        * If we fail here just call release_mem to clean up.  No need
-        * to decrement the use counts, as release_mem doesn't care.
-        */
-
-       if (tty->ldisc.open) {
-               retval = (tty->ldisc.open)(tty);
-               if (retval)
-                       goto release_mem_out;
-       }
-       if (o_tty && o_tty->ldisc.open) {
-               retval = (o_tty->ldisc.open)(o_tty);
-               if (retval) {
-                       if (tty->ldisc.close)
-                               (tty->ldisc.close)(tty);
-                       goto release_mem_out;
-               }
-               tty_ldisc_enable(o_tty);
-       }
-       tty_ldisc_enable(tty);
-       goto success;
-
-       /*
-        * This fast open can be used if the tty is already open.
-        * No memory is allocated, and the only failures are from
-        * attempting to open a closing tty or attempting multiple
-        * opens on a pty master.
-        */
-fast_track:
-       if (test_bit(TTY_CLOSING, &tty->flags)) {
-               retval = -EIO;
-               goto end_init;
-       }
-       if (driver->type == TTY_DRIVER_TYPE_PTY &&
-           driver->subtype == PTY_TYPE_MASTER) {
-               /*
-                * special case for PTY masters: only one open permitted, 
-                * and the slave side open count is incremented as well.
-                */
-               if (tty->count) {
-                       retval = -EIO;
-                       goto end_init;
-               }
-               tty->link->count++;
-       }
-       tty->count++;
-       tty->driver = driver; /* N.B. why do this every time?? */
-
-       /* FIXME */
-       if(!test_bit(TTY_LDISC, &tty->flags))
-               printk(KERN_ERR "init_dev but no ldisc\n");
-success:
-       *ret_tty = tty;
-       
-       /* All paths come through here to release the mutex */
-end_init:
-       return retval;
-
-       /* Release locally allocated memory ... nothing placed in slots */
-free_mem_out:
-       kfree(o_tp);
-       if (o_tty)
-               free_tty_struct(o_tty);
-       kfree(ltp);
-       kfree(tp);
-       free_tty_struct(tty);
-
-fail_no_mem:
-       module_put(driver->owner);
-       retval = -ENOMEM;
-       goto end_init;
-
-       /* call the tty release_mem routine to clean out this slot */
-release_mem_out:
-       printk(KERN_INFO "init_dev: ldisc open failed, "
-                        "clearing slot %d\n", idx);
-       release_mem(tty, idx);
-       goto end_init;
-}
-
-/**
- *     release_mem             -       release tty structure memory
- *
- *     Releases memory associated with a tty structure, and clears out the
- *     driver table slots. This function is called when a device is no longer
- *     in use. It also gets called when setup of a device fails.
- *
- *     Locking:
- *             tty_mutex - sometimes only
- *             takes the file list lock internally when working on the list
- *     of ttys that the driver keeps.
- *             FIXME: should we require tty_mutex is held here ??
- */
-
-static void release_mem(struct tty_struct *tty, int idx)
-{
-       struct tty_struct *o_tty;
-       struct termios *tp;
-       int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
-
-       if ((o_tty = tty->link) != NULL) {
-               if (!devpts)
-                       o_tty->driver->ttys[idx] = NULL;
-               if (o_tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
-                       tp = o_tty->termios;
-                       if (!devpts)
-                               o_tty->driver->termios[idx] = NULL;
-                       kfree(tp);
-
-                       tp = o_tty->termios_locked;
-                       if (!devpts)
-                               o_tty->driver->termios_locked[idx] = NULL;
-                       kfree(tp);
-               }
-               o_tty->magic = 0;
-               o_tty->driver->refcount--;
-               file_list_lock();
-               list_del_init(&o_tty->tty_files);
-               file_list_unlock();
-               free_tty_struct(o_tty);
-       }
-
-       if (!devpts)
-               tty->driver->ttys[idx] = NULL;
-       if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
-               tp = tty->termios;
-               if (!devpts)
-                       tty->driver->termios[idx] = NULL;
-               kfree(tp);
-
-               tp = tty->termios_locked;
-               if (!devpts)
-                       tty->driver->termios_locked[idx] = NULL;
-               kfree(tp);
-       }
-
-       tty->magic = 0;
-       tty->driver->refcount--;
-       file_list_lock();
-       list_del_init(&tty->tty_files);
-       file_list_unlock();
-       module_put(tty->driver->owner);
-       free_tty_struct(tty);
-}
-
-/*
- * Even releasing the tty structures is a tricky business.. We have
- * to be very careful that the structures are all released at the
- * same time, as interrupts might otherwise get the wrong pointers.
- *
- * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
- * lead to double frees or releasing memory still in use.
- */
-static void release_dev(struct file * filp)
-{
-       struct tty_struct *tty, *o_tty;
-       int     pty_master, tty_closing, o_tty_closing, do_sleep;
-       int     devpts;
-       int     idx;
-       char    buf[64];
-       unsigned long flags;
-       
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "release_dev"))
-               return;
-
-       check_tty_count(tty, "release_dev");
-
-       tty_fasync(-1, filp, 0);
-
-       idx = tty->index;
-       pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
-                     tty->driver->subtype == PTY_TYPE_MASTER);
-       devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
-       o_tty = tty->link;
-
-#ifdef TTY_PARANOIA_CHECK
-       if (idx < 0 || idx >= tty->driver->num) {
-               printk(KERN_DEBUG "release_dev: bad idx when trying to "
-                                 "free (%s)\n", tty->name);
-               return;
-       }
-       if (!(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
-               if (tty != tty->driver->ttys[idx]) {
-                       printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
-                              "for (%s)\n", idx, tty->name);
-                       return;
-               }
-               if (tty->termios != tty->driver->termios[idx]) {
-                       printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
-                              "for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
-               if (tty->termios_locked != tty->driver->termios_locked[idx]) {
-                       printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
-                              "termios_locked for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
-       }
-#endif
-
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
-              tty_name(tty, buf), tty->count);
-#endif
-
-#ifdef TTY_PARANOIA_CHECK
-       if (tty->driver->other &&
-            !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
-               if (o_tty != tty->driver->other->ttys[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->table[%d] "
-                                         "not o_tty for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
-               if (o_tty->termios != tty->driver->other->termios[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->termios[%d] "
-                                         "not o_termios for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
-               if (o_tty->termios_locked != 
-                     tty->driver->other->termios_locked[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->termios_locked["
-                                         "%d] not o_termios_locked for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
-               if (o_tty->link != tty) {
-                       printk(KERN_DEBUG "release_dev: bad pty pointers\n");
-                       return;
-               }
-       }
-#endif
-       if (tty->driver->close)
-               tty->driver->close(tty, filp);
-
-       /*
-        * Sanity check: if tty->count is going to zero, there shouldn't be
-        * any waiters on tty->read_wait or tty->write_wait.  We test the
-        * wait queues and kick everyone out _before_ actually starting to
-        * close.  This ensures that we won't block while releasing the tty
-        * structure.
-        *
-        * The test for the o_tty closing is necessary, since the master and
-        * slave sides may close in any order.  If the slave side closes out
-        * first, its count will be one, since the master side holds an open.
-        * Thus this test wouldn't be triggered at the time the slave closes,
-        * so we do it now.
-        *
-        * Note that it's possible for the tty to be opened again while we're
-        * flushing out waiters.  By recalculating the closing flags before
-        * each iteration we avoid any problems.
-        */
-       while (1) {
-               /* Guard against races with tty->count changes elsewhere and
-                  opens on /dev/tty */
-                  
-               mutex_lock(&tty_mutex);
-               tty_closing = tty->count <= 1;
-               o_tty_closing = o_tty &&
-                       (o_tty->count <= (pty_master ? 1 : 0));
-               do_sleep = 0;
-
-               if (tty_closing) {
-                       if (waitqueue_active(&tty->read_wait)) {
-                               wake_up(&tty->read_wait);
-                               do_sleep++;
-                       }
-                       if (waitqueue_active(&tty->write_wait)) {
-                               wake_up(&tty->write_wait);
-                               do_sleep++;
-                       }
-               }
-               if (o_tty_closing) {
-                       if (waitqueue_active(&o_tty->read_wait)) {
-                               wake_up(&o_tty->read_wait);
-                               do_sleep++;
-                       }
-                       if (waitqueue_active(&o_tty->write_wait)) {
-                               wake_up(&o_tty->write_wait);
-                               do_sleep++;
-                       }
-               }
-               if (!do_sleep)
-                       break;
-
-               printk(KERN_WARNING "release_dev: %s: read/write wait queue "
-                                   "active!\n", tty_name(tty, buf));
-               mutex_unlock(&tty_mutex);
-               schedule();
-       }       
-
-       /*
-        * The closing flags are now consistent with the open counts on 
-        * both sides, and we've completed the last operation that could 
-        * block, so it's safe to proceed with closing.
-        */
-       if (pty_master) {
-               if (--o_tty->count < 0) {
-                       printk(KERN_WARNING "release_dev: bad pty slave count "
-                                           "(%d) for %s\n",
-                              o_tty->count, tty_name(o_tty, buf));
-                       o_tty->count = 0;
-               }
-       }
-       if (--tty->count < 0) {
-               printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
-                      tty->count, tty_name(tty, buf));
-               tty->count = 0;
-       }
-       
-       /*
-        * We've decremented tty->count, so we need to remove this file
-        * descriptor off the tty->tty_files list; this serves two
-        * purposes:
-        *  - check_tty_count sees the correct number of file descriptors
-        *    associated with this tty.
-        *  - do_tty_hangup no longer sees this file descriptor as
-        *    something that needs to be handled for hangups.
-        */
-       file_kill(filp);
-       filp->private_data = NULL;
-
-       /*
-        * Perform some housekeeping before deciding whether to return.
-        *
-        * Set the TTY_CLOSING flag if this was the last open.  In the
-        * case of a pty we may have to wait around for the other side
-        * to close, and TTY_CLOSING makes sure we can't be reopened.
-        */
-       if(tty_closing)
-               set_bit(TTY_CLOSING, &tty->flags);
-       if(o_tty_closing)
-               set_bit(TTY_CLOSING, &o_tty->flags);
-
-       /*
-        * If _either_ side is closing, make sure there aren't any
-        * processes that still think tty or o_tty is their controlling
-        * tty.
-        */
-       if (tty_closing || o_tty_closing) {
-               struct task_struct *p;
-
-               read_lock(&tasklist_lock);
-               do_each_task_pid(tty->session, PIDTYPE_SID, p) {
-                       p->signal->tty = NULL;
-               } while_each_task_pid(tty->session, PIDTYPE_SID, p);
-               if (o_tty)
-                       do_each_task_pid(o_tty->session, PIDTYPE_SID, p) {
-                               p->signal->tty = NULL;
-                       } while_each_task_pid(o_tty->session, PIDTYPE_SID, p);
-               read_unlock(&tasklist_lock);
-       }
-
-       mutex_unlock(&tty_mutex);
-
-       /* check whether both sides are closing ... */
-       if (!tty_closing || (o_tty && !o_tty_closing))
-               return;
-       
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "freeing tty structure...");
-#endif
-       /*
-        * Prevent flush_to_ldisc() from rescheduling the work for later.  Then
-        * kill any delayed work. As this is the final close it does not
-        * race with the set_ldisc code path.
-        */
-       clear_bit(TTY_LDISC, &tty->flags);
-       cancel_delayed_work(&tty->buf.work);
-
-       /*
-        * Wait for ->hangup_work and ->buf.work handlers to terminate
-        */
-        
-       flush_scheduled_work();
-       
-       /*
-        * Wait for any short term users (we know they are just driver
-        * side waiters as the file is closing so user count on the file
-        * side is zero.
-        */
-       spin_lock_irqsave(&tty_ldisc_lock, flags);
-       while(tty->ldisc.refcount)
-       {
-               spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-               wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
-               spin_lock_irqsave(&tty_ldisc_lock, flags);
-       }
-       spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-       /*
-        * Shutdown the current line discipline, and reset it to N_TTY.
-        * N.B. why reset ldisc when we're releasing the memory??
-        *
-        * FIXME: this MUST get fixed for the new reflocking
-        */
-       if (tty->ldisc.close)
-               (tty->ldisc.close)(tty);
-       tty_ldisc_put(tty->ldisc.num);
-       
-       /*
-        *      Switch the line discipline back
-        */
-       tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-       tty_set_termios_ldisc(tty,N_TTY); 
-       if (o_tty) {
-               /* FIXME: could o_tty be in setldisc here ? */
-               clear_bit(TTY_LDISC, &o_tty->flags);
-               if (o_tty->ldisc.close)
-                       (o_tty->ldisc.close)(o_tty);
-               tty_ldisc_put(o_tty->ldisc.num);
-               tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
-               tty_set_termios_ldisc(o_tty,N_TTY); 
-       }
-       /*
-        * The release_mem function takes care of the details of clearing
-        * the slots and preserving the termios structure.
-        */
-       release_mem(tty, idx);
-
-#ifdef CONFIG_UNIX98_PTYS
-       /* Make this pty number available for reallocation */
-       if (devpts) {
-               down(&allocated_ptys_lock);
-               idr_remove(&allocated_ptys, idx);
-               up(&allocated_ptys_lock);
-       }
-#endif
-
-}
-
-/**
- *     tty_open                -       open a tty device
- *     @inode: inode of device file
- *     @filp: file pointer to tty
- *
- *     tty_open and tty_release keep up the tty count that contains the
- *     number of opens done on a tty. We cannot use the inode-count, as
- *     different inodes might point to the same tty.
- *
- *     Open-counting is needed for pty masters, as well as for keeping
- *     track of serial lines: DTR is dropped when the last close happens.
- *     (This is not done solely through tty->count, now.  - Ted 1/27/92)
- *
- *     The termios state of a pty is reset on first open so that
- *     settings don't persist across reuse.
- *
- *     Locking: tty_mutex protects current->signal->tty, get_tty_driver and
- *             init_dev work. tty->count should protect the rest.
- *             task_lock is held to update task details for sessions
- */
-
-static int tty_open(struct inode * inode, struct file * filp)
-{
-       struct tty_struct *tty;
-       int noctty, retval;
-       struct tty_driver *driver;
-       int index;
-       dev_t device = inode->i_rdev;
-       unsigned short saved_flags = filp->f_flags;
-
-       nonseekable_open(inode, filp);
-       
-retry_open:
-       noctty = filp->f_flags & O_NOCTTY;
-       index  = -1;
-       retval = 0;
-       
-       mutex_lock(&tty_mutex);
-
-       if (device == MKDEV(TTYAUX_MAJOR,0)) {
-               if (!current->signal->tty) {
-                       mutex_unlock(&tty_mutex);
-                       return -ENXIO;
-               }
-               driver = current->signal->tty->driver;
-               index = current->signal->tty->index;
-               filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
-               /* noctty = 1; */
-               goto got_driver;
-       }
-#ifdef CONFIG_VT
-       if (console_use_vt && (device == MKDEV(TTY_MAJOR,0))) {
-               extern struct tty_driver *console_driver;
-               driver = console_driver;
-               index = fg_console;
-               noctty = 1;
-               goto got_driver;
-       }
-#endif
-       if (device == MKDEV(TTYAUX_MAJOR,1)) {
-               driver = console_device(&index);
-               if (driver) {
-                       /* Don't let /dev/console block */
-                       filp->f_flags |= O_NONBLOCK;
-                       noctty = 1;
-                       goto got_driver;
-               }
-               mutex_unlock(&tty_mutex);
-               return -ENODEV;
-       }
-
-       driver = get_tty_driver(device, &index);
-       if (!driver) {
-               mutex_unlock(&tty_mutex);
-               return -ENODEV;
-       }
-got_driver:
-       retval = init_dev(driver, index, &tty);
-       mutex_unlock(&tty_mutex);
-       if (retval)
-               return retval;
-
-       filp->private_data = tty;
-       file_move(filp, &tty->tty_files);
-       check_tty_count(tty, "tty_open");
-       if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver->subtype == PTY_TYPE_MASTER)
-               noctty = 1;
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "opening %s...", tty->name);
-#endif
-       if (!retval) {
-               if (tty->driver->open)
-                       retval = tty->driver->open(tty, filp);
-               else
-                       retval = -ENODEV;
-       }
-       filp->f_flags = saved_flags;
-
-       if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
-               retval = -EBUSY;
-
-       if (retval) {
-#ifdef TTY_DEBUG_HANGUP
-               printk(KERN_DEBUG "error %d in opening %s...", retval,
-                      tty->name);
-#endif
-               release_dev(filp);
-               if (retval != -ERESTARTSYS)
-                       return retval;
-               if (signal_pending(current))
-                       return retval;
-               schedule();
-               /*
-                * Need to reset f_op in case a hangup happened.
-                */
-               if (filp->f_op == &hung_up_tty_fops)
-                       filp->f_op = &tty_fops;
-               goto retry_open;
-       }
-       if (!noctty &&
-           current->signal->leader &&
-           !current->signal->tty &&
-           tty->session == 0) {
-               task_lock(current);
-               current->signal->tty = tty;
-               task_unlock(current);
-               current->signal->tty_old_pgrp = 0;
-               tty->session = current->signal->session;
-               tty->pgrp = process_group(current);
-       }
-       return 0;
-}
-
-#ifdef CONFIG_UNIX98_PTYS
-/**
- *     ptmx_open               -       open a unix 98 pty master
- *     @inode: inode of device file
- *     @filp: file pointer to tty
- *
- *     Allocate a unix98 pty master device from the ptmx driver.
- *
- *     Locking: tty_mutex protects theinit_dev work. tty->count should
-               protect the rest.
- *             allocated_ptys_lock handles the list of free pty numbers
- */
-
-static int ptmx_open(struct inode * inode, struct file * filp)
-{
-       struct tty_struct *tty;
-       int retval;
-       int index;
-       int idr_ret;
-
-       nonseekable_open(inode, filp);
-
-       /* find a device that is not in use. */
-       down(&allocated_ptys_lock);
-       if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) {
-               up(&allocated_ptys_lock);
-               return -ENOMEM;
-       }
-       idr_ret = idr_get_new(&allocated_ptys, NULL, &index);
-       if (idr_ret < 0) {
-               up(&allocated_ptys_lock);
-               if (idr_ret == -EAGAIN)
-                       return -ENOMEM;
-               return -EIO;
-       }
-       if (index >= pty_limit) {
-               idr_remove(&allocated_ptys, index);
-               up(&allocated_ptys_lock);
-               return -EIO;
-       }
-       up(&allocated_ptys_lock);
-
-       mutex_lock(&tty_mutex);
-       retval = init_dev(ptm_driver, index, &tty);
-       mutex_unlock(&tty_mutex);
-       
-       if (retval)
-               goto out;
-
-       set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
-       filp->private_data = tty;
-       file_move(filp, &tty->tty_files);
-
-       retval = -ENOMEM;
-       if (devpts_pty_new(tty->link))
-               goto out1;
-
-       check_tty_count(tty, "tty_open");
-       retval = ptm_driver->open(tty, filp);
-       if (!retval)
-               return 0;
-out1:
-       release_dev(filp);
-       return retval;
-out:
-       down(&allocated_ptys_lock);
-       idr_remove(&allocated_ptys, index);
-       up(&allocated_ptys_lock);
-       return retval;
-}
-#endif
-
-/**
- *     tty_release             -       vfs callback for close
- *     @inode: inode of tty
- *     @filp: file pointer for handle to tty
- *
- *     Called the last time each file handle is closed that references
- *     this tty. There may however be several such references.
- *
- *     Locking:
- *             Takes bkl. See release_dev
- */
-
-static int tty_release(struct inode * inode, struct file * filp)
-{
-       lock_kernel();
-       release_dev(filp);
-       unlock_kernel();
-       return 0;
-}
-
-/**
- *     tty_poll        -       check tty status
- *     @filp: file being polled
- *     @wait: poll wait structures to update
- *
- *     Call the line discipline polling method to obtain the poll
- *     status of the device.
- *
- *     Locking: locks called line discipline but ldisc poll method
- *     may be re-entered freely by other callers.
- */
-
-static unsigned int tty_poll(struct file * filp, poll_table * wait)
-{
-       struct tty_struct * tty;
-       struct tty_ldisc *ld;
-       int ret = 0;
-
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_poll"))
-               return 0;
-               
-       ld = tty_ldisc_ref_wait(tty);
-       if (ld->poll)
-               ret = (ld->poll)(tty, filp, wait);
-       tty_ldisc_deref(ld);
-       return ret;
-}
-
-static int tty_fasync(int fd, struct file * filp, int on)
-{
-       struct tty_struct * tty;
-       int retval;
-
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_fasync"))
-               return 0;
-       
-       retval = fasync_helper(fd, filp, on, &tty->fasync);
-       if (retval <= 0)
-               return retval;
-
-       if (on) {
-               if (!waitqueue_active(&tty->read_wait))
-                       tty->minimum_to_wake = 1;
-               retval = f_setown(filp, (-tty->pgrp) ? : current->pid, 0);
-               if (retval)
-                       return retval;
-       } else {
-               if (!tty->fasync && !waitqueue_active(&tty->read_wait))
-                       tty->minimum_to_wake = N_TTY_BUF_SIZE;
-       }
-       return 0;
-}
-
-/**
- *     tiocsti                 -       fake input character
- *     @tty: tty to fake input into
- *     @p: pointer to character
- *
- *     Fake input to a tty device. Does the neccessary locking and
- *     input management.
- *
- *     FIXME: does not honour flow control ??
- *
- *     Locking:
- *             Called functions take tty_ldisc_lock
- *             current->signal->tty check is safe without locks
- */
-
-static int tiocsti(struct tty_struct *tty, char __user *p)
-{
-       char ch, mbz = 0;
-       struct tty_ldisc *ld;
-       
-       if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
-               return -EPERM;
-       if (get_user(ch, p))
-               return -EFAULT;
-       ld = tty_ldisc_ref_wait(tty);
-       ld->receive_buf(tty, &ch, &mbz, 1);
-       tty_ldisc_deref(ld);
-       return 0;
-}
-
-/**
- *     tiocgwinsz              -       implement window query ioctl
- *     @tty; tty
- *     @arg: user buffer for result
- *
- *     Copies the kernel idea of the window size into the user buffer. No
- *     locking is done.
- *
- *     FIXME: Returning random values racing a window size set is wrong
- *     should lock here against that
- */
-
-static int tiocgwinsz(struct tty_struct *tty, struct winsize __user * arg)
-{
-       if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
-               return -EFAULT;
-       return 0;
-}
-
-/**
- *     tiocswinsz              -       implement window size set ioctl
- *     @tty; tty
- *     @arg: user buffer for result
- *
- *     Copies the user idea of the window size to the kernel. Traditionally
- *     this is just advisory information but for the Linux console it
- *     actually has driver level meaning and triggers a VC resize.
- *
- *     Locking:
- *             The console_sem is used to ensure we do not try and resize
- *     the console twice at once.
- *     FIXME: Two racing size sets may leave the console and kernel
- *             parameters disagreeing. Is this exploitable ?
- *     FIXME: Random values racing a window size get is wrong
- *     should lock here against that
- */
-
-static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
-       struct winsize __user * arg)
-{
-       struct winsize tmp_ws;
-
-       if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
-               return -EFAULT;
-       if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
-               return 0;
-#ifdef CONFIG_VT
-       if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
-               int rc;
-
-               acquire_console_sem();
-               rc = vc_resize(tty->driver_data, tmp_ws.ws_col, tmp_ws.ws_row);
-               release_console_sem();
-               if (rc)
-                       return -ENXIO;
-       }
-#endif
-       if (tty->pgrp > 0)
-               kill_pg(tty->pgrp, SIGWINCH, 1);
-       if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
-               kill_pg(real_tty->pgrp, SIGWINCH, 1);
-       tty->winsize = tmp_ws;
-       real_tty->winsize = tmp_ws;
-       return 0;
-}
-
-/**
- *     tioccons        -       allow admin to move logical console
- *     @file: the file to become console
- *
- *     Allow the adminstrator to move the redirected console device
- *
- *     Locking: uses redirect_lock to guard the redirect information
- */
-
-static int tioccons(struct file *file)
-{
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-       if (file->f_op->write == redirected_tty_write) {
-               struct file *f;
-               spin_lock(&redirect_lock);
-               f = redirect;
-               redirect = NULL;
-               spin_unlock(&redirect_lock);
-               if (f)
-                       fput(f);
-               return 0;
-       }
-       spin_lock(&redirect_lock);
-       if (redirect) {
-               spin_unlock(&redirect_lock);
-               return -EBUSY;
-       }
-       get_file(file);
-       redirect = file;
-       spin_unlock(&redirect_lock);
-       return 0;
-}
-
-/**
- *     fionbio         -       non blocking ioctl
- *     @file: file to set blocking value
- *     @p: user parameter
- *
- *     Historical tty interfaces had a blocking control ioctl before
- *     the generic functionality existed. This piece of history is preserved
- *     in the expected tty API of posix OS's.
- *
- *     Locking: none, the open fle handle ensures it won't go away.
- */
-
-static int fionbio(struct file *file, int __user *p)
-{
-       int nonblock;
-
-       if (get_user(nonblock, p))
-               return -EFAULT;
-
-       if (nonblock)
-               file->f_flags |= O_NONBLOCK;
-       else
-               file->f_flags &= ~O_NONBLOCK;
-       return 0;
-}
-
-/**
- *     tiocsctty       -       set controlling tty
- *     @tty: tty structure
- *     @arg: user argument
- *
- *     This ioctl is used to manage job control. It permits a session
- *     leader to set this tty as the controlling tty for the session.
- *
- *     Locking:
- *             Takes tasklist lock internally to walk sessions
- *             Takes task_lock() when updating signal->tty
- *
- *     FIXME: tty_mutex is needed to protect signal->tty references.
- *     FIXME: why task_lock on the signal->tty reference ??
- *
- */
-
-static int tiocsctty(struct tty_struct *tty, int arg)
-{
-       struct task_struct *p;
-
-       if (current->signal->leader &&
-           (current->signal->session == tty->session))
-               return 0;
-       /*
-        * The process must be a session leader and
-        * not have a controlling tty already.
-        */
-       if (!current->signal->leader || current->signal->tty)
-               return -EPERM;
-       if (tty->session > 0) {
-               /*
-                * This tty is already the controlling
-                * tty for another session group!
-                */
-               if ((arg == 1) && capable(CAP_SYS_ADMIN)) {
-                       /*
-                        * Steal it away
-                        */
-
-                       read_lock(&tasklist_lock);
-                       do_each_task_pid(tty->session, PIDTYPE_SID, p) {
-                               p->signal->tty = NULL;
-                       } while_each_task_pid(tty->session, PIDTYPE_SID, p);
-                       read_unlock(&tasklist_lock);
-               } else
-                       return -EPERM;
-       }
-       task_lock(current);
-       current->signal->tty = tty;
-       task_unlock(current);
-       current->signal->tty_old_pgrp = 0;
-       tty->session = current->signal->session;
-       tty->pgrp = process_group(current);
-       return 0;
-}
-
-/**
- *     tiocgpgrp               -       get process group
- *     @tty: tty passed by user
- *     @real_tty: tty side of the tty pased by the user if a pty else the tty
- *     @p: returned pid
- *
- *     Obtain the process group of the tty. If there is no process group
- *     return an error.
- *
- *     Locking: none. Reference to ->signal->tty is safe.
- */
-
-static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
-{
-       /*
-        * (tty == real_tty) is a cheap way of
-        * testing if the tty is NOT a master pty.
-        */
-       if (tty == real_tty && current->signal->tty != real_tty)
-               return -ENOTTY;
-       return put_user(real_tty->pgrp, p);
-}
-
-/**
- *     tiocspgrp               -       attempt to set process group
- *     @tty: tty passed by user
- *     @real_tty: tty side device matching tty passed by user
- *     @p: pid pointer
- *
- *     Set the process group of the tty to the session passed. Only
- *     permitted where the tty session is our session.
- *
- *     Locking: None
- *
- *     FIXME: current->signal->tty referencing is unsafe.
- */
-
-static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
-{
-       pid_t pgrp;
-       int retval = tty_check_change(real_tty);
-
-       if (retval == -EIO)
-               return -ENOTTY;
-       if (retval)
-               return retval;
-       if (!current->signal->tty ||
-           (current->signal->tty != real_tty) ||
-           (real_tty->session != current->signal->session))
-               return -ENOTTY;
-       if (get_user(pgrp, p))
-               return -EFAULT;
-       if (pgrp < 0)
-               return -EINVAL;
-       if (session_of_pgrp(pgrp) != current->signal->session)
-               return -EPERM;
-       real_tty->pgrp = pgrp;
-       return 0;
-}
-
-/**
- *     tiocgsid                -       get session id
- *     @tty: tty passed by user
- *     @real_tty: tty side of the tty pased by the user if a pty else the tty
- *     @p: pointer to returned session id
- *
- *     Obtain the session id of the tty. If there is no session
- *     return an error.
- *
- *     Locking: none. Reference to ->signal->tty is safe.
- */
-
-static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
-{
-       /*
-        * (tty == real_tty) is a cheap way of
-        * testing if the tty is NOT a master pty.
-       */
-       if (tty == real_tty && current->signal->tty != real_tty)
-               return -ENOTTY;
-       if (real_tty->session <= 0)
-               return -ENOTTY;
-       return put_user(real_tty->session, p);
-}
-
-/**
- *     tiocsetd        -       set line discipline
- *     @tty: tty device
- *     @p: pointer to user data
- *
- *     Set the line discipline according to user request.
- *
- *     Locking: see tty_set_ldisc, this function is just a helper
- */
-
-static int tiocsetd(struct tty_struct *tty, int __user *p)
-{
-       int ldisc;
-
-       if (get_user(ldisc, p))
-               return -EFAULT;
-       return tty_set_ldisc(tty, ldisc);
-}
-
-/**
- *     send_break      -       performed time break
- *     @tty: device to break on
- *     @duration: timeout in mS
- *
- *     Perform a timed break on hardware that lacks its own driver level
- *     timed break functionality.
- *
- *     Locking:
- *             None
- *
- *     FIXME:
- *             What if two overlap
- */
-
-static int send_break(struct tty_struct *tty, unsigned int duration)
-{
-       tty->driver->break_ctl(tty, -1);
-       if (!signal_pending(current)) {
-               msleep_interruptible(duration);
-       }
-       tty->driver->break_ctl(tty, 0);
-       if (signal_pending(current))
-               return -EINTR;
-       return 0;
-}
-
-/**
- *     tiocmget                -       get modem status
- *     @tty: tty device
- *     @file: user file pointer
- *     @p: pointer to result
- *
- *     Obtain the modem status bits from the tty driver if the feature
- *     is supported. Return -EINVAL if it is not available.
- *
- *     Locking: none (up to the driver)
- */
-
-static int tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p)
-{
-       int retval = -EINVAL;
-
-       if (tty->driver->tiocmget) {
-               retval = tty->driver->tiocmget(tty, file);
-
-               if (retval >= 0)
-                       retval = put_user(retval, p);
-       }
-       return retval;
-}
-
-/**
- *     tiocmset                -       set modem status
- *     @tty: tty device
- *     @file: user file pointer
- *     @cmd: command - clear bits, set bits or set all
- *     @p: pointer to desired bits
- *
- *     Set the modem status bits from the tty driver if the feature
- *     is supported. Return -EINVAL if it is not available.
- *
- *     Locking: none (up to the driver)
- */
-
-static int tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
-            unsigned __user *p)
-{
-       int retval = -EINVAL;
-
-       if (tty->driver->tiocmset) {
-               unsigned int set, clear, val;
-
-               retval = get_user(val, p);
-               if (retval)
-                       return retval;
-
-               set = clear = 0;
-               switch (cmd) {
-               case TIOCMBIS:
-                       set = val;
-                       break;
-               case TIOCMBIC:
-                       clear = val;
-                       break;
-               case TIOCMSET:
-                       set = val;
-                       clear = ~val;
-                       break;
-               }
-
-               set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
-               clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
-
-               retval = tty->driver->tiocmset(tty, file, set, clear);
-       }
-       return retval;
-}
-
-/*
- * Split this up, as gcc can choke on it otherwise..
- */
-int tty_ioctl(struct inode * inode, struct file * file,
-             unsigned int cmd, unsigned long arg)
-{
-       struct tty_struct *tty, *real_tty;
-       void __user *p = (void __user *)arg;
-       int retval;
-       struct tty_ldisc *ld;
-       
-       tty = (struct tty_struct *)file->private_data;
-       if (tty_paranoia_check(tty, inode, "tty_ioctl"))
-               return -EINVAL;
-
-       real_tty = tty;
-       if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver->subtype == PTY_TYPE_MASTER)
-               real_tty = tty->link;
-
-       /*
-        * Break handling by driver
-        */
-       if (!tty->driver->break_ctl) {
-               switch(cmd) {
-               case TIOCSBRK:
-               case TIOCCBRK:
-                       if (tty->driver->ioctl)
-                               return tty->driver->ioctl(tty, file, cmd, arg);
-                       return -EINVAL;
-                       
-               /* These two ioctl's always return success; even if */
-               /* the driver doesn't support them. */
-               case TCSBRK:
-               case TCSBRKP:
-                       if (!tty->driver->ioctl)
-                               return 0;
-                       retval = tty->driver->ioctl(tty, file, cmd, arg);
-                       if (retval == -ENOIOCTLCMD)
-                               retval = 0;
-                       return retval;
-               }
-       }
-
-       /*
-        * Factor out some common prep work
-        */
-       switch (cmd) {
-       case TIOCSETD:
-       case TIOCSBRK:
-       case TIOCCBRK:
-       case TCSBRK:
-       case TCSBRKP:                   
-               retval = tty_check_change(tty);
-               if (retval)
-                       return retval;
-               if (cmd != TIOCCBRK) {
-                       tty_wait_until_sent(tty, 0);
-                       if (signal_pending(current))
-                               return -EINTR;
-               }
-               break;
-       }
-
-       switch (cmd) {
-               case TIOCSTI:
-                       return tiocsti(tty, p);
-               case TIOCGWINSZ:
-                       return tiocgwinsz(tty, p);
-               case TIOCSWINSZ:
-                       return tiocswinsz(tty, real_tty, p);
-               case TIOCCONS:
-                       return real_tty!=tty ? -EINVAL : tioccons(file);
-               case FIONBIO:
-                       return fionbio(file, p);
-               case TIOCEXCL:
-                       set_bit(TTY_EXCLUSIVE, &tty->flags);
-                       return 0;
-               case TIOCNXCL:
-                       clear_bit(TTY_EXCLUSIVE, &tty->flags);
-                       return 0;
-               case TIOCNOTTY:
-                       /* FIXME: taks lock or tty_mutex ? */
-                       if (current->signal->tty != tty)
-                               return -ENOTTY;
-                       if (current->signal->leader)
-                               disassociate_ctty(0);
-                       task_lock(current);
-                       current->signal->tty = NULL;
-                       task_unlock(current);
-                       return 0;
-               case TIOCSCTTY:
-                       return tiocsctty(tty, arg);
-               case TIOCGPGRP:
-                       return tiocgpgrp(tty, real_tty, p);
-               case TIOCSPGRP:
-                       return tiocspgrp(tty, real_tty, p);
-               case TIOCGSID:
-                       return tiocgsid(tty, real_tty, p);
-               case TIOCGETD:
-                       /* FIXME: check this is ok */
-                       return put_user(tty->ldisc.num, (int __user *)p);
-               case TIOCSETD:
-                       return tiocsetd(tty, p);
-#ifdef CONFIG_VT
-               case TIOCLINUX:
-                       return tioclinux(tty, arg);
-#endif
-               /*
-                * Break handling
-                */
-               case TIOCSBRK:  /* Turn break on, unconditionally */
-                       tty->driver->break_ctl(tty, -1);
-                       return 0;
-                       
-               case TIOCCBRK:  /* Turn break off, unconditionally */
-                       tty->driver->break_ctl(tty, 0);
-                       return 0;
-               case TCSBRK:   /* SVID version: non-zero arg --> no break */
-                       /* non-zero arg means wait for all output data
-                        * to be sent (performed above) but don't send break.
-                        * This is used by the tcdrain() termios function.
-                        */
-                       if (!arg)
-                               return send_break(tty, 250);
-                       return 0;
-               case TCSBRKP:   /* support for POSIX tcsendbreak() */   
-                       return send_break(tty, arg ? arg*100 : 250);
-
-               case TIOCMGET:
-                       return tty_tiocmget(tty, file, p);
-
-               case TIOCMSET:
-               case TIOCMBIC:
-               case TIOCMBIS:
-                       return tty_tiocmset(tty, file, cmd, p);
-       }
-       if (tty->driver->ioctl) {
-               retval = (tty->driver->ioctl)(tty, file, cmd, arg);
-               if (retval != -ENOIOCTLCMD)
-                       return retval;
-       }
-       ld = tty_ldisc_ref_wait(tty);
-       retval = -EINVAL;
-       if (ld->ioctl) {
-               retval = ld->ioctl(tty, file, cmd, arg);
-               if (retval == -ENOIOCTLCMD)
-                       retval = -EINVAL;
-       }
-       tty_ldisc_deref(ld);
-       return retval;
-}
-
-
-/*
- * This implements the "Secure Attention Key" ---  the idea is to
- * prevent trojan horses by killing all processes associated with this
- * tty when the user hits the "Secure Attention Key".  Required for
- * super-paranoid applications --- see the Orange Book for more details.
- * 
- * This code could be nicer; ideally it should send a HUP, wait a few
- * seconds, then send a INT, and then a KILL signal.  But you then
- * have to coordinate with the init process, since all processes associated
- * with the current tty must be dead before the new getty is allowed
- * to spawn.
- *
- * Now, if it would be correct ;-/ The current code has a nasty hole -
- * it doesn't catch files in flight. We may send the descriptor to ourselves
- * via AF_UNIX socket, close it and later fetch from socket. FIXME.
- *
- * Nasty bug: do_SAK is being called in interrupt context.  This can
- * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
- */
-static void __do_SAK(void *arg)
-{
-#ifdef TTY_SOFT_SAK
-       tty_hangup(tty);
-#else
-       struct tty_struct *tty = arg;
-       struct task_struct *g, *p;
-       int session;
-       int             i;
-       struct file     *filp;
-       struct tty_ldisc *disc;
-       struct fdtable *fdt;
-       
-       if (!tty)
-               return;
-       session  = tty->session;
-       
-       /* We don't want an ldisc switch during this */
-       disc = tty_ldisc_ref(tty);
-       if (disc && disc->flush_buffer)
-               disc->flush_buffer(tty);
-       tty_ldisc_deref(disc);
-
-       if (tty->driver->flush_buffer)
-               tty->driver->flush_buffer(tty);
-       
-       read_lock(&tasklist_lock);
-       /* Kill the entire session */
-       do_each_task_pid(session, PIDTYPE_SID, p) {
-               printk(KERN_NOTICE "SAK: killed process %d"
-                       " (%s): p->signal->session==tty->session\n",
-                       p->pid, p->comm);
-               send_sig(SIGKILL, p, 1);
-       } while_each_task_pid(session, PIDTYPE_SID, p);
-       /* Now kill any processes that happen to have the
-        * tty open.
-        */
-       do_each_thread(g, p) {
-               if (p->signal->tty == tty) {
-                       printk(KERN_NOTICE "SAK: killed process %d"
-                           " (%s): p->signal->session==tty->session\n",
-                           p->pid, p->comm);
-                       send_sig(SIGKILL, p, 1);
-                       continue;
-               }
-               task_lock(p);
-               if (p->files) {
-                       /*
-                        * We don't take a ref to the file, so we must
-                        * hold ->file_lock instead.
-                        */
-                       spin_lock(&p->files->file_lock);
-                       fdt = files_fdtable(p->files);
-                       for (i=0; i < fdt->max_fds; i++) {
-                               filp = fcheck_files(p->files, i);
-                               if (!filp)
-                                       continue;
-                               if (filp->f_op->read == tty_read &&
-                                   filp->private_data == tty) {
-                                       printk(KERN_NOTICE "SAK: killed process %d"
-                                           " (%s): fd#%d opened to the tty\n",
-                                           p->pid, p->comm, i);
-                                       force_sig(SIGKILL, p);
-                                       break;
-                               }
-                       }
-                       spin_unlock(&p->files->file_lock);
-               }
-               task_unlock(p);
-       } while_each_thread(g, p);
-       read_unlock(&tasklist_lock);
-#endif
-}
-
-/*
- * The tq handling here is a little racy - tty->SAK_work may already be queued.
- * Fortunately we don't need to worry, because if ->SAK_work is already queued,
- * the values which we write to it will be identical to the values which it
- * already has. --akpm
- */
-void do_SAK(struct tty_struct *tty)
-{
-       if (!tty)
-               return;
-       PREPARE_WORK(&tty->SAK_work, __do_SAK, tty);
-       schedule_work(&tty->SAK_work);
-}
-
-EXPORT_SYMBOL(do_SAK);
-
-/**
- *     flush_to_ldisc
- *     @private_: tty structure passed from work queue.
- *
- *     This routine is called out of the software interrupt to flush data
- *     from the buffer chain to the line discipline.
- *
- *     Locking: holds tty->buf.lock to guard buffer list. Drops the lock
- *     while invoking the line discipline receive_buf method. The
- *     receive_buf method is single threaded for each tty instance.
- */
-static void flush_to_ldisc(void *private_)
-{
-       struct tty_struct *tty = (struct tty_struct *) private_;
-       unsigned long   flags;
-       struct tty_ldisc *disc;
-       struct tty_buffer *tbuf, *head;
-       char *char_buf;
-       unsigned char *flag_buf;
-
-       disc = tty_ldisc_ref(tty);
-       if (disc == NULL)       /*  !TTY_LDISC */
-               return;
-
-       spin_lock_irqsave(&tty->buf.lock, flags);
-       head = tty->buf.head;
-       if (head != NULL) {
-               tty->buf.head = NULL;
-               for (;;) {
-                       int count = head->commit - head->read;
-                       if (!count) {
-                               if (head->next == NULL)
-                                       break;
-                               tbuf = head;
-                               head = head->next;
-                               tty_buffer_free(tty, tbuf);
-                               continue;
-                       }
-                       if (!tty->receive_room) {
-                               schedule_delayed_work(&tty->buf.work, 1);
-                               break;
-                       }
-                       if (count > tty->receive_room)
-                               count = tty->receive_room;
-                       char_buf = head->char_buf_ptr + head->read;
-                       flag_buf = head->flag_buf_ptr + head->read;
-                       head->read += count;
-                       spin_unlock_irqrestore(&tty->buf.lock, flags);
-                       disc->receive_buf(tty, char_buf, flag_buf, count);
-                       spin_lock_irqsave(&tty->buf.lock, flags);
-               }
-               tty->buf.head = head;
-       }
-       spin_unlock_irqrestore(&tty->buf.lock, flags);
-
-       tty_ldisc_deref(disc);
-}
-
-/*
- * Routine which returns the baud rate of the tty
- *
- * Note that the baud_table needs to be kept in sync with the
- * include/asm/termbits.h file.
- */
-static int baud_table[] = {
-       0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-       9600, 19200, 38400, 57600, 115200, 230400, 460800,
-#ifdef __sparc__
-       76800, 153600, 307200, 614400, 921600
-#else
-       500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
-       2500000, 3000000, 3500000, 4000000
-#endif
-};
-
-static int n_baud_table = ARRAY_SIZE(baud_table);
-
-/**
- *     tty_termios_baud_rate
- *     @termios: termios structure
- *
- *     Convert termios baud rate data into a speed. This should be called
- *     with the termios lock held if this termios is a terminal termios
- *     structure. May change the termios data.
- *
- *     Locking: none
- */
-int tty_termios_baud_rate(struct termios *termios)
-{
-       unsigned int cbaud;
-       
-       cbaud = termios->c_cflag & CBAUD;
-
-       if (cbaud & CBAUDEX) {
-               cbaud &= ~CBAUDEX;
-
-               if (cbaud < 1 || cbaud + 15 > n_baud_table)
-                       termios->c_cflag &= ~CBAUDEX;
-               else
-                       cbaud += 15;
-       }
-       return baud_table[cbaud];
-}
-
-EXPORT_SYMBOL(tty_termios_baud_rate);
-
-/**
- *     tty_get_baud_rate       -       get tty bit rates
- *     @tty: tty to query
- *
- *     Returns the baud rate as an integer for this terminal. The
- *     termios lock must be held by the caller and the terminal bit
- *     flags may be updated.
- *
- *     Locking: none
- */
-int tty_get_baud_rate(struct tty_struct *tty)
-{
-       int baud = tty_termios_baud_rate(tty->termios);
-
-       if (baud == 38400 && tty->alt_speed) {
-               if (!tty->warned) {
-                       printk(KERN_WARNING "Use of setserial/setrocket to "
-                                           "set SPD_* flags is deprecated\n");
-                       tty->warned = 1;
-               }
-               baud = tty->alt_speed;
-       }
-       
-       return baud;
-}
-
-EXPORT_SYMBOL(tty_get_baud_rate);
-
-/**
- *     tty_flip_buffer_push    -       terminal
- *     @tty: tty to push
- *
- *     Queue a push of the terminal flip buffers to the line discipline. This
- *     function must not be called from IRQ context if tty->low_latency is set.
- *
- *     In the event of the queue being busy for flipping the work will be
- *     held off and retried later.
- *
- *     Locking: tty buffer lock. Driver locks in low latency mode.
- */
-
-void tty_flip_buffer_push(struct tty_struct *tty)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&tty->buf.lock, flags);
-       if (tty->buf.tail != NULL)
-               tty->buf.tail->commit = tty->buf.tail->used;
-       spin_unlock_irqrestore(&tty->buf.lock, flags);
-
-       if (tty->low_latency)
-               flush_to_ldisc((void *) tty);
-       else
-               schedule_delayed_work(&tty->buf.work, 1);
-}
-
-EXPORT_SYMBOL(tty_flip_buffer_push);
-
-
-/**
- *     initialize_tty_struct
- *     @tty: tty to initialize
- *
- *     This subroutine initializes a tty structure that has been newly
- *     allocated.
- *
- *     Locking: none - tty in question must not be exposed at this point
- */
-
-static void initialize_tty_struct(struct tty_struct *tty)
-{
-       memset(tty, 0, sizeof(struct tty_struct));
-       tty->magic = TTY_MAGIC;
-       tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-       tty->pgrp = -1;
-       tty->overrun_time = jiffies;
-       tty->buf.head = tty->buf.tail = NULL;
-       tty_buffer_init(tty);
-       INIT_WORK(&tty->buf.work, flush_to_ldisc, tty);
-       init_MUTEX(&tty->buf.pty_sem);
-       init_MUTEX(&tty->termios_sem);
-       init_waitqueue_head(&tty->write_wait);
-       init_waitqueue_head(&tty->read_wait);
-       INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
-       mutex_init(&tty->atomic_read_lock);
-       mutex_init(&tty->atomic_write_lock);
-       spin_lock_init(&tty->read_lock);
-       INIT_LIST_HEAD(&tty->tty_files);
-       INIT_WORK(&tty->SAK_work, NULL, NULL);
-}
-
-/*
- * The default put_char routine if the driver did not define one.
- */
-
-static void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
-{
-       tty->driver->write(tty, &ch, 1);
-}
-
-static struct class *tty_class;
-
-/**
- *     tty_register_device - register a tty device
- *     @driver: the tty driver that describes the tty device
- *     @index: the index in the tty driver for this tty device
- *     @device: a struct device that is associated with this tty device.
- *             This field is optional, if there is no known struct device
- *             for this tty device it can be set to NULL safely.
- *
- *     Returns a pointer to the class device (or ERR_PTR(-EFOO) on error).
- *
- *     This call is required to be made to register an individual tty device
- *     if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set.  If
- *     that bit is not set, this function should not be called by a tty
- *     driver.
- *
- *     Locking: ??
- */
-
-struct class_device *tty_register_device(struct tty_driver *driver,
-                                        unsigned index, struct device *device)
-{
-       char name[64];
-       dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
-
-       if (index >= driver->num) {
-               printk(KERN_ERR "Attempt to register invalid tty line number "
-                      " (%d).\n", index);
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (driver->type == TTY_DRIVER_TYPE_PTY)
-               pty_line_name(driver, index, name);
-       else
-               tty_line_name(driver, index, name);
-
-       return class_device_create(tty_class, NULL, dev, device, "%s", name);
-}
-
-/**
- *     tty_unregister_device - unregister a tty device
- *     @driver: the tty driver that describes the tty device
- *     @index: the index in the tty driver for this tty device
- *
- *     If a tty device is registered with a call to tty_register_device() then
- *     this function must be called when the tty device is gone.
- *
- *     Locking: ??
- */
-
-void tty_unregister_device(struct tty_driver *driver, unsigned index)
-{
-       class_device_destroy(tty_class, MKDEV(driver->major, driver->minor_start) + index);
-}
-
-EXPORT_SYMBOL(tty_register_device);
-EXPORT_SYMBOL(tty_unregister_device);
-
-struct tty_driver *alloc_tty_driver(int lines)
-{
-       struct tty_driver *driver;
-
-       driver = kmalloc(sizeof(struct tty_driver), GFP_KERNEL);
-       if (driver) {
-               memset(driver, 0, sizeof(struct tty_driver));
-               driver->magic = TTY_DRIVER_MAGIC;
-               driver->num = lines;
-               /* later we'll move allocation of tables here */
-       }
-       return driver;
-}
-
-void put_tty_driver(struct tty_driver *driver)
-{
-       kfree(driver);
-}
-
-void tty_set_operations(struct tty_driver *driver, struct tty_operations *op)
-{
-       driver->open = op->open;
-       driver->close = op->close;
-       driver->write = op->write;
-       driver->put_char = op->put_char;
-       driver->flush_chars = op->flush_chars;
-       driver->write_room = op->write_room;
-       driver->chars_in_buffer = op->chars_in_buffer;
-       driver->ioctl = op->ioctl;
-       driver->set_termios = op->set_termios;
-       driver->throttle = op->throttle;
-       driver->unthrottle = op->unthrottle;
-       driver->stop = op->stop;
-       driver->start = op->start;
-       driver->hangup = op->hangup;
-       driver->break_ctl = op->break_ctl;
-       driver->flush_buffer = op->flush_buffer;
-       driver->set_ldisc = op->set_ldisc;
-       driver->wait_until_sent = op->wait_until_sent;
-       driver->send_xchar = op->send_xchar;
-       driver->read_proc = op->read_proc;
-       driver->write_proc = op->write_proc;
-       driver->tiocmget = op->tiocmget;
-       driver->tiocmset = op->tiocmset;
-}
-
-
-EXPORT_SYMBOL(alloc_tty_driver);
-EXPORT_SYMBOL(put_tty_driver);
-EXPORT_SYMBOL(tty_set_operations);
-
-/*
- * Called by a tty driver to register itself.
- */
-int tty_register_driver(struct tty_driver *driver)
-{
-       int error;
-        int i;
-       dev_t dev;
-       void **p = NULL;
-
-       if (driver->flags & TTY_DRIVER_INSTALLED)
-               return 0;
-
-       if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
-               p = kmalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
-               if (!p)
-                       return -ENOMEM;
-               memset(p, 0, driver->num * 3 * sizeof(void *));
-       }
-
-       if (!driver->major) {
-               error = alloc_chrdev_region(&dev, driver->minor_start, driver->num,
-                                               (char*)driver->name);
-               if (!error) {
-                       driver->major = MAJOR(dev);
-                       driver->minor_start = MINOR(dev);
-               }
-       } else {
-               dev = MKDEV(driver->major, driver->minor_start);
-               error = register_chrdev_region(dev, driver->num,
-                                               (char*)driver->name);
-       }
-       if (error < 0) {
-               kfree(p);
-               return error;
-       }
-
-       if (p) {
-               driver->ttys = (struct tty_struct **)p;
-               driver->termios = (struct termios **)(p + driver->num);
-               driver->termios_locked = (struct termios **)(p + driver->num * 2);
-       } else {
-               driver->ttys = NULL;
-               driver->termios = NULL;
-               driver->termios_locked = NULL;
-       }
-
-       cdev_init(&driver->cdev, &tty_fops);
-       driver->cdev.owner = driver->owner;
-       error = cdev_add(&driver->cdev, dev, driver->num);
-       if (error) {
-               unregister_chrdev_region(dev, driver->num);
-               driver->ttys = NULL;
-               driver->termios = driver->termios_locked = NULL;
-               kfree(p);
-               return error;
-       }
-
-       if (!driver->put_char)
-               driver->put_char = tty_default_put_char;
-       
-       list_add(&driver->tty_drivers, &tty_drivers);
-       
-       if ( !(driver->flags & TTY_DRIVER_DYNAMIC_DEV) ) {
-               for(i = 0; i < driver->num; i++)
-                   tty_register_device(driver, i, NULL);
-       }
-       proc_tty_register_driver(driver);
-       return 0;
-}
-
-EXPORT_SYMBOL(tty_register_driver);
-
-/*
- * Called by a tty driver to unregister itself.
- */
-int tty_unregister_driver(struct tty_driver *driver)
-{
-       int i;
-       struct termios *tp;
-       void *p;
-
-       if (driver->refcount)
-               return -EBUSY;
-
-       unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
-                               driver->num);
-
-       list_del(&driver->tty_drivers);
-
-       /*
-        * Free the termios and termios_locked structures because
-        * we don't want to get memory leaks when modular tty
-        * drivers are removed from the kernel.
-        */
-       for (i = 0; i < driver->num; i++) {
-               tp = driver->termios[i];
-               if (tp) {
-                       driver->termios[i] = NULL;
-                       kfree(tp);
-               }
-               tp = driver->termios_locked[i];
-               if (tp) {
-                       driver->termios_locked[i] = NULL;
-                       kfree(tp);
-               }
-               if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
-                       tty_unregister_device(driver, i);
-       }
-       p = driver->ttys;
-       proc_tty_unregister_driver(driver);
-       driver->ttys = NULL;
-       driver->termios = driver->termios_locked = NULL;
-       kfree(p);
-       cdev_del(&driver->cdev);
-       return 0;
-}
-
-EXPORT_SYMBOL(tty_unregister_driver);
-
-
-/*
- * Initialize the console device. This is called *early*, so
- * we can't necessarily depend on lots of kernel help here.
- * Just do some early initializations, and do the complex setup
- * later.
- */
-void __init console_init(void)
-{
-       initcall_t *call;
-
-       /* Setup the default TTY line discipline. */
-       (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
-
-       /*
-        * set up the console device so that later boot sequences can 
-        * inform about problems etc..
-        */
-#ifdef CONFIG_EARLY_PRINTK
-       disable_early_printk();
-#endif
-       call = __con_initcall_start;
-       while (call < __con_initcall_end) {
-               (*call)();
-               call++;
-       }
-}
-
-#ifdef CONFIG_VT
-extern int vty_init(void);
-#endif
-
-static int __init tty_class_init(void)
-{
-       tty_class = class_create(THIS_MODULE, "tty");
-       if (IS_ERR(tty_class))
-               return PTR_ERR(tty_class);
-       return 0;
-}
-
-postcore_initcall(tty_class_init);
-
-/* 3/2004 jmc: why do these devices exist? */
-
-static struct cdev tty_cdev, console_cdev;
-#ifdef CONFIG_UNIX98_PTYS
-static struct cdev ptmx_cdev;
-#endif
-#ifdef CONFIG_VT
-static struct cdev vc0_cdev;
-#endif
-
-/*
- * Ok, now we can initialize the rest of the tty devices and can count
- * on memory allocations, interrupts etc..
- */
-static int __init tty_init(void)
-{
-       cdev_init(&tty_cdev, &tty_fops);
-       if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
-           register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
-               panic("Couldn't register /dev/tty driver\n");
-       class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
-
-       cdev_init(&console_cdev, &console_fops);
-       if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
-           register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
-               panic("Couldn't register /dev/console driver\n");
-       class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
-
-#ifdef CONFIG_UNIX98_PTYS
-       cdev_init(&ptmx_cdev, &ptmx_fops);
-       if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
-           register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
-               panic("Couldn't register /dev/ptmx driver\n");
-       class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
-#endif
-
-#ifdef CONFIG_VT
-       if (!console_use_vt)
-               goto out_vt;
-       cdev_init(&vc0_cdev, &console_fops);
-       if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
-           register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
-               panic("Couldn't register /dev/tty0 driver\n");
-       class_device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
-
-       vty_init();
- out_vt:
-#endif
-       return 0;
-}
-module_init(tty_init);
diff --git a/linux-2.6-xen-sparse/drivers/firmware/Kconfig b/linux-2.6-xen-sparse/drivers/firmware/Kconfig
deleted file mode 100644 (file)
index a444f63..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-
-menu "Firmware Drivers"
-
-config EDD
-       tristate "BIOS Enhanced Disk Drive calls determine boot disk"
-       depends on !IA64
-       depends on !XEN
-       help
-         Say Y or M here if you want to enable BIOS Enhanced Disk Drive
-         Services real mode BIOS calls to determine which disk
-         BIOS tries boot from.  This information is then exported via sysfs.
-
-         This option is experimental and is known to fail to boot on some
-          obscure configurations. Most disk controller BIOS vendors do
-          not yet implement this feature.
-
-config EFI_VARS
-       tristate "EFI Variable Support via sysfs"
-       depends on EFI
-       default n
-       help
-         If you say Y here, you are able to get EFI (Extensible Firmware
-         Interface) variable information via sysfs.  You may read,
-         write, create, and destroy EFI variables through this interface.
-
-         Note that using this driver in concert with efibootmgr requires
-         at least test release version 0.5.0-test3 or later, which is
-         available from Matt Domsch's website located at:
-         <http://linux.dell.com/efibootmgr/testing/efibootmgr-0.5.0-test3.tar.gz>
-
-         Subsequent efibootmgr releases may be found at:
-         <http://linux.dell.com/efibootmgr>
-
-config EFI_PCDP
-       bool "Console device selection via EFI PCDP or HCDP table"
-       depends on ACPI && EFI && IA64
-       default y if IA64
-       help
-         If your firmware supplies the PCDP table, and you want to
-         automatically use the primary console device it describes
-         as the Linux console, say Y here.
-
-         If your firmware supplies the HCDP table, and you want to
-         use the first serial port it describes as the Linux console,
-         say Y here.  If your EFI ConOut path contains only a UART
-         device, it will become the console automatically.  Otherwise,
-         you must specify the "console=hcdp" kernel boot argument.
-
-         Neither the PCDP nor the HCDP affects naming of serial devices,
-         so a serial console may be /dev/ttyS0, /dev/ttyS1, etc, depending
-         on how the driver discovers devices.
-
-         You must also enable the appropriate drivers (serial, VGA, etc.)
-
-         See <http://www.dig64.org/specifications/DIG64_HCDPv20_042804.pdf>
-
-config DELL_RBU
-       tristate "BIOS update support for DELL systems via sysfs"
-       depends on X86
-       select FW_LOADER
-       help
-        Say m if you want to have the option of updating the BIOS for your
-        DELL system. Note you need a Dell OpenManage or Dell Update package (DUP)
-        supporting application to comunicate with the BIOS regarding the new
-        image for the image update to take effect.
-        See <file:Documentation/dell_rbu.txt> for more details on the driver.
-
-config DCDBAS
-       tristate "Dell Systems Management Base Driver"
-       depends on X86
-       help
-         The Dell Systems Management Base Driver provides a sysfs interface
-         for systems management software to perform System Management
-         Interrupts (SMIs) and Host Control Actions (system power cycle or
-         power off after OS shutdown) on certain Dell systems.
-
-         See <file:Documentation/dcdbas.txt> for more details on the driver
-         and the Dell systems on which Dell systems management software makes
-         use of this driver.
-
-         Say Y or M here to enable the driver for use by Dell systems
-         management software such as Dell OpenManage.
-
-endmenu
diff --git a/linux-2.6-xen-sparse/drivers/pci/Kconfig b/linux-2.6-xen-sparse/drivers/pci/Kconfig
deleted file mode 100644 (file)
index 065ea43..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# PCI configuration
-#
-config PCI_MSI
-       bool "Message Signaled Interrupts (MSI and MSI-X)"
-       depends on PCI
-       depends on (X86_LOCAL_APIC && X86_IO_APIC) || IA64
-       depends on !XEN
-       help
-          This allows device drivers to enable MSI (Message Signaled
-          Interrupts).  Message Signaled Interrupts enable a device to
-          generate an interrupt using an inbound Memory Write on its
-          PCI bus instead of asserting a device IRQ pin.
-
-          Use of PCI MSI interrupts can be disabled at kernel boot time
-          by using the 'pci=nomsi' option.  This disables MSI for the
-          entire system.
-
-          If you don't know what to do here, say N.
-
-config PCI_DEBUG
-       bool "PCI Debugging"
-       depends on PCI && DEBUG_KERNEL
-       help
-         Say Y here if you want the PCI core to produce a bunch of debug
-         messages to the system log.  Select this if you are having a
-         problem with PCI support and want to see more of what is going on.
-
-         When in doubt, say N.
-
diff --git a/linux-2.6-xen-sparse/drivers/serial/Kconfig b/linux-2.6-xen-sparse/drivers/serial/Kconfig
deleted file mode 100644 (file)
index 48f0eef..0000000
+++ /dev/null
@@ -1,963 +0,0 @@
-#
-# Serial device configuration
-#
-# $Id: Kconfig,v 1.11 2004/03/11 18:08:04 lethal Exp $
-#
-
-menu "Serial drivers"
-
-#
-# The new 8250/16550 serial drivers
-config SERIAL_8250
-       tristate "8250/16550 and compatible serial support"
-       depends on (BROKEN || !SPARC)
-       depends on !XEN_DISABLE_SERIAL
-       select SERIAL_CORE
-       ---help---
-         This selects whether you want to include the driver for the standard
-         serial ports.  The standard answer is Y.  People who might say N
-         here are those that are setting up dedicated Ethernet WWW/FTP
-         servers, or users that have one of the various bus mice instead of a
-         serial mouse and don't intend to use their machine's standard serial
-         port for anything.  (Note that the Cyclades and Stallion multi
-         serial port drivers do not need this driver built in for them to
-         work.)
-
-         To compile this driver as a module, choose M here: the
-         module will be called 8250.
-         [WARNING: Do not compile this driver as a module if you are using
-         non-standard serial ports, since the configuration information will
-         be lost when the driver is unloaded.  This limitation may be lifted
-         in the future.]
-
-         BTW1: If you have a mouseman serial mouse which is not recognized by
-         the X window system, try running gpm first.
-
-         BTW2: If you intend to use a software modem (also called Winmodem)
-         under Linux, forget it.  These modems are crippled and require
-         proprietary drivers which are only available under Windows.
-
-         Most people will say Y or M here, so that they can use serial mice,
-         modems and similar devices connecting to the standard serial ports.
-
-config SERIAL_8250_CONSOLE
-       bool "Console on 8250/16550 and compatible serial port"
-       depends on SERIAL_8250=y
-       select SERIAL_CORE_CONSOLE
-       ---help---
-         If you say Y here, it will be possible to use a serial port as the
-         system console (the system console is the device which receives all
-         kernel messages and warnings and which allows logins in single user
-         mode). This could be useful if some terminal or printer is connected
-         to that serial port.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyS1". (Try "man bootparam" or see the documentation of
-         your boot loader (grub or lilo or loadlin) about how to pass options
-         to the kernel at boot time.)
-
-         If you don't have a VGA card installed and you say Y here, the
-         kernel will automatically use the first serial line, /dev/ttyS0, as
-         system console.
-
-         If unsure, say N.
-
-config SERIAL_8250_GSC
-       tristate
-       depends on SERIAL_8250 && GSC
-       default SERIAL_8250
-
-config SERIAL_8250_PCI
-       tristate "8250/16550 PCI device support" if EMBEDDED
-       depends on SERIAL_8250 && PCI
-       default SERIAL_8250
-       help
-         This builds standard PCI serial support. You may be able to
-         disable this feature if you only need legacy serial support.
-         Saves about 9K.
-
-config SERIAL_8250_PNP
-       tristate "8250/16550 PNP device support" if EMBEDDED
-       depends on SERIAL_8250 && PNP
-       default SERIAL_8250
-       help
-         This builds standard PNP serial support. You may be able to
-         disable this feature if you only need legacy serial support.
-
-config SERIAL_8250_HP300
-       tristate
-       depends on SERIAL_8250 && HP300
-       default SERIAL_8250
-
-config SERIAL_8250_CS
-       tristate "8250/16550 PCMCIA device support"
-       depends on PCMCIA && SERIAL_8250
-       ---help---
-         Say Y here to enable support for 16-bit PCMCIA serial devices,
-         including serial port cards, modems, and the modem functions of
-         multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
-         credit-card size devices often used with laptops.)
-
-         To compile this driver as a module, choose M here: the
-         module will be called serial_cs.
-
-         If unsure, say N.
-
-config SERIAL_8250_NR_UARTS
-       int "Maximum number of 8250/16550 serial ports"
-       depends on SERIAL_8250
-       default "4"
-       help
-         Set this to the number of serial ports you want the driver
-         to support.  This includes any ports discovered via ACPI or
-         PCI enumeration and any ports that may be added at run-time
-         via hot-plug, or any ISA multi-port serial cards.
-
-config SERIAL_8250_RUNTIME_UARTS
-       int "Number of 8250/16550 serial ports to register at runtime"
-       depends on SERIAL_8250
-       range 0 SERIAL_8250_NR_UARTS
-       default "4"
-       help
-         Set this to the maximum number of serial ports you want
-         the kernel to register at boot time.  This can be overriden
-         with the module parameter "nr_uarts", or boot-time parameter
-         8250.nr_uarts
-
-config SERIAL_8250_EXTENDED
-       bool "Extended 8250/16550 serial driver options"
-       depends on SERIAL_8250
-       help
-         If you wish to use any non-standard features of the standard "dumb"
-         driver, say Y here. This includes HUB6 support, shared serial
-         interrupts, special multiport support, support for more than the
-         four COM 1/2/3/4 boards, etc.
-
-         Note that the answer to this question won't directly affect the
-         kernel: saying N will just cause the configurator to skip all
-         the questions about serial driver options. If unsure, say N.
-
-config SERIAL_8250_MANY_PORTS
-       bool "Support more than 4 legacy serial ports"
-       depends on SERIAL_8250_EXTENDED && !IA64
-       help
-         Say Y here if you have dumb serial boards other than the four
-         standard COM 1/2/3/4 ports. This may happen if you have an AST
-         FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
-         from <http://www.tldp.org/docs.html#howto>), or other custom
-         serial port hardware which acts similar to standard serial port
-         hardware. If you only use the standard COM 1/2/3/4 ports, you can
-         say N here to save some memory. You can also say Y if you have an
-         "intelligent" multiport card such as Cyclades, Digiboards, etc.
-
-config SERIAL_8250_SHARE_IRQ
-       bool "Support for sharing serial interrupts"
-       depends on SERIAL_8250_EXTENDED
-       help
-         Some serial boards have hardware support which allows multiple dumb
-         serial ports on the same board to share a single IRQ. To enable
-         support for this in the serial driver, say Y here.
-
-config SERIAL_8250_DETECT_IRQ
-       bool "Autodetect IRQ on standard ports (unsafe)"
-       depends on SERIAL_8250_EXTENDED
-       help
-         Say Y here if you want the kernel to try to guess which IRQ
-         to use for your serial port.
-
-         This is considered unsafe; it is far better to configure the IRQ in
-         a boot script using the setserial command.
-
-         If unsure, say N.
-
-config SERIAL_8250_RSA
-       bool "Support RSA serial ports"
-       depends on SERIAL_8250_EXTENDED
-       help
-         ::: To be written :::
-
-#
-# Multi-port serial cards
-#
-
-config SERIAL_8250_FOURPORT
-       tristate "Support Fourport cards"
-       depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
-       help
-         Say Y here if you have an AST FourPort serial board.
-
-         To compile this driver as a module, choose M here: the module
-         will be called 8250_fourport.
-
-config SERIAL_8250_ACCENT
-       tristate "Support Accent cards"
-       depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
-       help
-         Say Y here if you have an Accent Async serial board.
-
-         To compile this driver as a module, choose M here: the module
-         will be called 8250_accent.
-
-
-config SERIAL_8250_BOCA
-       tristate "Support Boca cards"
-       depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
-       help
-         Say Y here if you have a Boca serial board.  Please read the Boca
-         mini-HOWTO, avaialble from <http://www.tldp.org/docs.html#howto>
-
-         To compile this driver as a module, choose M here: the module
-         will be called 8250_boca.
-
-config SERIAL_8250_HUB6
-       tristate "Support Hub6 cards"
-       depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
-       help
-         Say Y here if you have a HUB6 serial board.
-
-         To compile this driver as a module, choose M here: the module
-         will be called 8250_hub6.
-
-config SERIAL_8250_MCA
-       tristate "Support 8250-type ports on MCA buses"
-       depends on SERIAL_8250 != n && MCA
-       help
-         Say Y here if you have a MCA serial ports.
-
-         To compile this driver as a module, choose M here: the module
-         will be called 8250_mca.
-
-config SERIAL_8250_ACORN
-       tristate "Acorn expansion card serial port support"
-       depends on ARCH_ACORN && SERIAL_8250
-       help
-         If you have an Atomwide Serial card or Serial Port card for an Acorn
-         system, say Y to this option.  The driver can handle 1, 2, or 3 port
-         cards.  If unsure, say N.
-
-config SERIAL_8250_AU1X00
-       bool "AU1X00 serial port support"
-       depends on SERIAL_8250 != n && SOC_AU1X00
-       help
-         If you have an Au1x00 board and want to use the serial port, say Y
-         to this option.  The driver can handle 1 or 2 serial ports.
-         If unsure, say N.
-
-comment "Non-8250 serial port support"
-
-config SERIAL_AMBA_PL010
-       tristate "ARM AMBA PL010 serial port support"
-       depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE)
-       select SERIAL_CORE
-       help
-         This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
-         an Integrator/AP or Integrator/PP2 platform, say Y or M here.
-
-         If unsure, say N.
-
-config SERIAL_AMBA_PL010_CONSOLE
-       bool "Support for console on AMBA serial port"
-       depends on SERIAL_AMBA_PL010=y
-       select SERIAL_CORE_CONSOLE
-       ---help---
-         Say Y here if you wish to use an AMBA PrimeCell UART as the system
-         console (the system console is the device which receives all kernel
-         messages and warnings and which allows logins in single user mode).
-
-         Even if you say Y here, the currently visible framebuffer console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyAM0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_AMBA_PL011
-       tristate "ARM AMBA PL011 serial port support"
-       depends on ARM_AMBA
-       select SERIAL_CORE
-       help
-         This selects the ARM(R) AMBA(R) PrimeCell PL011 UART.  If you have
-         an Integrator/PP2, Integrator/CP or Versatile platform, say Y or M
-         here.
-
-         If unsure, say N.
-
-config SERIAL_AMBA_PL011_CONSOLE
-       bool "Support for console on AMBA serial port"
-       depends on SERIAL_AMBA_PL011=y
-       select SERIAL_CORE_CONSOLE
-       ---help---
-         Say Y here if you wish to use an AMBA PrimeCell UART as the system
-         console (the system console is the device which receives all kernel
-         messages and warnings and which allows logins in single user mode).
-
-         Even if you say Y here, the currently visible framebuffer console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyAM0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_AT91
-       bool "AT91RM9200 / AT91SAM9261 serial port support"
-       depends on ARM && (ARCH_AT91RM9200 || ARCH_AT91SAM9261)
-       select SERIAL_CORE
-       help
-         This enables the driver for the on-chip UARTs of the Atmel
-         AT91RM9200 and AT91SAM926 processor.
-
-config SERIAL_AT91_CONSOLE
-       bool "Support for console on AT91RM9200 / AT91SAM9261 serial port"
-       depends on SERIAL_AT91=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Say Y here if you wish to use a UART on the Atmel AT91RM9200 or
-         AT91SAM9261 as the system console (the system console is the device
-         which receives all kernel messages and warnings and which allows
-         logins in single user mode).
-
-config SERIAL_AT91_TTYAT
-       bool "Install as device ttyAT0-4 instead of ttyS0-4"
-       depends on SERIAL_AT91=y
-       help
-         Say Y here if you wish to have the five internal AT91RM9200 UARTs
-         appear as /dev/ttyAT0-4 (major 204, minor 154-158) instead of the
-         normal /dev/ttyS0-4 (major 4, minor 64-68). This is necessary if
-         you also want other UARTs, such as external 8250/16C550 compatible
-         UARTs.
-         The ttySn nodes are legally reserved for the 8250 serial driver
-         but are often misused by other serial drivers.
-
-         To use this, you should create suitable ttyATn device nodes in
-         /dev/, and pass "console=ttyATn" to the kernel.
-
-         Say Y if you have an external 8250/16C550 UART.  If unsure, say N.
-
-config SERIAL_CLPS711X
-       tristate "CLPS711X serial port support"
-       depends on ARM && ARCH_CLPS711X
-       select SERIAL_CORE
-       help
-         ::: To be written :::
-
-config SERIAL_CLPS711X_CONSOLE
-       bool "Support for console on CLPS711X serial port"
-       depends on SERIAL_CLPS711X=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyCL1". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_S3C2410
-       tristate "Samsung S3C2410/S3C2440/S3C2442/S3C2412 Serial port support"
-       depends on ARM && ARCH_S3C2410
-       select SERIAL_CORE
-       help
-         Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
-         providing /dev/ttySAC0, 1 and 2 (note, some machines may not
-         provide all of these ports, depending on how the serial port
-         pins are configured.
-
-         Currently this driver supports the UARTS on the S3C2410, S3C2440,
-         S3C2442, S3C2412 and S3C2413 CPUs.
-
-config SERIAL_S3C2410_CONSOLE
-       bool "Support for console on S3C2410 serial port"
-       depends on SERIAL_S3C2410=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Allow selection of the S3C24XX on-board serial ports for use as
-         an virtual console.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttySACx". (Try "man bootparam" or see the documentation of
-         your boot loader about how to pass options to the kernel at
-         boot time.)
-
-config SERIAL_DZ
-       bool "DECstation DZ serial driver"
-       depends on MACH_DECSTATION && 32BIT
-       select SERIAL_CORE
-       help
-         DZ11-family serial controllers for VAXstations, including the
-         DC7085, M7814, and M7819.
-
-config SERIAL_DZ_CONSOLE
-       bool "Support console on DECstation DZ serial driver"
-       depends on SERIAL_DZ=y
-       select SERIAL_CORE_CONSOLE
-       help
-         If you say Y here, it will be possible to use a serial port as the
-         system console (the system console is the device which receives all
-         kernel messages and warnings and which allows logins in single user
-         mode).  Note that the firmware uses ttyS0 as the serial console on
-         the Maxine and ttyS2 on the others.
-
-         If unsure, say Y.
-
-config SERIAL_21285
-       tristate "DC21285 serial port support"
-       depends on ARM && FOOTBRIDGE
-       select SERIAL_CORE
-       help
-         If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
-         PCI bridge you can enable its onboard serial port by enabling this
-         option.
-
-config SERIAL_21285_CONSOLE
-       bool "Console on DC21285 serial port"
-       depends on SERIAL_21285=y
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have enabled the serial port on the 21285 footbridge you can
-         make it the console by answering Y to this option.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyFB". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_MPSC
-       bool "Marvell MPSC serial port support"
-       depends on PPC32 && MV64X60
-       select SERIAL_CORE
-       help
-         Say Y here if you want to use the Marvell MPSC serial controller.
-
-config SERIAL_MPSC_CONSOLE
-       bool "Support for console on Marvell MPSC serial port"
-       depends on SERIAL_MPSC
-       select SERIAL_CORE_CONSOLE
-       help
-         Say Y here if you want to support a serial console on a Marvell MPSC.
-
-config SERIAL_PXA
-       bool "PXA serial port support"
-       depends on ARM && ARCH_PXA
-       select SERIAL_CORE
-       help
-         If you have a machine based on an Intel XScale PXA2xx CPU you
-         can enable its onboard serial ports by enabling this option.
-
-config SERIAL_PXA_CONSOLE
-       bool "Console on PXA serial port"
-       depends on SERIAL_PXA
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have enabled the serial port on the Intel XScale PXA
-         CPU you can make it the console by answering Y to this option.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttySA0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_SA1100
-       bool "SA1100 serial port support"
-       depends on ARM && ARCH_SA1100
-       select SERIAL_CORE
-       help
-         If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
-         can enable its onboard serial port by enabling this option.
-         Please read <file:Documentation/arm/SA1100/serial_UART> for further
-         info.
-
-config SERIAL_SA1100_CONSOLE
-       bool "Console on SA1100 serial port"
-       depends on SERIAL_SA1100
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have enabled the serial port on the SA1100/SA1110 StrongARM
-         CPU you can make it the console by answering Y to this option.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttySA0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_IMX
-       bool "IMX serial port support"
-       depends on ARM && ARCH_IMX
-       select SERIAL_CORE
-       help
-         If you have a machine based on a Motorola IMX CPU you
-         can enable its onboard serial port by enabling this option.
-
-config SERIAL_IMX_CONSOLE
-       bool "Console on IMX serial port"
-       depends on SERIAL_IMX
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have enabled the serial port on the Motorola IMX
-         CPU you can make it the console by answering Y to this option.
-
-         Even if you say Y here, the currently visible virtual console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttySA0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_SUNCORE
-       bool
-       depends on SPARC
-       select SERIAL_CORE
-       select SERIAL_CORE_CONSOLE
-       default y
-
-config SERIAL_SUNZILOG
-       tristate "Sun Zilog8530 serial support"
-       depends on SPARC
-       help
-         This driver supports the Zilog8530 serial ports found on many Sparc
-         systems.  Say Y or M if you want to be able to these serial ports.
-
-config SERIAL_SUNZILOG_CONSOLE
-       bool "Console on Sun Zilog8530 serial port"
-       depends on SERIAL_SUNZILOG=y
-       help
-         If you would like to be able to use the Zilog8530 serial port
-         on your Sparc system as the console, you can do so by answering
-         Y to this option.
-
-config SERIAL_SUNSU
-       tristate "Sun SU serial support"
-       depends on SPARC && PCI
-       help
-         This driver supports the 8250 serial ports that run the keyboard and
-         mouse on (PCI) UltraSPARC systems.  Say Y or M if you want to be able
-         to these serial ports.
-
-config SERIAL_SUNSU_CONSOLE
-       bool "Console on Sun SU serial port"
-       depends on SERIAL_SUNSU=y
-       help
-         If you would like to be able to use the SU serial port
-         on your Sparc system as the console, you can do so by answering
-         Y to this option.
-
-config SERIAL_MUX
-       tristate "Serial MUX support"
-       depends on GSC
-       select SERIAL_CORE
-       default y
-       ---help---
-         Saying Y here will enable the hardware MUX serial driver for
-         the Nova and K class systems.  The hardware MUX is not 8250/16550 
-         compatible therefore the /dev/ttyB0 device is shared between the 
-         Serial MUX and the PDC software console.  The following steps 
-         need to be completed to use the Serial MUX:
-
-           1. create the device entry (mknod /dev/ttyB0 c 11 0)
-           2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
-           3. Add device ttyB0 to /etc/securetty (if you want to log on as
-                root on this console.)
-           4. Change the kernel command console parameter to: console=ttyB0
-
-config SERIAL_MUX_CONSOLE
-        bool "Support for console on serial MUX"
-        depends on SERIAL_MUX
-       select SERIAL_CORE_CONSOLE
-        default y
-
-config PDC_CONSOLE
-       bool "PDC software console support"
-       depends on PARISC && !SERIAL_MUX && VT
-       default n
-       help
-         Saying Y here will enable the software based PDC console to be 
-         used as the system console.  This is useful for machines in 
-         which the hardware based console has not been written yet.  The
-         following steps must be competed to use the PDC console:
-
-           1. create the device entry (mknod /dev/ttyB0 c 11 0)
-           2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
-           3. Add device ttyB0 to /etc/securetty (if you want to log on as
-                root on this console.)
-           4. Change the kernel command console parameter to: console=ttyB0
-
-config SERIAL_SUNSAB
-       tristate "Sun Siemens SAB82532 serial support"
-       depends on SPARC && PCI
-       help
-         This driver supports the Siemens SAB82532 DUSCC serial ports on newer
-         (PCI) UltraSPARC systems.  Say Y or M if you want to be able to these
-         serial ports.
-
-config SERIAL_SUNSAB_CONSOLE
-       bool "Console on Sun Siemens SAB82532 serial port"
-       depends on SERIAL_SUNSAB=y
-       help
-         If you would like to be able to use the SAB82532 serial port
-         on your Sparc system as the console, you can do so by answering
-         Y to this option.
-
-config SERIAL_SUNHV
-       bool "Sun4v Hypervisor Console support"
-       depends on SPARC64
-       help
-         This driver supports the console device found on SUN4V Sparc
-         systems.  Say Y if you want to be able to use this device.
-
-config SERIAL_IP22_ZILOG
-       tristate "IP22 Zilog8530 serial support"
-       depends on SGI_IP22
-       select SERIAL_CORE
-       help
-         This driver supports the Zilog8530 serial ports found on SGI IP22
-         systems.  Say Y or M if you want to be able to these serial ports.
-
-config SERIAL_IP22_ZILOG_CONSOLE
-       bool "Console on IP22 Zilog8530 serial port"
-       depends on SERIAL_IP22_ZILOG=y
-       select SERIAL_CORE_CONSOLE
-
-config V850E_UART
-       bool "NEC V850E on-chip UART support"
-       depends on V850E_MA1 || V850E_ME2 || V850E_TEG || V850E2_ANNA || V850E_AS85EP1
-       select SERIAL_CORE
-       default y
-
-config V850E_UARTB
-        bool
-       depends V850E_UART && V850E_ME2
-       default y
-
-config V850E_UART_CONSOLE
-       bool "Use NEC V850E on-chip UART for console"
-       depends on V850E_UART
-       select SERIAL_CORE_CONSOLE
-
-config SERIAL_SH_SCI
-       tristate "SH SCI(F) serial port support"
-       depends on SUPERH || H8300
-       select SERIAL_CORE
-
-config SERIAL_SH_SCI_CONSOLE
-       bool "Support for console on SH SCI(F)"
-       depends on SERIAL_SH_SCI=y
-       select SERIAL_CORE_CONSOLE
-
-config SERIAL_CORE
-       tristate
-
-config SERIAL_CORE_CONSOLE
-       bool
-
-config SERIAL_68328
-       bool "68328 serial support"
-       depends on M68328 || M68EZ328 || M68VZ328
-       help
-         This driver supports the built-in serial port of the Motorola 68328
-         (standard, EZ and VZ varities).
-
-config SERIAL_68328_RTS_CTS
-       bool "Support RTS/CTS on 68328 serial port"
-       depends on SERIAL_68328
-
-config SERIAL_COLDFIRE
-       bool "ColdFire serial support"
-       depends on COLDFIRE
-       help
-         This driver supports the built-in serial ports of the Motorola ColdFire
-         family of CPUs.
-
-config SERIAL_68360_SMC
-       bool "68360 SMC uart support"
-       depends on M68360
-       help
-         This driver supports the SMC serial ports of the Motorola 68360 CPU.
-
-config SERIAL_68360_SCC
-       bool "68360 SCC uart support"
-       depends on M68360
-       help
-         This driver supports the SCC serial ports of the Motorola 68360 CPU.
-
-config SERIAL_68360
-       bool
-       depends on SERIAL_68360_SMC || SERIAL_68360_SCC
-       default y
-
-config SERIAL_PMACZILOG
-       tristate "PowerMac z85c30 ESCC support"
-       depends on PPC_OF && PPC_PMAC
-       select SERIAL_CORE
-       help
-         This driver supports the Zilog z85C30 serial ports found on
-         PowerMac machines.
-         Say Y or M if you want to be able to these serial ports.
-
-config SERIAL_PMACZILOG_CONSOLE
-       bool "Console on PowerMac z85c30 serial port"
-       depends on SERIAL_PMACZILOG=y
-       select SERIAL_CORE_CONSOLE
-       help
-         If you would like to be able to use the z85c30 serial port
-         on your PowerMac as the console, you can do so by answering
-         Y to this option.
-
-config SERIAL_LH7A40X
-       tristate "Sharp LH7A40X embedded UART support"
-       depends on ARM && ARCH_LH7A40X
-       select SERIAL_CORE
-       help
-         This enables support for the three on-board UARTs of the
-         Sharp LH7A40X series CPUs.  Choose Y or M.
-
-config SERIAL_LH7A40X_CONSOLE
-       bool "Support for console on Sharp LH7A40X serial port"
-       depends on SERIAL_LH7A40X=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Say Y here if you wish to use one of the serial ports as the
-         system console--the system console is the device which
-         receives all kernel messages and warnings and which allows
-         logins in single user mode.
-
-         Even if you say Y here, the currently visible framebuffer console
-         (/dev/tty0) will still be used as the default system console, but
-         you can alter that using a kernel command line, for example
-         "console=ttyAM1".
-
-config SERIAL_CPM
-       tristate "CPM SCC/SMC serial port support"
-       depends on CPM2 || 8xx
-       select SERIAL_CORE
-       help
-         This driver supports the SCC and SMC serial ports on Motorola 
-         embedded PowerPC that contain a CPM1 (8xx) or CPM2 (8xxx)
-
-config SERIAL_CPM_CONSOLE
-       bool "Support for console on CPM SCC/SMC serial port"
-       depends on SERIAL_CPM=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Say Y here if you wish to use a SCC or SMC CPM UART as the system
-         console (the system console is the device which receives all kernel
-         messages and warnings and which allows logins in single user mode).
-
-         Even if you say Y here, the currently visible framebuffer console
-         (/dev/tty0) will still be used as the system console by default, but
-         you can alter that using a kernel command line option such as
-         "console=ttyCPM0". (Try "man bootparam" or see the documentation of
-         your boot loader (lilo or loadlin) about how to pass options to the
-         kernel at boot time.)
-
-config SERIAL_CPM_SCC1
-       bool "Support for SCC1 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SCC1 as a serial port
-
-config SERIAL_CPM_SCC2
-       bool "Support for SCC2 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SCC2 as a serial port
-
-config SERIAL_CPM_SCC3
-       bool "Support for SCC3 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SCC3 as a serial port
-
-config SERIAL_CPM_SCC4
-       bool "Support for SCC4 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SCC4 as a serial port
-
-config SERIAL_CPM_SMC1
-       bool "Support for SMC1 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SMC1 as a serial port
-
-config SERIAL_CPM_SMC2
-       bool "Support for SMC2 serial port"
-       depends on SERIAL_CPM=y
-       help
-         Select the is option to use SMC2 as a serial port
-
-config SERIAL_SGI_L1_CONSOLE
-       bool "SGI Altix L1 serial console support"
-       depends on IA64_GENERIC || IA64_SGI_SN2
-       select SERIAL_CORE
-       select SERIAL_CORE_CONSOLE
-       help
-               If you have an SGI Altix and you would like to use the system
-               controller serial port as your console (you want this!),
-               say Y.  Otherwise, say N.
-
-config SERIAL_MPC52xx
-       tristate "Freescale MPC52xx family PSC serial support"
-       depends on PPC_MPC52xx
-       select SERIAL_CORE
-       help
-         This drivers support the MPC52xx PSC serial ports. If you would
-         like to use them, you must answer Y or M to this option. Not that
-         for use as console, it must be included in kernel and not as a
-         module.
-
-config SERIAL_MPC52xx_CONSOLE
-       bool "Console on a Freescale MPC52xx family PSC serial port"
-       depends on SERIAL_MPC52xx=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Select this options if you'd like to use one of the PSC serial port
-         of the Freescale MPC52xx family as a console.
-
-config SERIAL_MPC52xx_CONSOLE_BAUD
-       int "Freescale MPC52xx family PSC serial port baud"
-       depends on SERIAL_MPC52xx_CONSOLE=y
-       default "9600"
-       help
-         Select the MPC52xx console baud rate.
-         This value is only used if the bootloader doesn't pass in the
-         console baudrate
-
-config SERIAL_ICOM
-       tristate "IBM Multiport Serial Adapter"
-       depends on PCI && (PPC_ISERIES || PPC_PSERIES)
-       select SERIAL_CORE
-       select FW_LOADER
-       help
-         This driver is for a family of multiport serial adapters
-         including 2 port RVX, 2 port internal modem, 4 port internal
-         modem and a split 1 port RVX and 1 port internal modem.
-
-         This driver can also be built as a module.  If so, the module
-         will be called icom.
-
-config SERIAL_M32R_SIO
-       bool "M32R SIO I/F"
-       depends on M32R
-       default y
-       select SERIAL_CORE
-       help
-         Say Y here if you want to use the M32R serial controller.
-
-config SERIAL_M32R_SIO_CONSOLE
-       bool "use SIO console"
-       depends on SERIAL_M32R_SIO=y
-       select SERIAL_CORE_CONSOLE
-       help
-         Say Y here if you want to support a serial console.
-
-         If you use an M3T-M32700UT or an OPSPUT platform,
-         please say also y for SERIAL_M32R_PLDSIO.
-
-config SERIAL_M32R_PLDSIO
-       bool "M32R SIO I/F on a PLD"
-       depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PLAT_USRV || PLAT_M32700UT)
-       default n
-       help
-         Say Y here if you want to use the M32R serial controller
-         on a PLD (Programmable Logic Device).
-
-         If you use an M3T-M32700UT or an OPSPUT platform,
-         please say Y.
-
-config SERIAL_TXX9
-       bool "TMPTX39XX/49XX SIO support"
-       depends HAS_TXX9_SERIAL
-       select SERIAL_CORE
-       default y
-
-config HAS_TXX9_SERIAL
-       bool
-
-config SERIAL_TXX9_CONSOLE
-       bool "TMPTX39XX/49XX SIO Console support"
-       depends on SERIAL_TXX9=y
-       select SERIAL_CORE_CONSOLE
-
-config SERIAL_TXX9_STDSERIAL
-       bool "TX39XX/49XX SIO act as standard serial"
-       depends on !SERIAL_8250 && SERIAL_TXX9
-
-config SERIAL_VR41XX
-       tristate "NEC VR4100 series Serial Interface Unit support"
-       depends on CPU_VR41XX
-       select SERIAL_CORE
-       help
-         If you have a NEC VR4100 series processor and you want to use
-         Serial Interface Unit(SIU) or Debug Serial Interface Unit(DSIU)
-         (not include VR4111/VR4121 DSIU), say Y.  Otherwise, say N.
-
-config SERIAL_VR41XX_CONSOLE
-       bool "Enable NEC VR4100 series Serial Interface Unit console"
-       depends on SERIAL_VR41XX
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have a NEC VR4100 series processor and you want to use
-         a console on a serial port, say Y.  Otherwise, say N.
-
-config SERIAL_JSM
-       tristate "Digi International NEO PCI Support"
-       depends on PCI
-       select SERIAL_CORE
-       help
-         This is a driver for Digi International's Neo series
-         of cards which provide multiple serial ports. You would need
-         something like this to connect more than two modems to your Linux
-         box, for instance in order to become a dial-in server. This driver
-         supports PCI boards only.
-
-         If you have a card like this, say Y here, otherwise say N.
-
-         To compile this driver as a module, choose M here: the
-         module will be called jsm.
-
-config SERIAL_SGI_IOC4
-       tristate "SGI IOC4 controller serial support"
-       depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC4
-       select SERIAL_CORE
-       help
-               If you have an SGI Altix with an IOC4 based Base IO card
-               and wish to use the serial ports on this card, say Y.
-               Otherwise, say N.
-
-config SERIAL_SGI_IOC3
-       tristate "SGI Altix IOC3 serial support"
-       depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC3
-       select SERIAL_CORE
-       help
-         If you have an SGI Altix with an IOC3 serial card,
-         say Y or M.  Otherwise, say N.
-
-config SERIAL_NETX
-       bool "NetX serial port support"
-       depends on ARM && ARCH_NETX
-       select SERIAL_CORE
-       help
-         If you have a machine based on a Hilscher NetX SoC you
-         can enable its onboard serial port by enabling this option.
-
-          To compile this driver as a module, choose M here: the
-          module will be called netx-serial.
-
-config SERIAL_NETX_CONSOLE
-       bool "Console on NetX serial port"
-       depends on SERIAL_NETX
-       select SERIAL_CORE_CONSOLE
-       help
-         If you have enabled the serial port on the Motorola IMX
-         CPU you can make it the console by answering Y to this option.
-
-endmenu
diff --git a/linux-2.6-xen-sparse/drivers/video/Kconfig b/linux-2.6-xen-sparse/drivers/video/Kconfig
deleted file mode 100644 (file)
index 702eb93..0000000
+++ /dev/null
@@ -1,1620 +0,0 @@
-#
-# Video configuration
-#
-
-menu "Graphics support"
-
-config FIRMWARE_EDID
-       bool "Enable firmware EDID"
-       default y
-       ---help---
-         This enables access to the EDID transferred from the firmware.
-        On the i386, this is from the Video BIOS. Enable this if DDC/I2C
-        transfers do not work for your driver and if you are using
-        nvidiafb, i810fb or savagefb.
-
-        In general, choosing Y for this option is safe.  If you
-        experience extremely long delays while booting before you get
-        something on your display, try setting this to N.  Matrox cards in
-        combination with certain motherboards and monitors are known to
-        suffer from this problem.
-
-config FB
-       tristate "Support for frame buffer devices"
-       ---help---
-         The frame buffer device provides an abstraction for the graphics
-         hardware. It represents the frame buffer of some video hardware and
-         allows application software to access the graphics hardware through
-         a well-defined interface, so the software doesn't need to know
-         anything about the low-level (hardware register) stuff.
-
-         Frame buffer devices work identically across the different
-         architectures supported by Linux and make the implementation of
-         application programs easier and more portable; at this point, an X
-         server exists which uses the frame buffer device exclusively.
-         On several non-X86 architectures, the frame buffer device is the
-         only way to use the graphics hardware.
-
-         The device is accessed through special device nodes, usually located
-         in the /dev directory, i.e. /dev/fb*.
-
-         You need an utility program called fbset to make full use of frame
-         buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
-         and the Framebuffer-HOWTO at
-         <http://www.tahallah.demon.co.uk/programming/prog.html> for more
-         information.
-
-         Say Y here and to the driver for your graphics board below if you
-         are compiling a kernel for a non-x86 architecture.
-
-         If you are compiling for the x86 architecture, you can say Y if you
-         want to play with it, but it is not essential. Please note that
-         running graphical applications that directly touch the hardware
-         (e.g. an accelerated X server) and that are not frame buffer
-         device-aware may cause unexpected results. If unsure, say N.
-
-config FB_CFB_FILLRECT
-       tristate
-       depends on FB
-       default n
-       ---help---
-         Include the cfb_fillrect function for generic software rectangle
-         filling. This is used by drivers that don't provide their own
-         (accelerated) version.
-
-config FB_CFB_COPYAREA
-       tristate
-       depends on FB
-       default n
-       ---help---
-         Include the cfb_copyarea function for generic software area copying.
-         This is used by drivers that don't provide their own (accelerated)
-         version.
-
-config FB_CFB_IMAGEBLIT
-       tristate
-       depends on FB
-       default n
-       ---help---
-         Include the cfb_imageblit function for generic software image
-         blitting. This is used by drivers that don't provide their own
-         (accelerated) version.
-
-config FB_MACMODES
-       tristate
-       depends on FB
-       default n
-
-config FB_BACKLIGHT
-       bool
-       depends on FB
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
-       default n
-
-config FB_MODE_HELPERS
-        bool "Enable Video Mode Handling Helpers"
-        depends on FB
-       default n
-       ---help---
-         This enables functions for handling video modes using the
-         Generalized Timing Formula and the EDID parser. A few drivers rely
-          on this feature such as the radeonfb, rivafb, and the i810fb. If
-         your driver does not take advantage of this feature, choosing Y will
-         just increase the kernel size by about 5K.
-
-config FB_TILEBLITTING
-       bool "Enable Tile Blitting Support"
-       depends on FB
-       default n
-       ---help---
-         This enables tile blitting.  Tile blitting is a drawing technique
-        where the screen is divided into rectangular sections (tiles), whereas
-        the standard blitting divides the screen into pixels. Because the
-        default drawing element is a tile, drawing functions will be passed
-        parameters in terms of number of tiles instead of number of pixels.
-        For example, to draw a single character, instead of using bitmaps,
-        an index to an array of bitmaps will be used.  To clear or move a
-        rectangular section of a screen, the rectangle will be described in
-        terms of number of tiles in the x- and y-axis.
-
-        This is particularly important to one driver, matroxfb.  If
-        unsure, say N.
-
-config FB_CIRRUS
-       tristate "Cirrus Logic support"
-       depends on FB && (ZORRO || PCI)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         This enables support for Cirrus Logic GD542x/543x based boards on
-         Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
-
-         If you have a PCI-based system, this enables support for these
-         chips: GD-543x, GD-544x, GD-5480.
-
-         Please read the file <file:Documentation/fb/cirrusfb.txt>.
-
-         Say N unless you have such a graphics board or plan to get one
-         before you next recompile the kernel.
-
-config FB_PM2
-       tristate "Permedia2 support"
-       depends on FB && ((AMIGA && BROKEN) || PCI)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Permedia2 AGP frame
-         buffer card from ASK, aka `Graphic Blaster Exxtreme'.  There is a
-         product page at
-         <http://www.ask.com.hk/product/Permedia%202/permedia2.htm>.
-
-config FB_PM2_FIFO_DISCONNECT
-       bool "enable FIFO disconnect feature"
-       depends on FB_PM2 && PCI
-       help
-         Support the Permedia2 FIFO disconnect feature (see CONFIG_FB_PM2).
-
-config FB_ARMCLCD
-       tristate "ARM PrimeCell PL110 support"
-       depends on FB && ARM && ARM_AMBA
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This framebuffer device driver is for the ARM PrimeCell PL110
-         Colour LCD controller.  ARM PrimeCells provide the building
-         blocks for System on a Chip devices.
-
-         If you want to compile this as a module (=code which can be
-         inserted into and removed from the running kernel), say M
-         here and read <file:Documentation/modules.txt>.  The module
-         will be called amba-clcd.
-
-choice
-
-       depends on FB_ARMCLCD && (ARCH_LH7A40X || ARCH_LH7952X)
-       prompt "LCD Panel"
-       default FB_ARMCLCD_SHARP_LQ035Q7DB02
-
-config FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT
-       bool "LogicPD LCD 3.5\" QVGA w/HRTFT IC"
-       help
-         This is an implementation of the Sharp LQ035Q7DB02, a 3.5"
-         color QVGA, HRTFT panel.  The LogicPD device includes an
-         an integrated HRTFT controller IC.
-         The native resolution is 240x320.
-
-config FB_ARMCLCD_SHARP_LQ057Q3DC02
-       bool "LogicPD LCD 5.7\" QVGA"
-       help
-         This is an implementation of the Sharp LQ057Q3DC02, a 5.7"
-         color QVGA, TFT panel.  The LogicPD device includes an
-         The native resolution is 320x240.
-
-config FB_ARMCLCD_SHARP_LQ64D343
-       bool "LogicPD LCD 6.4\" VGA"
-       help
-         This is an implementation of the Sharp LQ64D343, a 6.4"
-         color VGA, TFT panel.  The LogicPD device includes an
-         The native resolution is 640x480.
-
-config FB_ARMCLCD_SHARP_LQ10D368
-       bool "LogicPD LCD 10.4\" VGA"
-       help
-         This is an implementation of the Sharp LQ10D368, a 10.4"
-         color VGA, TFT panel.  The LogicPD device includes an
-         The native resolution is 640x480.
-
-
-config FB_ARMCLCD_SHARP_LQ121S1DG41
-       bool "LogicPD LCD 12.1\" SVGA"
-       help
-         This is an implementation of the Sharp LQ121S1DG41, a 12.1"
-         color SVGA, TFT panel.  The LogicPD device includes an
-         The native resolution is 800x600.
-
-         This panel requires a clock rate may be an integer fraction
-         of the base LCDCLK frequency.  The driver will select the
-         highest frequency available that is lower than the maximum
-         allowed.  The panel may flicker if the clock rate is
-         slower than the recommended minimum.
-
-config FB_ARMCLCD_AUO_A070VW01_WIDE
-       bool "AU Optronics A070VW01 LCD 7.0\" WIDE"
-       help
-         This is an implementation of the AU Optronics, a 7.0"
-         WIDE Color.  The native resolution is 234x480.
-
-config FB_ARMCLCD_HITACHI
-       bool "Hitachi Wide Screen 800x480"
-       help
-         This is an implementation of the Hitachi 800x480.
-
-endchoice
-
-
-config FB_ACORN
-       bool "Acorn VIDC support"
-       depends on (FB = y) && ARM && (ARCH_ACORN || ARCH_CLPS7500)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Acorn VIDC graphics
-         hardware found in Acorn RISC PCs and other ARM-based machines.  If
-         unsure, say N.
-
-config FB_CLPS711X
-       bool "CLPS711X LCD support"
-       depends on (FB = y) && ARM && ARCH_CLPS711X
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Say Y to enable the Framebuffer driver for the CLPS7111 and
-         EP7212 processors.
-
-config FB_SA1100
-       bool "SA-1100 LCD support"
-       depends on (FB = y) && ARM && ARCH_SA1100
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is a framebuffer device for the SA-1100 LCD Controller.
-         See <http://www.linux-fbdev.org/> for information on framebuffer
-         devices.
-
-         If you plan to use the LCD display with your SA-1100 system, say
-         Y here.
-
-config FB_IMX
-       tristate "Motorola i.MX LCD support"
-       depends on FB && ARM && ARCH_IMX
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-
-config FB_CYBER2000
-       tristate "CyberPro 2000/2010/5000 support"
-       depends on FB && PCI && (BROKEN || !SPARC64)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Integraphics CyberPro 20x0 and 5000
-         VGA chips used in the Rebel.com Netwinder and other machines.
-         Say Y if you have a NetWinder or a graphics card containing this
-         device, otherwise say N.
-
-config FB_APOLLO
-       bool
-       depends on (FB = y) && APOLLO
-       default y
-       select FB_CFB_FILLRECT
-       select FB_CFB_IMAGEBLIT
-
-config FB_Q40
-       bool
-       depends on (FB = y) && Q40
-       default y
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-
-config FB_AMIGA
-       tristate "Amiga native chipset support"
-       depends on FB && AMIGA
-       help
-         This is the frame buffer device driver for the builtin graphics
-         chipset found in Amigas.
-
-         To compile this driver as a module, choose M here: the
-         module will be called amifb.
-
-config FB_AMIGA_OCS
-       bool "Amiga OCS chipset support"
-       depends on FB_AMIGA
-       help
-         This enables support for the original Agnus and Denise video chips,
-         found in the Amiga 1000 and most A500's and A2000's. If you intend
-         to run Linux on any of these systems, say Y; otherwise say N.
-
-config FB_AMIGA_ECS
-       bool "Amiga ECS chipset support"
-       depends on FB_AMIGA
-       help
-         This enables support for the Enhanced Chip Set, found in later
-         A500's, later A2000's, the A600, the A3000, the A3000T and CDTV. If
-         you intend to run Linux on any of these systems, say Y; otherwise
-         say N.
-
-config FB_AMIGA_AGA
-       bool "Amiga AGA chipset support"
-       depends on FB_AMIGA
-       help
-         This enables support for the Advanced Graphics Architecture (also
-         known as the AGA or AA) Chip Set, found in the A1200, A4000, A4000T
-         and CD32. If you intend to run Linux on any of these systems, say Y;
-         otherwise say N.
-
-config FB_CYBER
-       tristate "Amiga CyberVision 64 support"
-       depends on FB && ZORRO && BROKEN
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Cybervision 64 graphics card from
-         Phase5. Please note that its use is not all that intuitive (i.e. if
-         you have any questions, be sure to ask!). Say N unless you have a
-         Cybervision 64 or plan to get one before you next recompile the
-         kernel. Please note that this driver DOES NOT support the
-         Cybervision 64/3D card, as they use incompatible video chips.
-
-config FB_VIRGE
-       bool "Amiga CyberVision 64/3D support "
-       depends on (FB = y) && ZORRO && BROKEN
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Cybervision 64/3D graphics card from
-         Phase5. Please note that its use is not all that intuitive (i.e. if
-         you have any questions, be sure to ask!). Say N unless you have a
-         Cybervision 64/3D or plan to get one before you next recompile the
-         kernel. Please note that this driver DOES NOT support the older
-         Cybervision 64 card, as they use incompatible video chips.
-
-config FB_RETINAZ3
-       tristate "Amiga Retina Z3 support"
-       depends on (FB = y) && ZORRO && BROKEN
-       help
-         This enables support for the Retina Z3 graphics card. Say N unless
-         you have a Retina Z3 or plan to get one before you next recompile
-         the kernel.
-
-config FB_FM2
-       bool "Amiga FrameMaster II/Rainbow II support"
-       depends on (FB = y) && ZORRO
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Amiga FrameMaster
-         card from BSC (exhibited 1992 but not shipped as a CBM product).
-
-config FB_ARC
-       tristate "Arc Monochrome LCD board support"
-       depends on FB && X86
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Arc Monochrome LCD board. The board
-         is based on the KS-108 lcd controller and is typically a matrix
-         of 2*n chips. This driver was tested with a 128x64 panel. This
-         driver supports it for use with x86 SBCs through a 16 bit GPIO
-         interface (8 bit data, 8 bit control). If you anticpate using
-         this driver, say Y or M; otherwise say N. You must specify the
-         GPIO IO address to be used for setting control and data.
-
-config FB_ATARI
-       bool "Atari native chipset support"
-       depends on (FB = y) && ATARI && BROKEN
-       help
-         This is the frame buffer device driver for the builtin graphics
-         chipset found in Ataris.
-
-config FB_OF
-       bool "Open Firmware frame buffer device support"
-       depends on (FB = y) && (PPC64 || PPC_OF)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES
-       help
-         Say Y if you want support with Open Firmware for your graphics
-         board.
-
-config FB_CONTROL
-       bool "Apple \"control\" display support"
-       depends on (FB = y) && PPC_PMAC && PPC32
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES
-       help
-         This driver supports a frame buffer for the graphics adapter in the
-         Power Macintosh 7300 and others.
-
-config FB_PLATINUM
-       bool "Apple \"platinum\" display support"
-       depends on (FB = y) && PPC_PMAC && PPC32
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES
-       help
-         This driver supports a frame buffer for the "platinum" graphics
-         adapter in some Power Macintoshes.
-
-config FB_VALKYRIE
-       bool "Apple \"valkyrie\" display support"
-       depends on (FB = y) && (MAC || (PPC_PMAC && PPC32))
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES
-       help
-         This driver supports a frame buffer for the "valkyrie" graphics
-         adapter in some Power Macintoshes.
-
-config FB_CT65550
-       bool "Chips 65550 display support"
-       depends on (FB = y) && PPC32
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Chips & Technologies
-         65550 graphics chip in PowerBooks.
-
-config FB_ASILIANT
-       bool "Asiliant (Chips) 69000 display support"
-       depends on (FB = y) && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Asiliant 69030 chipset
-
-config FB_IMSTT
-       bool "IMS Twin Turbo display support"
-       depends on (FB = y) && PCI
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES if PPC
-       help
-         The IMS Twin Turbo is a PCI-based frame buffer card bundled with
-         many Macintosh and compatible computers.
-
-config FB_VGA16
-       tristate "VGA 16-color graphics support"
-       depends on FB && (X86 || PPC)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for VGA 16 color graphic
-         cards. Say Y if you have such a card.
-
-         To compile this driver as a module, choose M here: the
-         module will be called vga16fb.
-
-config FB_STI
-       tristate "HP STI frame buffer device support"
-       depends on FB && PARISC
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       default y
-       ---help---
-         STI refers to the HP "Standard Text Interface" which is a set of
-         BIOS routines contained in a ROM chip in HP PA-RISC based machines.
-         Enabling this option will implement the linux framebuffer device
-         using calls to the STI BIOS routines for initialisation.
-       
-         If you enable this option, you will get a planar framebuffer device
-         /dev/fb which will work on the most common HP graphic cards of the
-         NGLE family, including the artist chips (in the 7xx and Bxxx series),
-         HCRX, HCRX24, CRX, CRX24 and VisEG series.
-
-         It is safe to enable this option, so you should probably say "Y".
-
-config FB_MAC
-       bool "Generic Macintosh display support"
-       depends on (FB = y) && MAC
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES
-
-#      bool '  Apple DAFB display support' CONFIG_FB_DAFB
-config FB_HP300
-       bool
-       depends on (FB = y) && HP300
-       select FB_CFB_FILLRECT
-       select FB_CFB_IMAGEBLIT
-       default y
-
-config FB_TGA
-       tristate "TGA framebuffer support"
-       depends on FB && ALPHA
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for generic TGA graphic
-         cards. Say Y if you have one of those.
-
-config FB_VESA
-       bool "VESA VGA graphics support"
-       depends on (FB = y) && X86
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for generic VESA 2.0
-         compliant graphic cards. The older VESA 1.2 cards are not supported.
-         You will get a boot time penguin logo at no additional cost. Please
-         read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-
-config FB_IMAC
-       bool "Intel-based Macintosh Framebuffer Support"
-       depends on (FB = y) && X86 && EFI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Intel-based Macintosh
-
-config FB_HGA
-       tristate "Hercules mono graphics support"
-       depends on FB && X86
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Say Y here if you have a Hercules mono graphics card.
-
-         To compile this driver as a module, choose M here: the
-         module will be called hgafb.
-
-         As this card technology is 15 years old, most people will answer N
-         here.
-
-config FB_HGA_ACCEL
-       bool "Hercules mono Acceleration functions (EXPERIMENTAL)"
-       depends on FB_HGA && EXPERIMENTAL
-       ---help---
-       This will compile the Hercules mono graphics with
-       acceleration functions.
-
-config FB_SGIVW
-       tristate "SGI Visual Workstation framebuffer support"
-       depends on FB && X86_VISWS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         SGI Visual Workstation support for framebuffer graphics.
-
-config FB_GBE
-       bool "SGI Graphics Backend frame buffer support"
-       depends on (FB = y) && (SGI_IP32 || X86_VISWS)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for SGI Graphics Backend.
-         This chip is used in SGI O2 and Visual Workstation 320/540.
-
-config FB_GBE_MEM
-       int "Video memory size in MB"
-       depends on FB_GBE
-       default 4
-       help
-         This is the amount of memory reserved for the framebuffer,
-         which can be any value between 1MB and 8MB.
-
-config FB_SUN3
-       bool "Sun3 framebuffer support"
-       depends on (FB = y) && (SUN3 || SUN3X) && BROKEN
-
-config FB_SBUS
-       bool "SBUS and UPA framebuffers"
-       depends on (FB = y) && SPARC
-       help
-         Say Y if you want support for SBUS or UPA based frame buffer device.
-
-config FB_BW2
-       bool "BWtwo support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the BWtwo frame buffer.
-
-config FB_CG3
-       bool "CGthree support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the CGthree frame buffer.
-
-config FB_CG6
-       bool "CGsix (GX,TurboGX) support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the CGsix (GX, TurboGX)
-         frame buffer.
-
-config FB_PVR2
-       tristate "NEC PowerVR 2 display support"
-       depends on FB && SH_DREAMCAST
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Say Y here if you have a PowerVR 2 card in your box.  If you plan to
-         run linux on your Dreamcast, you will have to say Y here.
-         This driver may or may not work on other PowerVR 2 cards, but is
-         totally untested.  Use at your own risk.  If unsure, say N.
-
-         To compile this driver as a module, choose M here: the
-         module will be called pvr2fb.
-
-         You can pass several parameters to the driver at boot time or at
-         module load time.  The parameters look like "video=pvr2:XXX", where
-         the meaning of XXX can be found at the end of the main source file
-         (<file:drivers/video/pvr2fb.c>). Please see the file
-         <file:Documentation/fb/pvr2fb.txt>.
-
-config FB_EPSON1355
-       bool "Epson 1355 framebuffer support"
-       depends on (FB = y) && (SUPERH || ARCH_CEIVA)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Build in support for the SED1355 Epson Research Embedded RAMDAC
-         LCD/CRT Controller (since redesignated as the S1D13505) as a
-         framebuffer.  Product specs at
-         <http://www.erd.epson.com/vdc/html/products.htm>.
-
-config FB_S1D13XXX
-       tristate "Epson S1D13XXX framebuffer support"
-       depends on FB
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Support for S1D13XXX framebuffer device family (currently only
-         working with S1D13806). Product specs at
-         <http://www.erd.epson.com/vdc/html/legacy_13xxx.htm>
-
-config FB_NVIDIA
-       tristate "nVidia Framebuffer Support"
-       depends on FB && PCI
-       select I2C_ALGOBIT if FB_NVIDIA_I2C
-       select I2C if FB_NVIDIA_I2C
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports graphics boards with the nVidia chips, TNT
-         and newer. For very old chipsets, such as the RIVA128, then use
-         the rivafb.
-         Say Y if you have such a graphics board.
-
-         To compile this driver as a module, choose M here: the
-         module will be called nvidiafb.
-
-config FB_NVIDIA_I2C
-       bool "Enable DDC Support"
-       depends on FB_NVIDIA
-       help
-         This enables I2C support for nVidia Chipsets.  This is used
-         only for getting EDID information from the attached display
-         allowing for robust video mode handling and switching.
-
-         Because fbdev-2.6 requires that drivers must be able to
-         independently validate video mode parameters, you should say Y
-         here.
-
-config FB_NVIDIA_BACKLIGHT
-       bool "Support for backlight control"
-       depends on FB_NVIDIA && PMAC_BACKLIGHT
-       select FB_BACKLIGHT
-       default y
-       help
-         Say Y here if you want to control the backlight of your display.
-
-config FB_RIVA
-       tristate "nVidia Riva support"
-       depends on FB && PCI
-       select I2C_ALGOBIT if FB_RIVA_I2C
-       select I2C if FB_RIVA_I2C
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports graphics boards with the nVidia Riva/Geforce
-         chips.
-         Say Y if you have such a graphics board.
-
-         To compile this driver as a module, choose M here: the
-         module will be called rivafb.
-
-config FB_RIVA_I2C
-       bool "Enable DDC Support"
-       depends on FB_RIVA
-       help
-         This enables I2C support for nVidia Chipsets.  This is used
-         only for getting EDID information from the attached display
-         allowing for robust video mode handling and switching.
-
-         Because fbdev-2.6 requires that drivers must be able to
-         independently validate video mode parameters, you should say Y
-         here.
-
-config FB_RIVA_DEBUG
-       bool "Lots of debug output from Riva(nVidia) driver"
-       depends on FB_RIVA
-       default n
-       help
-         Say Y here if you want the Riva driver to output all sorts
-         of debugging informations to provide to the maintainer when
-         something goes wrong.
-
-config FB_RIVA_BACKLIGHT
-       bool "Support for backlight control"
-       depends on FB_RIVA && PMAC_BACKLIGHT
-       select FB_BACKLIGHT
-       default y
-       help
-         Say Y here if you want to control the backlight of your display.
-
-config FB_I810
-       tristate "Intel 810/815 support (EXPERIMENTAL)"
-       depends on FB && EXPERIMENTAL && PCI && X86_32
-       select AGP
-       select AGP_INTEL
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports the on-board graphics built in to the Intel 810 
-          and 815 chipsets.  Say Y if you have and plan to use such a board.
-
-          To compile this driver as a module, choose M here: the
-         module will be called i810fb.
-
-          For more information, please read 
-         <file:Documentation/fb/intel810.txt>
-
-config FB_I810_GTF
-       bool "use VESA Generalized Timing Formula"
-       depends on FB_I810
-       help
-         If you say Y, then the VESA standard, Generalized Timing Formula 
-          or GTF, will be used to calculate the required video timing values
-         per video mode.  Since the GTF allows nondiscrete timings 
-          (nondiscrete being a range of values as opposed to discrete being a
-          set of values), you'll be able to use any combination of horizontal 
-         and vertical resolutions, and vertical refresh rates without having
-         to specify your own timing parameters.  This is especially useful
-         to maximize the performance of an aging display, or if you just 
-          have a display with nonstandard dimensions. A VESA compliant 
-         monitor is recommended, but can still work with non-compliant ones.
-         If you need or want this, then select this option. The timings may 
-         not be compliant with Intel's recommended values. Use at your own 
-         risk.
-
-          If you say N, the driver will revert to discrete video timings 
-         using a set recommended by Intel in their documentation.
-  
-          If unsure, say N.
-
-config FB_I810_I2C
-       bool "Enable DDC Support"
-       depends on FB_I810 && FB_I810_GTF
-       select I2C
-       select I2C_ALGOBIT
-       help
-
-config FB_INTEL
-       tristate "Intel 830M/845G/852GM/855GM/865G support (EXPERIMENTAL)"
-       depends on FB && EXPERIMENTAL && PCI && X86
-       select AGP
-       select AGP_INTEL
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports the on-board graphics built in to the Intel
-          830M/845G/852GM/855GM/865G chipsets.
-          Say Y if you have and plan to use such a board.
-
-          To compile this driver as a module, choose M here: the
-         module will be called intelfb.
-
-config FB_INTEL_DEBUG
-        bool "Intel driver Debug Messages"
-       depends on FB_INTEL
-       ---help---
-         Say Y here if you want the Intel driver to output all sorts
-         of debugging informations to provide to the maintainer when
-         something goes wrong.
-
-config FB_MATROX
-       tristate "Matrox acceleration"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_TILEBLITTING
-       select FB_MACMODES if PPC_PMAC
-       ---help---
-         Say Y here if you have a Matrox Millennium, Matrox Millennium II,
-         Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox
-         Mystique G200, Matrox Millennium G200, Matrox Marvel G200 video,
-         Matrox G400, G450 or G550 card in your box.
-
-         To compile this driver as a module, choose M here: the
-         module will be called matroxfb.
-
-         You can pass several parameters to the driver at boot time or at
-         module load time. The parameters look like "video=matrox:XXX", and
-         are described in <file:Documentation/fb/matroxfb.txt>.
-
-config FB_MATROX_MILLENIUM
-       bool "Millennium I/II support"
-       depends on FB_MATROX
-       help
-         Say Y here if you have a Matrox Millennium or Matrox Millennium II
-         video card. If you select "Advanced lowlevel driver options" below,
-         you should check 4 bpp packed pixel, 8 bpp packed pixel, 16 bpp
-         packed pixel, 24 bpp packed pixel and 32 bpp packed pixel. You can
-         also use font widths different from 8.
-
-config FB_MATROX_MYSTIQUE
-       bool "Mystique support"
-       depends on FB_MATROX
-       help
-         Say Y here if you have a Matrox Mystique or Matrox Mystique 220
-         video card. If you select "Advanced lowlevel driver options" below,
-         you should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp
-         packed pixel and 32 bpp packed pixel. You can also use font widths
-         different from 8.
-
-config FB_MATROX_G
-       bool "G100/G200/G400/G450/G550 support"
-       depends on FB_MATROX
-       ---help---
-         Say Y here if you have a Matrox G100, G200, G400, G450 or G550 based
-         video card. If you select "Advanced lowlevel driver options", you
-         should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
-         pixel and 32 bpp packed pixel. You can also use font widths
-         different from 8.
-
-         If you need support for G400 secondary head, you must first say Y to
-         "I2C support" in the character devices section, and then to
-         "Matrox I2C support" and "G400 second head support" here in the
-         framebuffer section. G450/G550 secondary head and digital output
-         are supported without additional modules.
-
-         The driver starts in monitor mode. You must use the matroxset tool 
-         (available at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to 
-         swap primary and secondary head outputs, or to change output mode.  
-         Secondary head driver always start in 640x480 resolution and you 
-         must use fbset to change it.
-
-         Do not forget that second head supports only 16 and 32 bpp
-         packed pixels, so it is a good idea to compile them into the kernel
-         too. You can use only some font widths, as the driver uses generic
-         painting procedures (the secondary head does not use acceleration
-         engine).
-
-         G450/G550 hardware can display TV picture only from secondary CRTC,
-         and it performs no scaling, so picture must have 525 or 625 lines.
-
-config FB_MATROX_I2C
-       tristate "Matrox I2C support"
-       depends on FB_MATROX && I2C
-       select I2C_ALGOBIT
-       ---help---
-         This drivers creates I2C buses which are needed for accessing the
-         DDC (I2C) bus present on all Matroxes, an I2C bus which
-         interconnects Matrox optional devices, like MGA-TVO on G200 and
-         G400, and the secondary head DDC bus, present on G400 only.
-
-         You can say Y or M here if you want to experiment with monitor
-         detection code. You must say Y or M here if you want to use either
-         second head of G400 or MGA-TVO on G200 or G400.
-
-         If you compile it as module, it will create a module named
-         i2c-matroxfb.
-
-config FB_MATROX_MAVEN
-       tristate "G400 second head support"
-       depends on FB_MATROX_G && FB_MATROX_I2C
-       ---help---
-         WARNING !!! This support does not work with G450 !!!
-
-         Say Y or M here if you want to use a secondary head (meaning two
-         monitors in parallel) on G400 or MGA-TVO add-on on G200. Secondary
-         head is not compatible with accelerated XFree 3.3.x SVGA servers -
-         secondary head output is blanked while you are in X. With XFree
-         3.9.17 preview you can use both heads if you use SVGA over fbdev or
-         the fbdev driver on first head and the fbdev driver on second head.
-
-         If you compile it as module, two modules are created,
-         matroxfb_crtc2 and matroxfb_maven. Matroxfb_maven is needed for
-         both G200 and G400, matroxfb_crtc2 is needed only by G400. You must
-         also load i2c-matroxfb to get it to run.
-
-         The driver starts in monitor mode and you must use the matroxset
-         tool (available at
-         <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to switch it to
-         PAL or NTSC or to swap primary and secondary head outputs.
-         Secondary head driver also always start in 640x480 resolution, you
-         must use fbset to change it.
-
-         Also do not forget that second head supports only 16 and 32 bpp
-         packed pixels, so it is a good idea to compile them into the kernel
-         too.  You can use only some font widths, as the driver uses generic
-         painting procedures (the secondary head does not use acceleration
-         engine).
-
-config FB_MATROX_MULTIHEAD
-       bool "Multihead support"
-       depends on FB_MATROX
-       ---help---
-         Say Y here if you have more than one (supported) Matrox device in
-         your computer and you want to use all of them for different monitors
-         ("multihead"). If you have only one device, you should say N because
-         the driver compiled with Y is larger and a bit slower, especially on
-         ia32 (ix86).
-
-         If you said M to "Matrox unified accelerated driver" and N here, you
-         will still be able to use several Matrox devices simultaneously:
-         insert several instances of the module matroxfb into the kernel
-         with insmod, supplying the parameter "dev=N" where N is 0, 1, etc.
-         for the different Matrox devices. This method is slightly faster but
-         uses 40 KB of kernel memory per Matrox card.
-
-         There is no need for enabling 'Matrox multihead support' if you have
-         only one Matrox card in the box.
-
-config FB_RADEON
-       tristate "ATI Radeon display support"
-       depends on FB && PCI
-       select I2C_ALGOBIT if FB_RADEON_I2C
-       select I2C if FB_RADEON_I2C
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES if PPC_OF
-       help
-         Choose this option if you want to use an ATI Radeon graphics card as
-         a framebuffer device.  There are both PCI and AGP versions.  You
-         don't need to choose this to run the Radeon in plain VGA mode.
-
-         If you say Y here and want DDC/I2C support you must first say Y to
-         "I2C support" and "I2C bit-banging support" in the character devices
-         section.
-
-         If you say M here then "I2C support" and "I2C bit-banging support" 
-         can be build either as modules or built-in.
-
-         There is a product page at
-         http://apps.ati.com/ATIcompare/
-
-config FB_RADEON_I2C
-       bool "DDC/I2C for ATI Radeon support"
-       depends on FB_RADEON
-       default y
-       help
-         Say Y here if you want DDC/I2C support for your Radeon board. 
-
-config FB_RADEON_BACKLIGHT
-       bool "Support for backlight control"
-       depends on FB_RADEON && PMAC_BACKLIGHT
-       select FB_BACKLIGHT
-       default y
-       help
-         Say Y here if you want to control the backlight of your display.
-
-config FB_RADEON_DEBUG
-       bool "Lots of debug output from Radeon driver"
-       depends on FB_RADEON
-       default n
-       help
-         Say Y here if you want the Radeon driver to output all sorts
-         of debugging informations to provide to the maintainer when
-         something goes wrong.
-
-config FB_ATY128
-       tristate "ATI Rage128 display support"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES if PPC_PMAC
-       help
-         This driver supports graphics boards with the ATI Rage128 chips.
-         Say Y if you have such a graphics board and read
-         <file:Documentation/fb/aty128fb.txt>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called aty128fb.
-
-config FB_ATY128_BACKLIGHT
-       bool "Support for backlight control"
-       depends on FB_ATY128 && PMAC_BACKLIGHT
-       select FB_BACKLIGHT
-       default y
-       help
-         Say Y here if you want to control the backlight of your display.
-
-config FB_ATY
-       tristate "ATI Mach64 display support" if PCI || ATARI
-       depends on FB && !SPARC32
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       select FB_MACMODES if PPC
-       help
-         This driver supports graphics boards with the ATI Mach64 chips.
-         Say Y if you have such a graphics board.
-
-         To compile this driver as a module, choose M here: the
-         module will be called atyfb.
-
-config FB_ATY_CT
-       bool "Mach64 CT/VT/GT/LT (incl. 3D RAGE) support"
-       depends on PCI && FB_ATY
-       default y if SPARC64 && FB_PCI
-       help
-         Say Y here to support use of ATI's 64-bit Rage boards (or other
-         boards based on the Mach64 CT, VT, GT, and LT chipsets) as a
-         framebuffer device.  The ATI product support page for these boards
-         is at <http://support.ati.com/products/pc/mach64/>.
-
-config FB_ATY_GENERIC_LCD
-       bool "Mach64 generic LCD support (EXPERIMENTAL)"
-       depends on FB_ATY_CT
-       help
-         Say Y if you have a laptop with an ATI Rage LT PRO, Rage Mobility,
-         Rage XC, or Rage XL chipset.
-
-config FB_ATY_GX
-       bool "Mach64 GX support" if PCI
-       depends on FB_ATY
-       default y if ATARI
-       help
-         Say Y here to support use of the ATI Mach64 Graphics Expression
-         board (or other boards based on the Mach64 GX chipset) as a
-         framebuffer device.  The ATI product support page for these boards
-         is at
-         <http://support.ati.com/products/pc/mach64/graphics_xpression.html>.
-
-config FB_ATY_BACKLIGHT
-       bool "Support for backlight control"
-       depends on FB_ATY && PMAC_BACKLIGHT
-       select FB_BACKLIGHT
-       default y
-       help
-         Say Y here if you want to control the backlight of your display.
-
-config FB_S3TRIO
-       bool "S3 Trio display support"
-       depends on (FB = y) && PPC && BROKEN
-       help
-         If you have a S3 Trio say Y. Say N for S3 Virge.
-
-config FB_SAVAGE
-       tristate "S3 Savage support"
-       depends on FB && PCI && EXPERIMENTAL
-       select I2C_ALGOBIT if FB_SAVAGE_I2C
-       select I2C if FB_SAVAGE_I2C
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports notebooks and computers with S3 Savage PCI/AGP
-         chips.
-
-         Say Y if you have such a graphics card.
-
-         To compile this driver as a module, choose M here; the module
-         will be called savagefb.
-
-config FB_SAVAGE_I2C
-       bool "Enable DDC2 Support"
-       depends on FB_SAVAGE
-       help
-         This enables I2C support for S3 Savage Chipsets.  This is used
-         only for getting EDID information from the attached display
-         allowing for robust video mode handling and switching.
-
-         Because fbdev-2.6 requires that drivers must be able to
-         independently validate video mode parameters, you should say Y
-         here.
-
-config FB_SAVAGE_ACCEL
-       bool "Enable Console Acceleration"
-       depends on FB_SAVAGE
-       default n
-       help
-          This option will compile in console acceleration support. If
-          the resulting framebuffer console has bothersome glitches, then
-          choose N here.
-
-config FB_SIS
-       tristate "SiS/XGI display support"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the SiS 300, 315, 330
-         and 340 series as well as XGI V3XT, V5, V8, Z7 graphics chipsets.
-         Specs available at <http://www.sis.com> and <http://www.xgitech.com>.
-
-         To compile this driver as a module, choose M here; the module
-         will be called sisfb.
-
-config FB_SIS_300
-       bool "SiS 300 series support"
-       depends on FB_SIS
-       help
-         Say Y here to support use of the SiS 300/305, 540, 630 and 730.
-
-config FB_SIS_315
-       bool "SiS 315/330/340 series and XGI support"
-       depends on FB_SIS
-       help
-         Say Y here to support use of the SiS 315, 330 and 340 series
-         (315/H/PRO, 55x, 650, 651, 740, 330, 661, 741, 760, 761) as well
-         as XGI V3XT, V5, V8 and Z7.
-
-config FB_NEOMAGIC
-       tristate "NeoMagic display support"
-       depends on FB && PCI
-       select FB_MODE_HELPERS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This driver supports notebooks with NeoMagic PCI chips.
-         Say Y if you have such a graphics card. 
-
-         To compile this driver as a module, choose M here: the
-         module will be called neofb.
-
-config FB_KYRO
-       tristate "IMG Kyro support"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Say Y here if you have a STG4000 / Kyro / PowerVR 3 based
-         graphics board.
-
-         To compile this driver as a module, choose M here: the
-         module will be called kyrofb.
-
-config FB_3DFX
-       tristate "3Dfx Banshee/Voodoo3 display support"
-       depends on FB && PCI
-       select FB_CFB_IMAGEBLIT
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       help
-         This driver supports graphics boards with the 3Dfx Banshee/Voodoo3
-         chips. Say Y if you have such a graphics board.
-
-         To compile this driver as a module, choose M here: the
-         module will be called tdfxfb.
-
-config FB_3DFX_ACCEL
-       bool "3Dfx Banshee/Voodoo3 Acceleration functions (EXPERIMENTAL)"
-       depends on FB_3DFX && EXPERIMENTAL
-       ---help---
-       This will compile the 3Dfx Banshee/Voodoo3 frame buffer device
-       with acceleration functions.
-
-
-config FB_VOODOO1
-       tristate "3Dfx Voodoo Graphics (sst1) support"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Say Y here if you have a 3Dfx Voodoo Graphics (Voodoo1/sst1) or 
-         Voodoo2 (cvg) based graphics card.
-
-         To compile this driver as a module, choose M here: the
-         module will be called sstfb.
-
-         WARNING: Do not use any application that uses the 3D engine
-         (namely glide) while using this driver.
-         Please read the <file:Documentation/fb/README-sstfb.txt> for supported
-         options and other important info  support.
-
-config FB_CYBLA
-       tristate "Cyberblade/i1 support"
-       depends on FB && PCI && X86_32 && !64BIT
-       select FB_CFB_IMAGEBLIT
-       select VIDEO_SELECT
-       ---help---
-         This driver is supposed to support the Trident Cyberblade/i1
-         graphics core integrated in the VIA VT8601A North Bridge,
-         also known as VIA Apollo PLE133.
-
-         Status:
-          - Developed, tested and working on EPIA 5000 and EPIA 800.
-          - Does work reliable on all systems with CRT/LCD connected to
-            normal VGA ports.
-          - Should work on systems that do use the internal LCD port, but
-            this is absolutely not tested.
-
-         Character imageblit, copyarea and rectangle fill are hw accelerated,
-         ypan scrolling is used by default.
-
-         Please do read <file:Documentation/fb/cyblafb/*>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called cyblafb.
-
-config FB_TRIDENT
-       tristate "Trident support"
-       depends on FB && PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         This driver is supposed to support graphics boards with the
-         Trident CyberXXXX/Image/CyberBlade chips mostly found in laptops
-         but also on some motherboards. For more information, read
-         <file:Documentation/fb/tridentfb.txt>
-
-         Cyberblade/i1 support will be removed soon, use the cyblafb driver
-         instead.
-
-         Say Y if you have such a graphics board.
-
-
-         To compile this driver as a module, choose M here: the
-         module will be called tridentfb.
-
-config FB_TRIDENT_ACCEL
-       bool "Trident Acceleration functions (EXPERIMENTAL)"
-       depends on FB_TRIDENT && EXPERIMENTAL
-       ---help---
-       This will compile the Trident frame buffer device with
-       acceleration functions.
-
-config FB_PM3
-       tristate "Permedia3 support"
-       depends on FB && PCI && BROKEN
-       help
-         This is the frame buffer device driver for the 3DLabs Permedia3
-         chipset, used in Formac ProFormance III, 3DLabs Oxygen VX1 &
-         similar boards, 3DLabs Permedia3 Create!, Appian Jeronimo 2000
-         and maybe other boards.
-
-config FB_AU1100
-       bool "Au1100 LCD Driver"
-       depends on (FB = y) && EXPERIMENTAL && PCI && MIPS && MIPS_PB1100=y
-
-config FB_AU1200
-       bool "Au1200 LCD Driver"
-       depends on FB && MIPS && SOC_AU1200
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the framebuffer driver for the AMD Au1200 SOC.  It can drive
-         various panels and CRTs by passing in kernel cmd line option
-         au1200fb:panel=<name>.
-
-source "drivers/video/geode/Kconfig"
-
-config FB_FFB
-       bool "Creator/Creator3D/Elite3D support"
-       depends on FB_SBUS && SPARC64
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Creator, Creator3D,
-         and Elite3D graphics boards.
-
-config FB_TCX
-       bool "TCX (SS4/SS5 only) support"
-       depends on FB_SBUS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the TCX 24/8bit frame
-         buffer.
-
-config FB_CG14
-       bool "CGfourteen (SX) support"
-       depends on FB_SBUS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the CGfourteen frame
-         buffer on Desktop SPARCsystems with the SX graphics option.
-
-config FB_P9100
-       bool "P9100 (Sparcbook 3 only) support"
-       depends on FB_SBUS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the P9100 card
-         supported on Sparcbook 3 machines.
-
-config FB_LEO
-       bool "Leo (ZX) support"
-       depends on FB_SBUS
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the SBUS-based Sun ZX
-         (leo) frame buffer cards.
-
-config FB_PCI
-       bool "PCI framebuffers"
-       depends on (FB = y) && PCI && SPARC
-
-config FB_IGA
-       bool "IGA 168x display support"
-       depends on SPARC32 && FB_PCI
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the framebuffer device for the INTERGRAPHICS 1680 and
-         successor frame buffer cards.
-
-config FB_HIT
-       tristate "HD64461 Frame Buffer support"
-       depends on FB && HD64461
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This is the frame buffer device driver for the Hitachi HD64461 LCD
-         frame buffer card.
-
-config FB_PMAG_AA
-       bool "PMAG-AA TURBOchannel framebuffer support"
-       depends on (FB = y) && TC
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Support for the PMAG-AA TURBOchannel framebuffer card (1280x1024x1)
-         used mainly in the MIPS-based DECstation series.
-
-config FB_PMAG_BA
-       bool "PMAG-BA TURBOchannel framebuffer support"
-       depends on (FB = y) && TC
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Support for the PMAG-BA TURBOchannel framebuffer card (1024x864x8)
-         used mainly in the MIPS-based DECstation series.
-
-config FB_PMAGB_B
-       bool "PMAGB-B TURBOchannel framebuffer support"
-       depends on (FB = y) && TC
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Support for the PMAGB-B TURBOchannel framebuffer card used mainly
-         in the MIPS-based DECstation series. The card is currently only
-         supported in 1280x1024x8 mode.
-
-config FB_MAXINE
-       bool "Maxine (Personal DECstation) onboard framebuffer support"
-       depends on (FB = y) && MACH_DECSTATION
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Support for the onboard framebuffer (1024x768x8) in the Personal
-         DECstation series (Personal DECstation 5000/20, /25, /33, /50,
-         Codename "Maxine").
-
-config FB_TX3912
-       bool "TMPTX3912/PR31700 frame buffer support"
-       depends on (FB = y) && NINO
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         The TX3912 is a Toshiba RISC processor based on the MIPS 3900 core
-         see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
-
-         Say Y here to enable kernel support for the on-board framebuffer.
-
-config FB_G364
-       bool "G364 frame buffer support"
-       depends on (FB = y) && (MIPS_MAGNUM_4000 || OLIVETTI_M700)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         The G364 driver is the framebuffer used in MIPS Magnum 4000 and
-         Olivetti M700-10 systems.
-
-config FB_68328
-       bool "Motorola 68328 native frame buffer support"
-       depends on FB && (M68328 || M68EZ328 || M68VZ328)
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         Say Y here if you want to support the built-in frame buffer of
-         the Motorola 68328 CPU family.
-
-config FB_PXA
-       tristate "PXA LCD framebuffer support"
-       depends on FB && ARCH_PXA
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Frame buffer driver for the built-in LCD controller in the Intel
-         PXA2x0 processor.
-
-         This driver is also available as a module ( = code which can be
-         inserted and removed from the running kernel whenever you want). The
-         module will be called pxafb. If you want to compile it as a module,
-         say M here and read <file:Documentation/modules.txt>.
-
-         If unsure, say N.
-
-config FB_PXA_PARAMETERS
-       bool "PXA LCD command line parameters"
-       default n
-       depends on FB_PXA
-       ---help---
-         Enable the use of kernel command line or module parameters
-         to configure the physical properties of the LCD panel when
-         using the PXA LCD driver.
-
-         This option allows you to override the panel parameters
-         supplied by the platform in order to support multiple
-         different models of flatpanel. If you will only be using a
-         single model of flatpanel then you can safely leave this
-         option disabled.
-
-         <file:Documentation/fb/pxafb.txt> describes the available parameters.
-
-config FB_MBX
-       tristate "2700G LCD framebuffer support"
-       depends on FB && ARCH_PXA
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Framebuffer driver for the Intel 2700G (Marathon) Graphics
-         Accelerator
-
-config FB_MBX_DEBUG
-       bool "Enable debugging info via debugfs"
-       depends on FB_MBX && DEBUG_FS
-       default n
-       ---help---
-         Enable this if you want debugging information using the debug
-         filesystem (debugfs)
-
-         If unsure, say N.
-
-config FB_W100
-       tristate "W100 frame buffer support"
-       depends on FB && PXA_SHARPSL
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Frame buffer driver for the w100 as found on the Sharp SL-Cxx series.
-
-         This driver is also available as a module ( = code which can be
-         inserted and removed from the running kernel whenever you want). The
-         module will be called w100fb. If you want to compile it as a module,
-         say M here and read <file:Documentation/modules.txt>.
-
-         If unsure, say N.
-
-config FB_S3C2410
-       tristate "S3C2410 LCD framebuffer support"
-       depends on FB && ARCH_S3C2410
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Frame buffer driver for the built-in LCD controller in the Samsung
-         S3C2410 processor.
-
-         This driver is also available as a module ( = code which can be
-         inserted and removed from the running kernel whenever you want). The
-         module will be called s3c2410fb. If you want to compile it as a module,
-         say M here and read <file:Documentation/modules.txt>.
-
-         If unsure, say N.
-config FB_S3C2410_DEBUG
-       bool "S3C2410 lcd debug messages"
-       depends on FB_S3C2410
-       help
-         Turn on debugging messages. Note that you can set/unset at run time
-         through sysfs
-
-config FB_PNX4008_DUM
-       tristate "Display Update Module support on Philips PNX4008 board"
-       depends on FB && ARCH_PNX4008
-       ---help---
-         Say Y here to enable support for PNX4008 Display Update Module (DUM)
-
-config FB_PNX4008_DUM_RGB
-       tristate "RGB Framebuffer support on Philips PNX4008 board"
-       depends on FB_PNX4008_DUM
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         Say Y here to enable support for PNX4008 RGB Framebuffer
-
-config FB_VIRTUAL
-       tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
-       depends on FB
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       ---help---
-         This is a `virtual' frame buffer device. It operates on a chunk of
-         unswappable kernel memory instead of on the memory of a graphics
-         board. This means you cannot see any output sent to this frame
-         buffer device, while it does consume precious memory. The main use
-         of this frame buffer device is testing and debugging the frame
-         buffer subsystem. Do NOT enable it for normal systems! To protect
-         the innocent, it has to be enabled explicitly at boot time using the
-         kernel option `video=vfb:'.
-
-         To compile this driver as a module, choose M here: the
-         module will be called vfb.
-
-         If unsure, say N.
-if VT
-       source "drivers/video/console/Kconfig"
-endif
-
-if FB || SGI_NEWPORT_CONSOLE
-       source "drivers/video/logo/Kconfig"
-endif
-
-if SYSFS
-       source "drivers/video/backlight/Kconfig"
-endif
-
-endmenu
-
diff --git a/linux-2.6-xen-sparse/drivers/video/console/Kconfig b/linux-2.6-xen-sparse/drivers/video/console/Kconfig
deleted file mode 100644 (file)
index b6c2c1a..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-#
-# Video configuration
-#
-
-menu "Console display driver support"
-
-config VGA_CONSOLE
-       bool "VGA text console" if EMBEDDED || !X86
-       depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !ARCH_VERSATILE
-       default y
-       help
-         Saying Y here will allow you to use Linux in text mode through a
-         display that complies with the generic VGA standard. Virtually
-         everyone wants that.
-
-         The program SVGATextMode can be used to utilize SVGA video cards to
-         their full potential in text mode. Download it from
-         <ftp://ibiblio.org/pub/Linux/utils/console/>.
-
-         Say Y.
-
-#      if [ "$CONFIG_PCI" = "y" -a "$CONFIG_VGA_CONSOLE" = "y" ]; then
-#         bool '   Allow VGA on any bus?' CONFIG_VGA_HOSE
-#         if [ "$CONFIG_VGA_HOSE" = "y" ]; then
-#            define_bool CONFIG_DUMMY_CONSOLE y
-#         fi
-#      fi
-
-config VGACON_SOFT_SCROLLBACK
-       bool "Enable Scrollback Buffer in System RAM"
-       depends on VGA_CONSOLE
-       default n
-       help
-         The scrollback buffer of the standard VGA console is located in
-        the VGA RAM.  The size of this RAM is fixed and is quite small.
-        If you require a larger scrollback buffer, this can be placed in
-        System RAM which is dynamically allocated during intialization.
-        Placing the scrollback buffer in System RAM will slightly slow
-        down the console.
-
-        If you want this feature, say 'Y' here and enter the amount of
-        RAM to allocate for this buffer.  If unsure, say 'N'.
-
-config VGACON_SOFT_SCROLLBACK_SIZE
-       int "Scrollback Buffer Size (in KB)"
-       depends on VGACON_SOFT_SCROLLBACK
-       default "64"
-       help
-         Enter the amount of System RAM to allocate for the scrollback
-        buffer.  Each 64KB will give you approximately 16 80x25
-        screenfuls of scrollback buffer
-
-config VIDEO_SELECT
-       bool "Video mode selection support"
-       depends on  X86 && VGA_CONSOLE
-       depends on !XEN
-       ---help---
-         This enables support for text mode selection on kernel startup. If
-         you want to take advantage of some high-resolution text mode your
-         card's BIOS offers, but the traditional Linux utilities like
-         SVGATextMode don't, you can say Y here and set the mode using the
-         "vga=" option from your boot loader (lilo or loadlin) or set
-         "vga=ask" which brings up a video mode menu on kernel startup. (Try
-         "man bootparam" or see the documentation of your boot loader about
-         how to pass options to the kernel.)
-
-         Read the file <file:Documentation/svga.txt> for more information
-         about the Video mode selection support. If unsure, say N.
-
-config MDA_CONSOLE
-       depends on !M68K && !PARISC && ISA
-       tristate "MDA text console (dual-headed) (EXPERIMENTAL)"
-       ---help---
-         Say Y here if you have an old MDA or monochrome Hercules graphics
-         adapter in your system acting as a second head ( = video card). You
-         will then be able to use two monitors with your Linux system. Do not
-         say Y here if your MDA card is the primary card in your system; the
-         normal VGA driver will handle it.
-
-         To compile this driver as a module, choose M here: the
-         module will be called mdacon.
-
-         If unsure, say N.
-
-config SGI_NEWPORT_CONSOLE
-        tristate "SGI Newport Console support"
-        depends on SGI_IP22 
-        help
-          Say Y here if you want the console on the Newport aka XL graphics
-          card of your Indy.  Most people say Y here.
-
-#  bool 'IODC console' CONFIG_IODC_CONSOLE
-
-config PROM_CONSOLE
-       bool "PROM console"
-       depends on SPARC
-       help
-         Say Y to build a console driver for Sun machines that uses the
-         terminal emulation built into their console PROMS.
-
-config DUMMY_CONSOLE
-       bool
-       depends on PROM_CONSOLE!=y || VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y 
-       default y
-
-config DUMMY_CONSOLE_COLUMNS
-        int "Initial number of console screen columns"
-        depends on PARISC && DUMMY_CONSOLE
-        default "160"
-        help
-          The default value is 160, which should fit a 1280x1024 monitor.
-          Select 80 if you use a 640x480 resolution by default.
-
-config DUMMY_CONSOLE_ROWS
-        int "Initial number of console screen rows"
-        depends on PARISC && DUMMY_CONSOLE
-        default "64"
-        help
-          The default value is 64, which should fit a 1280x1024 monitor.
-          Select 25 if you use a 640x480 resolution by default.
-
-config FRAMEBUFFER_CONSOLE
-       tristate "Framebuffer Console support"
-       depends on FB
-       select CRC32
-       help
-         Low-level framebuffer-based console driver.
-
-config FRAMEBUFFER_CONSOLE_ROTATION
-       bool "Framebuffer Console Rotation"
-       depends on FRAMEBUFFER_CONSOLE
-       help
-         Enable display rotation for the framebuffer console.  This is done
-         in software and may be significantly slower than a normally oriented
-         display.  Note that the rotation is done at the console level only
-         such that other users of the framebuffer will remain normally
-         oriented.
-
-config STI_CONSOLE
-        tristate "STI text console" 
-        depends on PARISC
-        default y
-        help
-          The STI console is the builtin display/keyboard on HP-PARISC
-          machines.  Say Y here to build support for it into your kernel.
-          The alternative is to use your primary serial port as a console.
-
-config FONTS
-       bool "Select compiled-in fonts"
-       depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
-       help
-         Say Y here if you would like to use fonts other than the default
-         your frame buffer console usually use.
-
-         Note that the answer to this question won't directly affect the
-         kernel: saying N will just cause the configurator to skip all
-         the questions about foreign fonts.
-
-         If unsure, say N (the default choices are safe).
-
-config FONT_8x8
-       bool "VGA 8x8 font" if FONTS
-       depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
-       default y if !SPARC && !FONTS
-       help
-         This is the "high resolution" font for the VGA frame buffer (the one
-         provided by the text console 80x50 (and higher) modes).
-
-         Note that this is a poor quality font. The VGA 8x16 font is quite a
-         lot more readable.
-
-         Given the resolution provided by the frame buffer device, answer N
-         here is safe.
-
-config FONT_8x16
-       bool "VGA 8x16 font" if FONTS
-       depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y || STI_CONSOLE || USB_SISUSBVGA_CON 
-       default y if !SPARC && !FONTS
-       help
-         This is the "high resolution" font for the VGA frame buffer (the one
-         provided by the VGA text console 80x25 mode.
-
-         If unsure, say Y.
-
-config FONT_6x11
-       bool "Mac console 6x11 font (not supported by all drivers)" if FONTS
-       depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
-       default y if !SPARC && !FONTS && MAC
-       help
-         Small console font with Macintosh-style high-half glyphs.  Some Mac
-         framebuffer drivers don't support this one at all.
-
-config FONT_7x14
-       bool "console 7x14 font (not supported by all drivers)" if FONTS
-       depends on FRAMEBUFFER_CONSOLE
-       help
-         Console font with characters just a bit smaller than the default.
-         If the standard 8x16 font is a little too big for you, say Y.
-         Otherwise, say N.
-
-config FONT_PEARL_8x8
-       bool "Pearl (old m68k) console 8x8 font" if FONTS
-       depends on FRAMEBUFFER_CONSOLE
-       default y if !SPARC && !FONTS && AMIGA
-       help
-         Small console font with PC-style control-character and high-half
-         glyphs.
-
-config FONT_ACORN_8x8
-       bool "Acorn console 8x8 font" if FONTS
-       depends on FRAMEBUFFER_CONSOLE
-       default y if !SPARC && !FONTS && ARM && ARCH_ACORN
-       help
-         Small console font with PC-style control characters and high-half
-         glyphs.
-
-config FONT_MINI_4x6
-       bool "Mini 4x6 font"
-       depends on !SPARC && FONTS
-
-config FONT_SUN8x16
-       bool "Sparc console 8x16 font"
-       depends on FRAMEBUFFER_CONSOLE && (!SPARC && FONTS || SPARC)
-       help
-         This is the high resolution console font for Sun machines. Say Y.
-
-config FONT_SUN12x22
-       bool "Sparc console 12x22 font (not supported by all drivers)"
-       depends on FRAMEBUFFER_CONSOLE && (!SPARC && FONTS || SPARC)
-       help
-         This is the high resolution console font for Sun machines with very
-         big letters (like the letters used in the SPARC PROM). If the
-         standard font is unreadable for you, say Y, otherwise say N.
-
-config FONT_10x18
-       bool "console 10x18 font (not supported by all drivers)" if FONTS
-       depends on FRAMEBUFFER_CONSOLE
-       help
-         This is a high resolution console font for machines with very
-         big letters. It fits between the sun 12x22 and the normal 8x16 font.
-         If other fonts are too big or too small for you, say Y, otherwise say N.
-
-endmenu
-
diff --git a/linux-2.6-xen-sparse/drivers/xen/Kconfig b/linux-2.6-xen-sparse/drivers/xen/Kconfig
deleted file mode 100644 (file)
index a9c7573..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-#
-# This Kconfig describe xen options
-#
-
-mainmenu "Xen Configuration"
-
-config XEN
-       bool
-       default y if X86_XEN || X86_64_XEN
-       help
-         This is the Linux Xen port.
-
-if XEN
-config XEN_INTERFACE_VERSION
-       hex
-       default 0x00030205
-
-menu "XEN"
-
-config XEN_PRIVILEGED_GUEST
-       bool "Privileged Guest (domain 0)"
-       depends XEN
-       default n
-       help
-         Support for privileged operation (domain 0)
-
-config XEN_UNPRIVILEGED_GUEST
-       bool
-       default !XEN_PRIVILEGED_GUEST
-
-config XEN_PRIVCMD
-       bool
-       depends on PROC_FS
-       default y
-
-config XEN_XENBUS_DEV
-       bool
-       depends on PROC_FS
-       default y
-
-config XEN_BACKEND
-        tristate "Backend driver support"
-        default y
-        help
-          Support for backend device drivers that provide I/O services
-          to other virtual machines.
-
-config XEN_BLKDEV_BACKEND
-       tristate "Block-device backend driver"
-        depends on XEN_BACKEND
-       default y
-       help
-         The block-device backend driver allows the kernel to export its
-         block devices to other guests via a high-performance shared-memory
-         interface.
-
-config XEN_BLKDEV_TAP
-       tristate "Block-device tap backend driver"
-       depends on XEN_BACKEND
-       default XEN_PRIVILEGED_GUEST
-       help
-         The block tap driver is an alternative to the block back driver 
-          and allows VM block requests to be redirected to userspace through
-          a device interface.  The tap allows user-space development of 
-          high-performance block backends, where disk images may be implemented
-          as files, in memory, or on other hosts across the network.  This 
-         driver can safely coexist with the existing blockback driver.
-
-config XEN_NETDEV_BACKEND
-       tristate "Network-device backend driver"
-        depends on XEN_BACKEND && NET
-       default y
-       help
-         The network-device backend driver allows the kernel to export its
-         network devices to other guests via a high-performance shared-memory
-         interface.
-
-config XEN_NETDEV_PIPELINED_TRANSMITTER
-       bool "Pipelined transmitter (DANGEROUS)"
-       depends on XEN_NETDEV_BACKEND
-       default n
-       help
-         If the net backend is a dumb domain, such as a transparent Ethernet
-         bridge with no local IP interface, it is safe to say Y here to get
-         slightly lower network overhead.
-         If the backend has a local IP interface; or may be doing smart things
-         like reassembling packets to perform firewall filtering; or if you
-         are unsure; or if you experience network hangs when this option is
-         enabled; then you must say N here.
-
-config XEN_NETDEV_LOOPBACK
-       tristate "Network-device loopback driver"
-       depends on XEN_NETDEV_BACKEND
-       default y
-       help
-         A two-interface loopback device to emulate a local netfront-netback
-         connection.
-
-config XEN_PCIDEV_BACKEND
-       tristate "PCI-device backend driver"
-       depends on PCI && XEN_BACKEND
-       default XEN_PRIVILEGED_GUEST
-       help
-         The PCI device backend driver allows the kernel to export arbitrary
-         PCI devices to other guests. If you select this to be a module, you
-         will need to make sure no other driver has bound to the device(s)
-         you want to make visible to other guests.
-
-choice
-       prompt "PCI Backend Mode"
-       depends on XEN_PCIDEV_BACKEND
-       default XEN_PCIDEV_BACKEND_VPCI
-
-config XEN_PCIDEV_BACKEND_VPCI
-       bool "Virtual PCI"
-       ---help---
-         This PCI Backend hides the true PCI topology and makes the frontend
-         think there is a single PCI bus with only the exported devices on it.
-         For example, a device at 03:05.0 will be re-assigned to 00:00.0. A
-         second device at 02:1a.1 will be re-assigned to 00:01.1.
-
-config XEN_PCIDEV_BACKEND_PASS
-       bool "Passthrough"
-       ---help---
-         This PCI Backend provides a real view of the PCI topology to the
-         frontend (for example, a device at 06:01.b will still appear at
-         06:01.b to the frontend). This is similar to how Xen 2.0.x exposed
-         PCI devices to its driver domains. This may be required for drivers
-         which depend on finding their hardward in certain bus/slot
-         locations.
-
-config XEN_PCIDEV_BACKEND_SLOT
-       bool "Slot"
-       ---help---
-         This PCI Backend hides the true PCI topology and makes the frontend
-         think there is a single PCI bus with only the exported devices on it.
-         Contrary to the virtual PCI backend, a function becomes a new slot.
-         For example, a device at 03:05.2 will be re-assigned to 00:00.0. A
-         second device at 02:1a.1 will be re-assigned to 00:01.0.
-
-endchoice
-
-config XEN_PCIDEV_BE_DEBUG
-       bool "PCI Backend Debugging"
-       depends on XEN_PCIDEV_BACKEND
-       default n
-
-config XEN_TPMDEV_BACKEND
-       tristate "TPM-device backend driver"
-        depends on XEN_BACKEND
-       default n
-       help
-         The TPM-device backend driver
-
-config XEN_BLKDEV_FRONTEND
-       tristate "Block-device frontend driver"
-       depends on XEN
-       default y
-       help
-         The block-device frontend driver allows the kernel to access block
-         devices mounted within another guest OS. Unless you are building a
-         dedicated device-driver domain, or your master control domain
-         (domain 0), then you almost certainly want to say Y here.
-
-config XEN_NETDEV_FRONTEND
-       tristate "Network-device frontend driver"
-       depends on XEN && NET
-       default y
-       help
-         The network-device frontend driver allows the kernel to access
-         network interfaces within another guest OS. Unless you are building a
-         dedicated device-driver domain, or your master control domain
-         (domain 0), then you almost certainly want to say Y here.
-
-config XEN_FRAMEBUFFER
-       tristate "Framebuffer-device frontend driver"
-       depends on XEN && FB
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       default y
-       help
-         The framebuffer-device frontend drivers allows the kernel to create a
-         virtual framebuffer.  This framebuffer can be viewed in another
-         domain.  Unless this domain has access to a real video card, you
-         probably want to say Y here.
-
-config XEN_KEYBOARD
-       tristate "Keyboard-device frontend driver"
-       depends on XEN && XEN_FRAMEBUFFER && INPUT
-       default y
-       help
-         The keyboard-device frontend driver allows the kernel to create a
-         virtual keyboard.  This keyboard can then be driven by another
-         domain.  If you've said Y to CONFIG_XEN_FRAMEBUFFER, you probably
-         want to say Y here.
-
-config XEN_SCRUB_PAGES
-       bool "Scrub memory before freeing it to Xen"
-       default y
-       help
-         Erase memory contents before freeing it back to Xen's global
-         pool. This ensures that any secrets contained within that
-         memory (e.g., private keys) cannot be found by other guests that
-         may be running on the machine. Most people will want to say Y here.
-         If security is not a concern then you may increase performance by
-         saying N.
-
-config XEN_DISABLE_SERIAL
-       bool "Disable serial port drivers"
-       default y
-       help
-         Disable serial port drivers, allowing the Xen console driver
-         to provide a serial console at ttyS0.
-
-config XEN_SYSFS
-       tristate "Export Xen attributes in sysfs"
-       depends on SYSFS
-       default y
-       help
-         Xen hypervisor attributes will show up under /sys/hypervisor/.
-
-choice
-       prompt "Xen version compatibility"
-       default XEN_COMPAT_030002_AND_LATER
-
-       config XEN_COMPAT_030002_AND_LATER
-               bool "3.0.2 and later"
-
-       config XEN_COMPAT_030004_AND_LATER
-               bool "3.0.4 and later"
-
-       config XEN_COMPAT_LATEST_ONLY
-               bool "no compatibility code"
-
-endchoice
-
-config XEN_COMPAT
-       hex
-       default 0xffffff if XEN_COMPAT_LATEST_ONLY
-       default 0x030004 if XEN_COMPAT_030004_AND_LATER
-       default 0x030002 if XEN_COMPAT_030002_AND_LATER
-       default 0
-
-endmenu
-
-config HAVE_IRQ_IGNORE_UNHANDLED
-       bool
-       default y
-
-config NO_IDLE_HZ
-       bool
-       default y
-
-config XEN_SMPBOOT
-       bool
-       default y
-       depends on SMP
-
-endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/Makefile b/linux-2.6-xen-sparse/drivers/xen/Makefile
deleted file mode 100644 (file)
index f453f8e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-obj-y  += core/
-obj-y  += console/
-obj-y  += evtchn/
-obj-y  += privcmd/
-obj-y  += xenbus/
-obj-y  += gntdev/
-obj-y  += balloon/
-obj-y  += char/
-
-obj-y  += util.o
-obj-$(CONFIG_XEN_BLKDEV_BACKEND)       += blkback/
-obj-$(CONFIG_XEN_BLKDEV_TAP)           += blktap/
-obj-$(CONFIG_XEN_NETDEV_BACKEND)       += netback/
-obj-$(CONFIG_XEN_TPMDEV_BACKEND)       += tpmback/
-obj-$(CONFIG_XEN_BLKDEV_FRONTEND)      += blkfront/
-obj-$(CONFIG_XEN_NETDEV_FRONTEND)      += netfront/
-obj-$(CONFIG_XEN_PCIDEV_BACKEND)       += pciback/
-obj-$(CONFIG_XEN_PCIDEV_FRONTEND)      += pcifront/
-obj-$(CONFIG_XEN_FRAMEBUFFER)          += fbfront/
-obj-$(CONFIG_XEN_KEYBOARD)             += fbfront/
diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/Makefile b/linux-2.6-xen-sparse/drivers/xen/balloon/Makefile
deleted file mode 100644 (file)
index 3fc3d0b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-obj-y := balloon.o sysfs.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
deleted file mode 100644 (file)
index 932e207..0000000
+++ /dev/null
@@ -1,663 +0,0 @@
-/******************************************************************************
- * balloon.c
- *
- * Xen balloon driver - enables returning/claiming memory to/from Xen.
- *
- * Copyright (c) 2003, B Dragovic
- * Copyright (c) 2003-2004, M Williamson, K Fraser
- * Copyright (c) 2005 Dan M. Smith, IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/smp_lock.h>
-#include <linux/pagemap.h>
-#include <linux/bootmem.h>
-#include <linux/highmem.h>
-#include <linux/vmalloc.h>
-#include <linux/mutex.h>
-#include <xen/xen_proc.h>
-#include <asm/hypervisor.h>
-#include <xen/balloon.h>
-#include <xen/interface/memory.h>
-#include <asm/maddr.h>
-#include <asm/page.h>
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-#include <linux/highmem.h>
-#include <linux/list.h>
-#include <xen/xenbus.h>
-#include "common.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#ifdef CONFIG_PROC_FS
-static struct proc_dir_entry *balloon_pde;
-#endif
-
-static DEFINE_MUTEX(balloon_mutex);
-
-/*
- * Protects atomic reservation decrease/increase against concurrent increases.
- * Also protects non-atomic updates of current_pages and driver_pages, and
- * balloon lists.
- */
-DEFINE_SPINLOCK(balloon_lock);
-
-struct balloon_stats balloon_stats;
-
-/* We increase/decrease in batches which fit in a page */
-static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
-
-/* VM /proc information for memory */
-extern unsigned long totalram_pages;
-
-/* List of ballooned pages, threaded through the mem_map array. */
-static LIST_HEAD(ballooned_pages);
-
-/* Main work function, always executed in process context. */
-static void balloon_process(void *unused);
-static DECLARE_WORK(balloon_worker, balloon_process, NULL);
-static struct timer_list balloon_timer;
-
-/* When ballooning out (allocating memory to return to Xen) we don't really 
-   want the kernel to try too hard since that can trigger the oom killer. */
-#define GFP_BALLOON \
-       (GFP_HIGHUSER | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC)
-
-#define PAGE_TO_LIST(p) (&(p)->lru)
-#define LIST_TO_PAGE(l) list_entry((l), struct page, lru)
-#define UNLIST_PAGE(p)                         \
-       do {                                    \
-               list_del(PAGE_TO_LIST(p));      \
-               PAGE_TO_LIST(p)->next = NULL;   \
-               PAGE_TO_LIST(p)->prev = NULL;   \
-       } while(0)
-
-#define IPRINTK(fmt, args...) \
-       printk(KERN_INFO "xen_mem: " fmt, ##args)
-#define WPRINTK(fmt, args...) \
-       printk(KERN_WARNING "xen_mem: " fmt, ##args)
-
-/* balloon_append: add the given page to the balloon. */
-static void balloon_append(struct page *page)
-{
-       /* Lowmem is re-populated first, so highmem pages go at list tail. */
-       if (PageHighMem(page)) {
-               list_add_tail(PAGE_TO_LIST(page), &ballooned_pages);
-               bs.balloon_high++;
-       } else {
-               list_add(PAGE_TO_LIST(page), &ballooned_pages);
-               bs.balloon_low++;
-       }
-}
-
-/* balloon_retrieve: rescue a page from the balloon, if it is not empty. */
-static struct page *balloon_retrieve(void)
-{
-       struct page *page;
-
-       if (list_empty(&ballooned_pages))
-               return NULL;
-
-       page = LIST_TO_PAGE(ballooned_pages.next);
-       UNLIST_PAGE(page);
-
-       if (PageHighMem(page))
-               bs.balloon_high--;
-       else
-               bs.balloon_low--;
-
-       return page;
-}
-
-static struct page *balloon_first_page(void)
-{
-       if (list_empty(&ballooned_pages))
-               return NULL;
-       return LIST_TO_PAGE(ballooned_pages.next);
-}
-
-static struct page *balloon_next_page(struct page *page)
-{
-       struct list_head *next = PAGE_TO_LIST(page)->next;
-       if (next == &ballooned_pages)
-               return NULL;
-       return LIST_TO_PAGE(next);
-}
-
-static void balloon_alarm(unsigned long unused)
-{
-       schedule_work(&balloon_worker);
-}
-
-static unsigned long current_target(void)
-{
-       unsigned long target = min(bs.target_pages, bs.hard_limit);
-       if (target > (bs.current_pages + bs.balloon_low + bs.balloon_high))
-               target = bs.current_pages + bs.balloon_low + bs.balloon_high;
-       return target;
-}
-
-static int increase_reservation(unsigned long nr_pages)
-{
-       unsigned long  pfn, i, flags;
-       struct page   *page;
-       long           rc;
-       struct xen_memory_reservation reservation = {
-               .address_bits = 0,
-               .extent_order = 0,
-               .domid        = DOMID_SELF
-       };
-
-       if (nr_pages > ARRAY_SIZE(frame_list))
-               nr_pages = ARRAY_SIZE(frame_list);
-
-       balloon_lock(flags);
-
-       page = balloon_first_page();
-       for (i = 0; i < nr_pages; i++) {
-               BUG_ON(page == NULL);
-               frame_list[i] = page_to_pfn(page);;
-               page = balloon_next_page(page);
-       }
-
-       set_xen_guest_handle(reservation.extent_start, frame_list);
-       reservation.nr_extents   = nr_pages;
-       rc = HYPERVISOR_memory_op(
-               XENMEM_populate_physmap, &reservation);
-       if (rc < nr_pages) {
-               if (rc > 0) {
-                       int ret;
-
-                       /* We hit the Xen hard limit: reprobe. */
-                       reservation.nr_extents = rc;
-                       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                       &reservation);
-                       BUG_ON(ret != rc);
-               }
-               if (rc >= 0)
-                       bs.hard_limit = (bs.current_pages + rc -
-                                        bs.driver_pages);
-               goto out;
-       }
-
-       for (i = 0; i < nr_pages; i++) {
-               page = balloon_retrieve();
-               BUG_ON(page == NULL);
-
-               pfn = page_to_pfn(page);
-               BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) &&
-                      phys_to_machine_mapping_valid(pfn));
-
-               set_phys_to_machine(pfn, frame_list[i]);
-
-#ifdef CONFIG_XEN
-               /* Link back into the page tables if not highmem. */
-               if (pfn < max_low_pfn) {
-                       int ret;
-                       ret = HYPERVISOR_update_va_mapping(
-                               (unsigned long)__va(pfn << PAGE_SHIFT),
-                               pfn_pte_ma(frame_list[i], PAGE_KERNEL),
-                               0);
-                       BUG_ON(ret);
-               }
-#endif
-
-               /* Relinquish the page back to the allocator. */
-               ClearPageReserved(page);
-               init_page_count(page);
-               __free_page(page);
-       }
-
-       bs.current_pages += nr_pages;
-       totalram_pages = bs.current_pages;
-
- out:
-       balloon_unlock(flags);
-
-       return 0;
-}
-
-static int decrease_reservation(unsigned long nr_pages)
-{
-       unsigned long  pfn, i, flags;
-       struct page   *page;
-       void          *v;
-       int            need_sleep = 0;
-       int ret;
-       struct xen_memory_reservation reservation = {
-               .address_bits = 0,
-               .extent_order = 0,
-               .domid        = DOMID_SELF
-       };
-
-       if (nr_pages > ARRAY_SIZE(frame_list))
-               nr_pages = ARRAY_SIZE(frame_list);
-
-       for (i = 0; i < nr_pages; i++) {
-               if ((page = alloc_page(GFP_BALLOON)) == NULL) {
-                       nr_pages = i;
-                       need_sleep = 1;
-                       break;
-               }
-
-               pfn = page_to_pfn(page);
-               frame_list[i] = pfn_to_mfn(pfn);
-
-               if (!PageHighMem(page)) {
-                       v = phys_to_virt(pfn << PAGE_SHIFT);
-                       scrub_pages(v, 1);
-#ifdef CONFIG_XEN
-                       ret = HYPERVISOR_update_va_mapping(
-                               (unsigned long)v, __pte_ma(0), 0);
-                       BUG_ON(ret);
-#endif
-               }
-#ifdef CONFIG_XEN_SCRUB_PAGES
-               else {
-                       v = kmap(page);
-                       scrub_pages(v, 1);
-                       kunmap(page);
-               }
-#endif
-       }
-
-#ifdef CONFIG_XEN
-       /* Ensure that ballooned highmem pages don't have kmaps. */
-       kmap_flush_unused();
-       flush_tlb_all();
-#endif
-
-       balloon_lock(flags);
-
-       /* No more mappings: invalidate P2M and add to balloon. */
-       for (i = 0; i < nr_pages; i++) {
-               pfn = mfn_to_pfn(frame_list[i]);
-               set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
-               balloon_append(pfn_to_page(pfn));
-       }
-
-       set_xen_guest_handle(reservation.extent_start, frame_list);
-       reservation.nr_extents   = nr_pages;
-       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
-       BUG_ON(ret != nr_pages);
-
-       bs.current_pages -= nr_pages;
-       totalram_pages = bs.current_pages;
-
-       balloon_unlock(flags);
-
-       return need_sleep;
-}
-
-/*
- * We avoid multiple worker processes conflicting via the balloon mutex.
- * We may of course race updates of the target counts (which are protected
- * by the balloon lock), or with changes to the Xen hard limit, but we will
- * recover from these in time.
- */
-static void balloon_process(void *unused)
-{
-       int need_sleep = 0;
-       long credit;
-
-       mutex_lock(&balloon_mutex);
-
-       do {
-               credit = current_target() - bs.current_pages;
-               if (credit > 0)
-                       need_sleep = (increase_reservation(credit) != 0);
-               if (credit < 0)
-                       need_sleep = (decrease_reservation(-credit) != 0);
-
-#ifndef CONFIG_PREEMPT
-               if (need_resched())
-                       schedule();
-#endif
-       } while ((credit != 0) && !need_sleep);
-
-       /* Schedule more work if there is some still to be done. */
-       if (current_target() != bs.current_pages)
-               mod_timer(&balloon_timer, jiffies + HZ);
-
-       mutex_unlock(&balloon_mutex);
-}
-
-/* Resets the Xen limit, sets new target, and kicks off processing. */
-void balloon_set_new_target(unsigned long target)
-{
-       /* No need for lock. Not read-modify-write updates. */
-       bs.hard_limit   = ~0UL;
-       bs.target_pages = target;
-       schedule_work(&balloon_worker);
-}
-
-static struct xenbus_watch target_watch =
-{
-       .node = "memory/target"
-};
-
-/* React to a change in the target key */
-static void watch_target(struct xenbus_watch *watch,
-                        const char **vec, unsigned int len)
-{
-       unsigned long long new_target;
-       int err;
-
-       err = xenbus_scanf(XBT_NIL, "memory", "target", "%llu", &new_target);
-       if (err != 1) {
-               /* This is ok (for domain0 at least) - so just return */
-               return;
-       }
-
-       /* The given memory/target value is in KiB, so it needs converting to
-        * pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10.
-        */
-       balloon_set_new_target(new_target >> (PAGE_SHIFT - 10));
-}
-
-static int balloon_init_watcher(struct notifier_block *notifier,
-                               unsigned long event,
-                               void *data)
-{
-       int err;
-
-       err = register_xenbus_watch(&target_watch);
-       if (err)
-               printk(KERN_ERR "Failed to set balloon watcher\n");
-
-       return NOTIFY_DONE;
-}
-
-#ifdef CONFIG_PROC_FS
-static int balloon_write(struct file *file, const char __user *buffer,
-                        unsigned long count, void *data)
-{
-       char memstring[64], *endchar;
-       unsigned long long target_bytes;
-
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-
-       if (count <= 1)
-               return -EBADMSG; /* runt */
-       if (count > sizeof(memstring))
-               return -EFBIG;   /* too long */
-
-       if (copy_from_user(memstring, buffer, count))
-               return -EFAULT;
-       memstring[sizeof(memstring)-1] = '\0';
-
-       target_bytes = memparse(memstring, &endchar);
-       balloon_set_new_target(target_bytes >> PAGE_SHIFT);
-
-       return count;
-}
-
-static int balloon_read(char *page, char **start, off_t off,
-                       int count, int *eof, void *data)
-{
-       int len;
-
-       len = sprintf(
-               page,
-               "Current allocation: %8lu kB\n"
-               "Requested target:   %8lu kB\n"
-               "Low-mem balloon:    %8lu kB\n"
-               "High-mem balloon:   %8lu kB\n"
-               "Driver pages:       %8lu kB\n"
-               "Xen hard limit:     ",
-               PAGES2KB(bs.current_pages), PAGES2KB(bs.target_pages), 
-               PAGES2KB(bs.balloon_low), PAGES2KB(bs.balloon_high),
-               PAGES2KB(bs.driver_pages));
-
-       if (bs.hard_limit != ~0UL)
-               len += sprintf(page + len, "%8lu kB\n",
-                              PAGES2KB(bs.hard_limit));
-       else
-               len += sprintf(page + len, "     ??? kB\n");
-
-       *eof = 1;
-       return len;
-}
-#endif
-
-static struct notifier_block xenstore_notifier;
-
-static int __init balloon_init(void)
-{
-#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
-       unsigned long pfn;
-       struct page *page;
-#endif
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       IPRINTK("Initialising balloon driver.\n");
-
-#ifdef CONFIG_XEN
-       bs.current_pages = min(xen_start_info->nr_pages, max_pfn);
-       totalram_pages   = bs.current_pages;
-#else 
-       bs.current_pages = totalram_pages; 
-#endif
-       bs.target_pages  = bs.current_pages;
-       bs.balloon_low   = 0;
-       bs.balloon_high  = 0;
-       bs.driver_pages  = 0UL;
-       bs.hard_limit    = ~0UL;
-
-       init_timer(&balloon_timer);
-       balloon_timer.data = 0;
-       balloon_timer.function = balloon_alarm;
-    
-#ifdef CONFIG_PROC_FS
-       if ((balloon_pde = create_xen_proc_entry("balloon", 0644)) == NULL) {
-               WPRINTK("Unable to create /proc/xen/balloon.\n");
-               return -1;
-       }
-
-       balloon_pde->read_proc  = balloon_read;
-       balloon_pde->write_proc = balloon_write;
-#endif
-       balloon_sysfs_init();
-
-#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
-       /* Initialise the balloon with excess memory space. */
-       for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
-               page = pfn_to_page(pfn);
-               if (!PageReserved(page))
-                       balloon_append(page);
-       }
-#endif
-
-       target_watch.callback = watch_target;
-       xenstore_notifier.notifier_call = balloon_init_watcher;
-
-       register_xenstore_notifier(&xenstore_notifier);
-    
-       return 0;
-}
-
-subsys_initcall(balloon_init);
-
-static void balloon_exit(void) 
-{
-    /* XXX - release balloon here */
-    return; 
-}
-
-module_exit(balloon_exit); 
-
-void balloon_update_driver_allowance(long delta)
-{
-       unsigned long flags;
-
-       balloon_lock(flags);
-       bs.driver_pages += delta;
-       balloon_unlock(flags);
-}
-
-#ifdef CONFIG_XEN
-static int dealloc_pte_fn(
-       pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-{
-       unsigned long mfn = pte_mfn(*pte);
-       int ret;
-       struct xen_memory_reservation reservation = {
-               .nr_extents   = 1,
-               .extent_order = 0,
-               .domid        = DOMID_SELF
-       };
-       set_xen_guest_handle(reservation.extent_start, &mfn);
-       set_pte_at(&init_mm, addr, pte, __pte_ma(0));
-       set_phys_to_machine(__pa(addr) >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
-       BUG_ON(ret != 1);
-       return 0;
-}
-#endif
-
-struct page **alloc_empty_pages_and_pagevec(int nr_pages)
-{
-       unsigned long vaddr, flags;
-       struct page *page, **pagevec;
-       int i, ret;
-
-       pagevec = kmalloc(sizeof(page) * nr_pages, GFP_KERNEL);
-       if (pagevec == NULL)
-               return NULL;
-
-       for (i = 0; i < nr_pages; i++) {
-               page = pagevec[i] = alloc_page(GFP_KERNEL);
-               if (page == NULL)
-                       goto err;
-
-               vaddr = (unsigned long)page_address(page);
-
-               scrub_pages(vaddr, 1);
-
-               balloon_lock(flags);
-
-               if (xen_feature(XENFEAT_auto_translated_physmap)) {
-                       unsigned long gmfn = page_to_pfn(page);
-                       struct xen_memory_reservation reservation = {
-                               .nr_extents   = 1,
-                               .extent_order = 0,
-                               .domid        = DOMID_SELF
-                       };
-                       set_xen_guest_handle(reservation.extent_start, &gmfn);
-                       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                                  &reservation);
-                       if (ret == 1)
-                               ret = 0; /* success */
-               } else {
-#ifdef CONFIG_XEN
-                       ret = apply_to_page_range(&init_mm, vaddr, PAGE_SIZE,
-                                                 dealloc_pte_fn, NULL);
-#else
-                       /* Cannot handle non-auto translate mode. */
-                       ret = 1;
-#endif
-               }
-
-               if (ret != 0) {
-                       balloon_unlock(flags);
-                       __free_page(page);
-                       goto err;
-               }
-
-               totalram_pages = --bs.current_pages;
-
-               balloon_unlock(flags);
-       }
-
- out:
-       schedule_work(&balloon_worker);
-#ifdef CONFIG_XEN
-       flush_tlb_all();
-#endif
-       return pagevec;
-
- err:
-       balloon_lock(flags);
-       while (--i >= 0)
-               balloon_append(pagevec[i]);
-       balloon_unlock(flags);
-       kfree(pagevec);
-       pagevec = NULL;
-       goto out;
-}
-
-void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages)
-{
-       unsigned long flags;
-       int i;
-
-       if (pagevec == NULL)
-               return;
-
-       balloon_lock(flags);
-       for (i = 0; i < nr_pages; i++) {
-               BUG_ON(page_count(pagevec[i]) != 1);
-               balloon_append(pagevec[i]);
-       }
-       balloon_unlock(flags);
-
-       kfree(pagevec);
-
-       schedule_work(&balloon_worker);
-}
-
-void balloon_release_driver_page(struct page *page)
-{
-       unsigned long flags;
-
-       balloon_lock(flags);
-       balloon_append(page);
-       bs.driver_pages--;
-       balloon_unlock(flags);
-
-       schedule_work(&balloon_worker);
-}
-
-EXPORT_SYMBOL_GPL(balloon_update_driver_allowance);
-EXPORT_SYMBOL_GPL(alloc_empty_pages_and_pagevec);
-EXPORT_SYMBOL_GPL(free_empty_pages_and_pagevec);
-EXPORT_SYMBOL_GPL(balloon_release_driver_page);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/common.h b/linux-2.6-xen-sparse/drivers/xen/balloon/common.h
deleted file mode 100644 (file)
index 4496d21..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/******************************************************************************
- * balloon/common.h
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __XEN_BALLOON_COMMON_H__
-#define __XEN_BALLOON_COMMON_H__
-
-#define PAGES2KB(_p) ((_p)<<(PAGE_SHIFT-10))
-
-struct balloon_stats {
-       /* We aim for 'current allocation' == 'target allocation'. */
-       unsigned long current_pages;
-       unsigned long target_pages;
-       /* We may hit the hard limit in Xen. If we do then we remember it. */
-       unsigned long hard_limit;
-       /*
-        * Drivers may alter the memory reservation independently, but they
-        * must inform the balloon driver so we avoid hitting the hard limit.
-        */
-       unsigned long driver_pages;
-       /* Number of pages in high- and low-memory balloons. */
-       unsigned long balloon_low;
-       unsigned long balloon_high;
-};
-
-extern struct balloon_stats balloon_stats;
-#define bs balloon_stats
-
-int balloon_sysfs_init(void);
-void balloon_sysfs_exit(void);
-
-void balloon_set_new_target(unsigned long target);
-
-#endif /* __XEN_BALLOON_COMMON_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/sysfs.c b/linux-2.6-xen-sparse/drivers/xen/balloon/sysfs.c
deleted file mode 100644 (file)
index 6079232..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/******************************************************************************
- * balloon/sysfs.c
- *
- * Xen balloon driver - sysfs interfaces.
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/capability.h>
-#include <linux/errno.h>
-#include <linux/stat.h>
-#include <linux/string.h>
-#include <linux/sysdev.h>
-#include "common.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#define BALLOON_CLASS_NAME "memory"
-
-#define BALLOON_SHOW(name, format, args...)                    \
-       static ssize_t show_##name(struct sys_device *dev,      \
-                                  char *buf)                   \
-       {                                                       \
-               return sprintf(buf, format, ##args);            \
-       }                                                       \
-       static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL)
-
-BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(bs.current_pages));
-BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(bs.balloon_low));
-BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(bs.balloon_high));
-BALLOON_SHOW(hard_limit_kb,
-            (bs.hard_limit!=~0UL) ? "%lu\n" : "???\n",
-            (bs.hard_limit!=~0UL) ? PAGES2KB(bs.hard_limit) : 0);
-BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(bs.driver_pages));
-
-static ssize_t show_target_kb(struct sys_device *dev, char *buf)
-{
-       return sprintf(buf, "%lu\n", PAGES2KB(bs.target_pages));
-}
-
-static ssize_t store_target_kb(struct sys_device *dev,
-                              const char *buf,
-                              size_t count)
-{
-       char memstring[64], *endchar;
-       unsigned long long target_bytes;
-
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-       
-       if (count <= 1)
-               return -EBADMSG; /* runt */
-       if (count > sizeof(memstring))
-               return -EFBIG;   /* too long */
-       strcpy(memstring, buf);
-       
-       target_bytes = memparse(memstring, &endchar);
-       balloon_set_new_target(target_bytes >> PAGE_SHIFT);
-       
-       return count;
-}
-
-static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR,
-                  show_target_kb, store_target_kb);
-
-static struct sysdev_attribute *balloon_attrs[] = {
-       &attr_target_kb,
-};
-
-static struct attribute *balloon_info_attrs[] = {
-       &attr_current_kb.attr,
-       &attr_low_kb.attr,
-       &attr_high_kb.attr,
-       &attr_hard_limit_kb.attr,
-       &attr_driver_kb.attr,
-       NULL
-};
-
-static struct attribute_group balloon_info_group = {
-       .name = "info",
-       .attrs = balloon_info_attrs,
-};
-
-static struct sysdev_class balloon_sysdev_class = {
-       set_kset_name(BALLOON_CLASS_NAME),
-};
-
-static struct sys_device balloon_sysdev;
-
-static int register_balloon(struct sys_device *sysdev)
-{
-       int i, error;
-
-       error = sysdev_class_register(&balloon_sysdev_class);
-       if (error)
-               return error;
-
-       sysdev->id = 0;
-       sysdev->cls = &balloon_sysdev_class;
-
-       error = sysdev_register(sysdev);
-       if (error) {
-               sysdev_class_unregister(&balloon_sysdev_class);
-               return error;
-       }
-
-       for (i = 0; i < ARRAY_SIZE(balloon_attrs); i++) {
-               error = sysdev_create_file(sysdev, balloon_attrs[i]);
-               if (error)
-                       goto fail;
-       }
-
-       error = sysfs_create_group(&sysdev->kobj, &balloon_info_group);
-       if (error)
-               goto fail;
-       
-       return 0;
-
- fail:
-       while (--i >= 0)
-               sysdev_remove_file(sysdev, balloon_attrs[i]);
-       sysdev_unregister(sysdev);
-       sysdev_class_unregister(&balloon_sysdev_class);
-       return error;
-}
-
-static void unregister_balloon(struct sys_device *sysdev)
-{
-       int i;
-
-       sysfs_remove_group(&sysdev->kobj, &balloon_info_group);
-       for (i = 0; i < ARRAY_SIZE(balloon_attrs); i++)
-               sysdev_remove_file(sysdev, balloon_attrs[i]);
-       sysdev_unregister(sysdev);
-       sysdev_class_unregister(&balloon_sysdev_class);
-}
-
-int balloon_sysfs_init(void)
-{
-       return register_balloon(&balloon_sysdev);
-}
-
-void balloon_sysfs_exit(void)
-{
-       unregister_balloon(&balloon_sysdev);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/Makefile b/linux-2.6-xen-sparse/drivers/xen/blkback/Makefile
deleted file mode 100644 (file)
index 8bab63d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-obj-$(CONFIG_XEN_BLKDEV_BACKEND) := blkbk.o
-
-blkbk-y        := blkback.o xenbus.o interface.o vbd.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
deleted file mode 100644 (file)
index 8d529c7..0000000
+++ /dev/null
@@ -1,614 +0,0 @@
-/******************************************************************************
- * arch/xen/drivers/blkif/backend/main.c
- * 
- * Back-end of the driver for virtual block devices. This portion of the
- * driver exports a 'unified' block-device interface that can be accessed
- * by any operating system that implements a compatible front end. A 
- * reference front-end implementation can be found in:
- *  arch/xen/drivers/blkif/frontend
- * 
- * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
- * Copyright (c) 2005, Christopher Clark
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/spinlock.h>
-#include <linux/kthread.h>
-#include <linux/list.h>
-#include <xen/balloon.h>
-#include <asm/hypervisor.h>
-#include "common.h"
-
-/*
- * These are rather arbitrary. They are fairly large because adjacent requests
- * pulled from a communication ring are quite likely to end up being part of
- * the same scatter/gather request at the disc.
- * 
- * ** TRY INCREASING 'blkif_reqs' IF WRITE SPEEDS SEEM TOO LOW **
- * 
- * This will increase the chances of being able to write whole tracks.
- * 64 should be enough to keep us competitive with Linux.
- */
-static int blkif_reqs = 64;
-module_param_named(reqs, blkif_reqs, int, 0);
-MODULE_PARM_DESC(reqs, "Number of blkback requests to allocate");
-
-/* Run-time switchable: /sys/module/blkback/parameters/ */
-static unsigned int log_stats = 0;
-static unsigned int debug_lvl = 0;
-module_param(log_stats, int, 0644);
-module_param(debug_lvl, int, 0644);
-
-/*
- * Each outstanding request that we've passed to the lower device layers has a 
- * 'pending_req' allocated to it. Each buffer_head that completes decrements 
- * the pendcnt towards zero. When it hits zero, the specified domain has a 
- * response queued for it, with the saved 'id' passed back.
- */
-typedef struct {
-       blkif_t       *blkif;
-       u64            id;
-       int            nr_pages;
-       atomic_t       pendcnt;
-       unsigned short operation;
-       int            status;
-       struct list_head free_list;
-} pending_req_t;
-
-static pending_req_t *pending_reqs;
-static struct list_head pending_free;
-static DEFINE_SPINLOCK(pending_free_lock);
-static DECLARE_WAIT_QUEUE_HEAD(pending_free_wq);
-
-#define BLKBACK_INVALID_HANDLE (~0)
-
-static struct page **pending_pages;
-static grant_handle_t *pending_grant_handles;
-
-static inline int vaddr_pagenr(pending_req_t *req, int seg)
-{
-       return (req - pending_reqs) * BLKIF_MAX_SEGMENTS_PER_REQUEST + seg;
-}
-
-static inline unsigned long vaddr(pending_req_t *req, int seg)
-{
-       unsigned long pfn = page_to_pfn(pending_pages[vaddr_pagenr(req, seg)]);
-       return (unsigned long)pfn_to_kaddr(pfn);
-}
-
-#define pending_handle(_req, _seg) \
-       (pending_grant_handles[vaddr_pagenr(_req, _seg)])
-
-
-static int do_block_io_op(blkif_t *blkif);
-static void dispatch_rw_block_io(blkif_t *blkif,
-                                blkif_request_t *req,
-                                pending_req_t *pending_req);
-static void make_response(blkif_t *blkif, u64 id,
-                         unsigned short op, int st);
-
-/******************************************************************
- * misc small helpers
- */
-static pending_req_t* alloc_req(void)
-{
-       pending_req_t *req = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pending_free_lock, flags);
-       if (!list_empty(&pending_free)) {
-               req = list_entry(pending_free.next, pending_req_t, free_list);
-               list_del(&req->free_list);
-       }
-       spin_unlock_irqrestore(&pending_free_lock, flags);
-       return req;
-}
-
-static void free_req(pending_req_t *req)
-{
-       unsigned long flags;
-       int was_empty;
-
-       spin_lock_irqsave(&pending_free_lock, flags);
-       was_empty = list_empty(&pending_free);
-       list_add(&req->free_list, &pending_free);
-       spin_unlock_irqrestore(&pending_free_lock, flags);
-       if (was_empty)
-               wake_up(&pending_free_wq);
-}
-
-static void unplug_queue(blkif_t *blkif)
-{
-       if (blkif->plug == NULL)
-               return;
-       if (blkif->plug->unplug_fn)
-               blkif->plug->unplug_fn(blkif->plug);
-       blk_put_queue(blkif->plug);
-       blkif->plug = NULL;
-}
-
-static void plug_queue(blkif_t *blkif, struct bio *bio)
-{
-       request_queue_t *q = bdev_get_queue(bio->bi_bdev);
-
-       if (q == blkif->plug)
-               return;
-       unplug_queue(blkif);
-       blk_get_queue(q);
-       blkif->plug = q;
-}
-
-static void fast_flush_area(pending_req_t *req)
-{
-       struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-       unsigned int i, invcount = 0;
-       grant_handle_t handle;
-       int ret;
-
-       for (i = 0; i < req->nr_pages; i++) {
-               handle = pending_handle(req, i);
-               if (handle == BLKBACK_INVALID_HANDLE)
-                       continue;
-               gnttab_set_unmap_op(&unmap[i], vaddr(req, i), GNTMAP_host_map,
-                                   handle);
-               pending_handle(req, i) = BLKBACK_INVALID_HANDLE;
-               invcount++;
-       }
-
-       ret = HYPERVISOR_grant_table_op(
-               GNTTABOP_unmap_grant_ref, unmap, invcount);
-       BUG_ON(ret);
-}
-
-/******************************************************************
- * SCHEDULER FUNCTIONS
- */
-
-static void print_stats(blkif_t *blkif)
-{
-       printk(KERN_DEBUG "%s: oo %3d  |  rd %4d  |  wr %4d  |  br %4d\n",
-              current->comm, blkif->st_oo_req,
-              blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req);
-       blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
-       blkif->st_rd_req = 0;
-       blkif->st_wr_req = 0;
-       blkif->st_oo_req = 0;
-}
-
-int blkif_schedule(void *arg)
-{
-       blkif_t *blkif = arg;
-
-       blkif_get(blkif);
-
-       if (debug_lvl)
-               printk(KERN_DEBUG "%s: started\n", current->comm);
-
-       while (!kthread_should_stop()) {
-               wait_event_interruptible(
-                       blkif->wq,
-                       blkif->waiting_reqs || kthread_should_stop());
-               wait_event_interruptible(
-                       pending_free_wq,
-                       !list_empty(&pending_free) || kthread_should_stop());
-
-               blkif->waiting_reqs = 0;
-               smp_mb(); /* clear flag *before* checking for work */
-
-               if (do_block_io_op(blkif))
-                       blkif->waiting_reqs = 1;
-               unplug_queue(blkif);
-
-               if (log_stats && time_after(jiffies, blkif->st_print))
-                       print_stats(blkif);
-       }
-
-       if (log_stats)
-               print_stats(blkif);
-       if (debug_lvl)
-               printk(KERN_DEBUG "%s: exiting\n", current->comm);
-
-       blkif->xenblkd = NULL;
-       blkif_put(blkif);
-
-       return 0;
-}
-
-/******************************************************************
- * COMPLETION CALLBACK -- Called as bh->b_end_io()
- */
-
-static void __end_block_io_op(pending_req_t *pending_req, int error)
-{
-       /* An error fails the entire request. */
-       if ((pending_req->operation == BLKIF_OP_WRITE_BARRIER) &&
-           (error == -EOPNOTSUPP)) {
-               DPRINTK("blkback: write barrier op failed, not supported\n");
-               blkback_barrier(XBT_NIL, pending_req->blkif->be, 0);
-               pending_req->status = BLKIF_RSP_EOPNOTSUPP;
-       } else if (error) {
-               DPRINTK("Buffer not up-to-date at end of operation, "
-                       "error=%d\n", error);
-               pending_req->status = BLKIF_RSP_ERROR;
-       }
-
-       if (atomic_dec_and_test(&pending_req->pendcnt)) {
-               fast_flush_area(pending_req);
-               make_response(pending_req->blkif, pending_req->id,
-                             pending_req->operation, pending_req->status);
-               blkif_put(pending_req->blkif);
-               free_req(pending_req);
-       }
-}
-
-static int end_block_io_op(struct bio *bio, unsigned int done, int error)
-{
-       if (bio->bi_size != 0)
-               return 1;
-       __end_block_io_op(bio->bi_private, error);
-       bio_put(bio);
-       return error;
-}
-
-
-/******************************************************************************
- * NOTIFICATION FROM GUEST OS.
- */
-
-static void blkif_notify_work(blkif_t *blkif)
-{
-       blkif->waiting_reqs = 1;
-       wake_up(&blkif->wq);
-}
-
-irqreturn_t blkif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-{
-       blkif_notify_work(dev_id);
-       return IRQ_HANDLED;
-}
-
-
-
-/******************************************************************
- * DOWNWARD CALLS -- These interface with the block-device layer proper.
- */
-
-static int do_block_io_op(blkif_t *blkif)
-{
-       blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-       blkif_request_t req;
-       pending_req_t *pending_req;
-       RING_IDX rc, rp;
-       int more_to_do = 0;
-
-       rc = blk_rings->common.req_cons;
-       rp = blk_rings->common.sring->req_prod;
-       rmb(); /* Ensure we see queued requests up to 'rp'. */
-
-       while ((rc != rp)) {
-
-               if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc))
-                       break;
-
-               pending_req = alloc_req();
-               if (NULL == pending_req) {
-                       blkif->st_oo_req++;
-                       more_to_do = 1;
-                       break;
-               }
-
-               switch (blkif->blk_protocol) {
-               case BLKIF_PROTOCOL_NATIVE:
-                       memcpy(&req, RING_GET_REQUEST(&blk_rings->native, rc), sizeof(req));
-                       break;
-               case BLKIF_PROTOCOL_X86_32:
-                       blkif_get_x86_32_req(&req, RING_GET_REQUEST(&blk_rings->x86_32, rc));
-                       break;
-               case BLKIF_PROTOCOL_X86_64:
-                       blkif_get_x86_64_req(&req, RING_GET_REQUEST(&blk_rings->x86_64, rc));
-                       break;
-               default:
-                       BUG();
-               }
-               blk_rings->common.req_cons = ++rc; /* before make_response() */
-
-               switch (req.operation) {
-               case BLKIF_OP_READ:
-                       blkif->st_rd_req++;
-                       dispatch_rw_block_io(blkif, &req, pending_req);
-                       break;
-               case BLKIF_OP_WRITE_BARRIER:
-                       blkif->st_br_req++;
-                       /* fall through */
-               case BLKIF_OP_WRITE:
-                       blkif->st_wr_req++;
-                       dispatch_rw_block_io(blkif, &req, pending_req);
-                       break;
-               default:
-                       DPRINTK("error: unknown block io operation [%d]\n",
-                               req.operation);
-                       make_response(blkif, req.id, req.operation,
-                                     BLKIF_RSP_ERROR);
-                       free_req(pending_req);
-                       break;
-               }
-       }
-       return more_to_do;
-}
-
-static void dispatch_rw_block_io(blkif_t *blkif,
-                                blkif_request_t *req,
-                                pending_req_t *pending_req)
-{
-       extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
-       struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-       struct phys_req preq;
-       struct { 
-               unsigned long buf; unsigned int nsec;
-       } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-       unsigned int nseg;
-       struct bio *bio = NULL, *biolist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-       int ret, i, nbio = 0;
-       int operation;
-
-       switch (req->operation) {
-       case BLKIF_OP_READ:
-               operation = READ;
-               break;
-       case BLKIF_OP_WRITE:
-               operation = WRITE;
-               break;
-       case BLKIF_OP_WRITE_BARRIER:
-               operation = WRITE_BARRIER;
-               break;
-       default:
-               operation = 0; /* make gcc happy */
-               BUG();
-       }
-
-       /* Check that number of segments is sane. */
-       nseg = req->nr_segments;
-       if (unlikely(nseg == 0) || 
-           unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
-               DPRINTK("Bad number of segments in request (%d)\n", nseg);
-               goto fail_response;
-       }
-
-       preq.dev           = req->handle;
-       preq.sector_number = req->sector_number;
-       preq.nr_sects      = 0;
-
-       pending_req->blkif     = blkif;
-       pending_req->id        = req->id;
-       pending_req->operation = req->operation;
-       pending_req->status    = BLKIF_RSP_OKAY;
-       pending_req->nr_pages  = nseg;
-
-       for (i = 0; i < nseg; i++) {
-               uint32_t flags;
-
-               seg[i].nsec = req->seg[i].last_sect -
-                       req->seg[i].first_sect + 1;
-
-               if ((req->seg[i].last_sect >= (PAGE_SIZE >> 9)) ||
-                   (req->seg[i].last_sect < req->seg[i].first_sect))
-                       goto fail_response;
-               preq.nr_sects += seg[i].nsec;
-
-               flags = GNTMAP_host_map;
-               if (operation != READ)
-                       flags |= GNTMAP_readonly;
-               gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags,
-                                 req->seg[i].gref, blkif->domid);
-       }
-
-       ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg);
-       BUG_ON(ret);
-
-       for (i = 0; i < nseg; i++) {
-               if (unlikely(map[i].status != 0)) {
-                       DPRINTK("invalid buffer -- could not remap it\n");
-                       map[i].handle = BLKBACK_INVALID_HANDLE;
-                       ret |= 1;
-               }
-
-               pending_handle(pending_req, i) = map[i].handle;
-
-               if (ret)
-                       continue;
-
-               set_phys_to_machine(__pa(vaddr(
-                       pending_req, i)) >> PAGE_SHIFT,
-                       FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT));
-               seg[i].buf  = map[i].dev_bus_addr | 
-                       (req->seg[i].first_sect << 9);
-       }
-
-       if (ret)
-               goto fail_flush;
-
-       if (vbd_translate(&preq, blkif, operation) != 0) {
-               DPRINTK("access denied: %s of [%llu,%llu] on dev=%04x\n", 
-                       operation == READ ? "read" : "write",
-                       preq.sector_number,
-                       preq.sector_number + preq.nr_sects, preq.dev);
-               goto fail_flush;
-       }
-
-       for (i = 0; i < nseg; i++) {
-               if (((int)preq.sector_number|(int)seg[i].nsec) &
-                   ((bdev_hardsect_size(preq.bdev) >> 9) - 1)) {
-                       DPRINTK("Misaligned I/O request from domain %d",
-                               blkif->domid);
-                       goto fail_put_bio;
-               }
-
-               while ((bio == NULL) ||
-                      (bio_add_page(bio,
-                                    virt_to_page(vaddr(pending_req, i)),
-                                    seg[i].nsec << 9,
-                                    seg[i].buf & ~PAGE_MASK) == 0)) {
-                       bio = biolist[nbio++] = bio_alloc(GFP_KERNEL, nseg-i);
-                       if (unlikely(bio == NULL))
-                               goto fail_put_bio;
-
-                       bio->bi_bdev    = preq.bdev;
-                       bio->bi_private = pending_req;
-                       bio->bi_end_io  = end_block_io_op;
-                       bio->bi_sector  = preq.sector_number;
-               }
-
-               preq.sector_number += seg[i].nsec;
-       }
-
-       plug_queue(blkif, bio);
-       atomic_set(&pending_req->pendcnt, nbio);
-       blkif_get(blkif);
-
-       for (i = 0; i < nbio; i++)
-               submit_bio(operation, biolist[i]);
-
-       if (operation == READ)
-               blkif->st_rd_sect += preq.nr_sects;
-       else if (operation == WRITE)
-               blkif->st_wr_sect += preq.nr_sects;
-
-       return;
-
- fail_put_bio:
-       for (i = 0; i < (nbio-1); i++)
-               bio_put(biolist[i]);
- fail_flush:
-       fast_flush_area(pending_req);
- fail_response:
-       make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
-       free_req(pending_req);
-} 
-
-
-
-/******************************************************************
- * MISCELLANEOUS SETUP / TEARDOWN / DEBUGGING
- */
-
-
-static void make_response(blkif_t *blkif, u64 id,
-                         unsigned short op, int st)
-{
-       blkif_response_t  resp;
-       unsigned long     flags;
-       blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-       int more_to_do = 0;
-       int notify;
-
-       resp.id        = id;
-       resp.operation = op;
-       resp.status    = st;
-
-       spin_lock_irqsave(&blkif->blk_ring_lock, flags);
-       /* Place on the response ring for the relevant domain. */
-       switch (blkif->blk_protocol) {
-       case BLKIF_PROTOCOL_NATIVE:
-               memcpy(RING_GET_RESPONSE(&blk_rings->native, blk_rings->native.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       case BLKIF_PROTOCOL_X86_32:
-               memcpy(RING_GET_RESPONSE(&blk_rings->x86_32, blk_rings->x86_32.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       case BLKIF_PROTOCOL_X86_64:
-               memcpy(RING_GET_RESPONSE(&blk_rings->x86_64, blk_rings->x86_64.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       default:
-               BUG();
-       }
-       blk_rings->common.rsp_prod_pvt++;
-       RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
-       if (blk_rings->common.rsp_prod_pvt == blk_rings->common.req_cons) {
-               /*
-                * Tail check for pending requests. Allows frontend to avoid
-                * notifications if requests are already in flight (lower
-                * overheads and promotes batching).
-                */
-               RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
-
-       } else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
-               more_to_do = 1;
-       }
-
-       spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
-
-       if (more_to_do)
-               blkif_notify_work(blkif);
-       if (notify)
-               notify_remote_via_irq(blkif->irq);
-}
-
-static int __init blkif_init(void)
-{
-       int i, mmap_pages;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       mmap_pages = blkif_reqs * BLKIF_MAX_SEGMENTS_PER_REQUEST;
-
-       pending_reqs          = kmalloc(sizeof(pending_reqs[0]) *
-                                       blkif_reqs, GFP_KERNEL);
-       pending_grant_handles = kmalloc(sizeof(pending_grant_handles[0]) *
-                                       mmap_pages, GFP_KERNEL);
-       pending_pages         = alloc_empty_pages_and_pagevec(mmap_pages);
-
-       if (!pending_reqs || !pending_grant_handles || !pending_pages)
-               goto out_of_memory;
-
-       for (i = 0; i < mmap_pages; i++)
-               pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
-
-       blkif_interface_init();
-
-       memset(pending_reqs, 0, sizeof(pending_reqs));
-       INIT_LIST_HEAD(&pending_free);
-
-       for (i = 0; i < blkif_reqs; i++)
-               list_add_tail(&pending_reqs[i].free_list, &pending_free);
-
-       blkif_xenbus_init();
-
-       return 0;
-
- out_of_memory:
-       kfree(pending_reqs);
-       kfree(pending_grant_handles);
-       free_empty_pages_and_pagevec(pending_pages, mmap_pages);
-       printk("%s: out of memory\n", __FUNCTION__);
-       return -ENOMEM;
-}
-
-module_init(blkif_init);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h
deleted file mode 100644 (file)
index 948edf3..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/* 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __BLKIF__BACKEND__COMMON_H__
-#define __BLKIF__BACKEND__COMMON_H__
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/blkdev.h>
-#include <linux/vmalloc.h>
-#include <linux/wait.h>
-#include <asm/io.h>
-#include <asm/setup.h>
-#include <asm/pgalloc.h>
-#include <xen/evtchn.h>
-#include <asm/hypervisor.h>
-#include <xen/blkif.h>
-#include <xen/gnttab.h>
-#include <xen/driver_util.h>
-#include <xen/xenbus.h>
-
-#define DPRINTK(_f, _a...)                     \
-       pr_debug("(file=%s, line=%d) " _f,      \
-                __FILE__ , __LINE__ , ## _a )
-
-struct vbd {
-       blkif_vdev_t   handle;      /* what the domain refers to this vbd as */
-       unsigned char  readonly;    /* Non-zero -> read-only */
-       unsigned char  type;        /* VDISK_xxx */
-       u32            pdevice;     /* phys device that this vbd maps to */
-       struct block_device *bdev;
-};
-
-struct backend_info;
-
-typedef struct blkif_st {
-       /* Unique identifier for this interface. */
-       domid_t           domid;
-       unsigned int      handle;
-       /* Physical parameters of the comms window. */
-       unsigned int      irq;
-       /* Comms information. */
-       enum blkif_protocol blk_protocol;
-       blkif_back_rings_t blk_rings;
-       struct vm_struct *blk_ring_area;
-       /* The VBD attached to this interface. */
-       struct vbd        vbd;
-       /* Back pointer to the backend_info. */
-       struct backend_info *be;
-       /* Private fields. */
-       spinlock_t       blk_ring_lock;
-       atomic_t         refcnt;
-
-       wait_queue_head_t   wq;
-       struct task_struct  *xenblkd;
-       unsigned int        waiting_reqs;
-       request_queue_t     *plug;
-
-       /* statistics */
-       unsigned long       st_print;
-       int                 st_rd_req;
-       int                 st_wr_req;
-       int                 st_oo_req;
-       int                 st_br_req;
-       int                 st_rd_sect;
-       int                 st_wr_sect;
-
-       wait_queue_head_t waiting_to_free;
-
-       grant_handle_t shmem_handle;
-       grant_ref_t    shmem_ref;
-} blkif_t;
-
-blkif_t *blkif_alloc(domid_t domid);
-void blkif_disconnect(blkif_t *blkif);
-void blkif_free(blkif_t *blkif);
-int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
-
-#define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
-#define blkif_put(_b)                                  \
-       do {                                            \
-               if (atomic_dec_and_test(&(_b)->refcnt)) \
-                       wake_up(&(_b)->waiting_to_free);\
-       } while (0)
-
-/* Create a vbd. */
-int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, unsigned major,
-              unsigned minor, int readonly);
-void vbd_free(struct vbd *vbd);
-
-unsigned long long vbd_size(struct vbd *vbd);
-unsigned int vbd_info(struct vbd *vbd);
-unsigned long vbd_secsize(struct vbd *vbd);
-
-struct phys_req {
-       unsigned short       dev;
-       unsigned short       nr_sects;
-       struct block_device *bdev;
-       blkif_sector_t       sector_number;
-};
-
-int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation);
-
-void blkif_interface_init(void);
-
-void blkif_xenbus_init(void);
-
-irqreturn_t blkif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-int blkif_schedule(void *arg);
-
-int blkback_barrier(struct xenbus_transaction xbt,
-                   struct backend_info *be, int state);
-
-#endif /* __BLKIF__BACKEND__COMMON_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
deleted file mode 100644 (file)
index 6df7b73..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/******************************************************************************
- * arch/xen/drivers/blkif/backend/interface.c
- * 
- * Block-device interface management.
- * 
- * Copyright (c) 2004, Keir Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "common.h"
-#include <xen/evtchn.h>
-#include <linux/kthread.h>
-
-static kmem_cache_t *blkif_cachep;
-
-blkif_t *blkif_alloc(domid_t domid)
-{
-       blkif_t *blkif;
-
-       blkif = kmem_cache_alloc(blkif_cachep, GFP_KERNEL);
-       if (!blkif)
-               return ERR_PTR(-ENOMEM);
-
-       memset(blkif, 0, sizeof(*blkif));
-       blkif->domid = domid;
-       spin_lock_init(&blkif->blk_ring_lock);
-       atomic_set(&blkif->refcnt, 1);
-       init_waitqueue_head(&blkif->wq);
-       blkif->st_print = jiffies;
-       init_waitqueue_head(&blkif->waiting_to_free);
-
-       return blkif;
-}
-
-static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
-{
-       struct gnttab_map_grant_ref op;
-
-       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-                         GNTMAP_host_map, shared_page, blkif->domid);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status) {
-               DPRINTK(" Grant table operation failure !\n");
-               return op.status;
-       }
-
-       blkif->shmem_ref = shared_page;
-       blkif->shmem_handle = op.handle;
-
-       return 0;
-}
-
-static void unmap_frontend_page(blkif_t *blkif)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-                           GNTMAP_host_map, blkif->shmem_handle);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-}
-
-int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn)
-{
-       int err;
-
-       /* Already connected through? */
-       if (blkif->irq)
-               return 0;
-
-       if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
-               return -ENOMEM;
-
-       err = map_frontend_page(blkif, shared_page);
-       if (err) {
-               free_vm_area(blkif->blk_ring_area);
-               return err;
-       }
-
-       switch (blkif->blk_protocol) {
-       case BLKIF_PROTOCOL_NATIVE:
-       {
-               blkif_sring_t *sring;
-               sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
-               break;
-       }
-       case BLKIF_PROTOCOL_X86_32:
-       {
-               blkif_x86_32_sring_t *sring_x86_32;
-               sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
-               break;
-       }
-       case BLKIF_PROTOCOL_X86_64:
-       {
-               blkif_x86_64_sring_t *sring_x86_64;
-               sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
-               break;
-       }
-       default:
-               BUG();
-       }
-
-       err = bind_interdomain_evtchn_to_irqhandler(
-               blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif);
-       if (err < 0)
-       {
-               unmap_frontend_page(blkif);
-               free_vm_area(blkif->blk_ring_area);
-               blkif->blk_rings.common.sring = NULL;
-               return err;
-       }
-       blkif->irq = err;
-
-       return 0;
-}
-
-void blkif_disconnect(blkif_t *blkif)
-{
-       if (blkif->xenblkd) {
-               kthread_stop(blkif->xenblkd);
-               blkif->xenblkd = NULL;
-       }
-
-       atomic_dec(&blkif->refcnt);
-       wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0);
-       atomic_inc(&blkif->refcnt);
-
-       if (blkif->irq) {
-               unbind_from_irqhandler(blkif->irq, blkif);
-               blkif->irq = 0;
-       }
-
-       if (blkif->blk_rings.common.sring) {
-               unmap_frontend_page(blkif);
-               free_vm_area(blkif->blk_ring_area);
-               blkif->blk_rings.common.sring = NULL;
-       }
-}
-
-void blkif_free(blkif_t *blkif)
-{
-       if (!atomic_dec_and_test(&blkif->refcnt))
-               BUG();
-       kmem_cache_free(blkif_cachep, blkif);
-}
-
-void __init blkif_interface_init(void)
-{
-       blkif_cachep = kmem_cache_create("blkif_cache", sizeof(blkif_t), 
-                                        0, 0, NULL, NULL);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c b/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c
deleted file mode 100644 (file)
index 34048b3..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/******************************************************************************
- * blkback/vbd.c
- * 
- * Routines for managing virtual block devices (VBDs).
- * 
- * Copyright (c) 2003-2005, Keir Fraser & Steve Hand
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "common.h"
-
-#define vbd_sz(_v)   ((_v)->bdev->bd_part ?                            \
-       (_v)->bdev->bd_part->nr_sects : (_v)->bdev->bd_disk->capacity)
-
-unsigned long long vbd_size(struct vbd *vbd)
-{
-       return vbd_sz(vbd);
-}
-
-unsigned int vbd_info(struct vbd *vbd)
-{
-       return vbd->type | (vbd->readonly?VDISK_READONLY:0);
-}
-
-unsigned long vbd_secsize(struct vbd *vbd)
-{
-       return bdev_hardsect_size(vbd->bdev);
-}
-
-int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
-              unsigned minor, int readonly)
-{
-       struct vbd *vbd;
-       struct block_device *bdev;
-
-       vbd = &blkif->vbd;
-       vbd->handle   = handle; 
-       vbd->readonly = readonly;
-       vbd->type     = 0;
-
-       vbd->pdevice  = MKDEV(major, minor);
-
-       bdev = open_by_devnum(vbd->pdevice,
-                             vbd->readonly ? FMODE_READ : FMODE_WRITE);
-
-       if (IS_ERR(bdev)) {
-               DPRINTK("vbd_creat: device %08x could not be opened.\n",
-                       vbd->pdevice);
-               return -ENOENT;
-       }
-
-       vbd->bdev = bdev;
-
-       if (vbd->bdev->bd_disk == NULL) {
-               DPRINTK("vbd_creat: device %08x doesn't exist.\n",
-                       vbd->pdevice);
-               vbd_free(vbd);
-               return -ENOENT;
-       }
-
-       if (vbd->bdev->bd_disk->flags & GENHD_FL_CD)
-               vbd->type |= VDISK_CDROM;
-       if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE)
-               vbd->type |= VDISK_REMOVABLE;
-
-       DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
-               handle, blkif->domid);
-       return 0;
-}
-
-void vbd_free(struct vbd *vbd)
-{
-       if (vbd->bdev)
-               blkdev_put(vbd->bdev);
-       vbd->bdev = NULL;
-}
-
-int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation)
-{
-       struct vbd *vbd = &blkif->vbd;
-       int rc = -EACCES;
-
-       if ((operation != READ) && vbd->readonly)
-               goto out;
-
-       if (unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd)))
-               goto out;
-
-       req->dev  = vbd->pdevice;
-       req->bdev = vbd->bdev;
-       rc = 0;
-
- out:
-       return rc;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
deleted file mode 100644 (file)
index 0c688e9..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-/*  Xenbus code for blkif backend
-    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-    Copyright (C) 2005 XenSource Ltd
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <stdarg.h>
-#include <linux/module.h>
-#include <linux/kthread.h>
-#include "common.h"
-
-#undef DPRINTK
-#define DPRINTK(fmt, args...)                          \
-       pr_debug("blkback/xenbus (%s:%d) " fmt ".\n",   \
-                __FUNCTION__, __LINE__, ##args)
-
-struct backend_info
-{
-       struct xenbus_device *dev;
-       blkif_t *blkif;
-       struct xenbus_watch backend_watch;
-       unsigned major;
-       unsigned minor;
-       char *mode;
-};
-
-static void connect(struct backend_info *);
-static int connect_ring(struct backend_info *);
-static void backend_changed(struct xenbus_watch *, const char **,
-                           unsigned int);
-
-static int blkback_name(blkif_t *blkif, char *buf)
-{
-       char *devpath, *devname;
-       struct xenbus_device *dev = blkif->be->dev;
-
-       devpath = xenbus_read(XBT_NIL, dev->nodename, "dev", NULL);
-       if (IS_ERR(devpath)) 
-               return PTR_ERR(devpath);
-       
-       if ((devname = strstr(devpath, "/dev/")) != NULL)
-               devname += strlen("/dev/");
-       else
-               devname  = devpath;
-
-       snprintf(buf, TASK_COMM_LEN, "blkback.%d.%s", blkif->domid, devname);
-       kfree(devpath);
-       
-       return 0;
-}
-
-static void update_blkif_status(blkif_t *blkif)
-{ 
-       int err;
-       char name[TASK_COMM_LEN];
-
-       /* Not ready to connect? */
-       if (!blkif->irq || !blkif->vbd.bdev)
-               return;
-
-       /* Already connected? */
-       if (blkif->be->dev->state == XenbusStateConnected)
-               return;
-
-       /* Attempt to connect: exit if we fail to. */
-       connect(blkif->be);
-       if (blkif->be->dev->state != XenbusStateConnected)
-               return;
-
-       err = blkback_name(blkif, name);
-       if (err) {
-               xenbus_dev_error(blkif->be->dev, err, "get blkback dev name");
-               return;
-       }
-
-       blkif->xenblkd = kthread_run(blkif_schedule, blkif, name);
-       if (IS_ERR(blkif->xenblkd)) {
-               err = PTR_ERR(blkif->xenblkd);
-               blkif->xenblkd = NULL;
-               xenbus_dev_error(blkif->be->dev, err, "start xenblkd");
-       }
-}
-
-
-/****************************************************************
- *  sysfs interface for VBD I/O requests
- */
-
-#define VBD_SHOW(name, format, args...)                                        \
-       static ssize_t show_##name(struct device *_dev,                 \
-                                  struct device_attribute *attr,       \
-                                  char *buf)                           \
-       {                                                               \
-               struct xenbus_device *dev = to_xenbus_device(_dev);     \
-               struct backend_info *be = dev->dev.driver_data;         \
-                                                                       \
-               return sprintf(buf, format, ##args);                    \
-       }                                                               \
-       DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
-
-VBD_SHOW(oo_req,  "%d\n", be->blkif->st_oo_req);
-VBD_SHOW(rd_req,  "%d\n", be->blkif->st_rd_req);
-VBD_SHOW(wr_req,  "%d\n", be->blkif->st_wr_req);
-VBD_SHOW(br_req,  "%d\n", be->blkif->st_br_req);
-VBD_SHOW(rd_sect, "%d\n", be->blkif->st_rd_sect);
-VBD_SHOW(wr_sect, "%d\n", be->blkif->st_wr_sect);
-
-static struct attribute *vbdstat_attrs[] = {
-       &dev_attr_oo_req.attr,
-       &dev_attr_rd_req.attr,
-       &dev_attr_wr_req.attr,
-       &dev_attr_br_req.attr,
-       &dev_attr_rd_sect.attr,
-       &dev_attr_wr_sect.attr,
-       NULL
-};
-
-static struct attribute_group vbdstat_group = {
-       .name = "statistics",
-       .attrs = vbdstat_attrs,
-};
-
-VBD_SHOW(physical_device, "%x:%x\n", be->major, be->minor);
-VBD_SHOW(mode, "%s\n", be->mode);
-
-int xenvbd_sysfs_addif(struct xenbus_device *dev)
-{
-       int error;
-       
-       error = device_create_file(&dev->dev, &dev_attr_physical_device);
-       if (error)
-               goto fail1;
-
-       error = device_create_file(&dev->dev, &dev_attr_mode);
-       if (error)
-               goto fail2;
-
-       error = sysfs_create_group(&dev->dev.kobj, &vbdstat_group);
-       if (error)
-               goto fail3;
-
-       return 0;
-
-fail3: sysfs_remove_group(&dev->dev.kobj, &vbdstat_group);
-fail2: device_remove_file(&dev->dev, &dev_attr_mode);
-fail1: device_remove_file(&dev->dev, &dev_attr_physical_device);
-       return error;
-}
-
-void xenvbd_sysfs_delif(struct xenbus_device *dev)
-{
-       sysfs_remove_group(&dev->dev.kobj, &vbdstat_group);
-       device_remove_file(&dev->dev, &dev_attr_mode);
-       device_remove_file(&dev->dev, &dev_attr_physical_device);
-}
-
-static int blkback_remove(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       DPRINTK("");
-
-       if (be->backend_watch.node) {
-               unregister_xenbus_watch(&be->backend_watch);
-               kfree(be->backend_watch.node);
-               be->backend_watch.node = NULL;
-       }
-
-       if (be->blkif) {
-               blkif_disconnect(be->blkif);
-               vbd_free(&be->blkif->vbd);
-               blkif_free(be->blkif);
-               be->blkif = NULL;
-       }
-
-       if (be->major || be->minor)
-               xenvbd_sysfs_delif(dev);
-
-       kfree(be);
-       dev->dev.driver_data = NULL;
-       return 0;
-}
-
-int blkback_barrier(struct xenbus_transaction xbt,
-                   struct backend_info *be, int state)
-{
-       struct xenbus_device *dev = be->dev;
-       int err;
-
-       err = xenbus_printf(xbt, dev->nodename, "feature-barrier",
-                           "%d", state);
-       if (err)
-               xenbus_dev_fatal(dev, err, "writing feature-barrier");
-
-       return err;
-}
-
-/**
- * Entry point to this code when a new device is created.  Allocate the basic
- * structures, and watch the store waiting for the hotplug scripts to tell us
- * the device's physical major and minor numbers.  Switch to InitWait.
- */
-static int blkback_probe(struct xenbus_device *dev,
-                        const struct xenbus_device_id *id)
-{
-       int err;
-       struct backend_info *be = kzalloc(sizeof(struct backend_info),
-                                         GFP_KERNEL);
-       if (!be) {
-               xenbus_dev_fatal(dev, -ENOMEM,
-                                "allocating backend structure");
-               return -ENOMEM;
-       }
-       be->dev = dev;
-       dev->dev.driver_data = be;
-
-       be->blkif = blkif_alloc(dev->otherend_id);
-       if (IS_ERR(be->blkif)) {
-               err = PTR_ERR(be->blkif);
-               be->blkif = NULL;
-               xenbus_dev_fatal(dev, err, "creating block interface");
-               goto fail;
-       }
-
-       /* setup back pointer */
-       be->blkif->be = be;
-
-       err = xenbus_watch_path2(dev, dev->nodename, "physical-device",
-                                &be->backend_watch, backend_changed);
-       if (err)
-               goto fail;
-
-       err = xenbus_switch_state(dev, XenbusStateInitWait);
-       if (err)
-               goto fail;
-
-       return 0;
-
-fail:
-       DPRINTK("failed");
-       blkback_remove(dev);
-       return err;
-}
-
-
-/**
- * Callback received when the hotplug scripts have placed the physical-device
- * node.  Read it and the mode node, and create a vbd.  If the frontend is
- * ready, connect.
- */
-static void backend_changed(struct xenbus_watch *watch,
-                           const char **vec, unsigned int len)
-{
-       int err;
-       unsigned major;
-       unsigned minor;
-       struct backend_info *be
-               = container_of(watch, struct backend_info, backend_watch);
-       struct xenbus_device *dev = be->dev;
-
-       DPRINTK("");
-
-       err = xenbus_scanf(XBT_NIL, dev->nodename, "physical-device", "%x:%x",
-                          &major, &minor);
-       if (XENBUS_EXIST_ERR(err)) {
-               /* Since this watch will fire once immediately after it is
-                  registered, we expect this.  Ignore it, and wait for the
-                  hotplug scripts. */
-               return;
-       }
-       if (err != 2) {
-               xenbus_dev_fatal(dev, err, "reading physical-device");
-               return;
-       }
-
-       if ((be->major || be->minor) &&
-           ((be->major != major) || (be->minor != minor))) {
-               printk(KERN_WARNING
-                      "blkback: changing physical device (from %x:%x to "
-                      "%x:%x) not supported.\n", be->major, be->minor,
-                      major, minor);
-               return;
-       }
-
-       be->mode = xenbus_read(XBT_NIL, dev->nodename, "mode", NULL);
-       if (IS_ERR(be->mode)) {
-               err = PTR_ERR(be->mode);
-               be->mode = NULL;
-               xenbus_dev_fatal(dev, err, "reading mode");
-               return;
-       }
-
-       if (be->major == 0 && be->minor == 0) {
-               /* Front end dir is a number, which is used as the handle. */
-
-               char *p = strrchr(dev->otherend, '/') + 1;
-               long handle = simple_strtoul(p, NULL, 0);
-
-               be->major = major;
-               be->minor = minor;
-
-               err = vbd_create(be->blkif, handle, major, minor,
-                                (NULL == strchr(be->mode, 'w')));
-               if (err) {
-                       be->major = be->minor = 0;
-                       xenbus_dev_fatal(dev, err, "creating vbd structure");
-                       return;
-               }
-
-               err = xenvbd_sysfs_addif(dev);
-               if (err) {
-                       vbd_free(&be->blkif->vbd);
-                       be->major = be->minor = 0;
-                       xenbus_dev_fatal(dev, err, "creating sysfs entries");
-                       return;
-               }
-
-               /* We're potentially connected now */
-               update_blkif_status(be->blkif);
-       }
-}
-
-
-/**
- * Callback received when the frontend's state changes.
- */
-static void frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state)
-{
-       struct backend_info *be = dev->dev.driver_data;
-       int err;
-
-       DPRINTK("%s", xenbus_strstate(frontend_state));
-
-       switch (frontend_state) {
-       case XenbusStateInitialising:
-               if (dev->state == XenbusStateClosed) {
-                       printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-                              __FUNCTION__, dev->nodename);
-                       xenbus_switch_state(dev, XenbusStateInitWait);
-               }
-               break;
-
-       case XenbusStateInitialised:
-       case XenbusStateConnected:
-               /* Ensure we connect even when two watches fire in 
-                  close successsion and we miss the intermediate value 
-                  of frontend_state. */
-               if (dev->state == XenbusStateConnected)
-                       break;
-
-               err = connect_ring(be);
-               if (err)
-                       break;
-               update_blkif_status(be->blkif);
-               break;
-
-       case XenbusStateClosing:
-               blkif_disconnect(be->blkif);
-               xenbus_switch_state(dev, XenbusStateClosing);
-               break;
-
-       case XenbusStateClosed:
-               xenbus_switch_state(dev, XenbusStateClosed);
-               if (xenbus_dev_is_online(dev))
-                       break;
-               /* fall through if not online */
-       case XenbusStateUnknown:
-               device_unregister(&dev->dev);
-               break;
-
-       default:
-               xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-                                frontend_state);
-               break;
-       }
-}
-
-
-/* ** Connection ** */
-
-
-/**
- * Write the physical details regarding the block device to the store, and
- * switch to Connected state.
- */
-static void connect(struct backend_info *be)
-{
-       struct xenbus_transaction xbt;
-       int err;
-       struct xenbus_device *dev = be->dev;
-
-       DPRINTK("%s", dev->otherend);
-
-       /* Supply the information about the device the frontend needs */
-again:
-       err = xenbus_transaction_start(&xbt);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "starting transaction");
-               return;
-       }
-
-       err = blkback_barrier(xbt, be, 1);
-       if (err)
-               goto abort;
-
-       err = xenbus_printf(xbt, dev->nodename, "sectors", "%llu",
-                           vbd_size(&be->blkif->vbd));
-       if (err) {
-               xenbus_dev_fatal(dev, err, "writing %s/sectors",
-                                dev->nodename);
-               goto abort;
-       }
-
-       /* FIXME: use a typename instead */
-       err = xenbus_printf(xbt, dev->nodename, "info", "%u",
-                           vbd_info(&be->blkif->vbd));
-       if (err) {
-               xenbus_dev_fatal(dev, err, "writing %s/info",
-                                dev->nodename);
-               goto abort;
-       }
-       err = xenbus_printf(xbt, dev->nodename, "sector-size", "%lu",
-                           vbd_secsize(&be->blkif->vbd));
-       if (err) {
-               xenbus_dev_fatal(dev, err, "writing %s/sector-size",
-                                dev->nodename);
-               goto abort;
-       }
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err == -EAGAIN)
-               goto again;
-       if (err)
-               xenbus_dev_fatal(dev, err, "ending transaction");
-
-       err = xenbus_switch_state(dev, XenbusStateConnected);
-       if (err)
-               xenbus_dev_fatal(dev, err, "switching to Connected state",
-                                dev->nodename);
-
-       return;
- abort:
-       xenbus_transaction_end(xbt, 1);
-}
-
-
-static int connect_ring(struct backend_info *be)
-{
-       struct xenbus_device *dev = be->dev;
-       unsigned long ring_ref;
-       unsigned int evtchn;
-       char protocol[64] = "";
-       int err;
-
-       DPRINTK("%s", dev->otherend);
-
-       err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", &ring_ref,
-                           "event-channel", "%u", &evtchn, NULL);
-       if (err) {
-               xenbus_dev_fatal(dev, err,
-                                "reading %s/ring-ref and event-channel",
-                                dev->otherend);
-               return err;
-       }
-
-       be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-       err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
-                           "%63s", protocol, NULL);
-       if (err)
-               strcpy(protocol, "unspecified, assuming native");
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32;
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_64))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64;
-       else {
-               xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
-               return -1;
-       }
-       printk(KERN_INFO
-              "blkback: ring-ref %ld, event-channel %d, protocol %d (%s)\n",
-              ring_ref, evtchn, be->blkif->blk_protocol, protocol);
-
-       /* Map the shared frame, irq etc. */
-       err = blkif_map(be->blkif, ring_ref, evtchn);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u",
-                                ring_ref, evtchn);
-               return err;
-       }
-
-       return 0;
-}
-
-
-/* ** Driver Registration ** */
-
-
-static struct xenbus_device_id blkback_ids[] = {
-       { "vbd" },
-       { "" }
-};
-
-
-static struct xenbus_driver blkback = {
-       .name = "vbd",
-       .owner = THIS_MODULE,
-       .ids = blkback_ids,
-       .probe = blkback_probe,
-       .remove = blkback_remove,
-       .otherend_changed = frontend_changed
-};
-
-
-void blkif_xenbus_init(void)
-{
-       xenbus_register_backend(&blkback);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/Makefile b/linux-2.6-xen-sparse/drivers/xen/blkfront/Makefile
deleted file mode 100644 (file)
index 182ef65..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-obj-$(CONFIG_XEN_BLKDEV_FRONTEND)      := xenblk.o
-
-xenblk-objs := blkfront.o vbd.o
-
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
deleted file mode 100644 (file)
index 283e17c..0000000
+++ /dev/null
@@ -1,902 +0,0 @@
-/******************************************************************************
- * blkfront.c
- * 
- * XenLinux virtual block-device driver.
- * 
- * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
- * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
- * Copyright (c) 2004, Christian Limpach
- * Copyright (c) 2004, Andrew Warfield
- * Copyright (c) 2005, Christopher Clark
- * Copyright (c) 2005, XenSource Ltd
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/version.h>
-#include "block.h"
-#include <linux/cdrom.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <scsi/scsi.h>
-#include <xen/evtchn.h>
-#include <xen/xenbus.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/io/protocols.h>
-#include <xen/gnttab.h>
-#include <asm/hypervisor.h>
-#include <asm/maddr.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#define BLKIF_STATE_DISCONNECTED 0
-#define BLKIF_STATE_CONNECTED    1
-#define BLKIF_STATE_SUSPENDED    2
-
-#define MAXIMUM_OUTSTANDING_BLOCK_REQS \
-    (BLKIF_MAX_SEGMENTS_PER_REQUEST * BLK_RING_SIZE)
-#define GRANT_INVALID_REF      0
-
-static void connect(struct blkfront_info *);
-static void blkfront_closing(struct xenbus_device *);
-static int blkfront_remove(struct xenbus_device *);
-static int talk_to_backend(struct xenbus_device *, struct blkfront_info *);
-static int setup_blkring(struct xenbus_device *, struct blkfront_info *);
-
-static void kick_pending_request_queues(struct blkfront_info *);
-
-static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs);
-static void blkif_restart_queue(void *arg);
-static void blkif_recover(struct blkfront_info *);
-static void blkif_completion(struct blk_shadow *);
-static void blkif_free(struct blkfront_info *, int);
-
-
-/**
- * Entry point to this code when a new device is created.  Allocate the basic
- * structures and the ring buffer for communication with the backend, and
- * inform the backend of the appropriate details for those.  Switch to
- * Initialised state.
- */
-static int blkfront_probe(struct xenbus_device *dev,
-                         const struct xenbus_device_id *id)
-{
-       int err, vdevice, i;
-       struct blkfront_info *info;
-
-       /* FIXME: Use dynamic device id if this is not set. */
-       err = xenbus_scanf(XBT_NIL, dev->nodename,
-                          "virtual-device", "%i", &vdevice);
-       if (err != 1) {
-               xenbus_dev_fatal(dev, err, "reading virtual-device");
-               return err;
-       }
-
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
-       if (!info) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-               return -ENOMEM;
-       }
-
-       info->xbdev = dev;
-       info->vdevice = vdevice;
-       info->connected = BLKIF_STATE_DISCONNECTED;
-       INIT_WORK(&info->work, blkif_restart_queue, (void *)info);
-
-       for (i = 0; i < BLK_RING_SIZE; i++)
-               info->shadow[i].req.id = i+1;
-       info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff;
-
-       /* Front end dir is a number, which is used as the id. */
-       info->handle = simple_strtoul(strrchr(dev->nodename,'/')+1, NULL, 0);
-       dev->dev.driver_data = info;
-
-       err = talk_to_backend(dev, info);
-       if (err) {
-               kfree(info);
-               dev->dev.driver_data = NULL;
-               return err;
-       }
-
-       return 0;
-}
-
-
-/**
- * We are reconnecting to the backend, due to a suspend/resume, or a backend
- * driver restart.  We tear down our blkif structure and recreate it, but
- * leave the device-layer structures intact so that this is transparent to the
- * rest of the kernel.
- */
-static int blkfront_resume(struct xenbus_device *dev)
-{
-       struct blkfront_info *info = dev->dev.driver_data;
-       int err;
-
-       DPRINTK("blkfront_resume: %s\n", dev->nodename);
-
-       blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
-
-       err = talk_to_backend(dev, info);
-       if (info->connected == BLKIF_STATE_SUSPENDED && !err)
-               blkif_recover(info);
-
-       return err;
-}
-
-
-/* Common code used when first setting up, and when resuming. */
-static int talk_to_backend(struct xenbus_device *dev,
-                          struct blkfront_info *info)
-{
-       const char *message = NULL;
-       struct xenbus_transaction xbt;
-       int err;
-
-       /* Create shared ring, alloc event channel. */
-       err = setup_blkring(dev, info);
-       if (err)
-               goto out;
-
-again:
-       err = xenbus_transaction_start(&xbt);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "starting transaction");
-               goto destroy_blkring;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename,
-                           "ring-ref","%u", info->ring_ref);
-       if (err) {
-               message = "writing ring-ref";
-               goto abort_transaction;
-       }
-       err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           irq_to_evtchn_port(info->irq));
-       if (err) {
-               message = "writing event-channel";
-               goto abort_transaction;
-       }
-       err = xenbus_printf(xbt, dev->nodename, "protocol", "%s",
-                           XEN_IO_PROTO_ABI_NATIVE);
-       if (err) {
-               message = "writing protocol";
-               goto abort_transaction;
-       }
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err) {
-               if (err == -EAGAIN)
-                       goto again;
-               xenbus_dev_fatal(dev, err, "completing transaction");
-               goto destroy_blkring;
-       }
-
-       xenbus_switch_state(dev, XenbusStateInitialised);
-
-       return 0;
-
- abort_transaction:
-       xenbus_transaction_end(xbt, 1);
-       if (message)
-               xenbus_dev_fatal(dev, err, "%s", message);
- destroy_blkring:
-       blkif_free(info, 0);
- out:
-       return err;
-}
-
-
-static int setup_blkring(struct xenbus_device *dev,
-                        struct blkfront_info *info)
-{
-       blkif_sring_t *sring;
-       int err;
-
-       info->ring_ref = GRANT_INVALID_REF;
-
-       sring = (blkif_sring_t *)__get_free_page(GFP_KERNEL);
-       if (!sring) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
-               return -ENOMEM;
-       }
-       SHARED_RING_INIT(sring);
-       FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
-
-       err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
-       if (err < 0) {
-               free_page((unsigned long)sring);
-               info->ring.sring = NULL;
-               goto fail;
-       }
-       info->ring_ref = err;
-
-       err = bind_listening_port_to_irqhandler(
-               dev->otherend_id, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
-       if (err <= 0) {
-               xenbus_dev_fatal(dev, err,
-                                "bind_listening_port_to_irqhandler");
-               goto fail;
-       }
-       info->irq = err;
-
-       return 0;
-fail:
-       blkif_free(info, 0);
-       return err;
-}
-
-
-/**
- * Callback received when the backend's state changes.
- */
-static void backend_changed(struct xenbus_device *dev,
-                           enum xenbus_state backend_state)
-{
-       struct blkfront_info *info = dev->dev.driver_data;
-       struct block_device *bd;
-
-       DPRINTK("blkfront:backend_changed.\n");
-
-       switch (backend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitWait:
-       case XenbusStateInitialised:
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               break;
-
-       case XenbusStateConnected:
-               connect(info);
-               break;
-
-       case XenbusStateClosing:
-               bd = bdget(info->dev);
-               if (bd == NULL)
-                       xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-               down(&bd->bd_sem);
-#else
-               mutex_lock(&bd->bd_mutex);
-#endif
-               if (info->users > 0)
-                       xenbus_dev_error(dev, -EBUSY,
-                                        "Device in use; refusing to close");
-               else
-                       blkfront_closing(dev);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-               up(&bd->bd_sem);
-#else
-               mutex_unlock(&bd->bd_mutex);
-#endif
-               bdput(bd);
-               break;
-       }
-}
-
-
-/* ** Connection ** */
-
-
-/*
- * Invoked when the backend is finally 'ready' (and has told produced
- * the details about the physical device - #sectors, size, etc).
- */
-static void connect(struct blkfront_info *info)
-{
-       unsigned long long sectors;
-       unsigned long sector_size;
-       unsigned int binfo;
-       int err;
-
-       if ((info->connected == BLKIF_STATE_CONNECTED) ||
-           (info->connected == BLKIF_STATE_SUSPENDED) )
-               return;
-
-       DPRINTK("blkfront.c:connect:%s.\n", info->xbdev->otherend);
-
-       err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
-                           "sectors", "%Lu", &sectors,
-                           "info", "%u", &binfo,
-                           "sector-size", "%lu", &sector_size,
-                           NULL);
-       if (err) {
-               xenbus_dev_fatal(info->xbdev, err,
-                                "reading backend fields at %s",
-                                info->xbdev->otherend);
-               return;
-       }
-
-       err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
-                           "feature-barrier", "%lu", &info->feature_barrier,
-                           NULL);
-       if (err)
-               info->feature_barrier = 0;
-
-       err = xlvbd_add(sectors, info->vdevice, binfo, sector_size, info);
-       if (err) {
-               xenbus_dev_fatal(info->xbdev, err, "xlvbd_add at %s",
-                                info->xbdev->otherend);
-               return;
-       }
-
-       (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
-
-       /* Kick pending requests. */
-       spin_lock_irq(&blkif_io_lock);
-       info->connected = BLKIF_STATE_CONNECTED;
-       kick_pending_request_queues(info);
-       spin_unlock_irq(&blkif_io_lock);
-
-       add_disk(info->gd);
-}
-
-/**
- * Handle the change of state of the backend to Closing.  We must delete our
- * device-layer structures now, to ensure that writes are flushed through to
- * the backend.  Once is this done, we can switch to Closed in
- * acknowledgement.
- */
-static void blkfront_closing(struct xenbus_device *dev)
-{
-       struct blkfront_info *info = dev->dev.driver_data;
-       unsigned long flags;
-
-       DPRINTK("blkfront_closing: %s removed\n", dev->nodename);
-
-       if (info->rq == NULL)
-               goto out;
-
-       spin_lock_irqsave(&blkif_io_lock, flags);
-       /* No more blkif_request(). */
-       blk_stop_queue(info->rq);
-       /* No more gnttab callback work. */
-       gnttab_cancel_free_callback(&info->callback);
-       spin_unlock_irqrestore(&blkif_io_lock, flags);
-
-       /* Flush gnttab callback work. Must be done with no locks held. */
-       flush_scheduled_work();
-
-       xlvbd_del(info);
-
- out:
-       xenbus_frontend_closed(dev);
-}
-
-
-static int blkfront_remove(struct xenbus_device *dev)
-{
-       struct blkfront_info *info = dev->dev.driver_data;
-
-       DPRINTK("blkfront_remove: %s removed\n", dev->nodename);
-
-       blkif_free(info, 0);
-
-       kfree(info);
-
-       return 0;
-}
-
-
-static inline int GET_ID_FROM_FREELIST(
-       struct blkfront_info *info)
-{
-       unsigned long free = info->shadow_free;
-       BUG_ON(free > BLK_RING_SIZE);
-       info->shadow_free = info->shadow[free].req.id;
-       info->shadow[free].req.id = 0x0fffffee; /* debug */
-       return free;
-}
-
-static inline void ADD_ID_TO_FREELIST(
-       struct blkfront_info *info, unsigned long id)
-{
-       info->shadow[id].req.id  = info->shadow_free;
-       info->shadow[id].request = 0;
-       info->shadow_free = id;
-}
-
-static inline void flush_requests(struct blkfront_info *info)
-{
-       int notify;
-
-       RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->ring, notify);
-
-       if (notify)
-               notify_remote_via_irq(info->irq);
-}
-
-static void kick_pending_request_queues(struct blkfront_info *info)
-{
-       if (!RING_FULL(&info->ring)) {
-               /* Re-enable calldowns. */
-               blk_start_queue(info->rq);
-               /* Kick things off immediately. */
-               do_blkif_request(info->rq);
-       }
-}
-
-static void blkif_restart_queue(void *arg)
-{
-       struct blkfront_info *info = (struct blkfront_info *)arg;
-       spin_lock_irq(&blkif_io_lock);
-       if (info->connected == BLKIF_STATE_CONNECTED)
-               kick_pending_request_queues(info);
-       spin_unlock_irq(&blkif_io_lock);
-}
-
-static void blkif_restart_queue_callback(void *arg)
-{
-       struct blkfront_info *info = (struct blkfront_info *)arg;
-       schedule_work(&info->work);
-}
-
-int blkif_open(struct inode *inode, struct file *filep)
-{
-       struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
-       info->users++;
-       return 0;
-}
-
-
-int blkif_release(struct inode *inode, struct file *filep)
-{
-       struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
-       info->users--;
-       if (info->users == 0) {
-               /* Check whether we have been instructed to close.  We will
-                  have ignored this request initially, as the device was
-                  still mounted. */
-               struct xenbus_device * dev = info->xbdev;
-               enum xenbus_state state = xenbus_read_driver_state(dev->otherend);
-
-               if (state == XenbusStateClosing)
-                       blkfront_closing(dev);
-       }
-       return 0;
-}
-
-
-int blkif_ioctl(struct inode *inode, struct file *filep,
-               unsigned command, unsigned long argument)
-{
-       int i;
-
-       DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
-                     command, (long)argument, inode->i_rdev);
-
-       switch (command) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
-       case HDIO_GETGEO: {
-               struct block_device *bd = inode->i_bdev;
-               struct hd_geometry geo;
-               int ret;
-
-                if (!argument)
-                        return -EINVAL;
-
-               geo.start = get_start_sect(bd);
-               ret = blkif_getgeo(bd, &geo);
-               if (ret)
-                       return ret;
-
-               if (copy_to_user((struct hd_geometry __user *)argument, &geo,
-                                sizeof(geo)))
-                        return -EFAULT;
-
-                return 0;
-       }
-#endif
-       case CDROMMULTISESSION:
-               DPRINTK("FIXME: support multisession CDs later\n");
-               for (i = 0; i < sizeof(struct cdrom_multisession); i++)
-                       if (put_user(0, (char __user *)(argument + i)))
-                               return -EFAULT;
-               return 0;
-
-       default:
-               /*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n",
-                 command);*/
-               return -EINVAL; /* same return as native Linux */
-       }
-
-       return 0;
-}
-
-
-int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
-{
-       /* We don't have real geometry info, but let's at least return
-          values consistent with the size of the device */
-       sector_t nsect = get_capacity(bd->bd_disk);
-       sector_t cylinders = nsect;
-
-       hg->heads = 0xff;
-       hg->sectors = 0x3f;
-       sector_div(cylinders, hg->heads * hg->sectors);
-       hg->cylinders = cylinders;
-       if ((sector_t)(hg->cylinders + 1) * hg->heads * hg->sectors < nsect)
-               hg->cylinders = 0xffff;
-       return 0;
-}
-
-
-/*
- * blkif_queue_request
- *
- * request block io
- *
- * id: for guest use only.
- * operation: BLKIF_OP_{READ,WRITE,PROBE}
- * buffer: buffer to read/write into. this should be a
- *   virtual address in the guest os.
- */
-static int blkif_queue_request(struct request *req)
-{
-       struct blkfront_info *info = req->rq_disk->private_data;
-       unsigned long buffer_mfn;
-       blkif_request_t *ring_req;
-       struct bio *bio;
-       struct bio_vec *bvec;
-       int idx;
-       unsigned long id;
-       unsigned int fsect, lsect;
-       int ref;
-       grant_ref_t gref_head;
-
-       if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
-               return 1;
-
-       if (gnttab_alloc_grant_references(
-               BLKIF_MAX_SEGMENTS_PER_REQUEST, &gref_head) < 0) {
-               gnttab_request_free_callback(
-                       &info->callback,
-                       blkif_restart_queue_callback,
-                       info,
-                       BLKIF_MAX_SEGMENTS_PER_REQUEST);
-               return 1;
-       }
-
-       /* Fill out a communications ring structure. */
-       ring_req = RING_GET_REQUEST(&info->ring, info->ring.req_prod_pvt);
-       id = GET_ID_FROM_FREELIST(info);
-       info->shadow[id].request = (unsigned long)req;
-
-       ring_req->id = id;
-       ring_req->sector_number = (blkif_sector_t)req->sector;
-       ring_req->handle = info->handle;
-
-       ring_req->operation = rq_data_dir(req) ?
-               BLKIF_OP_WRITE : BLKIF_OP_READ;
-       if (blk_barrier_rq(req))
-               ring_req->operation = BLKIF_OP_WRITE_BARRIER;
-
-       ring_req->nr_segments = 0;
-       rq_for_each_bio (bio, req) {
-               bio_for_each_segment (bvec, bio, idx) {
-                       BUG_ON(ring_req->nr_segments
-                              == BLKIF_MAX_SEGMENTS_PER_REQUEST);
-                       buffer_mfn = page_to_phys(bvec->bv_page) >> PAGE_SHIFT;
-                       fsect = bvec->bv_offset >> 9;
-                       lsect = fsect + (bvec->bv_len >> 9) - 1;
-                       /* install a grant reference. */
-                       ref = gnttab_claim_grant_reference(&gref_head);
-                       BUG_ON(ref == -ENOSPC);
-
-                       gnttab_grant_foreign_access_ref(
-                               ref,
-                               info->xbdev->otherend_id,
-                               buffer_mfn,
-                               rq_data_dir(req) );
-
-                       info->shadow[id].frame[ring_req->nr_segments] =
-                               mfn_to_pfn(buffer_mfn);
-
-                       ring_req->seg[ring_req->nr_segments] =
-                               (struct blkif_request_segment) {
-                                       .gref       = ref,
-                                       .first_sect = fsect,
-                                       .last_sect  = lsect };
-
-                       ring_req->nr_segments++;
-               }
-       }
-
-       info->ring.req_prod_pvt++;
-
-       /* Keep a private copy so we can reissue requests when recovering. */
-       info->shadow[id].req = *ring_req;
-
-       gnttab_free_grant_references(gref_head);
-
-       return 0;
-}
-
-/*
- * do_blkif_request
- *  read a block; request is in a request queue
- */
-void do_blkif_request(request_queue_t *rq)
-{
-       struct blkfront_info *info = NULL;
-       struct request *req;
-       int queued;
-
-       DPRINTK("Entered do_blkif_request\n");
-
-       queued = 0;
-
-       while ((req = elv_next_request(rq)) != NULL) {
-               info = req->rq_disk->private_data;
-               if (!blk_fs_request(req)) {
-                       end_request(req, 0);
-                       continue;
-               }
-
-               if (RING_FULL(&info->ring))
-                       goto wait;
-
-               DPRINTK("do_blk_req %p: cmd %p, sec %llx, "
-                       "(%u/%li) buffer:%p [%s]\n",
-                       req, req->cmd, (long long)req->sector,
-                       req->current_nr_sectors,
-                       req->nr_sectors, req->buffer,
-                       rq_data_dir(req) ? "write" : "read");
-
-
-               blkdev_dequeue_request(req);
-               if (blkif_queue_request(req)) {
-                       blk_requeue_request(rq, req);
-               wait:
-                       /* Avoid pointless unplugs. */
-                       blk_stop_queue(rq);
-                       break;
-               }
-
-               queued++;
-       }
-
-       if (queued != 0)
-               flush_requests(info);
-}
-
-
-static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs)
-{
-       struct request *req;
-       blkif_response_t *bret;
-       RING_IDX i, rp;
-       unsigned long flags;
-       struct blkfront_info *info = (struct blkfront_info *)dev_id;
-       int uptodate;
-
-       spin_lock_irqsave(&blkif_io_lock, flags);
-
-       if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
-               spin_unlock_irqrestore(&blkif_io_lock, flags);
-               return IRQ_HANDLED;
-       }
-
- again:
-       rp = info->ring.sring->rsp_prod;
-       rmb(); /* Ensure we see queued responses up to 'rp'. */
-
-       for (i = info->ring.rsp_cons; i != rp; i++) {
-               unsigned long id;
-               int ret;
-
-               bret = RING_GET_RESPONSE(&info->ring, i);
-               id   = bret->id;
-               req  = (struct request *)info->shadow[id].request;
-
-               blkif_completion(&info->shadow[id]);
-
-               ADD_ID_TO_FREELIST(info, id);
-
-               uptodate = (bret->status == BLKIF_RSP_OKAY);
-               switch (bret->operation) {
-               case BLKIF_OP_WRITE_BARRIER:
-                       if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) {
-                               printk("blkfront: %s: write barrier op failed\n",
-                                      info->gd->disk_name);
-                               uptodate = -EOPNOTSUPP;
-                               info->feature_barrier = 0;
-                               xlvbd_barrier(info);
-                       }
-                       /* fall through */
-               case BLKIF_OP_READ:
-               case BLKIF_OP_WRITE:
-                       if (unlikely(bret->status != BLKIF_RSP_OKAY))
-                               DPRINTK("Bad return from blkdev data "
-                                       "request: %x\n", bret->status);
-
-                       ret = end_that_request_first(req, uptodate,
-                               req->hard_nr_sectors);
-                       BUG_ON(ret);
-                       end_that_request_last(req, uptodate);
-                       break;
-               default:
-                       BUG();
-               }
-       }
-
-       info->ring.rsp_cons = i;
-
-       if (i != info->ring.req_prod_pvt) {
-               int more_to_do;
-               RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, more_to_do);
-               if (more_to_do)
-                       goto again;
-       } else
-               info->ring.sring->rsp_event = i + 1;
-
-       kick_pending_request_queues(info);
-
-       spin_unlock_irqrestore(&blkif_io_lock, flags);
-
-       return IRQ_HANDLED;
-}
-
-static void blkif_free(struct blkfront_info *info, int suspend)
-{
-       /* Prevent new requests being issued until we fix things up. */
-       spin_lock_irq(&blkif_io_lock);
-       info->connected = suspend ?
-               BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED;
-       /* No more blkif_request(). */
-       if (info->rq)
-               blk_stop_queue(info->rq);
-       /* No more gnttab callback work. */
-       gnttab_cancel_free_callback(&info->callback);
-       spin_unlock_irq(&blkif_io_lock);
-
-       /* Flush gnttab callback work. Must be done with no locks held. */
-       flush_scheduled_work();
-
-       /* Free resources associated with old device channel. */
-       if (info->ring_ref != GRANT_INVALID_REF) {
-               gnttab_end_foreign_access(info->ring_ref, 0,
-                                         (unsigned long)info->ring.sring);
-               info->ring_ref = GRANT_INVALID_REF;
-               info->ring.sring = NULL;
-       }
-       if (info->irq)
-               unbind_from_irqhandler(info->irq, info);
-       info->irq = 0;
-}
-
-static void blkif_completion(struct blk_shadow *s)
-{
-       int i;
-       for (i = 0; i < s->req.nr_segments; i++)
-               gnttab_end_foreign_access(s->req.seg[i].gref, 0, 0UL);
-}
-
-static void blkif_recover(struct blkfront_info *info)
-{
-       int i;
-       blkif_request_t *req;
-       struct blk_shadow *copy;
-       int j;
-
-       /* Stage 1: Make a safe copy of the shadow state. */
-       copy = kmalloc(sizeof(info->shadow), GFP_KERNEL | __GFP_NOFAIL);
-       memcpy(copy, info->shadow, sizeof(info->shadow));
-
-       /* Stage 2: Set up free list. */
-       memset(&info->shadow, 0, sizeof(info->shadow));
-       for (i = 0; i < BLK_RING_SIZE; i++)
-               info->shadow[i].req.id = i+1;
-       info->shadow_free = info->ring.req_prod_pvt;
-       info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff;
-
-       /* Stage 3: Find pending requests and requeue them. */
-       for (i = 0; i < BLK_RING_SIZE; i++) {
-               /* Not in use? */
-               if (copy[i].request == 0)
-                       continue;
-
-               /* Grab a request slot and copy shadow state into it. */
-               req = RING_GET_REQUEST(
-                       &info->ring, info->ring.req_prod_pvt);
-               *req = copy[i].req;
-
-               /* We get a new request id, and must reset the shadow state. */
-               req->id = GET_ID_FROM_FREELIST(info);
-               memcpy(&info->shadow[req->id], &copy[i], sizeof(copy[i]));
-
-               /* Rewrite any grant references invalidated by susp/resume. */
-               for (j = 0; j < req->nr_segments; j++)
-                       gnttab_grant_foreign_access_ref(
-                               req->seg[j].gref,
-                               info->xbdev->otherend_id,
-                               pfn_to_mfn(info->shadow[req->id].frame[j]),
-                               rq_data_dir(
-                                       (struct request *)
-                                       info->shadow[req->id].request));
-               info->shadow[req->id].req = *req;
-
-               info->ring.req_prod_pvt++;
-       }
-
-       kfree(copy);
-
-       (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
-
-       spin_lock_irq(&blkif_io_lock);
-
-       /* Now safe for us to use the shared ring */
-       info->connected = BLKIF_STATE_CONNECTED;
-
-       /* Send off requeued requests */
-       flush_requests(info);
-
-       /* Kick any other new requests queued since we resumed */
-       kick_pending_request_queues(info);
-
-       spin_unlock_irq(&blkif_io_lock);
-}
-
-
-/* ** Driver Registration ** */
-
-
-static struct xenbus_device_id blkfront_ids[] = {
-       { "vbd" },
-       { "" }
-};
-
-
-static struct xenbus_driver blkfront = {
-       .name = "vbd",
-       .owner = THIS_MODULE,
-       .ids = blkfront_ids,
-       .probe = blkfront_probe,
-       .remove = blkfront_remove,
-       .resume = blkfront_resume,
-       .otherend_changed = backend_changed,
-};
-
-
-static int __init xlblk_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       return xenbus_register_frontend(&blkfront);
-}
-module_init(xlblk_init);
-
-
-static void xlblk_exit(void)
-{
-       return xenbus_unregister_driver(&blkfront);
-}
-module_exit(xlblk_exit);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h
deleted file mode 100644 (file)
index 4111e6f..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/******************************************************************************
- * block.h
- * 
- * Shared definitions between all levels of XenLinux Virtual block devices.
- * 
- * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
- * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
- * Copyright (c) 2004-2005, Christian Limpach
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __XEN_DRIVERS_BLOCK_H__
-#define __XEN_DRIVERS_BLOCK_H__
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/hdreg.h>
-#include <linux/blkdev.h>
-#include <linux/major.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <xen/gnttab.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/io/blkif.h>
-#include <xen/interface/io/ring.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#include <asm/uaccess.h>
-
-#define DPRINTK(_f, _a...) pr_debug(_f, ## _a)
-
-#if 0
-#define DPRINTK_IOCTL(_f, _a...) printk(KERN_ALERT _f, ## _a)
-#else
-#define DPRINTK_IOCTL(_f, _a...) ((void)0)
-#endif
-
-struct xlbd_type_info
-{
-       int partn_shift;
-       int disks_per_major;
-       char *devname;
-       char *diskname;
-};
-
-struct xlbd_major_info
-{
-       int major;
-       int index;
-       int usage;
-       struct xlbd_type_info *type;
-};
-
-struct blk_shadow {
-       blkif_request_t req;
-       unsigned long request;
-       unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-};
-
-#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
-
-/*
- * We have one of these per vbd, whether ide, scsi or 'other'.  They
- * hang in private_data off the gendisk structure. We may end up
- * putting all kinds of interesting stuff here :-)
- */
-struct blkfront_info
-{
-       struct xenbus_device *xbdev;
-       dev_t dev;
-       struct gendisk *gd;
-       int vdevice;
-       blkif_vdev_t handle;
-       int connected;
-       int ring_ref;
-       blkif_front_ring_t ring;
-       unsigned int irq;
-       struct xlbd_major_info *mi;
-       request_queue_t *rq;
-       struct work_struct work;
-       struct gnttab_free_callback callback;
-       struct blk_shadow shadow[BLK_RING_SIZE];
-       unsigned long shadow_free;
-       int feature_barrier;
-
-       /**
-        * The number of people holding this device open.  We won't allow a
-        * hot-unplug unless this is 0.
-        */
-       int users;
-};
-
-extern spinlock_t blkif_io_lock;
-
-extern int blkif_open(struct inode *inode, struct file *filep);
-extern int blkif_release(struct inode *inode, struct file *filep);
-extern int blkif_ioctl(struct inode *inode, struct file *filep,
-                      unsigned command, unsigned long argument);
-extern int blkif_getgeo(struct block_device *, struct hd_geometry *);
-extern int blkif_check(dev_t dev);
-extern int blkif_revalidate(dev_t dev);
-extern void do_blkif_request (request_queue_t *rq);
-
-/* Virtual block-device subsystem. */
-/* Note that xlvbd_add doesn't call add_disk for you: you're expected
-   to call add_disk on info->gd once the disk is properly connected
-   up. */
-int xlvbd_add(blkif_sector_t capacity, int device,
-             u16 vdisk_info, u16 sector_size, struct blkfront_info *info);
-void xlvbd_del(struct blkfront_info *info);
-int xlvbd_barrier(struct blkfront_info *info);
-
-#endif /* __XEN_DRIVERS_BLOCK_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c b/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c
deleted file mode 100644 (file)
index 145e795..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-/******************************************************************************
- * vbd.c
- * 
- * XenLinux virtual block-device driver (xvd).
- * 
- * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
- * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
- * Copyright (c) 2004-2005, Christian Limpach
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "block.h"
-#include <linux/blkdev.h>
-#include <linux/list.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#define BLKIF_MAJOR(dev) ((dev)>>8)
-#define BLKIF_MINOR(dev) ((dev) & 0xff)
-
-/*
- * For convenience we distinguish between ide, scsi and 'other' (i.e.,
- * potentially combinations of the two) in the naming scheme and in a few other
- * places.
- */
-
-#define NUM_IDE_MAJORS 10
-#define NUM_SCSI_MAJORS 17
-#define NUM_VBD_MAJORS 1
-
-static struct xlbd_type_info xlbd_ide_type = {
-       .partn_shift = 6,
-       .disks_per_major = 2,
-       .devname = "ide",
-       .diskname = "hd",
-};
-
-static struct xlbd_type_info xlbd_scsi_type = {
-       .partn_shift = 4,
-       .disks_per_major = 16,
-       .devname = "sd",
-       .diskname = "sd",
-};
-
-static struct xlbd_type_info xlbd_vbd_type = {
-       .partn_shift = 4,
-       .disks_per_major = 16,
-       .devname = "xvd",
-       .diskname = "xvd",
-};
-
-static struct xlbd_major_info *major_info[NUM_IDE_MAJORS + NUM_SCSI_MAJORS +
-                                        NUM_VBD_MAJORS];
-
-#define XLBD_MAJOR_IDE_START   0
-#define XLBD_MAJOR_SCSI_START  (NUM_IDE_MAJORS)
-#define XLBD_MAJOR_VBD_START   (NUM_IDE_MAJORS + NUM_SCSI_MAJORS)
-
-#define XLBD_MAJOR_IDE_RANGE   XLBD_MAJOR_IDE_START ... XLBD_MAJOR_SCSI_START - 1
-#define XLBD_MAJOR_SCSI_RANGE  XLBD_MAJOR_SCSI_START ... XLBD_MAJOR_VBD_START - 1
-#define XLBD_MAJOR_VBD_RANGE   XLBD_MAJOR_VBD_START ... XLBD_MAJOR_VBD_START + NUM_VBD_MAJORS - 1
-
-/* Information about our VBDs. */
-#define MAX_VBDS 64
-static LIST_HEAD(vbds_list);
-
-static struct block_device_operations xlvbd_block_fops =
-{
-       .owner = THIS_MODULE,
-       .open = blkif_open,
-       .release = blkif_release,
-       .ioctl  = blkif_ioctl,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-       .getgeo = blkif_getgeo
-#endif
-};
-
-DEFINE_SPINLOCK(blkif_io_lock);
-
-static struct xlbd_major_info *
-xlbd_alloc_major_info(int major, int minor, int index)
-{
-       struct xlbd_major_info *ptr;
-
-       ptr = kzalloc(sizeof(struct xlbd_major_info), GFP_KERNEL);
-       if (ptr == NULL)
-               return NULL;
-
-       ptr->major = major;
-
-       switch (index) {
-       case XLBD_MAJOR_IDE_RANGE:
-               ptr->type = &xlbd_ide_type;
-               ptr->index = index - XLBD_MAJOR_IDE_START;
-               break;
-       case XLBD_MAJOR_SCSI_RANGE:
-               ptr->type = &xlbd_scsi_type;
-               ptr->index = index - XLBD_MAJOR_SCSI_START;
-               break;
-       case XLBD_MAJOR_VBD_RANGE:
-               ptr->type = &xlbd_vbd_type;
-               ptr->index = index - XLBD_MAJOR_VBD_START;
-               break;
-       }
-
-       if (register_blkdev(ptr->major, ptr->type->devname)) {
-               kfree(ptr);
-               return NULL;
-       }
-
-       printk("xen-vbd: registered block device major %i\n", ptr->major);
-       major_info[index] = ptr;
-       return ptr;
-}
-
-static struct xlbd_major_info *
-xlbd_get_major_info(int vdevice)
-{
-       struct xlbd_major_info *mi;
-       int major, minor, index;
-
-       major = BLKIF_MAJOR(vdevice);
-       minor = BLKIF_MINOR(vdevice);
-
-       switch (major) {
-       case IDE0_MAJOR: index = 0; break;
-       case IDE1_MAJOR: index = 1; break;
-       case IDE2_MAJOR: index = 2; break;
-       case IDE3_MAJOR: index = 3; break;
-       case IDE4_MAJOR: index = 4; break;
-       case IDE5_MAJOR: index = 5; break;
-       case IDE6_MAJOR: index = 6; break;
-       case IDE7_MAJOR: index = 7; break;
-       case IDE8_MAJOR: index = 8; break;
-       case IDE9_MAJOR: index = 9; break;
-       case SCSI_DISK0_MAJOR: index = 10; break;
-       case SCSI_DISK1_MAJOR ... SCSI_DISK7_MAJOR:
-               index = 11 + major - SCSI_DISK1_MAJOR;
-               break;
-        case SCSI_DISK8_MAJOR ... SCSI_DISK15_MAJOR:
-                index = 18 + major - SCSI_DISK8_MAJOR;
-                break;
-        case SCSI_CDROM_MAJOR: index = 26; break;
-        default: index = 27; break;
-       }
-
-       mi = ((major_info[index] != NULL) ? major_info[index] :
-             xlbd_alloc_major_info(major, minor, index));
-       if (mi)
-               mi->usage++;
-       return mi;
-}
-
-static void
-xlbd_put_major_info(struct xlbd_major_info *mi)
-{
-       mi->usage--;
-       /* XXX: release major if 0 */
-}
-
-static int
-xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
-{
-       request_queue_t *rq;
-
-       rq = blk_init_queue(do_blkif_request, &blkif_io_lock);
-       if (rq == NULL)
-               return -1;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
-       elevator_init(rq, "noop");
-#else
-       elevator_init(rq, &elevator_noop);
-#endif
-
-       /* Hard sector size and max sectors impersonate the equiv. hardware. */
-       blk_queue_hardsect_size(rq, sector_size);
-       blk_queue_max_sectors(rq, 512);
-
-       /* Each segment in a request is up to an aligned page in size. */
-       blk_queue_segment_boundary(rq, PAGE_SIZE - 1);
-       blk_queue_max_segment_size(rq, PAGE_SIZE);
-
-       /* Ensure a merged request will fit in a single I/O ring slot. */
-       blk_queue_max_phys_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
-       blk_queue_max_hw_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
-
-       /* Make sure buffer addresses are sector-aligned. */
-       blk_queue_dma_alignment(rq, 511);
-
-       gd->queue = rq;
-
-       return 0;
-}
-
-static int
-xlvbd_alloc_gendisk(int minor, blkif_sector_t capacity, int vdevice,
-                   u16 vdisk_info, u16 sector_size,
-                   struct blkfront_info *info)
-{
-       struct gendisk *gd;
-       struct xlbd_major_info *mi;
-       int nr_minors = 1;
-       int err = -ENODEV;
-       unsigned int offset;
-
-       BUG_ON(info->gd != NULL);
-       BUG_ON(info->mi != NULL);
-       BUG_ON(info->rq != NULL);
-
-       mi = xlbd_get_major_info(vdevice);
-       if (mi == NULL)
-               goto out;
-       info->mi = mi;
-
-       if ((minor & ((1 << mi->type->partn_shift) - 1)) == 0)
-               nr_minors = 1 << mi->type->partn_shift;
-
-       gd = alloc_disk(nr_minors);
-       if (gd == NULL)
-               goto out;
-
-       offset =  mi->index * mi->type->disks_per_major +
-                       (minor >> mi->type->partn_shift);
-       if (nr_minors > 1) {
-               if (offset < 26) {
-                       sprintf(gd->disk_name, "%s%c",
-                                mi->type->diskname, 'a' + offset );
-               }
-               else {
-                       sprintf(gd->disk_name, "%s%c%c",
-                               mi->type->diskname,
-                               'a' + ((offset/26)-1), 'a' + (offset%26) );
-               }
-       }
-       else {
-               if (offset < 26) {
-                       sprintf(gd->disk_name, "%s%c%d",
-                               mi->type->diskname,
-                               'a' + offset,
-                               minor & ((1 << mi->type->partn_shift) - 1));
-               }
-               else {
-                       sprintf(gd->disk_name, "%s%c%c%d",
-                               mi->type->diskname,
-                               'a' + ((offset/26)-1), 'a' + (offset%26),
-                               minor & ((1 << mi->type->partn_shift) - 1));
-               }
-       }
-
-       gd->major = mi->major;
-       gd->first_minor = minor;
-       gd->fops = &xlvbd_block_fops;
-       gd->private_data = info;
-       gd->driverfs_dev = &(info->xbdev->dev);
-       set_capacity(gd, capacity);
-
-       if (xlvbd_init_blk_queue(gd, sector_size)) {
-               del_gendisk(gd);
-               goto out;
-       }
-
-       info->rq = gd->queue;
-       info->gd = gd;
-
-       if (info->feature_barrier)
-               xlvbd_barrier(info);
-
-       if (vdisk_info & VDISK_READONLY)
-               set_disk_ro(gd, 1);
-
-       if (vdisk_info & VDISK_REMOVABLE)
-               gd->flags |= GENHD_FL_REMOVABLE;
-
-       if (vdisk_info & VDISK_CDROM)
-               gd->flags |= GENHD_FL_CD;
-
-       return 0;
-
- out:
-       if (mi)
-               xlbd_put_major_info(mi);
-       info->mi = NULL;
-       return err;
-}
-
-int
-xlvbd_add(blkif_sector_t capacity, int vdevice, u16 vdisk_info,
-         u16 sector_size, struct blkfront_info *info)
-{
-       struct block_device *bd;
-       int err = 0;
-
-       info->dev = MKDEV(BLKIF_MAJOR(vdevice), BLKIF_MINOR(vdevice));
-
-       bd = bdget(info->dev);
-       if (bd == NULL)
-               return -ENODEV;
-
-       err = xlvbd_alloc_gendisk(BLKIF_MINOR(vdevice), capacity, vdevice,
-                                 vdisk_info, sector_size, info);
-
-       bdput(bd);
-       return err;
-}
-
-void
-xlvbd_del(struct blkfront_info *info)
-{
-       if (info->mi == NULL)
-               return;
-
-       BUG_ON(info->gd == NULL);
-       del_gendisk(info->gd);
-       put_disk(info->gd);
-       info->gd = NULL;
-
-       xlbd_put_major_info(info->mi);
-       info->mi = NULL;
-
-       BUG_ON(info->rq == NULL);
-       blk_cleanup_queue(info->rq);
-       info->rq = NULL;
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-int
-xlvbd_barrier(struct blkfront_info *info)
-{
-       int err;
-
-       err = blk_queue_ordered(info->rq,
-               info->feature_barrier ? QUEUE_ORDERED_DRAIN : QUEUE_ORDERED_NONE, NULL);
-       if (err)
-               return err;
-       printk("blkfront: %s: barriers %s\n",
-              info->gd->disk_name, info->feature_barrier ? "enabled" : "disabled");
-       return 0;
-}
-#else
-int
-xlvbd_barrier(struct blkfront_info *info)
-{
-       printk("blkfront: %s: barriers disabled\n", info->gd->disk_name);
-       return -ENOSYS;
-}
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/blktap/Makefile b/linux-2.6-xen-sparse/drivers/xen/blktap/Makefile
deleted file mode 100644 (file)
index f10cc4f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-LINUXINCLUDE += -I../xen/include/public/io
-
-obj-$(CONFIG_XEN_BLKDEV_TAP) := xenblktap.o
-
-xenblktap-y := xenbus.o interface.o blktap.o 
diff --git a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
deleted file mode 100644 (file)
index e52e15c..0000000
+++ /dev/null
@@ -1,1641 +0,0 @@
-/******************************************************************************
- * drivers/xen/blktap/blktap.c
- * 
- * Back-end driver for user level virtual block devices. This portion of the
- * driver exports a 'unified' block-device interface that can be accessed
- * by any operating system that implements a compatible front end. Requests
- * are remapped to a user-space memory region.
- *
- * Based on the blkback driver code.
- * 
- * Copyright (c) 2004-2005, Andrew Warfield and Julian Chesterfield
- *
- * Clean ups and fix ups:
- *    Copyright (c) 2006, Steven Rostedt - Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/spinlock.h>
-#include <linux/kthread.h>
-#include <linux/list.h>
-#include <asm/hypervisor.h>
-#include "common.h"
-#include <xen/balloon.h>
-#include <xen/driver_util.h>
-#include <linux/kernel.h>
-#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/errno.h>
-#include <linux/major.h>
-#include <linux/gfp.h>
-#include <linux/poll.h>
-#include <asm/tlbflush.h>
-
-#define MAX_TAP_DEV 256     /*the maximum number of tapdisk ring devices    */
-#define MAX_DEV_NAME 100    /*the max tapdisk ring device name e.g. blktap0 */
-
-/*
- * The maximum number of requests that can be outstanding at any time
- * is determined by 
- *
- *   [mmap_alloc * MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST] 
- *
- * where mmap_alloc < MAX_DYNAMIC_MEM.
- *
- * TODO:
- * mmap_alloc is initialised to 2 and should be adjustable on the fly via
- * sysfs.
- */
-#define BLK_RING_SIZE          __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
-#define MAX_DYNAMIC_MEM                BLK_RING_SIZE
-#define MAX_PENDING_REQS       BLK_RING_SIZE
-#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
-#define MMAP_VADDR(_start, _req,_seg)                                   \
-        (_start +                                                       \
-         ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) +        \
-         ((_seg) * PAGE_SIZE))
-static int blkif_reqs = MAX_PENDING_REQS;
-static int mmap_pages = MMAP_PAGES;
-
-#define RING_PAGES 1 /* BLKTAP - immediately before the mmap area, we
-                     * have a bunch of pages reserved for shared
-                     * memory rings.
-                     */
-
-/*Data struct handed back to userspace for tapdisk device to VBD mapping*/
-typedef struct domid_translate {
-       unsigned short domid;
-       unsigned short busid;
-} domid_translate_t ;
-
-/*Data struct associated with each of the tapdisk devices*/
-typedef struct tap_blkif {
-       struct vm_area_struct *vma;   /*Shared memory area                   */
-       unsigned long rings_vstart;   /*Kernel memory mapping                */
-       unsigned long user_vstart;    /*User memory mapping                  */
-       unsigned long dev_inuse;      /*One process opens device at a time.  */
-       unsigned long dev_pending;    /*In process of being opened           */
-       unsigned long ring_ok;        /*make this ring->state                */
-       blkif_front_ring_t ufe_ring;  /*Rings up to user space.              */
-       wait_queue_head_t wait;       /*for poll                             */
-       unsigned long mode;           /*current switching mode               */
-       int minor;                    /*Minor number for tapdisk device      */
-       pid_t pid;                    /*tapdisk process id                   */
-       enum { RUNNING, CLEANSHUTDOWN } status; /*Detect a clean userspace 
-                                                 shutdown                   */
-       unsigned long *idx_map;       /*Record the user ring id to kern 
-                                       [req id, idx] tuple                  */
-       blkif_t *blkif;               /*Associate blkif with tapdev          */
-       struct domid_translate trans; /*Translation from domid to bus.       */
-} tap_blkif_t;
-
-static struct tap_blkif *tapfds[MAX_TAP_DEV];
-static int blktap_next_minor;
-
-static int __init set_blkif_reqs(char *str)
-{
-       get_option(&str, &blkif_reqs);
-       return 1;
-}
-__setup("blkif_reqs=", set_blkif_reqs);
-
-/* Run-time switchable: /sys/module/blktap/parameters/ */
-static unsigned int log_stats = 0;
-static unsigned int debug_lvl = 0;
-module_param(log_stats, int, 0644);
-module_param(debug_lvl, int, 0644);
-
-/*
- * Each outstanding request that we've passed to the lower device layers has a 
- * 'pending_req' allocated to it. Each buffer_head that completes decrements 
- * the pendcnt towards zero. When it hits zero, the specified domain has a 
- * response queued for it, with the saved 'id' passed back.
- */
-typedef struct {
-       blkif_t       *blkif;
-       u64            id;
-       unsigned short mem_idx;
-       int            nr_pages;
-       atomic_t       pendcnt;
-       unsigned short operation;
-       int            status;
-       struct list_head free_list;
-       int            inuse;
-} pending_req_t;
-
-static pending_req_t *pending_reqs[MAX_PENDING_REQS];
-static struct list_head pending_free;
-static DEFINE_SPINLOCK(pending_free_lock);
-static DECLARE_WAIT_QUEUE_HEAD (pending_free_wq);
-static int alloc_pending_reqs;
-
-typedef unsigned int PEND_RING_IDX;
-
-static inline int MASK_PEND_IDX(int i) { 
-       return (i & (MAX_PENDING_REQS-1));
-}
-
-static inline unsigned int RTN_PEND_IDX(pending_req_t *req, int idx) {
-       return (req - pending_reqs[idx]);
-}
-
-#define NR_PENDING_REQS (MAX_PENDING_REQS - pending_prod + pending_cons)
-
-#define BLKBACK_INVALID_HANDLE (~0)
-
-static struct page **foreign_pages[MAX_DYNAMIC_MEM];
-static inline unsigned long idx_to_kaddr(
-       unsigned int mmap_idx, unsigned int req_idx, unsigned int sg_idx)
-{
-       unsigned int arr_idx = req_idx*BLKIF_MAX_SEGMENTS_PER_REQUEST + sg_idx;
-       unsigned long pfn = page_to_pfn(foreign_pages[mmap_idx][arr_idx]);
-       return (unsigned long)pfn_to_kaddr(pfn);
-}
-
-static unsigned short mmap_alloc = 0;
-static unsigned short mmap_lock = 0;
-static unsigned short mmap_inuse = 0;
-
-/******************************************************************
- * GRANT HANDLES
- */
-
-/* When using grant tables to map a frame for device access then the
- * handle returned must be used to unmap the frame. This is needed to
- * drop the ref count on the frame.
- */
-struct grant_handle_pair
-{
-        grant_handle_t kernel;
-        grant_handle_t user;
-};
-#define INVALID_GRANT_HANDLE   0xFFFF
-
-static struct grant_handle_pair 
-    pending_grant_handles[MAX_DYNAMIC_MEM][MMAP_PAGES];
-#define pending_handle(_id, _idx, _i) \
-    (pending_grant_handles[_id][((_idx) * BLKIF_MAX_SEGMENTS_PER_REQUEST) \
-    + (_i)])
-
-
-static int blktap_read_ufe_ring(tap_blkif_t *info); /*local prototypes*/
-
-#define BLKTAP_MINOR 0  /*/dev/xen/blktap has a dynamic major */
-#define BLKTAP_DEV_DIR  "/dev/xen"
-
-static int blktap_major;
-
-/* blktap IOCTLs: */
-#define BLKTAP_IOCTL_KICK_FE         1
-#define BLKTAP_IOCTL_KICK_BE         2 /* currently unused */
-#define BLKTAP_IOCTL_SETMODE         3
-#define BLKTAP_IOCTL_SENDPID        4
-#define BLKTAP_IOCTL_NEWINTF        5
-#define BLKTAP_IOCTL_MINOR          6
-#define BLKTAP_IOCTL_MAJOR          7
-#define BLKTAP_QUERY_ALLOC_REQS      8
-#define BLKTAP_IOCTL_FREEINTF        9
-#define BLKTAP_IOCTL_PRINT_IDXS      100  
-
-/* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE)             */
-#define BLKTAP_MODE_PASSTHROUGH      0x00000000  /* default            */
-#define BLKTAP_MODE_INTERCEPT_FE     0x00000001
-#define BLKTAP_MODE_INTERCEPT_BE     0x00000002  /* unimp.             */
-
-#define BLKTAP_MODE_INTERPOSE \
-           (BLKTAP_MODE_INTERCEPT_FE | BLKTAP_MODE_INTERCEPT_BE)
-
-
-static inline int BLKTAP_MODE_VALID(unsigned long arg)
-{
-       return ((arg == BLKTAP_MODE_PASSTHROUGH ) ||
-               (arg == BLKTAP_MODE_INTERCEPT_FE) ||
-                (arg == BLKTAP_MODE_INTERPOSE   ));
-}
-
-/* Requests passing through the tap to userspace are re-assigned an ID.
- * We must record a mapping between the BE [IDX,ID] tuple and the userspace
- * ring ID. 
- */
-
-static inline unsigned long MAKE_ID(domid_t fe_dom, PEND_RING_IDX idx)
-{
-        return ((fe_dom << 16) | MASK_PEND_IDX(idx));
-}
-
-extern inline PEND_RING_IDX ID_TO_IDX(unsigned long id)
-{
-        return (PEND_RING_IDX)(id & 0x0000ffff);
-}
-
-extern inline int ID_TO_MIDX(unsigned long id)
-{
-        return (int)(id >> 16);
-}
-
-#define INVALID_REQ 0xdead0000
-
-/*TODO: Convert to a free list*/
-static inline int GET_NEXT_REQ(unsigned long *idx_map)
-{
-       int i;
-       for (i = 0; i < MAX_PENDING_REQS; i++)
-               if (idx_map[i] == INVALID_REQ)
-                       return i;
-
-       return INVALID_REQ;
-}
-
-static inline int OFFSET_TO_USR_IDX(int offset)
-{
-       return offset / BLKIF_MAX_SEGMENTS_PER_REQUEST;
-}
-
-static inline int OFFSET_TO_SEG(int offset)
-{
-       return offset % BLKIF_MAX_SEGMENTS_PER_REQUEST;
-}
-
-
-#define BLKTAP_INVALID_HANDLE(_g) \
-    (((_g->kernel) == INVALID_GRANT_HANDLE) &&  \
-     ((_g->user) == INVALID_GRANT_HANDLE))
-
-#define BLKTAP_INVALIDATE_HANDLE(_g) do {       \
-    (_g)->kernel = INVALID_GRANT_HANDLE; (_g)->user = INVALID_GRANT_HANDLE; \
-    } while(0)
-
-
-/******************************************************************
- * BLKTAP VM OPS
- */
-
-static struct page *blktap_nopage(struct vm_area_struct *vma,
-                                 unsigned long address,
-                                 int *type)
-{
-       /*
-        * if the page has not been mapped in by the driver then return
-        * NOPAGE_SIGBUS to the domain.
-        */
-
-       return NOPAGE_SIGBUS;
-}
-
-static pte_t blktap_clear_pte(struct vm_area_struct *vma,
-                             unsigned long uvaddr,
-                             pte_t *ptep, int is_fullmm)
-{
-       pte_t copy = *ptep;
-       tap_blkif_t *info;
-       int offset, seg, usr_idx, pending_idx, mmap_idx;
-       unsigned long uvstart = vma->vm_start + (RING_PAGES << PAGE_SHIFT);
-       unsigned long kvaddr;
-       struct page **map;
-       struct page *pg;
-       struct grant_handle_pair *khandle;
-       struct gnttab_unmap_grant_ref unmap[2];
-       int count = 0;
-       static int print_warning = 1;
-
-       /* Print a warning message once, if the hook gets called. */
-       if (print_warning) {
-               WPRINTK("Clear pte hook called!\n");
-               print_warning = 0;
-       }
-
-       /*
-        * If the address is before the start of the grant mapped region or
-        * if vm_file is NULL (meaning mmap failed and we have nothing to do)
-        */
-       if (uvaddr < uvstart || vma->vm_file == NULL)
-               return copy;
-
-       info = vma->vm_file->private_data;
-       map = vma->vm_private_data;
-
-       /* TODO Should these be changed to if statements? */
-       BUG_ON(!info);
-       BUG_ON(!info->idx_map);
-       BUG_ON(!map);
-
-       offset = (int) ((uvaddr - uvstart) >> PAGE_SHIFT);
-       usr_idx = OFFSET_TO_USR_IDX(offset);
-       seg = OFFSET_TO_SEG(offset);
-
-       pending_idx = MASK_PEND_IDX(ID_TO_IDX(info->idx_map[usr_idx]));
-       mmap_idx = ID_TO_MIDX(info->idx_map[usr_idx]);
-
-       kvaddr = idx_to_kaddr(mmap_idx, pending_idx, seg);
-       pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-       ClearPageReserved(pg);
-       map[offset] = NULL;
-
-       khandle = &pending_handle(mmap_idx, pending_idx, seg);
-
-       if (khandle->kernel != INVALID_GRANT_HANDLE) {
-               gnttab_set_unmap_op(&unmap[count], kvaddr, 
-                                   GNTMAP_host_map, khandle->kernel);
-               count++;
-
-               set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, 
-                                   INVALID_P2M_ENTRY);
-       }
-
-       if (khandle->user != INVALID_GRANT_HANDLE) {
-               BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
-
-               gnttab_set_unmap_op(&unmap[count], virt_to_machine(ptep), 
-                                   GNTMAP_host_map 
-                                   | GNTMAP_application_map 
-                                   | GNTMAP_contains_pte,
-                                   khandle->user);
-               count++;
-       }
-
-       if (count) {
-               BLKTAP_INVALIDATE_HANDLE(khandle);
-               if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
-                                             unmap, count))
-                       BUG();
-       }
-
-       return copy;
-}
-
-struct vm_operations_struct blktap_vm_ops = {
-       nopage:   blktap_nopage,
-       zap_pte:  blktap_clear_pte,
-};
-
-/******************************************************************
- * BLKTAP FILE OPS
- */
-/*Function Declarations*/
-static tap_blkif_t *get_next_free_dev(void);
-static int blktap_open(struct inode *inode, struct file *filp);
-static int blktap_release(struct inode *inode, struct file *filp);
-static int blktap_mmap(struct file *filp, struct vm_area_struct *vma);
-static int blktap_ioctl(struct inode *inode, struct file *filp,
-                        unsigned int cmd, unsigned long arg);
-static unsigned int blktap_poll(struct file *file, poll_table *wait);
-
-static const struct file_operations blktap_fops = {
-       .owner   = THIS_MODULE,
-       .poll    = blktap_poll,
-       .ioctl   = blktap_ioctl,
-       .open    = blktap_open,
-       .release = blktap_release,
-       .mmap    = blktap_mmap,
-};
-
-
-static tap_blkif_t *get_next_free_dev(void)
-{
-       struct class *class;
-       tap_blkif_t *info;
-       int minor;
-
-       /*
-        * This is called only from the ioctl, which
-        * means we should always have interrupts enabled.
-        */
-       BUG_ON(irqs_disabled());
-
-       spin_lock_irq(&pending_free_lock);
-
-       /* tapfds[0] is always NULL */
-
-       for (minor = 1; minor < blktap_next_minor; minor++) {
-               info = tapfds[minor];
-               /* we could have failed a previous attempt. */
-               if (!info ||
-                   ((info->dev_inuse == 0) &&
-                    (info->dev_pending == 0)) ) {
-                       info->dev_pending = 1;
-                       goto found;
-               }
-       }
-       info = NULL;
-       minor = -1;
-
-       /*
-        * We didn't find free device. If we can still allocate
-        * more, then we grab the next device minor that is
-        * available.  This is done while we are still under
-        * the protection of the pending_free_lock.
-        */
-       if (blktap_next_minor < MAX_TAP_DEV)
-               minor = blktap_next_minor++;
-found:
-       spin_unlock_irq(&pending_free_lock);
-
-       if (!info && minor > 0) {
-               info = kzalloc(sizeof(*info), GFP_KERNEL);
-               if (unlikely(!info)) {
-                       /*
-                        * If we failed here, try to put back
-                        * the next minor number. But if one
-                        * was just taken, then we just lose this
-                        * minor.  We can try to allocate this
-                        * minor again later.
-                        */
-                       spin_lock_irq(&pending_free_lock);
-                       if (blktap_next_minor == minor+1)
-                               blktap_next_minor--;
-                       spin_unlock_irq(&pending_free_lock);
-                       goto out;
-               }
-
-               info->minor = minor;
-               /*
-                * Make sure that we have a minor before others can
-                * see us.
-                */
-               wmb();
-               tapfds[minor] = info;
-
-               if ((class = get_xen_class()) != NULL)
-                       class_device_create(class, NULL,
-                                           MKDEV(blktap_major, minor), NULL,
-                                           "blktap%d", minor);
-       }
-
-out:
-       return info;
-}
-
-int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif) 
-{
-       tap_blkif_t *info;
-       int i;
-
-       for (i = 1; i < blktap_next_minor; i++) {
-               info = tapfds[i];
-               if ( info &&
-                    (info->trans.domid == domid) &&
-                    (info->trans.busid == xenbus_id) ) {
-                       info->blkif = blkif;
-                       info->status = RUNNING;
-                       return i;
-               }
-       }
-       return -1;
-}
-
-void signal_tapdisk(int idx) 
-{
-       tap_blkif_t *info;
-       struct task_struct *ptask;
-
-       info = tapfds[idx];
-       if ((idx < 0) || (idx > MAX_TAP_DEV) || !info)
-               return;
-
-       if (info->pid > 0) {
-               ptask = find_task_by_pid(info->pid);
-               if (ptask)
-                       info->status = CLEANSHUTDOWN;
-       }
-       info->blkif = NULL;
-
-       return;
-}
-
-static int blktap_open(struct inode *inode, struct file *filp)
-{
-       blkif_sring_t *sring;
-       int idx = iminor(inode) - BLKTAP_MINOR;
-       tap_blkif_t *info;
-       int i;
-       
-       /* ctrl device, treat differently */
-       if (!idx)
-               return 0;
-
-       info = tapfds[idx];
-
-       if ((idx < 0) || (idx > MAX_TAP_DEV) || !info) {
-               WPRINTK("Unable to open device /dev/xen/blktap%d\n",
-                       idx);
-               return -ENODEV;
-       }
-
-       DPRINTK("Opening device /dev/xen/blktap%d\n",idx);
-       
-       /*Only one process can access device at a time*/
-       if (test_and_set_bit(0, &info->dev_inuse))
-               return -EBUSY;
-
-       info->dev_pending = 0;
-           
-       /* Allocate the fe ring. */
-       sring = (blkif_sring_t *)get_zeroed_page(GFP_KERNEL);
-       if (sring == NULL)
-               goto fail_nomem;
-
-       SetPageReserved(virt_to_page(sring));
-    
-       SHARED_RING_INIT(sring);
-       FRONT_RING_INIT(&info->ufe_ring, sring, PAGE_SIZE);
-       
-       filp->private_data = info;
-       info->vma = NULL;
-
-       info->idx_map = kmalloc(sizeof(unsigned long) * MAX_PENDING_REQS, 
-                               GFP_KERNEL);
-       
-       if (info->idx_map == NULL)
-               goto fail_nomem;
-
-       if (idx > 0) {
-               init_waitqueue_head(&info->wait);
-               for (i = 0; i < MAX_PENDING_REQS; i++) 
-                       info->idx_map[i] = INVALID_REQ;
-       }
-
-       DPRINTK("Tap open: device /dev/xen/blktap%d\n",idx);
-       return 0;
-
- fail_nomem:
-       return -ENOMEM;
-}
-
-static int blktap_release(struct inode *inode, struct file *filp)
-{
-       tap_blkif_t *info = filp->private_data;
-       
-       /* check for control device */
-       if (!info)
-               return 0;
-
-       info->dev_inuse = 0;
-       DPRINTK("Freeing device [/dev/xen/blktap%d]\n",info->minor);
-
-       /* Free the ring page. */
-       ClearPageReserved(virt_to_page(info->ufe_ring.sring));
-       free_page((unsigned long) info->ufe_ring.sring);
-
-       /* Clear any active mappings and free foreign map table */
-       if (info->vma) {
-               zap_page_range(
-                       info->vma, info->vma->vm_start, 
-                       info->vma->vm_end - info->vma->vm_start, NULL);
-
-               kfree(info->vma->vm_private_data);
-
-               info->vma = NULL;
-       }
-
-       if (info->idx_map) {
-               kfree(info->idx_map);
-               info->idx_map = NULL;
-       }
-
-       if ( (info->status != CLEANSHUTDOWN) && (info->blkif != NULL) ) {
-               if (info->blkif->xenblkd != NULL) {
-                       kthread_stop(info->blkif->xenblkd);
-                       info->blkif->xenblkd = NULL;
-               }
-               info->status = CLEANSHUTDOWN;
-       }
-
-       return 0;
-}
-
-
-/* Note on mmap:
- * We need to map pages to user space in a way that will allow the block
- * subsystem set up direct IO to them.  This couldn't be done before, because
- * there isn't really a sane way to translate a user virtual address down to a 
- * physical address when the page belongs to another domain.
- *
- * My first approach was to map the page in to kernel memory, add an entry
- * for it in the physical frame list (using alloc_lomem_region as in blkback)
- * and then attempt to map that page up to user space.  This is disallowed
- * by xen though, which realizes that we don't really own the machine frame
- * underlying the physical page.
- *
- * The new approach is to provide explicit support for this in xen linux.
- * The VMA now has a flag, VM_FOREIGN, to indicate that it contains pages
- * mapped from other vms.  vma->vm_private_data is set up as a mapping 
- * from pages to actual page structs.  There is a new clause in get_user_pages
- * that does the right thing for this sort of mapping.
- */
-static int blktap_mmap(struct file *filp, struct vm_area_struct *vma)
-{
-       int size;
-       struct page **map;
-       int i;
-       tap_blkif_t *info = filp->private_data;
-
-       if (info == NULL) {
-               WPRINTK("blktap: mmap, retrieving idx failed\n");
-               return -ENOMEM;
-       }
-       
-       vma->vm_flags |= VM_RESERVED;
-       vma->vm_ops = &blktap_vm_ops;
-
-       size = vma->vm_end - vma->vm_start;
-       if (size != ((mmap_pages + RING_PAGES) << PAGE_SHIFT)) {
-               WPRINTK("you _must_ map exactly %d pages!\n",
-                      mmap_pages + RING_PAGES);
-               return -EAGAIN;
-       }
-
-       size >>= PAGE_SHIFT;
-       info->rings_vstart = vma->vm_start;
-       info->user_vstart  = info->rings_vstart + (RING_PAGES << PAGE_SHIFT);
-    
-       /* Map the ring pages to the start of the region and reserve it. */
-       if (remap_pfn_range(vma, vma->vm_start, 
-                           __pa(info->ufe_ring.sring) >> PAGE_SHIFT, 
-                           PAGE_SIZE, vma->vm_page_prot)) {
-               WPRINTK("Mapping user ring failed!\n");
-               goto fail;
-       }
-
-       /* Mark this VM as containing foreign pages, and set up mappings. */
-       map = kzalloc(((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
-                     * sizeof(struct page_struct*),
-                     GFP_KERNEL);
-       if (map == NULL) {
-               WPRINTK("Couldn't alloc VM_FOREIGN map.\n");
-               goto fail;
-       }
-
-       for (i = 0; i < ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT); i++)
-               map[i] = NULL;
-    
-       vma->vm_private_data = map;
-       vma->vm_flags |= VM_FOREIGN;
-       vma->vm_flags |= VM_DONTCOPY;
-
-#ifdef CONFIG_X86
-       vma->vm_mm->context.has_foreign_mappings = 1;
-#endif
-
-       info->vma = vma;
-       info->ring_ok = 1;
-       return 0;
- fail:
-       /* Clear any active mappings. */
-       zap_page_range(vma, vma->vm_start, 
-                      vma->vm_end - vma->vm_start, NULL);
-
-       return -ENOMEM;
-}
-
-
-static int blktap_ioctl(struct inode *inode, struct file *filp,
-                        unsigned int cmd, unsigned long arg)
-{
-       tap_blkif_t *info = filp->private_data;
-
-       switch(cmd) {
-       case BLKTAP_IOCTL_KICK_FE: 
-       {
-               /* There are fe messages to process. */
-               return blktap_read_ufe_ring(info);
-       }
-       case BLKTAP_IOCTL_SETMODE:
-       {
-               if (info) {
-                       if (BLKTAP_MODE_VALID(arg)) {
-                               info->mode = arg;
-                               /* XXX: may need to flush rings here. */
-                               DPRINTK("blktap: set mode to %lx\n", 
-                                      arg);
-                               return 0;
-                       }
-               }
-               return 0;
-       }
-       case BLKTAP_IOCTL_PRINT_IDXS:
-        {
-               if (info) {
-                       printk("User Rings: \n-----------\n");
-                       printk("UF: rsp_cons: %2d, req_prod_prv: %2d "
-                               "| req_prod: %2d, rsp_prod: %2d\n",
-                               info->ufe_ring.rsp_cons,
-                               info->ufe_ring.req_prod_pvt,
-                               info->ufe_ring.sring->req_prod,
-                               info->ufe_ring.sring->rsp_prod);
-               }
-               return 0;
-        }
-       case BLKTAP_IOCTL_SENDPID:
-       {
-               if (info) {
-                       info->pid = (pid_t)arg;
-                       DPRINTK("blktap: pid received %d\n", 
-                              info->pid);
-               }
-               return 0;
-       }
-       case BLKTAP_IOCTL_NEWINTF:
-       {               
-               uint64_t val = (uint64_t)arg;
-               domid_translate_t *tr = (domid_translate_t *)&val;
-
-               DPRINTK("NEWINTF Req for domid %d and bus id %d\n", 
-                      tr->domid, tr->busid);
-               info = get_next_free_dev();
-               if (!info) {
-                       WPRINTK("Error initialising /dev/xen/blktap - "
-                               "No more devices\n");
-                       return -1;
-               }
-               info->trans.domid = tr->domid;
-               info->trans.busid = tr->busid;
-               return info->minor;
-       }
-       case BLKTAP_IOCTL_FREEINTF:
-       {
-               unsigned long dev = arg;
-               unsigned long flags;
-
-               info = tapfds[dev];
-
-               if ((dev > MAX_TAP_DEV) || !info)
-                       return 0; /* should this be an error? */
-
-               spin_lock_irqsave(&pending_free_lock, flags);
-               if (info->dev_pending)
-                       info->dev_pending = 0;
-               spin_unlock_irqrestore(&pending_free_lock, flags);
-
-               return 0;
-       }
-       case BLKTAP_IOCTL_MINOR:
-       {
-               unsigned long dev = arg;
-
-               info = tapfds[dev];
-
-               if ((dev > MAX_TAP_DEV) || !info)
-                       return -EINVAL;
-
-               return info->minor;
-       }
-       case BLKTAP_IOCTL_MAJOR:
-               return blktap_major;
-
-       case BLKTAP_QUERY_ALLOC_REQS:
-       {
-               WPRINTK("BLKTAP_QUERY_ALLOC_REQS ioctl: %d/%d\n",
-                      alloc_pending_reqs, blkif_reqs);
-               return (alloc_pending_reqs/blkif_reqs) * 100;
-       }
-       }
-       return -ENOIOCTLCMD;
-}
-
-static unsigned int blktap_poll(struct file *filp, poll_table *wait)
-{
-       tap_blkif_t *info = filp->private_data;
-       
-       /* do not work on the control device */
-       if (!info)
-               return 0;
-
-       poll_wait(filp, &info->wait, wait);
-       if (info->ufe_ring.req_prod_pvt != info->ufe_ring.sring->req_prod) {
-               RING_PUSH_REQUESTS(&info->ufe_ring);
-               return POLLIN | POLLRDNORM;
-       }
-       return 0;
-}
-
-void blktap_kick_user(int idx)
-{
-       tap_blkif_t *info;
-
-       info = tapfds[idx];
-
-       if ((idx < 0) || (idx > MAX_TAP_DEV) || !info)
-               return;
-
-       wake_up_interruptible(&info->wait);
-
-       return;
-}
-
-static int do_block_io_op(blkif_t *blkif);
-static void dispatch_rw_block_io(blkif_t *blkif,
-                                blkif_request_t *req,
-                                pending_req_t *pending_req);
-static void make_response(blkif_t *blkif, u64 id,
-                          unsigned short op, int st);
-
-/******************************************************************
- * misc small helpers
- */
-static int req_increase(void)
-{
-       int i, j;
-
-       if (mmap_alloc >= MAX_PENDING_REQS || mmap_lock) 
-               return -EINVAL;
-
-       pending_reqs[mmap_alloc]  = kzalloc(sizeof(pending_req_t)
-                                           * blkif_reqs, GFP_KERNEL);
-       foreign_pages[mmap_alloc] = alloc_empty_pages_and_pagevec(mmap_pages);
-
-       if (!pending_reqs[mmap_alloc] || !foreign_pages[mmap_alloc])
-               goto out_of_memory;
-
-       DPRINTK("%s: reqs=%d, pages=%d\n",
-               __FUNCTION__, blkif_reqs, mmap_pages);
-
-       for (i = 0; i < MAX_PENDING_REQS; i++) {
-               list_add_tail(&pending_reqs[mmap_alloc][i].free_list, 
-                             &pending_free);
-               pending_reqs[mmap_alloc][i].mem_idx = mmap_alloc;
-               for (j = 0; j < BLKIF_MAX_SEGMENTS_PER_REQUEST; j++)
-                       BLKTAP_INVALIDATE_HANDLE(&pending_handle(mmap_alloc, 
-                                                                i, j));
-       }
-
-       mmap_alloc++;
-       DPRINTK("# MMAPs increased to %d\n",mmap_alloc);
-       return 0;
-
- out_of_memory:
-       free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
-       kfree(pending_reqs[mmap_alloc]);
-       WPRINTK("%s: out of memory\n", __FUNCTION__);
-       return -ENOMEM;
-}
-
-static void mmap_req_del(int mmap)
-{
-       BUG_ON(!spin_is_locked(&pending_free_lock));
-
-       kfree(pending_reqs[mmap]);
-       pending_reqs[mmap] = NULL;
-
-       free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
-       foreign_pages[mmap] = NULL;
-
-       mmap_lock = 0;
-       DPRINTK("# MMAPs decreased to %d\n",mmap_alloc);
-       mmap_alloc--;
-}
-
-static pending_req_t* alloc_req(void)
-{
-       pending_req_t *req = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pending_free_lock, flags);
-
-       if (!list_empty(&pending_free)) {
-               req = list_entry(pending_free.next, pending_req_t, free_list);
-               list_del(&req->free_list);
-       }
-
-       if (req) {
-               req->inuse = 1;
-               alloc_pending_reqs++;
-       }
-       spin_unlock_irqrestore(&pending_free_lock, flags);
-
-       return req;
-}
-
-static void free_req(pending_req_t *req)
-{
-       unsigned long flags;
-       int was_empty;
-
-       spin_lock_irqsave(&pending_free_lock, flags);
-
-       alloc_pending_reqs--;
-       req->inuse = 0;
-       if (mmap_lock && (req->mem_idx == mmap_alloc-1)) {
-               mmap_inuse--;
-               if (mmap_inuse == 0) mmap_req_del(mmap_alloc-1);
-               spin_unlock_irqrestore(&pending_free_lock, flags);
-               return;
-       }
-       was_empty = list_empty(&pending_free);
-       list_add(&req->free_list, &pending_free);
-
-       spin_unlock_irqrestore(&pending_free_lock, flags);
-
-       if (was_empty)
-               wake_up(&pending_free_wq);
-}
-
-static void fast_flush_area(pending_req_t *req, int k_idx, int u_idx,
-                           int tapidx)
-{
-       struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
-       unsigned int i, invcount = 0;
-       struct grant_handle_pair *khandle;
-       uint64_t ptep;
-       int ret, mmap_idx;
-       unsigned long kvaddr, uvaddr;
-       tap_blkif_t *info;
-       
-
-       info = tapfds[tapidx];
-
-       if ((tapidx < 0) || (tapidx > MAX_TAP_DEV) || !info) {
-               WPRINTK("fast_flush: Couldn't get info!\n");
-               return;
-       }
-
-       if (info->vma != NULL &&
-           xen_feature(XENFEAT_auto_translated_physmap)) {
-               down_write(&info->vma->vm_mm->mmap_sem);
-               zap_page_range(info->vma, 
-                              MMAP_VADDR(info->user_vstart, u_idx, 0), 
-                              req->nr_pages << PAGE_SHIFT, NULL);
-               up_write(&info->vma->vm_mm->mmap_sem);
-       }
-
-       mmap_idx = req->mem_idx;
-
-       for (i = 0; i < req->nr_pages; i++) {
-               kvaddr = idx_to_kaddr(mmap_idx, k_idx, i);
-               uvaddr = MMAP_VADDR(info->user_vstart, u_idx, i);
-
-               khandle = &pending_handle(mmap_idx, k_idx, i);
-
-               if (khandle->kernel != INVALID_GRANT_HANDLE) {
-                       gnttab_set_unmap_op(&unmap[invcount],
-                                           idx_to_kaddr(mmap_idx, k_idx, i),
-                                           GNTMAP_host_map, khandle->kernel);
-                       invcount++;
-
-                       set_phys_to_machine(
-                               __pa(idx_to_kaddr(mmap_idx, k_idx, i))
-                               >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-               }
-
-               if (khandle->user != INVALID_GRANT_HANDLE) {
-                       BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
-                       if (create_lookup_pte_addr(
-                               info->vma->vm_mm,
-                               MMAP_VADDR(info->user_vstart, u_idx, i),
-                               &ptep) !=0) {
-                               WPRINTK("Couldn't get a pte addr!\n");
-                               return;
-                       }
-
-                       gnttab_set_unmap_op(&unmap[invcount], ptep,
-                                           GNTMAP_host_map
-                                           | GNTMAP_application_map
-                                           | GNTMAP_contains_pte,
-                                           khandle->user);
-                       invcount++;
-               }
-
-               BLKTAP_INVALIDATE_HANDLE(khandle);
-       }
-       ret = HYPERVISOR_grant_table_op(
-               GNTTABOP_unmap_grant_ref, unmap, invcount);
-       BUG_ON(ret);
-       
-       if (info->vma != NULL && !xen_feature(XENFEAT_auto_translated_physmap))
-               zap_page_range(info->vma, 
-                              MMAP_VADDR(info->user_vstart, u_idx, 0), 
-                              req->nr_pages << PAGE_SHIFT, NULL);
-}
-
-/******************************************************************
- * SCHEDULER FUNCTIONS
- */
-
-static void print_stats(blkif_t *blkif)
-{
-       printk(KERN_DEBUG "%s: oo %3d  |  rd %4d  |  wr %4d\n",
-              current->comm, blkif->st_oo_req,
-              blkif->st_rd_req, blkif->st_wr_req);
-       blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
-       blkif->st_rd_req = 0;
-       blkif->st_wr_req = 0;
-       blkif->st_oo_req = 0;
-}
-
-int tap_blkif_schedule(void *arg)
-{
-       blkif_t *blkif = arg;
-
-       blkif_get(blkif);
-
-       if (debug_lvl)
-               printk(KERN_DEBUG "%s: started\n", current->comm);
-
-       while (!kthread_should_stop()) {
-               wait_event_interruptible(
-                       blkif->wq,
-                       blkif->waiting_reqs || kthread_should_stop());
-               wait_event_interruptible(
-                       pending_free_wq,
-                       !list_empty(&pending_free) || kthread_should_stop());
-
-               blkif->waiting_reqs = 0;
-               smp_mb(); /* clear flag *before* checking for work */
-
-               if (do_block_io_op(blkif))
-                       blkif->waiting_reqs = 1;
-
-               if (log_stats && time_after(jiffies, blkif->st_print))
-                       print_stats(blkif);
-       }
-
-       if (log_stats)
-               print_stats(blkif);
-       if (debug_lvl)
-               printk(KERN_DEBUG "%s: exiting\n", current->comm);
-
-       blkif->xenblkd = NULL;
-       blkif_put(blkif);
-
-       return 0;
-}
-
-/******************************************************************
- * COMPLETION CALLBACK -- Called by user level ioctl()
- */
-
-static int blktap_read_ufe_ring(tap_blkif_t *info)
-{
-       /* This is called to read responses from the UFE ring. */
-       RING_IDX i, j, rp;
-       blkif_response_t *resp;
-       blkif_t *blkif=NULL;
-       int pending_idx, usr_idx, mmap_idx;
-       pending_req_t *pending_req;
-       
-       if (!info)
-               return 0;
-
-       /* We currently only forward packets in INTERCEPT_FE mode. */
-       if (!(info->mode & BLKTAP_MODE_INTERCEPT_FE))
-               return 0;
-
-       /* for each outstanding message on the UFEring  */
-       rp = info->ufe_ring.sring->rsp_prod;
-       rmb();
-        
-       for (i = info->ufe_ring.rsp_cons; i != rp; i++) {
-               blkif_response_t res;
-               resp = RING_GET_RESPONSE(&info->ufe_ring, i);
-               memcpy(&res, resp, sizeof(res));
-               mb(); /* rsp_cons read by RING_FULL() in do_block_io_op(). */
-               ++info->ufe_ring.rsp_cons;
-
-               /*retrieve [usr_idx] to [mmap_idx,pending_idx] mapping*/
-               usr_idx = (int)res.id;
-               pending_idx = MASK_PEND_IDX(ID_TO_IDX(info->idx_map[usr_idx]));
-               mmap_idx = ID_TO_MIDX(info->idx_map[usr_idx]);
-
-               if ( (mmap_idx >= mmap_alloc) || 
-                  (ID_TO_IDX(info->idx_map[usr_idx]) >= MAX_PENDING_REQS) )
-                       WPRINTK("Incorrect req map"
-                              "[%d], internal map [%d,%d (%d)]\n", 
-                              usr_idx, mmap_idx, 
-                              ID_TO_IDX(info->idx_map[usr_idx]),
-                              MASK_PEND_IDX(
-                                      ID_TO_IDX(info->idx_map[usr_idx])));
-
-               pending_req = &pending_reqs[mmap_idx][pending_idx];
-               blkif = pending_req->blkif;
-
-               for (j = 0; j < pending_req->nr_pages; j++) {
-
-                       unsigned long kvaddr, uvaddr;
-                       struct page **map = info->vma->vm_private_data;
-                       struct page *pg;
-                       int offset;
-
-                       uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, j);
-                       kvaddr = idx_to_kaddr(mmap_idx, pending_idx, j);
-
-                       pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-                       ClearPageReserved(pg);
-                       offset = (uvaddr - info->vma->vm_start) 
-                               >> PAGE_SHIFT;
-                       map[offset] = NULL;
-               }
-               fast_flush_area(pending_req, pending_idx, usr_idx, info->minor);
-               info->idx_map[usr_idx] = INVALID_REQ;
-               make_response(blkif, pending_req->id, res.operation,
-                             res.status);
-               blkif_put(pending_req->blkif);
-               free_req(pending_req);
-       }
-               
-       return 0;
-}
-
-
-/******************************************************************************
- * NOTIFICATION FROM GUEST OS.
- */
-
-static void blkif_notify_work(blkif_t *blkif)
-{
-       blkif->waiting_reqs = 1;
-       wake_up(&blkif->wq);
-}
-
-irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-{
-       blkif_notify_work(dev_id);
-       return IRQ_HANDLED;
-}
-
-
-
-/******************************************************************
- * DOWNWARD CALLS -- These interface with the block-device layer proper.
- */
-static int print_dbug = 1;
-static int do_block_io_op(blkif_t *blkif)
-{
-       blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-       blkif_request_t req;
-       pending_req_t *pending_req;
-       RING_IDX rc, rp;
-       int more_to_do = 0;
-       tap_blkif_t *info;
-
-       rc = blk_rings->common.req_cons;
-       rp = blk_rings->common.sring->req_prod;
-       rmb(); /* Ensure we see queued requests up to 'rp'. */
-
-       /*Check blkif has corresponding UE ring*/
-       if (blkif->dev_num < 0) {
-               /*oops*/
-               if (print_dbug) {
-                       WPRINTK("Corresponding UE " 
-                              "ring does not exist!\n");
-                       print_dbug = 0; /*We only print this message once*/
-               }
-               return 0;
-       }
-
-       info = tapfds[blkif->dev_num];
-
-       if (blkif->dev_num > MAX_TAP_DEV || !info || !info->dev_inuse) {
-               if (print_dbug) {
-                       WPRINTK("Can't get UE info!\n");
-                       print_dbug = 0;
-               }
-               return 0;
-       }
-
-       while (rc != rp) {
-               
-               if (RING_FULL(&info->ufe_ring)) {
-                       WPRINTK("RING_FULL! More to do\n");
-                       more_to_do = 1;
-                       break;
-               }
-
-               if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc)) {
-                       WPRINTK("RING_REQUEST_CONS_OVERFLOW!"
-                              " More to do\n");
-                       more_to_do = 1;
-                       break;          
-               }
-
-               pending_req = alloc_req();
-               if (NULL == pending_req) {
-                       blkif->st_oo_req++;
-                       more_to_do = 1;
-                       break;
-               }
-
-               switch (blkif->blk_protocol) {
-               case BLKIF_PROTOCOL_NATIVE:
-                       memcpy(&req, RING_GET_REQUEST(&blk_rings->native, rc),
-                              sizeof(req));
-                       break;
-               case BLKIF_PROTOCOL_X86_32:
-                       blkif_get_x86_32_req(&req, RING_GET_REQUEST(&blk_rings->x86_32, rc));
-                       break;
-               case BLKIF_PROTOCOL_X86_64:
-                       blkif_get_x86_64_req(&req, RING_GET_REQUEST(&blk_rings->x86_64, rc));
-                       break;
-               default:
-                       BUG();
-               }
-               blk_rings->common.req_cons = ++rc; /* before make_response() */
-
-               switch (req.operation) {
-               case BLKIF_OP_READ:
-                       blkif->st_rd_req++;
-                       dispatch_rw_block_io(blkif, &req, pending_req);
-                       break;
-
-               case BLKIF_OP_WRITE:
-                       blkif->st_wr_req++;
-                       dispatch_rw_block_io(blkif, &req, pending_req);
-                       break;
-
-               default:
-                       WPRINTK("unknown operation [%d]\n",
-                               req.operation);
-                       make_response(blkif, req.id, req.operation,
-                                     BLKIF_RSP_ERROR);
-                       free_req(pending_req);
-                       break;
-               }
-       }
-               
-       blktap_kick_user(blkif->dev_num);
-
-       return more_to_do;
-}
-
-static void dispatch_rw_block_io(blkif_t *blkif,
-                                blkif_request_t *req,
-                                pending_req_t *pending_req)
-{
-       extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
-       int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
-       struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
-       unsigned int nseg;
-       int ret, i, nr_sects = 0;
-       tap_blkif_t *info;
-       uint64_t sector;
-       blkif_request_t *target;
-       int pending_idx = RTN_PEND_IDX(pending_req,pending_req->mem_idx);
-       int usr_idx;
-       uint16_t mmap_idx = pending_req->mem_idx;
-
-       if (blkif->dev_num < 0 || blkif->dev_num > MAX_TAP_DEV)
-               goto fail_response;
-
-       info = tapfds[blkif->dev_num];
-       if (info == NULL)
-               goto fail_response;
-
-       /* Check we have space on user ring - should never fail. */
-       usr_idx = GET_NEXT_REQ(info->idx_map);
-       if (usr_idx == INVALID_REQ) {
-               BUG();
-               goto fail_response;
-       }
-
-       /* Check that number of segments is sane. */
-       nseg = req->nr_segments;
-       if ( unlikely(nseg == 0) || 
-           unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST) ) {
-               WPRINTK("Bad number of segments in request (%d)\n", nseg);
-               goto fail_response;
-       }
-       
-       /* Make sure userspace is ready. */
-       if (!info->ring_ok) {
-               WPRINTK("blktap: ring not ready for requests!\n");
-               goto fail_response;
-       }
-
-       if (RING_FULL(&info->ufe_ring)) {
-               WPRINTK("blktap: fe_ring is full, can't add "
-                       "IO Request will be dropped. %d %d\n",
-                       RING_SIZE(&info->ufe_ring),
-                       RING_SIZE(&blkif->blk_rings.common));
-               goto fail_response;
-       }
-
-       pending_req->blkif     = blkif;
-       pending_req->id        = req->id;
-       pending_req->operation = operation;
-       pending_req->status    = BLKIF_RSP_OKAY;
-       pending_req->nr_pages  = nseg;
-       op = 0;
-       for (i = 0; i < nseg; i++) {
-               unsigned long uvaddr;
-               unsigned long kvaddr;
-               uint64_t ptep;
-               uint32_t flags;
-
-               uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i);
-               kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-
-               sector = req->sector_number + ((PAGE_SIZE / 512) * i);
-               if( (blkif->sectors > 0) && (sector >= blkif->sectors) ) {
-                       WPRINTK("BLKTAP: Sector request greater" 
-                              "than size\n");
-                       WPRINTK("BLKTAP: %s request sector" 
-                              "[%llu,%llu], Total [%llu]\n",
-                              (req->operation == 
-                               BLKIF_OP_WRITE ? "WRITE" : "READ"),
-                               (long long unsigned) sector,
-                               (long long unsigned) sector>>9,
-                               (long long unsigned) blkif->sectors);
-               }
-
-               flags = GNTMAP_host_map;
-               if (operation == WRITE)
-                       flags |= GNTMAP_readonly;
-               gnttab_set_map_op(&map[op], kvaddr, flags,
-                                 req->seg[i].gref, blkif->domid);
-               op++;
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* Now map it to user. */
-                       ret = create_lookup_pte_addr(info->vma->vm_mm, 
-                                                    uvaddr, &ptep);
-                       if (ret) {
-                               WPRINTK("Couldn't get a pte addr!\n");
-                               goto fail_flush;
-                       }
-
-                       flags = GNTMAP_host_map | GNTMAP_application_map
-                               | GNTMAP_contains_pte;
-                       if (operation == WRITE)
-                               flags |= GNTMAP_readonly;
-                       gnttab_set_map_op(&map[op], ptep, flags,
-                                         req->seg[i].gref, blkif->domid);
-                       op++;
-               }
-
-               nr_sects += (req->seg[i].last_sect - 
-                            req->seg[i].first_sect + 1);
-       }
-
-       ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, op);
-       BUG_ON(ret);
-
-       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-               for (i = 0; i < (nseg*2); i+=2) {
-                       unsigned long uvaddr;
-                       unsigned long kvaddr;
-                       unsigned long offset;
-                       struct page *pg;
-
-                       uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i/2);
-                       kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i/2);
-
-                       if (unlikely(map[i].status != 0)) {
-                               WPRINTK("invalid kernel buffer -- "
-                                       "could not remap it\n");
-                               ret |= 1;
-                               map[i].handle = INVALID_GRANT_HANDLE;
-                       }
-
-                       if (unlikely(map[i+1].status != 0)) {
-                               WPRINTK("invalid user buffer -- "
-                                       "could not remap it\n");
-                               ret |= 1;
-                               map[i+1].handle = INVALID_GRANT_HANDLE;
-                       }
-
-                       pending_handle(mmap_idx, pending_idx, i/2).kernel 
-                               = map[i].handle;
-                       pending_handle(mmap_idx, pending_idx, i/2).user   
-                               = map[i+1].handle;
-
-                       if (ret)
-                               continue;
-
-                       set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT,
-                                           FOREIGN_FRAME(map[i].dev_bus_addr
-                                                         >> PAGE_SHIFT));
-                       offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT;
-                       pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-                       ((struct page **)info->vma->vm_private_data)[offset] =
-                               pg;
-               }
-       } else {
-               for (i = 0; i < nseg; i++) {
-                       unsigned long uvaddr;
-                       unsigned long kvaddr;
-                       unsigned long offset;
-                       struct page *pg;
-
-                       uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i);
-                       kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-
-                       if (unlikely(map[i].status != 0)) {
-                               WPRINTK("invalid kernel buffer -- "
-                                       "could not remap it\n");
-                               ret |= 1;
-                               map[i].handle = INVALID_GRANT_HANDLE;
-                       }
-
-                       pending_handle(mmap_idx, pending_idx, i).kernel 
-                               = map[i].handle;
-
-                       if (ret)
-                               continue;
-
-                       offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT;
-                       pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-                       ((struct page **)info->vma->vm_private_data)[offset] =
-                               pg;
-               }
-       }
-
-       if (ret)
-               goto fail_flush;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               down_write(&info->vma->vm_mm->mmap_sem);
-       /* Mark mapped pages as reserved: */
-       for (i = 0; i < req->nr_segments; i++) {
-               unsigned long kvaddr;
-               struct page *pg;
-
-               kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-               pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-               SetPageReserved(pg);
-               if (xen_feature(XENFEAT_auto_translated_physmap)) {
-                       ret = vm_insert_page(info->vma,
-                                            MMAP_VADDR(info->user_vstart,
-                                                       usr_idx, i), pg);
-                       if (ret) {
-                               up_write(&info->vma->vm_mm->mmap_sem);
-                               goto fail_flush;
-                       }
-               }
-       }
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               up_write(&info->vma->vm_mm->mmap_sem);
-       
-       /*record [mmap_idx,pending_idx] to [usr_idx] mapping*/
-       info->idx_map[usr_idx] = MAKE_ID(mmap_idx, pending_idx);
-
-       blkif_get(blkif);
-       /* Finally, write the request message to the user ring. */
-       target = RING_GET_REQUEST(&info->ufe_ring,
-                                 info->ufe_ring.req_prod_pvt);
-       memcpy(target, req, sizeof(*req));
-       target->id = usr_idx;
-       wmb(); /* blktap_poll() reads req_prod_pvt asynchronously */
-       info->ufe_ring.req_prod_pvt++;
-
-       if (operation == READ)
-               blkif->st_rd_sect += nr_sects;
-       else if (operation == WRITE)
-               blkif->st_wr_sect += nr_sects;
-
-       return;
-
- fail_flush:
-       WPRINTK("Reached Fail_flush\n");
-       fast_flush_area(pending_req, pending_idx, usr_idx, blkif->dev_num);
- fail_response:
-       make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
-       free_req(pending_req);
-} 
-
-
-
-/******************************************************************
- * MISCELLANEOUS SETUP / TEARDOWN / DEBUGGING
- */
-
-
-static void make_response(blkif_t *blkif, u64 id,
-                          unsigned short op, int st)
-{
-       blkif_response_t  resp;
-       unsigned long     flags;
-       blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-       int more_to_do = 0;
-       int notify;
-
-       resp.id        = id;
-       resp.operation = op;
-       resp.status    = st;
-
-       spin_lock_irqsave(&blkif->blk_ring_lock, flags);
-       /* Place on the response ring for the relevant domain. */
-       switch (blkif->blk_protocol) {
-       case BLKIF_PROTOCOL_NATIVE:
-               memcpy(RING_GET_RESPONSE(&blk_rings->native,
-                                        blk_rings->native.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       case BLKIF_PROTOCOL_X86_32:
-               memcpy(RING_GET_RESPONSE(&blk_rings->x86_32,
-                                        blk_rings->x86_32.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       case BLKIF_PROTOCOL_X86_64:
-               memcpy(RING_GET_RESPONSE(&blk_rings->x86_64,
-                                        blk_rings->x86_64.rsp_prod_pvt),
-                      &resp, sizeof(resp));
-               break;
-       default:
-               BUG();
-       }
-       blk_rings->common.rsp_prod_pvt++;
-       RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
-
-       if (blk_rings->common.rsp_prod_pvt == blk_rings->common.req_cons) {
-               /*
-                * Tail check for pending requests. Allows frontend to avoid
-                * notifications if requests are already in flight (lower
-                * overheads and promotes batching).
-                */
-               RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
-       } else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
-               more_to_do = 1;
-       }
-
-       spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
-       if (more_to_do)
-               blkif_notify_work(blkif);
-       if (notify)
-               notify_remote_via_irq(blkif->irq);
-}
-
-static int __init blkif_init(void)
-{
-       int i, ret;
-       struct class *class;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       INIT_LIST_HEAD(&pending_free);
-        for(i = 0; i < 2; i++) {
-               ret = req_increase();
-               if (ret)
-                       break;
-       }
-       if (i == 0)
-               return ret;
-
-       tap_blkif_interface_init();
-
-       alloc_pending_reqs = 0;
-
-       tap_blkif_xenbus_init();
-
-       /* Dynamically allocate a major for this device */
-       ret = register_chrdev(0, "blktap", &blktap_fops);
-
-       if (ret < 0) {
-               WPRINTK("Couldn't register /dev/xen/blktap\n");
-               return -ENOMEM;
-       }       
-       
-       blktap_major = ret;
-
-       /* tapfds[0] is always NULL */
-       blktap_next_minor++;
-
-       DPRINTK("Created misc_dev [/dev/xen/blktap%d]\n",i);
-
-       /* Make sure the xen class exists */
-       if ((class = get_xen_class()) != NULL) {
-               /*
-                * This will allow udev to create the blktap ctrl device.
-                * We only want to create blktap0 first.  We don't want
-                * to flood the sysfs system with needless blktap devices.
-                * We only create the device when a request of a new device is
-                * made.
-                */
-               class_device_create(class, NULL,
-                                   MKDEV(blktap_major, 0), NULL,
-                                   "blktap0");
-       } else {
-               /* this is bad, but not fatal */
-               WPRINTK("blktap: sysfs xen_class not created\n");
-       }
-
-       DPRINTK("Blktap device successfully created\n");
-
-       return 0;
-}
-
-module_init(blkif_init);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h
deleted file mode 100644 (file)
index 792d128..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/* 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __BLKIF__BACKEND__COMMON_H__
-#define __BLKIF__BACKEND__COMMON_H__
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/blkdev.h>
-#include <linux/vmalloc.h>
-#include <asm/io.h>
-#include <asm/setup.h>
-#include <asm/pgalloc.h>
-#include <xen/evtchn.h>
-#include <asm/hypervisor.h>
-#include <xen/blkif.h>
-#include <xen/gnttab.h>
-#include <xen/driver_util.h>
-
-#define DPRINTK(_f, _a...) pr_debug("(file=%s, line=%d) " _f, \
-                                    __FILE__ , __LINE__ , ## _a )
-
-#define WPRINTK(fmt, args...) printk(KERN_WARNING "blk_tap: " fmt, ##args)
-
-struct backend_info;
-
-typedef struct blkif_st {
-       /* Unique identifier for this interface. */
-       domid_t           domid;
-       unsigned int      handle;
-       /* Physical parameters of the comms window. */
-       unsigned int      irq;
-       /* Comms information. */
-       enum blkif_protocol blk_protocol;
-       blkif_back_rings_t blk_rings;
-       struct vm_struct *blk_ring_area;
-       /* Back pointer to the backend_info. */
-       struct backend_info *be;
-       /* Private fields. */
-       spinlock_t       blk_ring_lock;
-       atomic_t         refcnt;
-
-       wait_queue_head_t   wq;
-       struct task_struct  *xenblkd;
-       unsigned int        waiting_reqs;
-       request_queue_t     *plug;
-
-       /* statistics */
-       unsigned long       st_print;
-       int                 st_rd_req;
-       int                 st_wr_req;
-       int                 st_oo_req;
-       int                 st_rd_sect;
-       int                 st_wr_sect;
-
-       wait_queue_head_t waiting_to_free;
-
-       grant_handle_t shmem_handle;
-       grant_ref_t    shmem_ref;
-       
-       int             dev_num;
-       uint64_t        sectors;
-} blkif_t;
-
-blkif_t *tap_alloc_blkif(domid_t domid);
-void tap_blkif_free(blkif_t *blkif);
-int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, 
-                 unsigned int evtchn);
-void tap_blkif_unmap(blkif_t *blkif);
-
-#define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
-#define blkif_put(_b)                                  \
-       do {                                            \
-               if (atomic_dec_and_test(&(_b)->refcnt)) \
-                       wake_up(&(_b)->waiting_to_free);\
-       } while (0)
-
-
-struct phys_req {
-       unsigned short       dev;
-       unsigned short       nr_sects;
-       struct block_device *bdev;
-       blkif_sector_t       sector_number;
-};
-
-void tap_blkif_interface_init(void);
-
-void tap_blkif_xenbus_init(void);
-
-irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-int tap_blkif_schedule(void *arg);
-
-int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif);
-void signal_tapdisk(int idx);
-
-#endif /* __BLKIF__BACKEND__COMMON_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
deleted file mode 100644 (file)
index 11f8001..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/******************************************************************************
- * drivers/xen/blktap/interface.c
- * 
- * Block-device interface management.
- * 
- * Copyright (c) 2004, Keir Fraser
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
-
- */
-
-#include "common.h"
-#include <xen/evtchn.h>
-
-static kmem_cache_t *blkif_cachep;
-
-blkif_t *tap_alloc_blkif(domid_t domid)
-{
-       blkif_t *blkif;
-
-       blkif = kmem_cache_alloc(blkif_cachep, GFP_KERNEL);
-       if (!blkif)
-               return ERR_PTR(-ENOMEM);
-
-       memset(blkif, 0, sizeof(*blkif));
-       blkif->domid = domid;
-       spin_lock_init(&blkif->blk_ring_lock);
-       atomic_set(&blkif->refcnt, 1);
-       init_waitqueue_head(&blkif->wq);
-       blkif->st_print = jiffies;
-       init_waitqueue_head(&blkif->waiting_to_free);
-
-       return blkif;
-}
-
-static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
-{
-       struct gnttab_map_grant_ref op;
-
-       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-                         GNTMAP_host_map, shared_page, blkif->domid);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status) {
-               DPRINTK(" Grant table operation failure !\n");
-               return op.status;
-       }
-
-       blkif->shmem_ref = shared_page;
-       blkif->shmem_handle = op.handle;
-
-       return 0;
-}
-
-static void unmap_frontend_page(blkif_t *blkif)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-                           GNTMAP_host_map, blkif->shmem_handle);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-}
-
-int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, 
-                 unsigned int evtchn)
-{
-       int err;
-
-       /* Already connected through? */
-       if (blkif->irq)
-               return 0;
-
-       if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
-               return -ENOMEM;
-
-       err = map_frontend_page(blkif, shared_page);
-       if (err) {
-               free_vm_area(blkif->blk_ring_area);
-               return err;
-       }
-
-       switch (blkif->blk_protocol) {
-       case BLKIF_PROTOCOL_NATIVE:
-       {
-               blkif_sring_t *sring;
-               sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
-               break;
-       }
-       case BLKIF_PROTOCOL_X86_32:
-       {
-               blkif_x86_32_sring_t *sring_x86_32;
-               sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
-               break;
-       }
-       case BLKIF_PROTOCOL_X86_64:
-       {
-               blkif_x86_64_sring_t *sring_x86_64;
-               sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr;
-               BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
-               break;
-       }
-       default:
-               BUG();
-       }
-
-       err = bind_interdomain_evtchn_to_irqhandler(
-               blkif->domid, evtchn, tap_blkif_be_int,
-               0, "blkif-backend", blkif);
-       if (err < 0) {
-               unmap_frontend_page(blkif);
-               free_vm_area(blkif->blk_ring_area);
-               blkif->blk_rings.common.sring = NULL;
-               return err;
-       }
-       blkif->irq = err;
-
-       return 0;
-}
-
-void tap_blkif_unmap(blkif_t *blkif)
-{
-       if (blkif->irq) {
-               unbind_from_irqhandler(blkif->irq, blkif);
-               blkif->irq = 0;
-       }
-       if (blkif->blk_rings.common.sring) {
-               unmap_frontend_page(blkif);
-               free_vm_area(blkif->blk_ring_area);
-               blkif->blk_rings.common.sring = NULL;
-       }
-}
-
-void tap_blkif_free(blkif_t *blkif)
-{
-       atomic_dec(&blkif->refcnt);
-       wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0);
-
-       tap_blkif_unmap(blkif);
-       kmem_cache_free(blkif_cachep, blkif);
-}
-
-void __init tap_blkif_interface_init(void)
-{
-       blkif_cachep = kmem_cache_create("blktapif_cache", sizeof(blkif_t), 
-                                        0, 0, NULL, NULL);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
deleted file mode 100644 (file)
index 1d99f14..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-/* drivers/xen/blktap/xenbus.c
- *
- * Xenbus code for blktap
- *
- * Copyright (c) 2004-2005, Andrew Warfield and Julian Chesterfield
- *
- * Based on the blkback xenbus code:
- *
- * Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
- * Copyright (C) 2005 XenSource Ltd
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <stdarg.h>
-#include <linux/module.h>
-#include <linux/kthread.h>
-#include <xen/xenbus.h>
-#include "common.h"
-
-
-struct backend_info
-{
-       struct xenbus_device *dev;
-       blkif_t *blkif;
-       struct xenbus_watch backend_watch;
-       int xenbus_id;
-       int group_added;
-};
-
-
-static void connect(struct backend_info *);
-static int connect_ring(struct backend_info *);
-static int blktap_remove(struct xenbus_device *dev);
-static int blktap_probe(struct xenbus_device *dev,
-                        const struct xenbus_device_id *id);
-static void tap_backend_changed(struct xenbus_watch *, const char **,
-                           unsigned int);
-static void tap_frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state);
-
-static int strsep_len(const char *str, char c, unsigned int len)
-{
-        unsigned int i;
-
-        for (i = 0; str[i]; i++)
-                if (str[i] == c) {
-                        if (len == 0)
-                                return i;
-                        len--;
-                }
-        return (len == 0) ? i : -ERANGE;
-}
-
-static long get_id(const char *str)
-{
-        int len,end;
-        const char *ptr;
-        char *tptr, num[10];
-       
-        len = strsep_len(str, '/', 2);
-        end = strlen(str);
-        if ( (len < 0) || (end < 0) ) return -1;
-       
-        ptr = str + len + 1;
-        strncpy(num,ptr,end - len);
-        tptr = num + (end - (len + 1));
-        *tptr = '\0';
-       DPRINTK("Get_id called for %s (%s)\n",str,num);
-       
-        return simple_strtol(num, NULL, 10);
-}                              
-
-static int blktap_name(blkif_t *blkif, char *buf)
-{
-       char *devpath, *devname;
-       struct xenbus_device *dev = blkif->be->dev;
-
-       devpath = xenbus_read(XBT_NIL, dev->nodename, "dev", NULL);
-       if (IS_ERR(devpath)) 
-               return PTR_ERR(devpath);
-       
-       if ((devname = strstr(devpath, "/dev/")) != NULL)
-               devname += strlen("/dev/");
-       else
-               devname  = devpath;
-
-       snprintf(buf, TASK_COMM_LEN, "blktap.%d.%s", blkif->domid, devname);
-       kfree(devpath);
-       
-       return 0;
-}
-
-/****************************************************************
- *  sysfs interface for VBD I/O requests
- */
-
-#define VBD_SHOW(name, format, args...)                                        \
-       static ssize_t show_##name(struct device *_dev,                 \
-                                  struct device_attribute *attr,       \
-                                  char *buf)                           \
-       {                                                               \
-               struct xenbus_device *dev = to_xenbus_device(_dev);     \
-               struct backend_info *be = dev->dev.driver_data;         \
-                                                                       \
-               return sprintf(buf, format, ##args);                    \
-       }                                                               \
-       DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
-
-VBD_SHOW(tap_oo_req,  "%d\n", be->blkif->st_oo_req);
-VBD_SHOW(tap_rd_req,  "%d\n", be->blkif->st_rd_req);
-VBD_SHOW(tap_wr_req,  "%d\n", be->blkif->st_wr_req);
-VBD_SHOW(tap_rd_sect, "%d\n", be->blkif->st_rd_sect);
-VBD_SHOW(tap_wr_sect, "%d\n", be->blkif->st_wr_sect);
-
-static struct attribute *tapstat_attrs[] = {
-       &dev_attr_tap_oo_req.attr,
-       &dev_attr_tap_rd_req.attr,
-       &dev_attr_tap_wr_req.attr,
-       &dev_attr_tap_rd_sect.attr,
-       &dev_attr_tap_wr_sect.attr,
-       NULL
-};
-
-static struct attribute_group tapstat_group = {
-       .name = "statistics",
-       .attrs = tapstat_attrs,
-};
-
-int xentap_sysfs_addif(struct xenbus_device *dev)
-{
-       int err;
-       struct backend_info *be = dev->dev.driver_data;
-       err = sysfs_create_group(&dev->dev.kobj, &tapstat_group);
-       if (!err)
-               be->group_added = 1;
-       return err;
-}
-
-void xentap_sysfs_delif(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-       sysfs_remove_group(&dev->dev.kobj, &tapstat_group);
-       be->group_added = 0;
-}
-
-static int blktap_remove(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       if (be->backend_watch.node) {
-               unregister_xenbus_watch(&be->backend_watch);
-               kfree(be->backend_watch.node);
-               be->backend_watch.node = NULL;
-       }
-       if (be->blkif) {
-               if (be->blkif->xenblkd)
-                       kthread_stop(be->blkif->xenblkd);
-               signal_tapdisk(be->blkif->dev_num);
-               tap_blkif_free(be->blkif);
-               be->blkif = NULL;
-       }
-       if (be->group_added)
-               xentap_sysfs_delif(be->dev);
-       kfree(be);
-       dev->dev.driver_data = NULL;
-       return 0;
-}
-
-static void tap_update_blkif_status(blkif_t *blkif)
-{ 
-       int err;
-       char name[TASK_COMM_LEN];
-
-       /* Not ready to connect? */
-       if(!blkif->irq || !blkif->sectors) {
-               return;
-       } 
-
-       /* Already connected? */
-       if (blkif->be->dev->state == XenbusStateConnected)
-               return;
-
-       /* Attempt to connect: exit if we fail to. */
-       connect(blkif->be);
-       if (blkif->be->dev->state != XenbusStateConnected)
-               return;
-
-       err = blktap_name(blkif, name);
-       if (err) {
-               xenbus_dev_error(blkif->be->dev, err, "get blktap dev name");
-               return;
-       }
-
-       if (!blkif->be->group_added) {
-               err = xentap_sysfs_addif(blkif->be->dev);
-               if (err) {
-                       xenbus_dev_fatal(blkif->be->dev, err, 
-                                        "creating sysfs entries");
-                       return;
-               }
-       }
-
-       blkif->xenblkd = kthread_run(tap_blkif_schedule, blkif, name);
-       if (IS_ERR(blkif->xenblkd)) {
-               err = PTR_ERR(blkif->xenblkd);
-               blkif->xenblkd = NULL;
-               xenbus_dev_fatal(blkif->be->dev, err, "start xenblkd");
-               WPRINTK("Error starting thread\n");
-       }
-}
-
-/**
- * Entry point to this code when a new device is created.  Allocate
- * the basic structures, and watch the store waiting for the
- * user-space program to tell us the physical device info.  Switch to
- * InitWait.
- */
-static int blktap_probe(struct xenbus_device *dev,
-                        const struct xenbus_device_id *id)
-{
-       int err;
-       struct backend_info *be = kzalloc(sizeof(struct backend_info),
-                                         GFP_KERNEL);
-       if (!be) {
-               xenbus_dev_fatal(dev, -ENOMEM,
-                                "allocating backend structure");
-               return -ENOMEM;
-       }
-
-       be->dev = dev;
-       dev->dev.driver_data = be;
-       be->xenbus_id = get_id(dev->nodename);
-
-       be->blkif = tap_alloc_blkif(dev->otherend_id);
-       if (IS_ERR(be->blkif)) {
-               err = PTR_ERR(be->blkif);
-               be->blkif = NULL;
-               xenbus_dev_fatal(dev, err, "creating block interface");
-               goto fail;
-       }
-
-       /* setup back pointer */
-       be->blkif->be = be;
-       be->blkif->sectors = 0;
-
-       /* set a watch on disk info, waiting for userspace to update details*/
-       err = xenbus_watch_path2(dev, dev->nodename, "info",
-                                &be->backend_watch, tap_backend_changed);
-       if (err)
-               goto fail;
-       
-       err = xenbus_switch_state(dev, XenbusStateInitWait);
-       if (err)
-               goto fail;
-       return 0;
-
-fail:
-       DPRINTK("blktap probe failed\n");
-       blktap_remove(dev);
-       return err;
-}
-
-
-/**
- * Callback received when the user space code has placed the device
- * information in xenstore. 
- */
-static void tap_backend_changed(struct xenbus_watch *watch,
-                           const char **vec, unsigned int len)
-{
-       int err;
-       unsigned long info;
-       struct backend_info *be
-               = container_of(watch, struct backend_info, backend_watch);
-       struct xenbus_device *dev = be->dev;
-       
-       /** 
-        * Check to see whether userspace code has opened the image 
-        * and written sector
-        * and disk info to xenstore
-        */
-       err = xenbus_gather(XBT_NIL, dev->nodename, "info", "%lu", &info, 
-                           NULL);
-       if (XENBUS_EXIST_ERR(err))
-               return;
-       if (err) {
-               xenbus_dev_error(dev, err, "getting info");
-               return;
-       }
-
-       DPRINTK("Userspace update on disk info, %lu\n",info);
-
-       err = xenbus_gather(XBT_NIL, dev->nodename, "sectors", "%llu", 
-                           &be->blkif->sectors, NULL);
-
-       /* Associate tap dev with domid*/
-       be->blkif->dev_num = dom_to_devid(be->blkif->domid, be->xenbus_id, 
-                                         be->blkif);
-       DPRINTK("Thread started for domid [%d], connecting disk\n", 
-               be->blkif->dev_num);
-
-       tap_update_blkif_status(be->blkif);
-}
-
-/**
- * Callback received when the frontend's state changes.
- */
-static void tap_frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state)
-{
-       struct backend_info *be = dev->dev.driver_data;
-       int err;
-
-       DPRINTK("\n");
-
-       switch (frontend_state) {
-       case XenbusStateInitialising:
-               if (dev->state == XenbusStateClosed) {
-                       printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-                              __FUNCTION__, dev->nodename);
-                       xenbus_switch_state(dev, XenbusStateInitWait);
-               }
-               break;
-
-       case XenbusStateInitialised:
-       case XenbusStateConnected:
-               /* Ensure we connect even when two watches fire in 
-                  close successsion and we miss the intermediate value 
-                  of frontend_state. */
-               if (dev->state == XenbusStateConnected)
-                       break;
-
-               err = connect_ring(be);
-               if (err)
-                       break;
-               tap_update_blkif_status(be->blkif);
-               break;
-
-       case XenbusStateClosing:
-               if (be->blkif->xenblkd) {
-                       kthread_stop(be->blkif->xenblkd);
-                       be->blkif->xenblkd = NULL;
-               }
-               xenbus_switch_state(dev, XenbusStateClosing);
-               break;
-
-       case XenbusStateClosed:
-               xenbus_switch_state(dev, XenbusStateClosed);
-               if (xenbus_dev_is_online(dev))
-                       break;
-               /* fall through if not online */
-       case XenbusStateUnknown:
-               device_unregister(&dev->dev);
-               break;
-
-       default:
-               xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-                                frontend_state);
-               break;
-       }
-}
-
-
-/**
- * Switch to Connected state.
- */
-static void connect(struct backend_info *be)
-{
-       int err;
-
-       struct xenbus_device *dev = be->dev;
-
-       err = xenbus_switch_state(dev, XenbusStateConnected);
-       if (err)
-               xenbus_dev_fatal(dev, err, "switching to Connected state",
-                                dev->nodename);
-
-       return;
-}
-
-
-static int connect_ring(struct backend_info *be)
-{
-       struct xenbus_device *dev = be->dev;
-       unsigned long ring_ref;
-       unsigned int evtchn;
-       char protocol[64];
-       int err;
-
-       DPRINTK("%s\n", dev->otherend);
-
-       err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", 
-                           &ring_ref, "event-channel", "%u", &evtchn, NULL);
-       if (err) {
-               xenbus_dev_fatal(dev, err,
-                                "reading %s/ring-ref and event-channel",
-                                dev->otherend);
-               return err;
-       }
-
-       be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-       err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
-                           "%63s", protocol, NULL);
-       if (err)
-               strcpy(protocol, "unspecified, assuming native");
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32;
-       else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_64))
-               be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64;
-       else {
-               xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
-               return -1;
-       }
-       printk(KERN_INFO
-              "blktap: ring-ref %ld, event-channel %d, protocol %d (%s)\n",
-              ring_ref, evtchn, be->blkif->blk_protocol, protocol);
-
-       /* Map the shared frame, irq etc. */
-       err = tap_blkif_map(be->blkif, ring_ref, evtchn);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u",
-                                ring_ref, evtchn);
-               return err;
-       } 
-
-       return 0;
-}
-
-
-/* ** Driver Registration ** */
-
-
-static struct xenbus_device_id blktap_ids[] = {
-       { "tap" },
-       { "" }
-};
-
-
-static struct xenbus_driver blktap = {
-       .name = "tap",
-       .owner = THIS_MODULE,
-       .ids = blktap_ids,
-       .probe = blktap_probe,
-       .remove = blktap_remove,
-       .otherend_changed = tap_frontend_changed
-};
-
-
-void tap_blkif_xenbus_init(void)
-{
-       xenbus_register_backend(&blktap);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/char/Makefile b/linux-2.6-xen-sparse/drivers/xen/char/Makefile
deleted file mode 100644 (file)
index c73925e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-obj-y  := mem.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/char/mem.c b/linux-2.6-xen-sparse/drivers/xen/char/mem.c
deleted file mode 100644 (file)
index 7e857b2..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Originally from linux/drivers/char/mem.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Added devfs support. 
- *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
- *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
- */
-
-#include <linux/mm.h>
-#include <linux/miscdevice.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/mman.h>
-#include <linux/random.h>
-#include <linux/init.h>
-#include <linux/raw.h>
-#include <linux/tty.h>
-#include <linux/capability.h>
-#include <linux/smp_lock.h>
-#include <linux/ptrace.h>
-#include <linux/device.h>
-#include <asm/pgalloc.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/hypervisor.h>
-
-#ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
-static inline int valid_phys_addr_range(unsigned long addr, size_t count)
-{
-       return 1;
-}
-#endif
-
-/*
- * This funcion reads the *physical* memory. The f_pos points directly to the 
- * memory location. 
- */
-static ssize_t read_mem(struct file * file, char __user * buf,
-                       size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos, ignored;
-       ssize_t read = 0, sz;
-       void __iomem *v;
-
-       if (!valid_phys_addr_range(p, count))
-               return -EFAULT;
-
-       while (count > 0) {
-               /*
-                * Handle first page in case it's not aligned
-                */
-               if (-p & (PAGE_SIZE - 1))
-                       sz = -p & (PAGE_SIZE - 1);
-               else
-                       sz = PAGE_SIZE;
-
-               sz = min_t(unsigned long, sz, count);
-
-               v = xlate_dev_mem_ptr(p, sz);
-               if (IS_ERR(v) || v == NULL) {
-                       /*
-                        * Some programs (e.g., dmidecode) groove off into
-                        * weird RAM areas where no tables can possibly exist
-                        * (because Xen will have stomped on them!). These
-                        * programs get rather upset if we let them know that
-                        * Xen failed their access, so we fake out a read of
-                        * all zeroes.
-                        */
-                       if (clear_user(buf, count))
-                               return -EFAULT;
-                       read += count;
-                       break;
-               }
-
-               ignored = copy_to_user(buf, v, sz);
-               xlate_dev_mem_ptr_unmap(v);
-               if (ignored)
-                       return -EFAULT;
-               buf += sz;
-               p += sz;
-               count -= sz;
-               read += sz;
-       }
-
-       *ppos += read;
-       return read;
-}
-
-static ssize_t write_mem(struct file * file, const char __user * buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos, ignored;
-       ssize_t written = 0, sz;
-       void __iomem *v;
-
-       if (!valid_phys_addr_range(p, count))
-               return -EFAULT;
-
-       while (count > 0) {
-               /*
-                * Handle first page in case it's not aligned
-                */
-               if (-p & (PAGE_SIZE - 1))
-                       sz = -p & (PAGE_SIZE - 1);
-               else
-                       sz = PAGE_SIZE;
-
-               sz = min_t(unsigned long, sz, count);
-
-               v = xlate_dev_mem_ptr(p, sz);
-               if (v == NULL)
-                       break;
-               if (IS_ERR(v)) {
-                       if (written == 0)
-                               return PTR_ERR(v);
-                       break;
-               }
-
-               ignored = copy_from_user(v, buf, sz);
-               xlate_dev_mem_ptr_unmap(v);
-               if (ignored) {
-                       written += sz - ignored;
-                       if (written)
-                               break;
-                       return -EFAULT;
-               }
-               buf += sz;
-               p += sz;
-               count -= sz;
-               written += sz;
-       }
-
-       *ppos += written;
-       return written;
-}
-
-#ifndef ARCH_HAS_DEV_MEM_MMAP_MEM
-static inline int uncached_access(struct file *file)
-{
-       if (file->f_flags & O_SYNC)
-               return 1;
-       /* Xen sets correct MTRR type on non-RAM for us. */
-       return 0;
-}
-
-static int xen_mmap_mem(struct file * file, struct vm_area_struct * vma)
-{
-       size_t size = vma->vm_end - vma->vm_start;
-
-       if (uncached_access(file))
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
-       /* We want to return the real error code, not EAGAIN. */
-       return direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-                                     size, vma->vm_page_prot, DOMID_IO);
-}
-#endif
-
-/*
- * The memory devices use the full 32/64 bits of the offset, and so we cannot
- * check against negative addresses: they are ok. The return value is weird,
- * though, in that case (0).
- *
- * also note that seeking relative to the "end of file" isn't supported:
- * it has no meaning, so it returns -EINVAL.
- */
-static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
-{
-       loff_t ret;
-
-       mutex_lock(&file->f_dentry->d_inode->i_mutex);
-       switch (orig) {
-               case 0:
-                       file->f_pos = offset;
-                       ret = file->f_pos;
-                       force_successful_syscall_return();
-                       break;
-               case 1:
-                       file->f_pos += offset;
-                       ret = file->f_pos;
-                       force_successful_syscall_return();
-                       break;
-               default:
-                       ret = -EINVAL;
-       }
-       mutex_unlock(&file->f_dentry->d_inode->i_mutex);
-       return ret;
-}
-
-static int open_mem(struct inode * inode, struct file * filp)
-{
-       return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-}
-
-const struct file_operations mem_fops = {
-       .llseek         = memory_lseek,
-       .read           = read_mem,
-       .write          = write_mem,
-       .mmap           = xen_mmap_mem,
-       .open           = open_mem,
-};
diff --git a/linux-2.6-xen-sparse/drivers/xen/console/Makefile b/linux-2.6-xen-sparse/drivers/xen/console/Makefile
deleted file mode 100644 (file)
index 35de3e9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-obj-y  := console.o xencons_ring.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/console/console.c b/linux-2.6-xen-sparse/drivers/xen/console/console.c
deleted file mode 100644 (file)
index 1053ef8..0000000
+++ /dev/null
@@ -1,721 +0,0 @@
-/******************************************************************************
- * console.c
- * 
- * Virtual console driver.
- * 
- * Copyright (c) 2002-2004, K A Fraser.
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/serial.h>
-#include <linux/major.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/console.h>
-#include <linux/bootmem.h>
-#include <linux/sysrq.h>
-#include <linux/screen_info.h>
-#include <linux/vt.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/event_channel.h>
-#include <asm/hypervisor.h>
-#include <xen/evtchn.h>
-#include <xen/xenbus.h>
-#include <xen/xencons.h>
-
-/*
- * Modes:
- *  'xencons=off'  [XC_OFF]:     Console is disabled.
- *  'xencons=tty'  [XC_TTY]:     Console attached to '/dev/tty[0-9]+'.
- *  'xencons=ttyS' [XC_SERIAL]:  Console attached to '/dev/ttyS[0-9]+'.
- *  'xencons=xvc'  [XC_XVC]:     Console attached to '/dev/xvc0'.
- *  default:                     DOM0 -> XC_SERIAL ; all others -> XC_TTY.
- * 
- * NB. In mode XC_TTY, we create dummy consoles for tty2-63. This suppresses
- * warnings from standard distro startup scripts.
- */
-static enum {
-       XC_OFF, XC_TTY, XC_SERIAL, XC_XVC
-} xc_mode;
-static int xc_num = -1;
-
-/* /dev/xvc0 device number allocated by lanana.org. */
-#define XEN_XVC_MAJOR 204
-#define XEN_XVC_MINOR 191
-
-#ifdef CONFIG_MAGIC_SYSRQ
-static unsigned long sysrq_requested;
-extern int sysrq_enabled;
-#endif
-
-void xencons_early_setup(void)
-{
-       extern int console_use_vt;
-
-       if (is_initial_xendomain()) {
-               xc_mode = XC_SERIAL;
-       } else {
-               xc_mode = XC_TTY;
-               console_use_vt = 0;
-       }
-}
-
-static int __init xencons_setup(char *str)
-{
-       char *q;
-       int n;
-       extern int console_use_vt;
-
-       console_use_vt = 1;
-       if (!strncmp(str, "ttyS", 4)) {
-               xc_mode = XC_SERIAL;
-               str += 4;
-       } else if (!strncmp(str, "tty", 3)) {
-               xc_mode = XC_TTY;
-               str += 3;
-               console_use_vt = 0;
-       } else if (!strncmp(str, "xvc", 3)) {
-               xc_mode = XC_XVC;
-               str += 3;
-       } else if (!strncmp(str, "off", 3)) {
-               xc_mode = XC_OFF;
-               str += 3;
-       }
-
-       n = simple_strtol(str, &q, 10);
-       if (q != str)
-               xc_num = n;
-
-       return 1;
-}
-__setup("xencons=", xencons_setup);
-
-/* The kernel and user-land drivers share a common transmit buffer. */
-static unsigned int wbuf_size = 4096;
-#define WBUF_MASK(_i) ((_i)&(wbuf_size-1))
-static char *wbuf;
-static unsigned int wc, wp; /* write_cons, write_prod */
-
-static int __init xencons_bufsz_setup(char *str)
-{
-       unsigned int goal;
-       goal = simple_strtoul(str, NULL, 0);
-       if (goal) {
-               goal = roundup_pow_of_two(goal);
-               if (wbuf_size < goal)
-                       wbuf_size = goal;
-       }
-       return 1;
-}
-__setup("xencons_bufsz=", xencons_bufsz_setup);
-
-/* This lock protects accesses to the common transmit buffer. */
-static DEFINE_SPINLOCK(xencons_lock);
-
-/* Common transmit-kick routine. */
-static void __xencons_tx_flush(void);
-
-static struct tty_driver *xencons_driver;
-
-/******************** Kernel console driver ********************************/
-
-static void kcons_write(struct console *c, const char *s, unsigned int count)
-{
-       int           i = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-
-       while (i < count) {
-               for (; i < count; i++) {
-                       if ((wp - wc) >= (wbuf_size - 1))
-                               break;
-                       if ((wbuf[WBUF_MASK(wp++)] = s[i]) == '\n')
-                               wbuf[WBUF_MASK(wp++)] = '\r';
-               }
-
-               __xencons_tx_flush();
-       }
-
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static void kcons_write_dom0(struct console *c, const char *s, unsigned int count)
-{
-
-       while (count > 0) {
-               int rc;
-               rc = HYPERVISOR_console_io( CONSOLEIO_write, count, (char *)s);
-               if (rc <= 0)
-                       break;
-               count -= rc;
-               s += rc;
-       }
-}
-
-static struct tty_driver *kcons_device(struct console *c, int *index)
-{
-       *index = 0;
-       return xencons_driver;
-}
-
-static struct console kcons_info = {
-       .device = kcons_device,
-       .flags  = CON_PRINTBUFFER | CON_ENABLED,
-       .index  = -1,
-};
-
-static int __init xen_console_init(void)
-{
-       if (!is_running_on_xen())
-               goto out;
-
-       if (is_initial_xendomain()) {
-               kcons_info.write = kcons_write_dom0;
-       } else {
-               if (!xen_start_info->console.domU.evtchn)
-                       goto out;
-               kcons_info.write = kcons_write;
-       }
-
-       switch (xc_mode) {
-       case XC_XVC:
-               strcpy(kcons_info.name, "xvc");
-               if (xc_num == -1)
-                       xc_num = 0;
-               break;
-
-       case XC_SERIAL:
-               strcpy(kcons_info.name, "ttyS");
-               if (xc_num == -1)
-                       xc_num = 0;
-               break;
-
-       case XC_TTY:
-               strcpy(kcons_info.name, "tty");
-               if (xc_num == -1)
-                       xc_num = 1;
-               break;
-
-       default:
-               goto out;
-       }
-
-       wbuf = alloc_bootmem(wbuf_size);
-
-       register_console(&kcons_info);
-
- out:
-       return 0;
-}
-console_initcall(xen_console_init);
-
-/*** Useful function for console debugging -- goes straight to Xen. ***/
-asmlinkage int xprintk(const char *fmt, ...)
-{
-       va_list args;
-       int printk_len;
-       static char printk_buf[1024];
-
-       /* Emit the output into the temporary buffer */
-       va_start(args, fmt);
-       printk_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
-       va_end(args);
-
-       /* Send the processed output directly to Xen. */
-       kcons_write_dom0(NULL, printk_buf, printk_len);
-
-       return 0;
-}
-
-/*** Forcibly flush console data before dying. ***/
-void xencons_force_flush(void)
-{
-       int sz;
-
-       /* Emergency console is synchronous, so there's nothing to flush. */
-       if (!is_running_on_xen() ||
-           is_initial_xendomain() ||
-           !xen_start_info->console.domU.evtchn)
-               return;
-
-       /* Spin until console data is flushed through to the daemon. */
-       while (wc != wp) {
-               int sent = 0;
-               if ((sz = wp - wc) == 0)
-                       continue;
-               sent = xencons_ring_send(&wbuf[WBUF_MASK(wc)], sz);
-               if (sent > 0)
-                       wc += sent;
-       }
-}
-
-
-void dom0_init_screen_info(const struct dom0_vga_console_info *info)
-{
-       switch (info->video_type) {
-       case XEN_VGATYPE_TEXT_MODE_3:
-               screen_info.orig_video_mode = 3;
-               screen_info.orig_video_ega_bx = 3;
-               screen_info.orig_video_isVGA = 1;
-               screen_info.orig_video_lines = info->u.text_mode_3.rows;
-               screen_info.orig_video_cols = info->u.text_mode_3.columns;
-               screen_info.orig_x = info->u.text_mode_3.cursor_x;
-               screen_info.orig_y = info->u.text_mode_3.cursor_y;
-               screen_info.orig_video_points =
-                       info->u.text_mode_3.font_height;
-               break;
-       case XEN_VGATYPE_VESA_LFB:
-               screen_info.orig_video_isVGA = VIDEO_TYPE_VLFB;
-               screen_info.lfb_width = info->u.vesa_lfb.width;
-               screen_info.lfb_height = info->u.vesa_lfb.height;
-               screen_info.lfb_depth = info->u.vesa_lfb.bits_per_pixel;
-               screen_info.lfb_base = info->u.vesa_lfb.lfb_base;
-               screen_info.lfb_size = info->u.vesa_lfb.lfb_size;
-               screen_info.lfb_linelength = info->u.vesa_lfb.bytes_per_line;
-               screen_info.red_size = info->u.vesa_lfb.red_size;
-               screen_info.red_pos = info->u.vesa_lfb.red_pos;
-               screen_info.green_size = info->u.vesa_lfb.green_size;
-               screen_info.green_pos = info->u.vesa_lfb.green_pos;
-               screen_info.blue_size = info->u.vesa_lfb.blue_size;
-               screen_info.blue_pos = info->u.vesa_lfb.blue_pos;
-               screen_info.rsvd_size = info->u.vesa_lfb.rsvd_size;
-               screen_info.rsvd_pos = info->u.vesa_lfb.rsvd_pos;
-               break;
-       }
-}
-
-
-/******************** User-space console driver (/dev/console) ************/
-
-#define DRV(_d)         (_d)
-#define DUMMY_TTY(_tty) ((xc_mode == XC_TTY) &&                \
-                        ((_tty)->index != (xc_num - 1)))
-
-static struct termios *xencons_termios[MAX_NR_CONSOLES];
-static struct termios *xencons_termios_locked[MAX_NR_CONSOLES];
-static struct tty_struct *xencons_tty;
-static int xencons_priv_irq;
-static char x_char;
-
-void xencons_rx(char *buf, unsigned len, struct pt_regs *regs)
-{
-       int           i;
-       unsigned long flags;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       if (xencons_tty == NULL)
-               goto out;
-
-       for (i = 0; i < len; i++) {
-#ifdef CONFIG_MAGIC_SYSRQ
-               if (sysrq_enabled) {
-                       if (buf[i] == '\x0f') { /* ^O */
-                               if (!sysrq_requested) {
-                                       sysrq_requested = jiffies;
-                                       continue; /* don't print sysrq key */
-                               }
-                               sysrq_requested = 0;
-                       } else if (sysrq_requested) {
-                               unsigned long sysrq_timeout =
-                                       sysrq_requested + HZ*2;
-                               sysrq_requested = 0;
-                               if (time_before(jiffies, sysrq_timeout)) {
-                                       spin_unlock_irqrestore(
-                                               &xencons_lock, flags);
-                                       handle_sysrq(
-                                               buf[i], regs, xencons_tty);
-                                       spin_lock_irqsave(
-                                               &xencons_lock, flags);
-                                       continue;
-                               }
-                       }
-               }
-#endif
-               tty_insert_flip_char(xencons_tty, buf[i], 0);
-       }
-       tty_flip_buffer_push(xencons_tty);
-
- out:
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static void __xencons_tx_flush(void)
-{
-       int sent, sz, work_done = 0;
-
-       if (x_char) {
-               if (is_initial_xendomain())
-                       kcons_write_dom0(NULL, &x_char, 1);
-               else
-                       while (x_char)
-                               if (xencons_ring_send(&x_char, 1) == 1)
-                                       break;
-               x_char = 0;
-               work_done = 1;
-       }
-
-       while (wc != wp) {
-               sz = wp - wc;
-               if (sz > (wbuf_size - WBUF_MASK(wc)))
-                       sz = wbuf_size - WBUF_MASK(wc);
-               if (is_initial_xendomain()) {
-                       kcons_write_dom0(NULL, &wbuf[WBUF_MASK(wc)], sz);
-                       wc += sz;
-               } else {
-                       sent = xencons_ring_send(&wbuf[WBUF_MASK(wc)], sz);
-                       if (sent == 0)
-                               break;
-                       wc += sent;
-               }
-               work_done = 1;
-       }
-
-       if (work_done && (xencons_tty != NULL)) {
-               wake_up_interruptible(&xencons_tty->write_wait);
-               if ((xencons_tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-                   (xencons_tty->ldisc.write_wakeup != NULL))
-                       (xencons_tty->ldisc.write_wakeup)(xencons_tty);
-       }
-}
-
-void xencons_tx(void)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       __xencons_tx_flush();
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-/* Privileged receive callback and transmit kicker. */
-static irqreturn_t xencons_priv_interrupt(int irq, void *dev_id,
-                                         struct pt_regs *regs)
-{
-       static char rbuf[16];
-       int         l;
-
-       while ((l = HYPERVISOR_console_io(CONSOLEIO_read, 16, rbuf)) > 0)
-               xencons_rx(rbuf, l, regs);
-
-       xencons_tx();
-
-       return IRQ_HANDLED;
-}
-
-static int xencons_write_room(struct tty_struct *tty)
-{
-       return wbuf_size - (wp - wc);
-}
-
-static int xencons_chars_in_buffer(struct tty_struct *tty)
-{
-       return wp - wc;
-}
-
-static void xencons_send_xchar(struct tty_struct *tty, char ch)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       x_char = ch;
-       __xencons_tx_flush();
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static void xencons_throttle(struct tty_struct *tty)
-{
-       if (DUMMY_TTY(tty))
-               return;
-
-       if (I_IXOFF(tty))
-               xencons_send_xchar(tty, STOP_CHAR(tty));
-}
-
-static void xencons_unthrottle(struct tty_struct *tty)
-{
-       if (DUMMY_TTY(tty))
-               return;
-
-       if (I_IXOFF(tty)) {
-               if (x_char != 0)
-                       x_char = 0;
-               else
-                       xencons_send_xchar(tty, START_CHAR(tty));
-       }
-}
-
-static void xencons_flush_buffer(struct tty_struct *tty)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       wc = wp = 0;
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static inline int __xencons_put_char(int ch)
-{
-       char _ch = (char)ch;
-       if ((wp - wc) == wbuf_size)
-               return 0;
-       wbuf[WBUF_MASK(wp++)] = _ch;
-       return 1;
-}
-
-static int xencons_write(
-       struct tty_struct *tty,
-       const unsigned char *buf,
-       int count)
-{
-       int i;
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return count;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-
-       for (i = 0; i < count; i++)
-               if (!__xencons_put_char(buf[i]))
-                       break;
-
-       if (i != 0)
-               __xencons_tx_flush();
-
-       spin_unlock_irqrestore(&xencons_lock, flags);
-
-       return i;
-}
-
-static void xencons_put_char(struct tty_struct *tty, u_char ch)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       (void)__xencons_put_char(ch);
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static void xencons_flush_chars(struct tty_struct *tty)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       __xencons_tx_flush();
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static void xencons_wait_until_sent(struct tty_struct *tty, int timeout)
-{
-       unsigned long orig_jiffies = jiffies;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       while (DRV(tty->driver)->chars_in_buffer(tty)) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule_timeout(1);
-               if (signal_pending(current))
-                       break;
-               if (timeout && time_after(jiffies, orig_jiffies + timeout))
-                       break;
-       }
-
-       set_current_state(TASK_RUNNING);
-}
-
-static int xencons_open(struct tty_struct *tty, struct file *filp)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return 0;
-
-       spin_lock_irqsave(&xencons_lock, flags);
-       tty->driver_data = NULL;
-       if (xencons_tty == NULL)
-               xencons_tty = tty;
-       __xencons_tx_flush();
-       spin_unlock_irqrestore(&xencons_lock, flags);
-
-       return 0;
-}
-
-static void xencons_close(struct tty_struct *tty, struct file *filp)
-{
-       unsigned long flags;
-
-       if (DUMMY_TTY(tty))
-               return;
-
-       mutex_lock(&tty_mutex);
-
-       if (tty->count != 1) {
-               mutex_unlock(&tty_mutex);
-               return;
-       }
-
-       /* Prevent other threads from re-opening this tty. */
-       set_bit(TTY_CLOSING, &tty->flags);
-       mutex_unlock(&tty_mutex);
-
-       tty->closing = 1;
-       tty_wait_until_sent(tty, 0);
-       if (DRV(tty->driver)->flush_buffer != NULL)
-               DRV(tty->driver)->flush_buffer(tty);
-       if (tty->ldisc.flush_buffer != NULL)
-               tty->ldisc.flush_buffer(tty);
-       tty->closing = 0;
-       spin_lock_irqsave(&xencons_lock, flags);
-       xencons_tty = NULL;
-       spin_unlock_irqrestore(&xencons_lock, flags);
-}
-
-static struct tty_operations xencons_ops = {
-       .open = xencons_open,
-       .close = xencons_close,
-       .write = xencons_write,
-       .write_room = xencons_write_room,
-       .put_char = xencons_put_char,
-       .flush_chars = xencons_flush_chars,
-       .chars_in_buffer = xencons_chars_in_buffer,
-       .send_xchar = xencons_send_xchar,
-       .flush_buffer = xencons_flush_buffer,
-       .throttle = xencons_throttle,
-       .unthrottle = xencons_unthrottle,
-       .wait_until_sent = xencons_wait_until_sent,
-};
-
-static int __init xencons_init(void)
-{
-       int rc;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       if (xc_mode == XC_OFF)
-               return 0;
-
-       if (!is_initial_xendomain()) {
-               rc = xencons_ring_init();
-               if (rc)
-                       return rc;
-       }
-
-       xencons_driver = alloc_tty_driver((xc_mode == XC_TTY) ?
-                                         MAX_NR_CONSOLES : 1);
-       if (xencons_driver == NULL)
-               return -ENOMEM;
-
-       DRV(xencons_driver)->name            = "xencons";
-       DRV(xencons_driver)->major           = TTY_MAJOR;
-       DRV(xencons_driver)->type            = TTY_DRIVER_TYPE_SERIAL;
-       DRV(xencons_driver)->subtype         = SERIAL_TYPE_NORMAL;
-       DRV(xencons_driver)->init_termios    = tty_std_termios;
-       DRV(xencons_driver)->flags           =
-               TTY_DRIVER_REAL_RAW |
-               TTY_DRIVER_RESET_TERMIOS;
-       DRV(xencons_driver)->termios         = xencons_termios;
-       DRV(xencons_driver)->termios_locked  = xencons_termios_locked;
-
-       switch (xc_mode) {
-       case XC_XVC:
-               DRV(xencons_driver)->name        = "xvc";
-               DRV(xencons_driver)->major       = XEN_XVC_MAJOR;
-               DRV(xencons_driver)->minor_start = XEN_XVC_MINOR;
-               DRV(xencons_driver)->name_base   = xc_num;
-               break;
-       case XC_SERIAL:
-               DRV(xencons_driver)->name        = "ttyS";
-               DRV(xencons_driver)->minor_start = 64 + xc_num;
-               DRV(xencons_driver)->name_base   = xc_num;
-               break;
-       default:
-               DRV(xencons_driver)->name        = "tty";
-               DRV(xencons_driver)->minor_start = 1;
-               DRV(xencons_driver)->name_base   = 1;
-               break;
-       }
-
-       tty_set_operations(xencons_driver, &xencons_ops);
-
-       if ((rc = tty_register_driver(DRV(xencons_driver))) != 0) {
-               printk("WARNING: Failed to register Xen virtual "
-                      "console driver as '%s%d'\n",
-                      DRV(xencons_driver)->name,
-                      DRV(xencons_driver)->name_base);
-               put_tty_driver(xencons_driver);
-               xencons_driver = NULL;
-               return rc;
-       }
-
-       if (is_initial_xendomain()) {
-               xencons_priv_irq = bind_virq_to_irqhandler(
-                       VIRQ_CONSOLE,
-                       0,
-                       xencons_priv_interrupt,
-                       0,
-                       "console",
-                       NULL);
-               BUG_ON(xencons_priv_irq < 0);
-       }
-
-       printk("Xen virtual console successfully installed as %s%d\n",
-              DRV(xencons_driver)->name, xc_num);
-
-       return 0;
-}
-
-module_init(xencons_init);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
deleted file mode 100644 (file)
index 1c584d3..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/* 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/serial.h>
-#include <linux/major.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-
-#include <asm/hypervisor.h>
-#include <xen/evtchn.h>
-#include <xen/xencons.h>
-#include <linux/wait.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/err.h>
-#include <xen/interface/io/console.h>
-
-static int xencons_irq;
-
-static inline struct xencons_interface *xencons_interface(void)
-{
-       return mfn_to_virt(xen_start_info->console.domU.mfn);
-}
-
-static inline void notify_daemon(void)
-{
-       /* Use evtchn: this is called early, before irq is set up. */
-       notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
-}
-
-int xencons_ring_send(const char *data, unsigned len)
-{
-       int sent = 0;
-       struct xencons_interface *intf = xencons_interface();
-       XENCONS_RING_IDX cons, prod;
-
-       cons = intf->out_cons;
-       prod = intf->out_prod;
-       mb();
-       BUG_ON((prod - cons) > sizeof(intf->out));
-
-       while ((sent < len) && ((prod - cons) < sizeof(intf->out)))
-               intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++];
-
-       wmb();
-       intf->out_prod = prod;
-
-       notify_daemon();
-
-       return sent;
-}
-
-static irqreturn_t handle_input(int irq, void *unused, struct pt_regs *regs)
-{
-       struct xencons_interface *intf = xencons_interface();
-       XENCONS_RING_IDX cons, prod;
-
-       cons = intf->in_cons;
-       prod = intf->in_prod;
-       mb();
-       BUG_ON((prod - cons) > sizeof(intf->in));
-
-       while (cons != prod) {
-               xencons_rx(intf->in+MASK_XENCONS_IDX(cons,intf->in), 1, regs);
-               cons++;
-       }
-
-       mb();
-       intf->in_cons = cons;
-
-       notify_daemon();
-
-       xencons_tx();
-
-       return IRQ_HANDLED;
-}
-
-int xencons_ring_init(void)
-{
-       int irq;
-
-       if (xencons_irq)
-               unbind_from_irqhandler(xencons_irq, NULL);
-       xencons_irq = 0;
-
-       if (!is_running_on_xen() ||
-           is_initial_xendomain() ||
-           !xen_start_info->console.domU.evtchn)
-               return -ENODEV;
-
-       irq = bind_caller_port_to_irqhandler(
-               xen_start_info->console.domU.evtchn,
-               handle_input, 0, "xencons", NULL);
-       if (irq < 0) {
-               printk(KERN_ERR "XEN console request irq failed %i\n", irq);
-               return irq;
-       }
-
-       xencons_irq = irq;
-
-       /* In case we have in-flight data after save/restore... */
-       notify_daemon();
-
-       return 0;
-}
-
-void xencons_resume(void)
-{
-       (void)xencons_ring_init();
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/Makefile b/linux-2.6-xen-sparse/drivers/xen/core/Makefile
deleted file mode 100644 (file)
index 95122cb..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o
-
-obj-$(CONFIG_PROC_FS)          += xen_proc.o
-obj-$(CONFIG_SYSFS)            += hypervisor_sysfs.o
-obj-$(CONFIG_HOTPLUG_CPU)      += cpu_hotplug.o
-obj-$(CONFIG_XEN_SYSFS)                += xen_sysfs.o
-obj-$(CONFIG_XEN_SMPBOOT)      += smpboot.o
-obj-$(CONFIG_KEXEC)            += machine_kexec.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c b/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c
deleted file mode 100644 (file)
index 5602088..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/notifier.h>
-#include <linux/cpu.h>
-#include <xen/cpu_hotplug.h>
-#include <xen/xenbus.h>
-
-/*
- * Set of CPUs that remote admin software will allow us to bring online.
- * Notified to us via xenbus.
- */
-static cpumask_t xenbus_allowed_cpumask;
-
-/* Set of CPUs that local admin will allow us to bring online. */
-static cpumask_t local_allowed_cpumask = CPU_MASK_ALL;
-
-static int local_cpu_hotplug_request(void)
-{
-       /*
-        * We assume a CPU hotplug request comes from local admin if it is made
-        * via a userspace process (i.e., one with a real mm_struct).
-        */
-       return (current->mm != NULL);
-}
-
-static void vcpu_hotplug(unsigned int cpu)
-{
-       int err;
-       char dir[32], state[32];
-
-       if ((cpu >= NR_CPUS) || !cpu_possible(cpu))
-               return;
-
-       sprintf(dir, "cpu/%d", cpu);
-       err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state);
-       if (err != 1) {
-               printk(KERN_ERR "XENBUS: Unable to read cpu state\n");
-               return;
-       }
-
-       if (strcmp(state, "online") == 0) {
-               cpu_set(cpu, xenbus_allowed_cpumask);
-               (void)cpu_up(cpu);
-       } else if (strcmp(state, "offline") == 0) {
-               cpu_clear(cpu, xenbus_allowed_cpumask);
-               (void)cpu_down(cpu);
-       } else {
-               printk(KERN_ERR "XENBUS: unknown state(%s) on CPU%d\n",
-                      state, cpu);
-       }
-}
-
-static void handle_vcpu_hotplug_event(
-       struct xenbus_watch *watch, const char **vec, unsigned int len)
-{
-       int cpu;
-       char *cpustr;
-       const char *node = vec[XS_WATCH_PATH];
-
-       if ((cpustr = strstr(node, "cpu/")) != NULL) {
-               sscanf(cpustr, "cpu/%d", &cpu);
-               vcpu_hotplug(cpu);
-       }
-}
-
-static int smpboot_cpu_notify(struct notifier_block *notifier,
-                             unsigned long action, void *hcpu)
-{
-       int cpu = (long)hcpu;
-
-       /*
-        * We do this in a callback notifier rather than __cpu_disable()
-        * because local_cpu_hotplug_request() does not work in the latter
-        * as it's always executed from within a stopmachine kthread.
-        */
-       if ((action == CPU_DOWN_PREPARE) && local_cpu_hotplug_request())
-               cpu_clear(cpu, local_allowed_cpumask);
-
-       return NOTIFY_OK;
-}
-
-static int setup_cpu_watcher(struct notifier_block *notifier,
-                             unsigned long event, void *data)
-{
-       int i;
-
-       static struct xenbus_watch cpu_watch = {
-               .node = "cpu",
-               .callback = handle_vcpu_hotplug_event,
-               .flags = XBWF_new_thread };
-       (void)register_xenbus_watch(&cpu_watch);
-
-       if (!is_initial_xendomain()) {
-               for_each_possible_cpu(i)
-                       vcpu_hotplug(i);
-               printk(KERN_INFO "Brought up %ld CPUs\n",
-                      (long)num_online_cpus());
-       }
-
-       return NOTIFY_DONE;
-}
-
-static int __init setup_vcpu_hotplug_event(void)
-{
-       static struct notifier_block hotplug_cpu = {
-               .notifier_call = smpboot_cpu_notify };
-       static struct notifier_block xsn_cpu = {
-               .notifier_call = setup_cpu_watcher };
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       register_cpu_notifier(&hotplug_cpu);
-       register_xenstore_notifier(&xsn_cpu);
-
-       return 0;
-}
-
-arch_initcall(setup_vcpu_hotplug_event);
-
-int smp_suspend(void)
-{
-       int cpu, err;
-
-       for_each_online_cpu(cpu) {
-               if (cpu == 0)
-                       continue;
-               err = cpu_down(cpu);
-               if (err) {
-                       printk(KERN_CRIT "Failed to take all CPUs "
-                              "down: %d.\n", err);
-                       for_each_possible_cpu(cpu)
-                               vcpu_hotplug(cpu);
-                       return err;
-               }
-       }
-
-       return 0;
-}
-
-void smp_resume(void)
-{
-       int cpu;
-
-       for_each_possible_cpu(cpu)
-               vcpu_hotplug(cpu);
-}
-
-int cpu_up_check(unsigned int cpu)
-{
-       int rc = 0;
-
-       if (local_cpu_hotplug_request()) {
-               cpu_set(cpu, local_allowed_cpumask);
-               if (!cpu_isset(cpu, xenbus_allowed_cpumask)) {
-                       printk("%s: attempt to bring up CPU %u disallowed by "
-                              "remote admin.\n", __FUNCTION__, cpu);
-                       rc = -EBUSY;
-               }
-       } else if (!cpu_isset(cpu, local_allowed_cpumask) ||
-                  !cpu_isset(cpu, xenbus_allowed_cpumask)) {
-               rc = -EBUSY;
-       }
-
-       return rc;
-}
-
-void init_xenbus_allowed_cpumask(void)
-{
-       xenbus_allowed_cpumask = cpu_present_map;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
deleted file mode 100644 (file)
index fda12a3..0000000
+++ /dev/null
@@ -1,1015 +0,0 @@
-/******************************************************************************
- * evtchn.c
- * 
- * Communication via Xen event channels.
- * 
- * Copyright (c) 2002-2005, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/irq.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <linux/version.h>
-#include <asm/atomic.h>
-#include <asm/system.h>
-#include <asm/ptrace.h>
-#include <asm/synch_bitops.h>
-#include <xen/evtchn.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <asm/hypervisor.h>
-#include <linux/mc146818rtc.h> /* RTC_IRQ */
-
-/*
- * This lock protects updates to the following mapping and reference-count
- * arrays. The lock does not need to be acquired to read the mapping tables.
- */
-static DEFINE_SPINLOCK(irq_mapping_update_lock);
-
-/* IRQ <-> event-channel mappings. */
-static int evtchn_to_irq[NR_EVENT_CHANNELS] = {
-       [0 ...  NR_EVENT_CHANNELS-1] = -1 };
-
-/* Packed IRQ information: binding type, sub-type index, and event channel. */
-static u32 irq_info[NR_IRQS];
-
-/* Binding types. */
-enum {
-       IRQT_UNBOUND,
-       IRQT_PIRQ,
-       IRQT_VIRQ,
-       IRQT_IPI,
-       IRQT_LOCAL_PORT,
-       IRQT_CALLER_PORT
-};
-
-/* Constructor for packed IRQ information. */
-static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn)
-{
-       return ((type << 24) | (index << 16) | evtchn);
-}
-
-/* Convenient shorthand for packed representation of an unbound IRQ. */
-#define IRQ_UNBOUND    mk_irq_info(IRQT_UNBOUND, 0, 0)
-
-/*
- * Accessors for packed IRQ information.
- */
-
-static inline unsigned int evtchn_from_irq(int irq)
-{
-       return (u16)(irq_info[irq]);
-}
-
-static inline unsigned int index_from_irq(int irq)
-{
-       return (u8)(irq_info[irq] >> 16);
-}
-
-static inline unsigned int type_from_irq(int irq)
-{
-       return (u8)(irq_info[irq] >> 24);
-}
-
-/* IRQ <-> VIRQ mapping. */
-DEFINE_PER_CPU(int, virq_to_irq[NR_VIRQS]) = {[0 ... NR_VIRQS-1] = -1};
-
-/* IRQ <-> IPI mapping. */
-#ifndef NR_IPIS
-#define NR_IPIS 1
-#endif
-DEFINE_PER_CPU(int, ipi_to_irq[NR_IPIS]) = {[0 ... NR_IPIS-1] = -1};
-
-/* Reference counts for bindings to IRQs. */
-static int irq_bindcount[NR_IRQS];
-
-/* Bitmap indicating which PIRQs require Xen to be notified on unmask. */
-static DECLARE_BITMAP(pirq_needs_eoi, NR_PIRQS);
-
-#ifdef CONFIG_SMP
-
-static u8 cpu_evtchn[NR_EVENT_CHANNELS];
-static unsigned long cpu_evtchn_mask[NR_CPUS][NR_EVENT_CHANNELS/BITS_PER_LONG];
-
-static inline unsigned long active_evtchns(unsigned int cpu, shared_info_t *sh,
-                                          unsigned int idx)
-{
-       return (sh->evtchn_pending[idx] &
-               cpu_evtchn_mask[cpu][idx] &
-               ~sh->evtchn_mask[idx]);
-}
-
-static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu)
-{
-       int irq = evtchn_to_irq[chn];
-
-       BUG_ON(irq == -1);
-       set_native_irq_info(irq, cpumask_of_cpu(cpu));
-
-       clear_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu_evtchn[chn]]);
-       set_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu]);
-       cpu_evtchn[chn] = cpu;
-}
-
-static void init_evtchn_cpu_bindings(void)
-{
-       int i;
-
-       /* By default all event channels notify CPU#0. */
-       for (i = 0; i < NR_IRQS; i++)
-               set_native_irq_info(i, cpumask_of_cpu(0));
-
-       memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
-       memset(cpu_evtchn_mask[0], ~0, sizeof(cpu_evtchn_mask[0]));
-}
-
-static inline unsigned int cpu_from_evtchn(unsigned int evtchn)
-{
-       return cpu_evtchn[evtchn];
-}
-
-#else
-
-static inline unsigned long active_evtchns(unsigned int cpu, shared_info_t *sh,
-                                          unsigned int idx)
-{
-       return (sh->evtchn_pending[idx] & ~sh->evtchn_mask[idx]);
-}
-
-static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu)
-{
-}
-
-static void init_evtchn_cpu_bindings(void)
-{
-}
-
-static inline unsigned int cpu_from_evtchn(unsigned int evtchn)
-{
-       return 0;
-}
-
-#endif
-
-/* Upcall to generic IRQ layer. */
-#ifdef CONFIG_X86
-extern fastcall unsigned int do_IRQ(struct pt_regs *regs);
-void __init xen_init_IRQ(void);
-void __init init_IRQ(void)
-{
-       irq_ctx_init(0);
-       xen_init_IRQ();
-}
-#if defined (__i386__)
-static inline void exit_idle(void) {}
-#define IRQ_REG orig_eax
-#elif defined (__x86_64__)
-#include <asm/idle.h>
-#define IRQ_REG orig_rax
-#endif
-#define do_IRQ(irq, regs) do {         \
-       (regs)->IRQ_REG = ~(irq);       \
-       do_IRQ((regs));                 \
-} while (0)
-#endif
-
-/* Xen will never allocate port zero for any purpose. */
-#define VALID_EVTCHN(chn)      ((chn) != 0)
-
-/*
- * Force a proper event-channel callback from Xen after clearing the
- * callback mask. We do this in a very simple manner, by making a call
- * down into Xen. The pending flag will be checked by Xen on return.
- */
-void force_evtchn_callback(void)
-{
-       (void)HYPERVISOR_xen_version(0, NULL);
-}
-/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
-EXPORT_SYMBOL(force_evtchn_callback);
-
-static DEFINE_PER_CPU(unsigned int, upcall_count) = { 0 };
-
-/* NB. Interrupts are disabled on entry. */
-asmlinkage void evtchn_do_upcall(struct pt_regs *regs)
-{
-       unsigned long  l1, l2;
-       unsigned int   l1i, l2i, port, count;
-       int            irq, cpu = smp_processor_id();
-       shared_info_t *s = HYPERVISOR_shared_info;
-       vcpu_info_t   *vcpu_info = &s->vcpu_info[cpu];
-
-       do {
-               /* Avoid a callback storm when we reenable delivery. */
-               vcpu_info->evtchn_upcall_pending = 0;
-
-               /* Nested invocations bail immediately. */
-               if (unlikely(per_cpu(upcall_count, cpu)++))
-                       return;
-
-#ifndef CONFIG_X86 /* No need for a barrier -- XCHG is a barrier on x86. */
-               /* Clear master flag /before/ clearing selector flag. */
-               rmb();
-#endif
-               l1 = xchg(&vcpu_info->evtchn_pending_sel, 0);
-               while (l1 != 0) {
-                       l1i = __ffs(l1);
-                       l1 &= ~(1UL << l1i);
-
-                       while ((l2 = active_evtchns(cpu, s, l1i)) != 0) {
-                               l2i = __ffs(l2);
-
-                               port = (l1i * BITS_PER_LONG) + l2i;
-                               if ((irq = evtchn_to_irq[port]) != -1)
-                                       do_IRQ(irq, regs);
-                               else {
-                                       exit_idle();
-                                       evtchn_device_upcall(port);
-                               }
-                       }
-               }
-
-               /* If there were nested callbacks then we have more to do. */
-               count = per_cpu(upcall_count, cpu);
-               per_cpu(upcall_count, cpu) = 0;
-       } while (unlikely(count != 1));
-}
-
-static int find_unbound_irq(void)
-{
-       static int warned;
-       int dynirq, irq;
-
-       for (dynirq = 0; dynirq < NR_DYNIRQS; dynirq++) {
-               irq = dynirq_to_irq(dynirq);
-               if (irq_bindcount[irq] == 0)
-                       return irq;
-       }
-
-       if (!warned) {
-               warned = 1;
-               printk(KERN_WARNING "No available IRQ to bind to: "
-                      "increase NR_DYNIRQS.\n");
-       }
-
-       return -ENOSPC;
-}
-
-static int bind_caller_port_to_irq(unsigned int caller_port)
-{
-       int irq;
-
-       spin_lock(&irq_mapping_update_lock);
-
-       if ((irq = evtchn_to_irq[caller_port]) == -1) {
-               if ((irq = find_unbound_irq()) < 0)
-                       goto out;
-
-               evtchn_to_irq[caller_port] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_CALLER_PORT, 0, caller_port);
-       }
-
-       irq_bindcount[irq]++;
-
- out:
-       spin_unlock(&irq_mapping_update_lock);
-       return irq;
-}
-
-static int bind_local_port_to_irq(unsigned int local_port)
-{
-       int irq;
-
-       spin_lock(&irq_mapping_update_lock);
-
-       BUG_ON(evtchn_to_irq[local_port] != -1);
-
-       if ((irq = find_unbound_irq()) < 0) {
-               struct evtchn_close close = { .port = local_port };
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
-                       BUG();
-               goto out;
-       }
-
-       evtchn_to_irq[local_port] = irq;
-       irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port);
-       irq_bindcount[irq]++;
-
- out:
-       spin_unlock(&irq_mapping_update_lock);
-       return irq;
-}
-
-static int bind_listening_port_to_irq(unsigned int remote_domain)
-{
-       struct evtchn_alloc_unbound alloc_unbound;
-       int err;
-
-       alloc_unbound.dom        = DOMID_SELF;
-       alloc_unbound.remote_dom = remote_domain;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-                                         &alloc_unbound);
-
-       return err ? : bind_local_port_to_irq(alloc_unbound.port);
-}
-
-static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
-                                         unsigned int remote_port)
-{
-       struct evtchn_bind_interdomain bind_interdomain;
-       int err;
-
-       bind_interdomain.remote_dom  = remote_domain;
-       bind_interdomain.remote_port = remote_port;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-
-       return err ? : bind_local_port_to_irq(bind_interdomain.local_port);
-}
-
-static int bind_virq_to_irq(unsigned int virq, unsigned int cpu)
-{
-       struct evtchn_bind_virq bind_virq;
-       int evtchn, irq;
-
-       spin_lock(&irq_mapping_update_lock);
-
-       if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) {
-               if ((irq = find_unbound_irq()) < 0)
-                       goto out;
-
-               bind_virq.virq = virq;
-               bind_virq.vcpu = cpu;
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-                                               &bind_virq) != 0)
-                       BUG();
-               evtchn = bind_virq.port;
-
-               evtchn_to_irq[evtchn] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn);
-
-               per_cpu(virq_to_irq, cpu)[virq] = irq;
-
-               bind_evtchn_to_cpu(evtchn, cpu);
-       }
-
-       irq_bindcount[irq]++;
-
- out:
-       spin_unlock(&irq_mapping_update_lock);
-       return irq;
-}
-
-static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
-{
-       struct evtchn_bind_ipi bind_ipi;
-       int evtchn, irq;
-
-       spin_lock(&irq_mapping_update_lock);
-
-       if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) {
-               if ((irq = find_unbound_irq()) < 0)
-                       goto out;
-
-               bind_ipi.vcpu = cpu;
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
-                                               &bind_ipi) != 0)
-                       BUG();
-               evtchn = bind_ipi.port;
-
-               evtchn_to_irq[evtchn] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn);
-
-               per_cpu(ipi_to_irq, cpu)[ipi] = irq;
-
-               bind_evtchn_to_cpu(evtchn, cpu);
-       }
-
-       irq_bindcount[irq]++;
-
- out:
-       spin_unlock(&irq_mapping_update_lock);
-       return irq;
-}
-
-static void unbind_from_irq(unsigned int irq)
-{
-       struct evtchn_close close;
-       int cpu, evtchn = evtchn_from_irq(irq);
-
-       spin_lock(&irq_mapping_update_lock);
-
-       if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) {
-               close.port = evtchn;
-               if ((type_from_irq(irq) != IRQT_CALLER_PORT) &&
-                   HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
-                       BUG();
-
-               switch (type_from_irq(irq)) {
-               case IRQT_VIRQ:
-                       per_cpu(virq_to_irq, cpu_from_evtchn(evtchn))
-                               [index_from_irq(irq)] = -1;
-                       break;
-               case IRQT_IPI:
-                       per_cpu(ipi_to_irq, cpu_from_evtchn(evtchn))
-                               [index_from_irq(irq)] = -1;
-                       break;
-               default:
-                       break;
-               }
-
-               /* Closed ports are implicitly re-bound to VCPU0. */
-               bind_evtchn_to_cpu(evtchn, 0);
-
-               evtchn_to_irq[evtchn] = -1;
-               irq_info[irq] = IRQ_UNBOUND;
-
-               /* Zap stats across IRQ changes of use. */
-               for_each_possible_cpu(cpu)
-                       kstat_cpu(cpu).irqs[irq] = 0;
-       }
-
-       spin_unlock(&irq_mapping_update_lock);
-}
-
-int bind_caller_port_to_irqhandler(
-       unsigned int caller_port,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id)
-{
-       int irq, retval;
-
-       irq = bind_caller_port_to_irq(caller_port);
-       if (irq < 0)
-               return irq;
-
-       retval = request_irq(irq, handler, irqflags, devname, dev_id);
-       if (retval != 0) {
-               unbind_from_irq(irq);
-               return retval;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(bind_caller_port_to_irqhandler);
-
-int bind_listening_port_to_irqhandler(
-       unsigned int remote_domain,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id)
-{
-       int irq, retval;
-
-       irq = bind_listening_port_to_irq(remote_domain);
-       if (irq < 0)
-               return irq;
-
-       retval = request_irq(irq, handler, irqflags, devname, dev_id);
-       if (retval != 0) {
-               unbind_from_irq(irq);
-               return retval;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(bind_listening_port_to_irqhandler);
-
-int bind_interdomain_evtchn_to_irqhandler(
-       unsigned int remote_domain,
-       unsigned int remote_port,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id)
-{
-       int irq, retval;
-
-       irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port);
-       if (irq < 0)
-               return irq;
-
-       retval = request_irq(irq, handler, irqflags, devname, dev_id);
-       if (retval != 0) {
-               unbind_from_irq(irq);
-               return retval;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irqhandler);
-
-int bind_virq_to_irqhandler(
-       unsigned int virq,
-       unsigned int cpu,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id)
-{
-       int irq, retval;
-
-       irq = bind_virq_to_irq(virq, cpu);
-       if (irq < 0)
-               return irq;
-
-       retval = request_irq(irq, handler, irqflags, devname, dev_id);
-       if (retval != 0) {
-               unbind_from_irq(irq);
-               return retval;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(bind_virq_to_irqhandler);
-
-int bind_ipi_to_irqhandler(
-       unsigned int ipi,
-       unsigned int cpu,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id)
-{
-       int irq, retval;
-
-       irq = bind_ipi_to_irq(ipi, cpu);
-       if (irq < 0)
-               return irq;
-
-       retval = request_irq(irq, handler, irqflags, devname, dev_id);
-       if (retval != 0) {
-               unbind_from_irq(irq);
-               return retval;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(bind_ipi_to_irqhandler);
-
-void unbind_from_irqhandler(unsigned int irq, void *dev_id)
-{
-       free_irq(irq, dev_id);
-       unbind_from_irq(irq);
-}
-EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
-
-#ifdef CONFIG_SMP
-/* Rebind an evtchn so that it gets delivered to a specific cpu */
-static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
-{
-       struct evtchn_bind_vcpu bind_vcpu;
-       int evtchn = evtchn_from_irq(irq);
-
-       if (!VALID_EVTCHN(evtchn))
-               return;
-
-       /* Send future instances of this interrupt to other vcpu. */
-       bind_vcpu.port = evtchn;
-       bind_vcpu.vcpu = tcpu;
-
-       /*
-        * If this fails, it usually just indicates that we're dealing with a 
-        * virq or IPI channel, which don't actually need to be rebound. Ignore
-        * it, but don't do the xenlinux-level rebind in that case.
-        */
-       if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0)
-               bind_evtchn_to_cpu(evtchn, tcpu);
-}
-
-static void set_affinity_irq(unsigned irq, cpumask_t dest)
-{
-       unsigned tcpu = first_cpu(dest);
-       rebind_irq_to_cpu(irq, tcpu);
-}
-#endif
-
-int resend_irq_on_evtchn(unsigned int irq)
-{
-       int masked, evtchn = evtchn_from_irq(irq);
-       shared_info_t *s = HYPERVISOR_shared_info;
-
-       if (!VALID_EVTCHN(evtchn))
-               return 1;
-
-       masked = synch_test_and_set_bit(evtchn, s->evtchn_mask);
-       synch_set_bit(evtchn, s->evtchn_pending);
-       if (!masked)
-               unmask_evtchn(evtchn);
-
-       return 1;
-}
-
-/*
- * Interface to generic handling in irq.c
- */
-
-static unsigned int startup_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               unmask_evtchn(evtchn);
-       return 0;
-}
-
-static void shutdown_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               mask_evtchn(evtchn);
-}
-
-static void enable_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               unmask_evtchn(evtchn);
-}
-
-static void disable_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               mask_evtchn(evtchn);
-}
-
-static void ack_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       move_native_irq(irq);
-
-       if (VALID_EVTCHN(evtchn)) {
-               mask_evtchn(evtchn);
-               clear_evtchn(evtchn);
-       }
-}
-
-static void end_dynirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED))
-               unmask_evtchn(evtchn);
-}
-
-static struct hw_interrupt_type dynirq_type = {
-       .typename = "Dynamic-irq",
-       .startup  = startup_dynirq,
-       .shutdown = shutdown_dynirq,
-       .enable   = enable_dynirq,
-       .disable  = disable_dynirq,
-       .ack      = ack_dynirq,
-       .end      = end_dynirq,
-#ifdef CONFIG_SMP
-       .set_affinity = set_affinity_irq,
-#endif
-       .retrigger = resend_irq_on_evtchn,
-};
-
-static inline void pirq_unmask_notify(int pirq)
-{
-       struct physdev_eoi eoi = { .irq = pirq };
-       if (unlikely(test_bit(pirq, pirq_needs_eoi)))
-               (void)HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi);
-}
-
-static inline void pirq_query_unmask(int pirq)
-{
-       struct physdev_irq_status_query irq_status;
-       irq_status.irq = pirq;
-       (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
-       clear_bit(pirq, pirq_needs_eoi);
-       if (irq_status.flags & XENIRQSTAT_needs_eoi)
-               set_bit(pirq, pirq_needs_eoi);
-}
-
-/*
- * On startup, if there is no action associated with the IRQ then we are
- * probing. In this case we should not share with others as it will confuse us.
- */
-#define probing_irq(_irq) (irq_desc[(_irq)].action == NULL)
-
-static unsigned int startup_pirq(unsigned int irq)
-{
-       struct evtchn_bind_pirq bind_pirq;
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               goto out;
-
-       bind_pirq.pirq  = irq;
-       /* NB. We are happy to share unless we are probing. */
-       bind_pirq.flags = probing_irq(irq) ? 0 : BIND_PIRQ__WILL_SHARE;
-       if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &bind_pirq) != 0) {
-               if (!probing_irq(irq))
-                       printk(KERN_INFO "Failed to obtain physical IRQ %d\n",
-                              irq);
-               return 0;
-       }
-       evtchn = bind_pirq.port;
-
-       pirq_query_unmask(irq_to_pirq(irq));
-
-       evtchn_to_irq[evtchn] = irq;
-       bind_evtchn_to_cpu(evtchn, 0);
-       irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, evtchn);
-
- out:
-       unmask_evtchn(evtchn);
-       pirq_unmask_notify(irq_to_pirq(irq));
-
-       return 0;
-}
-
-static void shutdown_pirq(unsigned int irq)
-{
-       struct evtchn_close close;
-       int evtchn = evtchn_from_irq(irq);
-
-       if (!VALID_EVTCHN(evtchn))
-               return;
-
-       mask_evtchn(evtchn);
-
-       close.port = evtchn;
-       if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
-               BUG();
-
-       bind_evtchn_to_cpu(evtchn, 0);
-       evtchn_to_irq[evtchn] = -1;
-       irq_info[irq] = IRQ_UNBOUND;
-}
-
-static void enable_pirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn)) {
-               unmask_evtchn(evtchn);
-               pirq_unmask_notify(irq_to_pirq(irq));
-       }
-}
-
-static void disable_pirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               mask_evtchn(evtchn);
-}
-
-static void ack_pirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       move_native_irq(irq);
-
-       if (VALID_EVTCHN(evtchn)) {
-               mask_evtchn(evtchn);
-               clear_evtchn(evtchn);
-       }
-}
-
-static void end_pirq(unsigned int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED)) {
-               unmask_evtchn(evtchn);
-               pirq_unmask_notify(irq_to_pirq(irq));
-       }
-}
-
-static struct hw_interrupt_type pirq_type = {
-       .typename = "Phys-irq",
-       .startup  = startup_pirq,
-       .shutdown = shutdown_pirq,
-       .enable   = enable_pirq,
-       .disable  = disable_pirq,
-       .ack      = ack_pirq,
-       .end      = end_pirq,
-#ifdef CONFIG_SMP
-       .set_affinity = set_affinity_irq,
-#endif
-       .retrigger = resend_irq_on_evtchn,
-};
-
-int irq_ignore_unhandled(unsigned int irq)
-{
-       struct physdev_irq_status_query irq_status = { .irq = irq };
-
-       if (!is_running_on_xen())
-               return 0;
-
-       (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
-       return !!(irq_status.flags & XENIRQSTAT_shared);
-}
-
-void notify_remote_via_irq(int irq)
-{
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               notify_remote_via_evtchn(evtchn);
-}
-EXPORT_SYMBOL_GPL(notify_remote_via_irq);
-
-int irq_to_evtchn_port(int irq)
-{
-       return evtchn_from_irq(irq);
-}
-EXPORT_SYMBOL_GPL(irq_to_evtchn_port);
-
-void mask_evtchn(int port)
-{
-       shared_info_t *s = HYPERVISOR_shared_info;
-       synch_set_bit(port, s->evtchn_mask);
-}
-EXPORT_SYMBOL_GPL(mask_evtchn);
-
-void unmask_evtchn(int port)
-{
-       shared_info_t *s = HYPERVISOR_shared_info;
-       unsigned int cpu = smp_processor_id();
-       vcpu_info_t *vcpu_info = &s->vcpu_info[cpu];
-
-       BUG_ON(!irqs_disabled());
-
-       /* Slow path (hypercall) if this is a non-local port. */
-       if (unlikely(cpu != cpu_from_evtchn(port))) {
-               struct evtchn_unmask unmask = { .port = port };
-               (void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
-               return;
-       }
-
-       synch_clear_bit(port, s->evtchn_mask);
-
-       /* Did we miss an interrupt 'edge'? Re-fire if so. */
-       if (synch_test_bit(port, s->evtchn_pending) &&
-           !synch_test_and_set_bit(port / BITS_PER_LONG,
-                                   &vcpu_info->evtchn_pending_sel))
-               vcpu_info->evtchn_upcall_pending = 1;
-}
-EXPORT_SYMBOL_GPL(unmask_evtchn);
-
-static void restore_cpu_virqs(int cpu)
-{
-       struct evtchn_bind_virq bind_virq;
-       int virq, irq, evtchn;
-
-       for (virq = 0; virq < NR_VIRQS; virq++) {
-               if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1)
-                       continue;
-
-               BUG_ON(irq_info[irq] != mk_irq_info(IRQT_VIRQ, virq, 0));
-
-               /* Get a new binding from Xen. */
-               bind_virq.virq = virq;
-               bind_virq.vcpu = cpu;
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-                                               &bind_virq) != 0)
-                       BUG();
-               evtchn = bind_virq.port;
-
-               /* Record the new mapping. */
-               evtchn_to_irq[evtchn] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn);
-               bind_evtchn_to_cpu(evtchn, cpu);
-
-               /* Ready for use. */
-               unmask_evtchn(evtchn);
-       }
-}
-
-static void restore_cpu_ipis(int cpu)
-{
-       struct evtchn_bind_ipi bind_ipi;
-       int ipi, irq, evtchn;
-
-       for (ipi = 0; ipi < NR_IPIS; ipi++) {
-               if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1)
-                       continue;
-
-               BUG_ON(irq_info[irq] != mk_irq_info(IRQT_IPI, ipi, 0));
-
-               /* Get a new binding from Xen. */
-               bind_ipi.vcpu = cpu;
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
-                                               &bind_ipi) != 0)
-                       BUG();
-               evtchn = bind_ipi.port;
-
-               /* Record the new mapping. */
-               evtchn_to_irq[evtchn] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn);
-               bind_evtchn_to_cpu(evtchn, cpu);
-
-               /* Ready for use. */
-               unmask_evtchn(evtchn);
-
-       }
-}
-
-void irq_resume(void)
-{
-       int cpu, pirq, irq, evtchn;
-
-       init_evtchn_cpu_bindings();
-
-       /* New event-channel space is not 'live' yet. */
-       for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
-               mask_evtchn(evtchn);
-
-       /* Check that no PIRQs are still bound. */
-       for (pirq = 0; pirq < NR_PIRQS; pirq++)
-               BUG_ON(irq_info[pirq_to_irq(pirq)] != IRQ_UNBOUND);
-
-       /* No IRQ <-> event-channel mappings. */
-       for (irq = 0; irq < NR_IRQS; irq++)
-               irq_info[irq] &= ~0xFFFF; /* zap event-channel binding */
-       for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
-               evtchn_to_irq[evtchn] = -1;
-
-       for_each_possible_cpu(cpu) {
-               restore_cpu_virqs(cpu);
-               restore_cpu_ipis(cpu);
-       }
-
-}
-
-void __init xen_init_IRQ(void)
-{
-       int i;
-
-       init_evtchn_cpu_bindings();
-
-       /* No event channels are 'live' right now. */
-       for (i = 0; i < NR_EVENT_CHANNELS; i++)
-               mask_evtchn(i);
-
-       /* No IRQ -> event-channel mappings. */
-       for (i = 0; i < NR_IRQS; i++)
-               irq_info[i] = IRQ_UNBOUND;
-
-       /* Dynamic IRQ space is currently unbound. Zero the refcnts. */
-       for (i = 0; i < NR_DYNIRQS; i++) {
-               irq_bindcount[dynirq_to_irq(i)] = 0;
-
-               irq_desc[dynirq_to_irq(i)].status = IRQ_DISABLED;
-               irq_desc[dynirq_to_irq(i)].action = NULL;
-               irq_desc[dynirq_to_irq(i)].depth = 1;
-               irq_desc[dynirq_to_irq(i)].chip = &dynirq_type;
-       }
-
-       /* Phys IRQ space is statically bound (1:1 mapping). Nail refcnts. */
-       for (i = 0; i < NR_PIRQS; i++) {
-               irq_bindcount[pirq_to_irq(i)] = 1;
-
-#ifdef RTC_IRQ
-               /* If not domain 0, force our RTC driver to fail its probe. */
-               if ((i == RTC_IRQ) && !is_initial_xendomain())
-                       continue;
-#endif
-
-               irq_desc[pirq_to_irq(i)].status = IRQ_DISABLED;
-               irq_desc[pirq_to_irq(i)].action = NULL;
-               irq_desc[pirq_to_irq(i)].depth = 1;
-               irq_desc[pirq_to_irq(i)].chip = &pirq_type;
-       }
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/features.c b/linux-2.6-xen-sparse/drivers/xen/core/features.c
deleted file mode 100644 (file)
index a76f58c..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/******************************************************************************
- * features.c
- *
- * Xen feature flags.
- *
- * Copyright (c) 2006, Ian Campbell, XenSource Inc.
- */
-#include <linux/types.h>
-#include <linux/cache.h>
-#include <linux/module.h>
-#include <asm/hypervisor.h>
-#include <xen/features.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-u8 xen_features[XENFEAT_NR_SUBMAPS * 32] __read_mostly;
-/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
-EXPORT_SYMBOL(xen_features);
-
-void setup_xen_features(void)
-{
-       xen_feature_info_t fi;
-       int i, j;
-
-       for (i = 0; i < XENFEAT_NR_SUBMAPS; i++) {
-               fi.submap_idx = i;
-               if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
-                       break;
-               for (j=0; j<32; j++)
-                       xen_features[i*32+j] = !!(fi.submap & 1<<j);
-       }
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c b/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
deleted file mode 100644 (file)
index 1e01558..0000000
+++ /dev/null
@@ -1,753 +0,0 @@
-/******************************************************************************
- * gnttab.c
- *
- * Granting foreign access to our memory reservation.
- *
- * Copyright (c) 2005-2006, Christopher Clark
- * Copyright (c) 2004-2005, K A Fraser
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <xen/interface/xen.h>
-#include <xen/gnttab.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-#include <asm/synch_bitops.h>
-#include <asm/io.h>
-#include <xen/interface/memory.h>
-#include <xen/driver_util.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-/* External tools reserve first few grant table entries. */
-#define NR_RESERVED_ENTRIES 8
-#define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(grant_entry_t))
-
-static grant_ref_t **gnttab_list;
-static unsigned int nr_grant_frames;
-static unsigned int boot_max_nr_grant_frames;
-static int gnttab_free_count;
-static grant_ref_t gnttab_free_head;
-static DEFINE_SPINLOCK(gnttab_list_lock);
-
-static struct grant_entry *shared;
-
-static struct gnttab_free_callback *gnttab_free_callback_list;
-
-static int gnttab_expand(unsigned int req_entries);
-
-#define RPP (PAGE_SIZE / sizeof(grant_ref_t))
-#define gnttab_entry(entry) (gnttab_list[(entry) / RPP][(entry) % RPP])
-
-static int get_free_entries(int count)
-{
-       unsigned long flags;
-       int ref, rc;
-       grant_ref_t head;
-
-       spin_lock_irqsave(&gnttab_list_lock, flags);
-
-       if ((gnttab_free_count < count) &&
-           ((rc = gnttab_expand(count - gnttab_free_count)) < 0)) {
-               spin_unlock_irqrestore(&gnttab_list_lock, flags);
-               return rc;
-       }
-
-       ref = head = gnttab_free_head;
-       gnttab_free_count -= count;
-       while (count-- > 1)
-               head = gnttab_entry(head);
-       gnttab_free_head = gnttab_entry(head);
-       gnttab_entry(head) = GNTTAB_LIST_END;
-
-       spin_unlock_irqrestore(&gnttab_list_lock, flags);
-
-       return ref;
-}
-
-#define get_free_entry() get_free_entries(1)
-
-static void do_free_callbacks(void)
-{
-       struct gnttab_free_callback *callback, *next;
-
-       callback = gnttab_free_callback_list;
-       gnttab_free_callback_list = NULL;
-
-       while (callback != NULL) {
-               next = callback->next;
-               if (gnttab_free_count >= callback->count) {
-                       callback->next = NULL;
-                       callback->fn(callback->arg);
-               } else {
-                       callback->next = gnttab_free_callback_list;
-                       gnttab_free_callback_list = callback;
-               }
-               callback = next;
-       }
-}
-
-static inline void check_free_callbacks(void)
-{
-       if (unlikely(gnttab_free_callback_list))
-               do_free_callbacks();
-}
-
-static void put_free_entry(grant_ref_t ref)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&gnttab_list_lock, flags);
-       gnttab_entry(ref) = gnttab_free_head;
-       gnttab_free_head = ref;
-       gnttab_free_count++;
-       check_free_callbacks();
-       spin_unlock_irqrestore(&gnttab_list_lock, flags);
-}
-
-/*
- * Public grant-issuing interface functions
- */
-
-int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
-                               int readonly)
-{
-       int ref;
-
-       if (unlikely((ref = get_free_entry()) < 0))
-               return -ENOSPC;
-
-       shared[ref].frame = frame;
-       shared[ref].domid = domid;
-       wmb();
-       shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
-
-       return ref;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
-
-void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
-                                    unsigned long frame, int readonly)
-{
-       shared[ref].frame = frame;
-       shared[ref].domid = domid;
-       wmb();
-       shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
-
-
-int gnttab_query_foreign_access(grant_ref_t ref)
-{
-       u16 nflags;
-
-       nflags = shared[ref].flags;
-
-       return (nflags & (GTF_reading|GTF_writing));
-}
-EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
-
-int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
-{
-       u16 flags, nflags;
-
-       nflags = shared[ref].flags;
-       do {
-               if ((flags = nflags) & (GTF_reading|GTF_writing)) {
-                       printk(KERN_ALERT "WARNING: g.e. still in use!\n");
-                       return 0;
-               }
-       } while ((nflags = synch_cmpxchg_subword(&shared[ref].flags, flags, 0)) !=
-                flags);
-
-       return 1;
-}
-EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
-
-void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
-                              unsigned long page)
-{
-       if (gnttab_end_foreign_access_ref(ref, readonly)) {
-               put_free_entry(ref);
-               if (page != 0)
-                       free_page(page);
-       } else {
-               /* XXX This needs to be fixed so that the ref and page are
-                  placed on a list to be freed up later. */
-               printk(KERN_WARNING
-                      "WARNING: leaking g.e. and page still in use!\n");
-       }
-}
-EXPORT_SYMBOL_GPL(gnttab_end_foreign_access);
-
-int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn)
-{
-       int ref;
-
-       if (unlikely((ref = get_free_entry()) < 0))
-               return -ENOSPC;
-       gnttab_grant_foreign_transfer_ref(ref, domid, pfn);
-
-       return ref;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer);
-
-void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
-                                      unsigned long pfn)
-{
-       shared[ref].frame = pfn;
-       shared[ref].domid = domid;
-       wmb();
-       shared[ref].flags = GTF_accept_transfer;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
-
-unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
-{
-       unsigned long frame;
-       u16           flags;
-
-       /*
-        * If a transfer is not even yet started, try to reclaim the grant
-        * reference and return failure (== 0).
-        */
-       while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
-               if (synch_cmpxchg_subword(&shared[ref].flags, flags, 0) == flags)
-                       return 0;
-               cpu_relax();
-       }
-
-       /* If a transfer is in progress then wait until it is completed. */
-       while (!(flags & GTF_transfer_completed)) {
-               flags = shared[ref].flags;
-               cpu_relax();
-       }
-
-       /* Read the frame number /after/ reading completion status. */
-       rmb();
-       frame = shared[ref].frame;
-       BUG_ON(frame == 0);
-
-       return frame;
-}
-EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
-
-unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
-{
-       unsigned long frame = gnttab_end_foreign_transfer_ref(ref);
-       put_free_entry(ref);
-       return frame;
-}
-EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer);
-
-void gnttab_free_grant_reference(grant_ref_t ref)
-{
-       put_free_entry(ref);
-}
-EXPORT_SYMBOL_GPL(gnttab_free_grant_reference);
-
-void gnttab_free_grant_references(grant_ref_t head)
-{
-       grant_ref_t ref;
-       unsigned long flags;
-       int count = 1;
-       if (head == GNTTAB_LIST_END)
-               return;
-       spin_lock_irqsave(&gnttab_list_lock, flags);
-       ref = head;
-       while (gnttab_entry(ref) != GNTTAB_LIST_END) {
-               ref = gnttab_entry(ref);
-               count++;
-       }
-       gnttab_entry(ref) = gnttab_free_head;
-       gnttab_free_head = head;
-       gnttab_free_count += count;
-       check_free_callbacks();
-       spin_unlock_irqrestore(&gnttab_list_lock, flags);
-}
-EXPORT_SYMBOL_GPL(gnttab_free_grant_references);
-
-int gnttab_alloc_grant_references(u16 count, grant_ref_t *head)
-{
-       int h = get_free_entries(count);
-
-       if (h < 0)
-               return -ENOSPC;
-
-       *head = h;
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(gnttab_alloc_grant_references);
-
-int gnttab_empty_grant_references(const grant_ref_t *private_head)
-{
-       return (*private_head == GNTTAB_LIST_END);
-}
-EXPORT_SYMBOL_GPL(gnttab_empty_grant_references);
-
-int gnttab_claim_grant_reference(grant_ref_t *private_head)
-{
-       grant_ref_t g = *private_head;
-       if (unlikely(g == GNTTAB_LIST_END))
-               return -ENOSPC;
-       *private_head = gnttab_entry(g);
-       return g;
-}
-EXPORT_SYMBOL_GPL(gnttab_claim_grant_reference);
-
-void gnttab_release_grant_reference(grant_ref_t *private_head,
-                                   grant_ref_t release)
-{
-       gnttab_entry(release) = *private_head;
-       *private_head = release;
-}
-EXPORT_SYMBOL_GPL(gnttab_release_grant_reference);
-
-void gnttab_request_free_callback(struct gnttab_free_callback *callback,
-                                 void (*fn)(void *), void *arg, u16 count)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&gnttab_list_lock, flags);
-       if (callback->next)
-               goto out;
-       callback->fn = fn;
-       callback->arg = arg;
-       callback->count = count;
-       callback->next = gnttab_free_callback_list;
-       gnttab_free_callback_list = callback;
-       check_free_callbacks();
-out:
-       spin_unlock_irqrestore(&gnttab_list_lock, flags);
-}
-EXPORT_SYMBOL_GPL(gnttab_request_free_callback);
-
-void gnttab_cancel_free_callback(struct gnttab_free_callback *callback)
-{
-       struct gnttab_free_callback **pcb;
-       unsigned long flags;
-
-       spin_lock_irqsave(&gnttab_list_lock, flags);
-       for (pcb = &gnttab_free_callback_list; *pcb; pcb = &(*pcb)->next) {
-               if (*pcb == callback) {
-                       *pcb = callback->next;
-                       break;
-               }
-       }
-       spin_unlock_irqrestore(&gnttab_list_lock, flags);
-}
-EXPORT_SYMBOL_GPL(gnttab_cancel_free_callback);
-
-static int grow_gnttab_list(unsigned int more_frames)
-{
-       unsigned int new_nr_grant_frames, extra_entries, i;
-
-       new_nr_grant_frames = nr_grant_frames + more_frames;
-       extra_entries       = more_frames * GREFS_PER_GRANT_FRAME;
-
-       for (i = nr_grant_frames; i < new_nr_grant_frames; i++)
-       {
-               gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_ATOMIC);
-               if (!gnttab_list[i])
-                       goto grow_nomem;
-       }
-
-
-       for (i = GREFS_PER_GRANT_FRAME * nr_grant_frames;
-            i < GREFS_PER_GRANT_FRAME * new_nr_grant_frames - 1; i++)
-               gnttab_entry(i) = i + 1;
-
-       gnttab_entry(i) = gnttab_free_head;
-       gnttab_free_head = GREFS_PER_GRANT_FRAME * nr_grant_frames;
-       gnttab_free_count += extra_entries;
-
-       nr_grant_frames = new_nr_grant_frames;
-
-       check_free_callbacks();
-
-       return 0;
-       
-grow_nomem:
-       for ( ; i >= nr_grant_frames; i--)
-               free_page((unsigned long) gnttab_list[i]);
-       return -ENOMEM;
-}
-
-static unsigned int __max_nr_grant_frames(void)
-{
-       struct gnttab_query_size query;
-       int rc;
-
-       query.dom = DOMID_SELF;
-
-       rc = HYPERVISOR_grant_table_op(GNTTABOP_query_size, &query, 1);
-       if ((rc < 0) || (query.status != GNTST_okay))
-               return 4; /* Legacy max supported number of frames */
-
-       return query.max_nr_frames;
-}
-
-static inline unsigned int max_nr_grant_frames(void)
-{
-       unsigned int xen_max = __max_nr_grant_frames();
-
-       if (xen_max > boot_max_nr_grant_frames)
-               return boot_max_nr_grant_frames;
-       return xen_max;
-}
-
-#ifdef CONFIG_XEN
-
-#ifndef __ia64__
-static int map_pte_fn(pte_t *pte, struct page *pmd_page,
-                     unsigned long addr, void *data)
-{
-       unsigned long **frames = (unsigned long **)data;
-
-       set_pte_at(&init_mm, addr, pte, pfn_pte_ma((*frames)[0], PAGE_KERNEL));
-       (*frames)++;
-       return 0;
-}
-
-static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
-                       unsigned long addr, void *data)
-{
-
-       set_pte_at(&init_mm, addr, pte, __pte(0));
-       return 0;
-}
-#endif
-
-static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
-{
-       struct gnttab_setup_table setup;
-       unsigned long *frames;
-       unsigned int nr_gframes = end_idx + 1;
-       int rc;
-
-       frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
-       if (!frames)
-               return -ENOMEM;
-
-       setup.dom        = DOMID_SELF;
-       setup.nr_frames  = nr_gframes;
-       set_xen_guest_handle(setup.frame_list, frames);
-
-       rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
-       if (rc == -ENOSYS) {
-               kfree(frames);
-               return -ENOSYS;
-       }
-
-       BUG_ON(rc || setup.status);
-
-#ifndef __ia64__
-       if (shared == NULL) {
-               struct vm_struct *area;
-               area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames());
-               BUG_ON(area == NULL);
-               shared = area->addr;
-       }
-       rc = apply_to_page_range(&init_mm, (unsigned long)shared,
-                                PAGE_SIZE * nr_gframes,
-                                map_pte_fn, &frames);
-       BUG_ON(rc);
-        frames -= nr_gframes; /* adjust after map_pte_fn() */
-#else
-       shared = __va(frames[0] << PAGE_SHIFT);
-#endif
-
-       kfree(frames);
-
-       return 0;
-}
-
-static void gnttab_page_free(struct page *page)
-{
-       if (page->mapping) {
-               put_page((struct page *)page->mapping);
-               page->mapping = NULL;
-       }
-
-       ClearPageForeign(page);
-       gnttab_reset_grant_page(page);
-       put_page(page);
-}
-
-/*
- * Must not be called with IRQs off.  This should only be used on the
- * slow path.
- *
- * Copy a foreign granted page to local memory.
- */
-int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep)
-{
-       struct gnttab_unmap_and_replace unmap;
-       mmu_update_t mmu;
-       struct page *page;
-       struct page *new_page;
-       void *new_addr;
-       void *addr;
-       paddr_t pfn;
-       maddr_t mfn;
-       maddr_t new_mfn;
-       int err;
-
-       page = *pagep;
-       if (!get_page_unless_zero(page))
-               return -ENOENT;
-
-       err = -ENOMEM;
-       new_page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-       if (!new_page)
-               goto out;
-
-       new_addr = page_address(new_page);
-       addr = page_address(page);
-       memcpy(new_addr, addr, PAGE_SIZE);
-
-       pfn = page_to_pfn(page);
-       mfn = pfn_to_mfn(pfn);
-       new_mfn = virt_to_mfn(new_addr);
-
-       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-               set_phys_to_machine(pfn, new_mfn);
-               set_phys_to_machine(page_to_pfn(new_page), INVALID_P2M_ENTRY);
-
-               mmu.ptr = (new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
-               mmu.val = pfn;
-               err = HYPERVISOR_mmu_update(&mmu, 1, NULL, DOMID_SELF);
-               BUG_ON(err);
-       }
-
-       gnttab_set_replace_op(&unmap, (unsigned long)addr,
-                             (unsigned long)new_addr, ref);
-
-       err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_and_replace,
-                                       &unmap, 1);
-       BUG_ON(err);
-       BUG_ON(unmap.status);
-
-       new_page->mapping = page->mapping;
-       new_page->index = page->index;
-       set_bit(PG_foreign, &new_page->flags);
-       *pagep = new_page;
-
-       SetPageForeign(page, gnttab_page_free);
-       page->mapping = NULL;
-
-       /*
-        * Ensure that there is a barrier between setting the p2m entry
-        * and checking the map count.  See gnttab_dma_map_page.
-        */
-       smp_mb();
-
-       /* Has the page been DMA-mapped? */
-       if (unlikely(page_mapped(page))) {
-               err = -EBUSY;
-               page->mapping = (void *)new_page;
-       }
-
-out:
-       put_page(page);
-       return err;
-
-}
-EXPORT_SYMBOL(gnttab_copy_grant_page);
-
-/*
- * Keep track of foreign pages marked as PageForeign so that we don't
- * return them to the remote domain prematurely.
- *
- * PageForeign pages are pinned down by increasing their mapcount.
- *
- * All other pages are simply returned as is.
- */
-maddr_t gnttab_dma_map_page(struct page *page)
-{
-       maddr_t mfn = pfn_to_mfn(page_to_pfn(page)), mfn2;
-
-       if (!PageForeign(page))
-               return mfn << PAGE_SHIFT;
-
-       if (mfn_to_local_pfn(mfn) < max_mapnr)
-               return mfn << PAGE_SHIFT;
-
-       atomic_set(&page->_mapcount, 0);
-
-       /* This barrier corresponds to the one in gnttab_copy_grant_page. */
-       smp_mb();
-
-       /* Has this page been copied in the mean time? */
-       mfn2 = pfn_to_mfn(page_to_pfn(page));
-
-       return mfn2 << PAGE_SHIFT;
-}
-
-int gnttab_resume(void)
-{
-       if (max_nr_grant_frames() < nr_grant_frames)
-               return -ENOSYS;
-       return gnttab_map(0, nr_grant_frames - 1);
-}
-
-int gnttab_suspend(void)
-{
-#ifndef __ia64__
-       apply_to_page_range(&init_mm, (unsigned long)shared,
-                           PAGE_SIZE * nr_grant_frames,
-                           unmap_pte_fn, NULL);
-#endif
-       return 0;
-}
-
-#else /* !CONFIG_XEN */
-
-#include <platform-pci.h>
-
-static unsigned long resume_frames;
-
-static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
-{
-       struct xen_add_to_physmap xatp;
-       unsigned int i = end_idx;
-
-       /* Loop backwards, so that the first hypercall has the largest index,
-        * ensuring that the table will grow only once.
-        */
-       do {
-               xatp.domid = DOMID_SELF;
-               xatp.idx = i;
-               xatp.space = XENMAPSPACE_grant_table;
-               xatp.gpfn = (resume_frames >> PAGE_SHIFT) + i;
-               if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
-                       BUG();
-       } while (i-- > start_idx);
-
-       return 0;
-}
-
-int gnttab_resume(void)
-{
-       unsigned int max_nr_gframes, nr_gframes;
-
-       nr_gframes = nr_grant_frames;
-       max_nr_gframes = max_nr_grant_frames();
-       if (max_nr_gframes < nr_gframes)
-               return -ENOSYS;
-
-       if (!resume_frames) {
-               resume_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
-               shared = ioremap(resume_frames, PAGE_SIZE * max_nr_gframes);
-               if (shared == NULL) {
-                       printk("error to ioremap gnttab share frames\n");
-                       return -1;
-               }
-       }
-
-       gnttab_map(0, nr_gframes - 1);
-
-       return 0;
-}
-
-#endif /* !CONFIG_XEN */
-
-static int gnttab_expand(unsigned int req_entries)
-{
-       int rc;
-       unsigned int cur, extra;
-
-       cur = nr_grant_frames;
-       extra = ((req_entries + (GREFS_PER_GRANT_FRAME-1)) /
-                GREFS_PER_GRANT_FRAME);
-       if (cur + extra > max_nr_grant_frames())
-               return -ENOSPC;
-
-       if ((rc = gnttab_map(cur, cur + extra - 1)) == 0)
-               rc = grow_gnttab_list(extra);
-
-       return rc;
-}
-
-int __devinit gnttab_init(void)
-{
-       int i;
-       unsigned int max_nr_glist_frames;
-       unsigned int nr_init_grefs;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       nr_grant_frames = 1;
-       boot_max_nr_grant_frames = __max_nr_grant_frames();
-
-       /* Determine the maximum number of frames required for the
-        * grant reference free list on the current hypervisor.
-        */
-       max_nr_glist_frames = (boot_max_nr_grant_frames *
-                              GREFS_PER_GRANT_FRAME /
-                              (PAGE_SIZE / sizeof(grant_ref_t)));
-
-       gnttab_list = kmalloc(max_nr_glist_frames * sizeof(grant_ref_t *),
-                             GFP_KERNEL);
-       if (gnttab_list == NULL)
-               return -ENOMEM;
-
-       for (i = 0; i < nr_grant_frames; i++) {
-               gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_KERNEL);
-               if (gnttab_list[i] == NULL)
-                       goto ini_nomem;
-       }
-
-       if (gnttab_resume() < 0)
-               return -ENODEV;
-
-       nr_init_grefs = nr_grant_frames * GREFS_PER_GRANT_FRAME;
-
-       for (i = NR_RESERVED_ENTRIES; i < nr_init_grefs - 1; i++)
-               gnttab_entry(i) = i + 1;
-
-       gnttab_entry(nr_init_grefs - 1) = GNTTAB_LIST_END;
-       gnttab_free_count = nr_init_grefs - NR_RESERVED_ENTRIES;
-       gnttab_free_head  = NR_RESERVED_ENTRIES;
-
-       return 0;
-
- ini_nomem:
-       for (i--; i >= 0; i--)
-               free_page((unsigned long)gnttab_list[i]);
-       kfree(gnttab_list);
-       return -ENOMEM;
-}
-
-#ifdef CONFIG_XEN
-core_initcall(gnttab_init);
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/hypervisor_sysfs.c b/linux-2.6-xen-sparse/drivers/xen/core/hypervisor_sysfs.c
deleted file mode 100644 (file)
index ab3ce04..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  copyright (c) 2006 IBM Corporation
- *  Authored by: Mike D. Day <ncmike@us.ibm.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 as
- *  published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kobject.h>
-#include <xen/hypervisor_sysfs.h>
-
-decl_subsys(hypervisor, NULL, NULL);
-
-static ssize_t hyp_sysfs_show(struct kobject *kobj,
-                             struct attribute *attr,
-                             char *buffer)
-{
-       struct hyp_sysfs_attr *hyp_attr;
-       hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
-       if (hyp_attr->show)
-               return hyp_attr->show(hyp_attr, buffer);
-       return 0;
-}
-
-static ssize_t hyp_sysfs_store(struct kobject *kobj,
-                              struct attribute *attr,
-                              const char *buffer,
-                              size_t len)
-{
-       struct hyp_sysfs_attr *hyp_attr;
-       hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
-       if (hyp_attr->store)
-               return hyp_attr->store(hyp_attr, buffer, len);
-       return 0;
-}
-
-struct sysfs_ops hyp_sysfs_ops = {
-       .show = hyp_sysfs_show,
-       .store = hyp_sysfs_store,
-};
-
-static struct kobj_type hyp_sysfs_kobj_type = {
-       .sysfs_ops = &hyp_sysfs_ops,
-};
-
-static int __init hypervisor_subsys_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       hypervisor_subsys.kset.kobj.ktype = &hyp_sysfs_kobj_type;
-       return subsystem_register(&hypervisor_subsys);
-}
-
-device_initcall(hypervisor_subsys_init);
-EXPORT_SYMBOL_GPL(hypervisor_subsys);
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c
deleted file mode 100644 (file)
index 9356ccf..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * drivers/xen/core/machine_kexec.c 
- * handle transition of Linux booting another kernel
- */
-
-#include <linux/kexec.h>
-#include <xen/interface/kexec.h>
-#include <linux/mm.h>
-#include <linux/bootmem.h>
-
-extern void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, 
-                                        struct kimage *image);
-
-static int __initdata xen_max_nr_phys_cpus;
-static struct resource xen_hypervisor_res;
-static struct resource *xen_phys_cpus;
-
-void __init xen_machine_kexec_setup_resources(void)
-{
-       xen_kexec_range_t range;
-       struct resource *res;
-       int k = 0;
-
-       if (!is_initial_xendomain())
-               return;
-
-       /* determine maximum number of physical cpus */
-
-       while (1) {
-               memset(&range, 0, sizeof(range));
-               range.range = KEXEC_RANGE_MA_CPU;
-               range.nr = k;
-
-               if(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-                       break;
-
-               k++;
-       }
-
-       if (k == 0)
-               return;
-
-       xen_max_nr_phys_cpus = k;
-
-       /* allocate xen_phys_cpus */
-
-       xen_phys_cpus = alloc_bootmem_low(k * sizeof(struct resource));
-       BUG_ON(xen_phys_cpus == NULL);
-
-       /* fill in xen_phys_cpus with per-cpu crash note information */
-
-       for (k = 0; k < xen_max_nr_phys_cpus; k++) {
-               memset(&range, 0, sizeof(range));
-               range.range = KEXEC_RANGE_MA_CPU;
-               range.nr = k;
-
-               if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-                       goto err;
-
-               res = xen_phys_cpus + k;
-
-               memset(res, 0, sizeof(*res));
-               res->name = "Crash note";
-               res->start = range.start;
-               res->end = range.start + range.size - 1;
-               res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
-       }
-
-       /* fill in xen_hypervisor_res with hypervisor machine address range */
-
-       memset(&range, 0, sizeof(range));
-       range.range = KEXEC_RANGE_MA_XEN;
-
-       if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-               goto err;
-
-       xen_hypervisor_res.name = "Hypervisor code and data";
-       xen_hypervisor_res.start = range.start;
-       xen_hypervisor_res.end = range.start + range.size - 1;
-       xen_hypervisor_res.flags = IORESOURCE_BUSY | IORESOURCE_MEM;
-
-       /* fill in crashk_res if range is reserved by hypervisor */
-
-       memset(&range, 0, sizeof(range));
-       range.range = KEXEC_RANGE_MA_CRASH;
-
-       if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-               return;
-
-       if (range.size) {
-               crashk_res.start = range.start;
-               crashk_res.end = range.start + range.size - 1;
-       }
-
-       return;
-
- err:
-       /*
-        * It isn't possible to free xen_phys_cpus this early in the
-        * boot. Failure at this stage is unexpected and the amount of
-        * memory is small therefore we tolerate the potential leak.
-         */
-       xen_max_nr_phys_cpus = 0;
-       return;
-}
-
-void __init xen_machine_kexec_register_resources(struct resource *res)
-{
-       int k;
-
-       request_resource(res, &xen_hypervisor_res);
-
-       for (k = 0; k < xen_max_nr_phys_cpus; k++)
-               request_resource(&xen_hypervisor_res, xen_phys_cpus + k);
-
-}
-
-static void setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-{
-       machine_kexec_setup_load_arg(xki, image);
-
-       xki->indirection_page = image->head;
-       xki->start_address = image->start;
-}
-
-/*
- * Load the image into xen so xen can kdump itself
- * This might have been done in prepare, but prepare
- * is currently called too early. It might make sense
- * to move prepare, but for now, just add an extra hook.
- */
-int xen_machine_kexec_load(struct kimage *image)
-{
-       xen_kexec_load_t xkl;
-
-       memset(&xkl, 0, sizeof(xkl));
-       xkl.type = image->type;
-       setup_load_arg(&xkl.image, image);
-       return HYPERVISOR_kexec_op(KEXEC_CMD_kexec_load, &xkl);
-}
-
-/*
- * Unload the image that was stored by machine_kexec_load()
- * This might have been done in machine_kexec_cleanup() but it
- * is called too late, and its possible xen could try and kdump
- * using resources that have been freed.
- */
-void xen_machine_kexec_unload(struct kimage *image)
-{
-       xen_kexec_load_t xkl;
-
-       memset(&xkl, 0, sizeof(xkl));
-       xkl.type = image->type;
-       HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl);
-}
-
-/*
- * Do not allocate memory (or fail in any way) in machine_kexec().
- * We are past the point of no return, committed to rebooting now.
- *
- * This has the hypervisor move to the prefered reboot CPU, 
- * stop all CPUs and kexec. That is it combines machine_shutdown()
- * and machine_kexec() in Linux kexec terms.
- */
-NORET_TYPE void machine_kexec(struct kimage *image)
-{
-       xen_kexec_exec_t xke;
-
-       memset(&xke, 0, sizeof(xke));
-       xke.type = image->type;
-       HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke);
-       panic("KEXEC_CMD_kexec hypercall should not return\n");
-}
-
-void machine_shutdown(void)
-{
-       /* do nothing */
-}
-
-
-/*
- * Local variables:
- *  c-file-style: "linux"
- *  indent-tabs-mode: t
- *  c-indent-level: 8
- *  c-basic-offset: 8
- *  tab-width: 8
- * End:
- */
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c b/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c
deleted file mode 100644 (file)
index 814bfd2..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/unistd.h>
-#include <linux/module.h>
-#include <linux/reboot.h>
-#include <linux/sysrq.h>
-#include <linux/stringify.h>
-#include <linux/stop_machine.h>
-#include <asm/irq.h>
-#include <asm/mmu_context.h>
-#include <xen/evtchn.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <linux/cpu.h>
-#include <linux/kthread.h>
-#include <xen/gnttab.h>
-#include <xen/xencons.h>
-#include <xen/cpu_hotplug.h>
-#include <xen/interface/vcpu.h>
-
-#if defined(__i386__) || defined(__x86_64__)
-
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
-void machine_emergency_restart(void)
-{
-       /* We really want to get pending console data out before we die. */
-       xencons_force_flush();
-       HYPERVISOR_shutdown(SHUTDOWN_reboot);
-}
-
-void machine_restart(char * __unused)
-{
-       machine_emergency_restart();
-}
-
-void machine_halt(void)
-{
-       machine_power_off();
-}
-
-void machine_power_off(void)
-{
-       /* We really want to get pending console data out before we die. */
-       xencons_force_flush();
-       if (pm_power_off)
-               pm_power_off();
-       HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-}
-
-int reboot_thru_bios = 0;      /* for dmi_scan.c */
-EXPORT_SYMBOL(machine_restart);
-EXPORT_SYMBOL(machine_halt);
-EXPORT_SYMBOL(machine_power_off);
-
-static void pre_suspend(void)
-{
-       HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-       HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-                                    __pte_ma(0), 0);
-
-       xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
-       xen_start_info->console.domU.mfn =
-               mfn_to_pfn(xen_start_info->console.domU.mfn);
-}
-
-static void post_suspend(int suspend_cancelled)
-{
-       int i, j, k, fpp;
-       unsigned long shinfo_mfn;
-       extern unsigned long max_pfn;
-       extern unsigned long *pfn_to_mfn_frame_list_list;
-       extern unsigned long *pfn_to_mfn_frame_list[];
-
-       if (suspend_cancelled) {
-               xen_start_info->store_mfn =
-                       pfn_to_mfn(xen_start_info->store_mfn);
-               xen_start_info->console.domU.mfn =
-                       pfn_to_mfn(xen_start_info->console.domU.mfn);
-       } else {
-#ifdef CONFIG_SMP
-               cpu_initialized_map = cpu_online_map;
-#endif
-       }
-
-       shinfo_mfn = xen_start_info->shared_info >> PAGE_SHIFT;
-       HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-                                    pfn_pte_ma(shinfo_mfn, PAGE_KERNEL), 0);
-       HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-
-       memset(empty_zero_page, 0, PAGE_SIZE);
-
-       fpp = PAGE_SIZE/sizeof(unsigned long);
-       for (i = 0, j = 0, k = -1; i < max_pfn; i += fpp, j++) {
-               if ((j % fpp) == 0) {
-                       k++;
-                       pfn_to_mfn_frame_list_list[k] =
-                               virt_to_mfn(pfn_to_mfn_frame_list[k]);
-                       j = 0;
-               }
-               pfn_to_mfn_frame_list[k][j] =
-                       virt_to_mfn(&phys_to_machine_mapping[i]);
-       }
-       HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
-       HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-               virt_to_mfn(pfn_to_mfn_frame_list_list);
-}
-
-#else /* !(defined(__i386__) || defined(__x86_64__)) */
-
-#ifndef HAVE_XEN_PRE_SUSPEND
-#define xen_pre_suspend()      ((void)0)
-#endif
-
-#ifndef HAVE_XEN_POST_SUSPEND
-#define xen_post_suspend(x)    ((void)0)
-#endif
-
-#define switch_idle_mm()       ((void)0)
-#define mm_pin_all()           ((void)0)
-#define pre_suspend()          xen_pre_suspend()
-#define post_suspend(x)                xen_post_suspend(x)
-
-#endif
-
-static int take_machine_down(void *p_fast_suspend)
-{
-       int fast_suspend = *(int *)p_fast_suspend;
-       int suspend_cancelled, err;
-       extern void time_resume(void);
-
-       if (fast_suspend) {
-               BUG_ON(!irqs_disabled());
-       } else {
-               BUG_ON(irqs_disabled());
-
-               for (;;) {
-                       err = smp_suspend();
-                       if (err)
-                               return err;
-
-                       xenbus_suspend();
-                       preempt_disable();
-
-                       if (num_online_cpus() == 1)
-                               break;
-
-                       preempt_enable();
-                       xenbus_suspend_cancel();
-               }
-
-               local_irq_disable();
-       }
-
-       mm_pin_all();
-       gnttab_suspend();
-       pre_suspend();
-
-       /*
-        * This hypercall returns 1 if suspend was cancelled or the domain was
-        * merely checkpointed, and 0 if it is resuming in a new domain.
-        */
-       suspend_cancelled = HYPERVISOR_suspend(virt_to_mfn(xen_start_info));
-
-       post_suspend(suspend_cancelled);
-       gnttab_resume();
-       if (!suspend_cancelled) {
-               irq_resume();
-#ifdef __x86_64__
-               /*
-                * Older versions of Xen do not save/restore the user %cr3.
-                * We do it here just in case, but there's no need if we are
-                * in fast-suspend mode as that implies a new enough Xen.
-                */
-               if (!fast_suspend) {
-                       struct mmuext_op op;
-                       op.cmd = MMUEXT_NEW_USER_BASEPTR;
-                       op.arg1.mfn = pfn_to_mfn(__pa(__user_pgd(
-                               current->active_mm->pgd)) >> PAGE_SHIFT);
-                       if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF))
-                               BUG();
-               }
-#endif
-       }
-       time_resume();
-
-       if (!fast_suspend)
-               local_irq_enable();
-
-       return suspend_cancelled;
-}
-
-int __xen_suspend(int fast_suspend)
-{
-       int err, suspend_cancelled;
-
-       BUG_ON(smp_processor_id() != 0);
-       BUG_ON(in_interrupt());
-
-#if defined(__i386__) || defined(__x86_64__)
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               printk(KERN_WARNING "Cannot suspend in "
-                      "auto_translated_physmap mode.\n");
-               return -EOPNOTSUPP;
-       }
-#endif
-
-       /* If we are definitely UP then 'slow mode' is actually faster. */
-       if (num_possible_cpus() == 1)
-               fast_suspend = 0;
-
-       if (fast_suspend) {
-               xenbus_suspend();
-               err = stop_machine_run(take_machine_down, &fast_suspend, 0);
-               if (err < 0)
-                       xenbus_suspend_cancel();
-       } else {
-               err = take_machine_down(&fast_suspend);
-       }
-
-       if (err < 0)
-               return err;
-
-       suspend_cancelled = err;
-       if (!suspend_cancelled) {
-               xencons_resume();
-               xenbus_resume();
-       } else {
-               xenbus_suspend_cancel();
-       }
-
-       if (!fast_suspend)
-               smp_resume();
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/reboot.c b/linux-2.6-xen-sparse/drivers/xen/core/reboot.c
deleted file mode 100644 (file)
index ee6625a..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-#define __KERNEL_SYSCALLS__
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/unistd.h>
-#include <linux/module.h>
-#include <linux/reboot.h>
-#include <linux/sysrq.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <linux/kthread.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-MODULE_LICENSE("Dual BSD/GPL");
-
-#define SHUTDOWN_INVALID  -1
-#define SHUTDOWN_POWEROFF  0
-#define SHUTDOWN_SUSPEND   2
-/* Code 3 is SHUTDOWN_CRASH, which we don't use because the domain can only
- * report a crash, not be instructed to crash!
- * HALT is the same as POWEROFF, as far as we're concerned.  The tools use
- * the distinction when we return the reason code to them.
- */
-#define SHUTDOWN_HALT      4
-
-/* Ignore multiple shutdown requests. */
-static int shutting_down = SHUTDOWN_INVALID;
-
-/* Can we leave APs online when we suspend? */
-static int fast_suspend;
-
-static void __shutdown_handler(void *unused);
-static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
-
-int __xen_suspend(int fast_suspend);
-
-static int shutdown_process(void *__unused)
-{
-       static char *envp[] = { "HOME=/", "TERM=linux",
-                               "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
-       static char *poweroff_argv[] = { "/sbin/poweroff", NULL };
-
-       extern asmlinkage long sys_reboot(int magic1, int magic2,
-                                         unsigned int cmd, void *arg);
-
-       if ((shutting_down == SHUTDOWN_POWEROFF) ||
-           (shutting_down == SHUTDOWN_HALT)) {
-               if (call_usermodehelper("/sbin/poweroff", poweroff_argv,
-                                       envp, 0) < 0) {
-#ifdef CONFIG_XEN
-                       sys_reboot(LINUX_REBOOT_MAGIC1,
-                                  LINUX_REBOOT_MAGIC2,
-                                  LINUX_REBOOT_CMD_POWER_OFF,
-                                  NULL);
-#endif /* CONFIG_XEN */
-               }
-       }
-
-       shutting_down = SHUTDOWN_INVALID; /* could try again */
-
-       return 0;
-}
-
-static int xen_suspend(void *__unused)
-{
-       int err = __xen_suspend(fast_suspend);
-       if (err)
-               printk(KERN_ERR "Xen suspend failed (%d)\n", err);
-       shutting_down = SHUTDOWN_INVALID;
-       return 0;
-}
-
-static int kthread_create_on_cpu(int (*f)(void *arg),
-                                void *arg,
-                                const char *name,
-                                int cpu)
-{
-       struct task_struct *p;
-       p = kthread_create(f, arg, name);
-       if (IS_ERR(p))
-               return PTR_ERR(p);
-       kthread_bind(p, cpu);
-       wake_up_process(p);
-       return 0;
-}
-
-static void __shutdown_handler(void *unused)
-{
-       int err;
-
-       if (shutting_down != SHUTDOWN_SUSPEND)
-               err = kernel_thread(shutdown_process, NULL,
-                                   CLONE_FS | CLONE_FILES);
-       else
-               err = kthread_create_on_cpu(xen_suspend, NULL, "suspend", 0);
-
-       if (err < 0) {
-               printk(KERN_WARNING "Error creating shutdown process (%d): "
-                      "retrying...\n", -err);
-               schedule_delayed_work(&shutdown_work, HZ/2);
-       }
-}
-
-static void shutdown_handler(struct xenbus_watch *watch,
-                            const char **vec, unsigned int len)
-{
-       extern void ctrl_alt_del(void);
-       char *str;
-       struct xenbus_transaction xbt;
-       int err;
-
-       if (shutting_down != SHUTDOWN_INVALID)
-               return;
-
- again:
-       err = xenbus_transaction_start(&xbt);
-       if (err)
-               return;
-
-       str = (char *)xenbus_read(xbt, "control", "shutdown", NULL);
-       /* Ignore read errors and empty reads. */
-       if (XENBUS_IS_ERR_READ(str)) {
-               xenbus_transaction_end(xbt, 1);
-               return;
-       }
-
-       xenbus_write(xbt, "control", "shutdown", "");
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err == -EAGAIN) {
-               kfree(str);
-               goto again;
-       }
-
-       if (strcmp(str, "poweroff") == 0)
-               shutting_down = SHUTDOWN_POWEROFF;
-       else if (strcmp(str, "reboot") == 0)
-               ctrl_alt_del();
-       else if (strcmp(str, "suspend") == 0)
-               shutting_down = SHUTDOWN_SUSPEND;
-       else if (strcmp(str, "halt") == 0)
-               shutting_down = SHUTDOWN_HALT;
-       else {
-               printk("Ignoring shutdown request: %s\n", str);
-               shutting_down = SHUTDOWN_INVALID;
-       }
-
-       if (shutting_down != SHUTDOWN_INVALID)
-               schedule_work(&shutdown_work);
-
-       kfree(str);
-}
-
-static void sysrq_handler(struct xenbus_watch *watch, const char **vec,
-                         unsigned int len)
-{
-       char sysrq_key = '\0';
-       struct xenbus_transaction xbt;
-       int err;
-
- again:
-       err = xenbus_transaction_start(&xbt);
-       if (err)
-               return;
-       if (!xenbus_scanf(xbt, "control", "sysrq", "%c", &sysrq_key)) {
-               printk(KERN_ERR "Unable to read sysrq code in "
-                      "control/sysrq\n");
-               xenbus_transaction_end(xbt, 1);
-               return;
-       }
-
-       if (sysrq_key != '\0')
-               xenbus_printf(xbt, "control", "sysrq", "%c", '\0');
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err == -EAGAIN)
-               goto again;
-
-#ifdef CONFIG_MAGIC_SYSRQ
-       if (sysrq_key != '\0')
-               handle_sysrq(sysrq_key, NULL, NULL);
-#endif
-}
-
-static struct xenbus_watch shutdown_watch = {
-       .node = "control/shutdown",
-       .callback = shutdown_handler
-};
-
-static struct xenbus_watch sysrq_watch = {
-       .node = "control/sysrq",
-       .callback = sysrq_handler
-};
-
-static int setup_shutdown_watcher(void)
-{
-       int err;
-
-       xenbus_scanf(XBT_NIL, "control",
-                    "platform-feature-multiprocessor-suspend",
-                    "%d", &fast_suspend);
-
-       err = register_xenbus_watch(&shutdown_watch);
-       if (err) {
-               printk(KERN_ERR "Failed to set shutdown watcher\n");
-               return err;
-       }
-
-       err = register_xenbus_watch(&sysrq_watch);
-       if (err) {
-               printk(KERN_ERR "Failed to set sysrq watcher\n");
-               return err;
-       }
-
-       return 0;
-}
-
-#ifdef CONFIG_XEN
-
-static int shutdown_event(struct notifier_block *notifier,
-                         unsigned long event,
-                         void *data)
-{
-       setup_shutdown_watcher();
-       return NOTIFY_DONE;
-}
-
-static int __init setup_shutdown_event(void)
-{
-       static struct notifier_block xenstore_notifier = {
-               .notifier_call = shutdown_event
-       };
-       register_xenstore_notifier(&xenstore_notifier);
-
-       return 0;
-}
-
-subsys_initcall(setup_shutdown_event);
-
-#else /* !defined(CONFIG_XEN) */
-
-int xen_reboot_init(void)
-{
-       return setup_shutdown_watcher();
-}
-
-#endif /* !defined(CONFIG_XEN) */
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
deleted file mode 100644 (file)
index fd8b170..0000000
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- *     Xen SMP booting functions
- *
- *     See arch/i386/kernel/smpboot.c for copyright and credits for derived
- *     portions of this file.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <linux/smp_lock.h>
-#include <linux/irq.h>
-#include <linux/bootmem.h>
-#include <linux/notifier.h>
-#include <linux/cpu.h>
-#include <linux/percpu.h>
-#include <asm/desc.h>
-#include <asm/arch_hooks.h>
-#include <asm/pgalloc.h>
-#include <xen/evtchn.h>
-#include <xen/interface/vcpu.h>
-#include <xen/cpu_hotplug.h>
-#include <xen/xenbus.h>
-
-extern irqreturn_t smp_reschedule_interrupt(int, void *, struct pt_regs *);
-extern irqreturn_t smp_call_function_interrupt(int, void *, struct pt_regs *);
-
-extern int local_setup_timer(unsigned int cpu);
-extern void local_teardown_timer(unsigned int cpu);
-
-extern void hypervisor_callback(void);
-extern void failsafe_callback(void);
-extern void system_call(void);
-extern void smp_trap_init(trap_info_t *);
-
-/* Number of siblings per CPU package */
-int smp_num_siblings = 1;
-int phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
-EXPORT_SYMBOL(phys_proc_id);
-int cpu_core_id[NR_CPUS]; /* Core ID of each logical CPU */
-EXPORT_SYMBOL(cpu_core_id);
-
-cpumask_t cpu_online_map;
-EXPORT_SYMBOL(cpu_online_map);
-cpumask_t cpu_possible_map;
-EXPORT_SYMBOL(cpu_possible_map);
-cpumask_t cpu_initialized_map;
-
-struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
-EXPORT_SYMBOL(cpu_data);
-
-#ifdef CONFIG_HOTPLUG_CPU
-DEFINE_PER_CPU(int, cpu_state) = { 0 };
-#endif
-
-static DEFINE_PER_CPU(int, resched_irq);
-static DEFINE_PER_CPU(int, callfunc_irq);
-static char resched_name[NR_CPUS][15];
-static char callfunc_name[NR_CPUS][15];
-
-u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-
-void *xquad_portio;
-
-cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
-cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
-EXPORT_SYMBOL(cpu_core_map);
-
-#if defined(__i386__)
-u8 x86_cpu_to_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = 0xff };
-EXPORT_SYMBOL(x86_cpu_to_apicid);
-#elif !defined(CONFIG_X86_IO_APIC)
-unsigned int maxcpus = NR_CPUS;
-#endif
-
-void __init prefill_possible_map(void)
-{
-       int i, rc;
-
-       for_each_possible_cpu(i)
-           if (i != smp_processor_id())
-               return;
-
-       for (i = 0; i < NR_CPUS; i++) {
-               rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
-               if (rc >= 0)
-                       cpu_set(i, cpu_possible_map);
-       }
-}
-
-void __init smp_alloc_memory(void)
-{
-}
-
-static inline void
-set_cpu_sibling_map(int cpu)
-{
-       phys_proc_id[cpu] = cpu;
-       cpu_core_id[cpu]  = 0;
-
-       cpu_sibling_map[cpu] = cpumask_of_cpu(cpu);
-       cpu_core_map[cpu]    = cpumask_of_cpu(cpu);
-
-       cpu_data[cpu].booted_cores = 1;
-}
-
-static void
-remove_siblinginfo(int cpu)
-{
-       phys_proc_id[cpu] = BAD_APICID;
-       cpu_core_id[cpu]  = BAD_APICID;
-
-       cpus_clear(cpu_sibling_map[cpu]);
-       cpus_clear(cpu_core_map[cpu]);
-
-       cpu_data[cpu].booted_cores = 0;
-}
-
-static int xen_smp_intr_init(unsigned int cpu)
-{
-       int rc;
-
-       per_cpu(resched_irq, cpu) = per_cpu(callfunc_irq, cpu) = -1;
-
-       sprintf(resched_name[cpu], "resched%d", cpu);
-       rc = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR,
-                                   cpu,
-                                   smp_reschedule_interrupt,
-                                   SA_INTERRUPT,
-                                   resched_name[cpu],
-                                   NULL);
-       if (rc < 0)
-               goto fail;
-       per_cpu(resched_irq, cpu) = rc;
-
-       sprintf(callfunc_name[cpu], "callfunc%d", cpu);
-       rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR,
-                                   cpu,
-                                   smp_call_function_interrupt,
-                                   SA_INTERRUPT,
-                                   callfunc_name[cpu],
-                                   NULL);
-       if (rc < 0)
-               goto fail;
-       per_cpu(callfunc_irq, cpu) = rc;
-
-       if ((cpu != 0) && ((rc = local_setup_timer(cpu)) != 0))
-               goto fail;
-
-       return 0;
-
- fail:
-       if (per_cpu(resched_irq, cpu) >= 0)
-               unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
-       if (per_cpu(callfunc_irq, cpu) >= 0)
-               unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
-       return rc;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-static void xen_smp_intr_exit(unsigned int cpu)
-{
-       if (cpu != 0)
-               local_teardown_timer(cpu);
-
-       unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
-       unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
-}
-#endif
-
-void cpu_bringup(void)
-{
-       cpu_init();
-       touch_softlockup_watchdog();
-       preempt_disable();
-       local_irq_enable();
-}
-
-static void cpu_bringup_and_idle(void)
-{
-       cpu_bringup();
-       cpu_idle();
-}
-
-static void cpu_initialize_context(unsigned int cpu)
-{
-       vcpu_guest_context_t ctxt;
-       struct task_struct *idle = idle_task(cpu);
-#ifdef __x86_64__
-       struct desc_ptr *gdt_descr = &cpu_gdt_descr[cpu];
-#else
-       struct Xgt_desc_struct *gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-#endif
-
-       if (cpu_test_and_set(cpu, cpu_initialized_map))
-               return;
-
-       memset(&ctxt, 0, sizeof(ctxt));
-
-       ctxt.flags = VGCF_IN_KERNEL;
-       ctxt.user_regs.ds = __USER_DS;
-       ctxt.user_regs.es = __USER_DS;
-       ctxt.user_regs.fs = 0;
-       ctxt.user_regs.gs = 0;
-       ctxt.user_regs.ss = __KERNEL_DS;
-       ctxt.user_regs.eip = (unsigned long)cpu_bringup_and_idle;
-       ctxt.user_regs.eflags = X86_EFLAGS_IF | 0x1000; /* IOPL_RING1 */
-
-       memset(&ctxt.fpu_ctxt, 0, sizeof(ctxt.fpu_ctxt));
-
-       smp_trap_init(ctxt.trap_ctxt);
-
-       ctxt.ldt_ents = 0;
-
-       ctxt.gdt_frames[0] = virt_to_mfn(gdt_descr->address);
-       ctxt.gdt_ents      = gdt_descr->size / 8;
-
-#ifdef __i386__
-       ctxt.user_regs.cs = __KERNEL_CS;
-       ctxt.user_regs.esp = idle->thread.esp0 - sizeof(struct pt_regs);
-
-       ctxt.kernel_ss = __KERNEL_DS;
-       ctxt.kernel_sp = idle->thread.esp0;
-
-       ctxt.event_callback_cs     = __KERNEL_CS;
-       ctxt.event_callback_eip    = (unsigned long)hypervisor_callback;
-       ctxt.failsafe_callback_cs  = __KERNEL_CS;
-       ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
-
-       ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(swapper_pg_dir));
-#else /* __x86_64__ */
-       ctxt.user_regs.cs = __KERNEL_CS;
-       ctxt.user_regs.esp = idle->thread.rsp0 - sizeof(struct pt_regs);
-
-       ctxt.kernel_ss = __KERNEL_DS;
-       ctxt.kernel_sp = idle->thread.rsp0;
-
-       ctxt.event_callback_eip    = (unsigned long)hypervisor_callback;
-       ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
-       ctxt.syscall_callback_eip  = (unsigned long)system_call;
-
-       ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(init_level4_pgt));
-
-       ctxt.gs_base_kernel = (unsigned long)(cpu_pda(cpu));
-#endif
-
-       BUG_ON(HYPERVISOR_vcpu_op(VCPUOP_initialise, cpu, &ctxt));
-}
-
-void __init smp_prepare_cpus(unsigned int max_cpus)
-{
-       int cpu;
-       struct task_struct *idle;
-#ifdef __x86_64__
-       struct desc_ptr *gdt_descr;
-#else
-       struct Xgt_desc_struct *gdt_descr;
-#endif
-
-       boot_cpu_data.apicid = 0;
-       cpu_data[0] = boot_cpu_data;
-
-       cpu_2_logical_apicid[0] = 0;
-       x86_cpu_to_apicid[0] = 0;
-
-       current_thread_info()->cpu = 0;
-
-       for (cpu = 0; cpu < NR_CPUS; cpu++) {
-               cpus_clear(cpu_sibling_map[cpu]);
-               cpus_clear(cpu_core_map[cpu]);
-       }
-
-       set_cpu_sibling_map(0);
-
-       if (xen_smp_intr_init(0))
-               BUG();
-
-       cpu_initialized_map = cpumask_of_cpu(0);
-
-       /* Restrict the possible_map according to max_cpus. */
-       while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
-               for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--)
-                       continue;
-               cpu_clear(cpu, cpu_possible_map);
-       }
-
-       for_each_possible_cpu (cpu) {
-               if (cpu == 0)
-                       continue;
-
-#ifdef __x86_64__
-               gdt_descr = &cpu_gdt_descr[cpu];
-#else
-               gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-#endif
-               gdt_descr->address = get_zeroed_page(GFP_KERNEL);
-               if (unlikely(!gdt_descr->address)) {
-                       printk(KERN_CRIT "CPU%d failed to allocate GDT\n",
-                              cpu);
-                       continue;
-               }
-               gdt_descr->size = GDT_SIZE;
-               memcpy((void *)gdt_descr->address, cpu_gdt_table, GDT_SIZE);
-               make_page_readonly(
-                       (void *)gdt_descr->address,
-                       XENFEAT_writable_descriptor_tables);
-
-               cpu_data[cpu] = boot_cpu_data;
-               cpu_data[cpu].apicid = cpu;
-
-               cpu_2_logical_apicid[cpu] = cpu;
-               x86_cpu_to_apicid[cpu] = cpu;
-
-               idle = fork_idle(cpu);
-               if (IS_ERR(idle))
-                       panic("failed fork for CPU %d", cpu);
-
-#ifdef __x86_64__
-               cpu_pda(cpu)->pcurrent = idle;
-               cpu_pda(cpu)->cpunumber = cpu;
-               clear_ti_thread_flag(idle->thread_info, TIF_FORK);
-#endif
-
-               irq_ctx_init(cpu);
-
-#ifdef CONFIG_HOTPLUG_CPU
-               if (is_initial_xendomain())
-                       cpu_set(cpu, cpu_present_map);
-#else
-               cpu_set(cpu, cpu_present_map);
-#endif
-       }
-
-       init_xenbus_allowed_cpumask();
-
-#ifdef CONFIG_X86_IO_APIC
-       /*
-        * Here we can be sure that there is an IO-APIC in the system. Let's
-        * go and set it up:
-        */
-       if (!skip_ioapic_setup && nr_ioapics)
-               setup_IO_APIC();
-#endif
-}
-
-void __devinit smp_prepare_boot_cpu(void)
-{
-       prefill_possible_map();
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-
-/*
- * Initialize cpu_present_map late to skip SMP boot code in init/main.c.
- * But do it early enough to catch critical for_each_present_cpu() loops
- * in i386-specific code.
- */
-static int __init initialize_cpu_present_map(void)
-{
-       cpu_present_map = cpu_possible_map;
-       return 0;
-}
-core_initcall(initialize_cpu_present_map);
-
-int __cpu_disable(void)
-{
-       cpumask_t map = cpu_online_map;
-       int cpu = smp_processor_id();
-
-       if (cpu == 0)
-               return -EBUSY;
-
-       remove_siblinginfo(cpu);
-
-       cpu_clear(cpu, map);
-       fixup_irqs(map);
-       cpu_clear(cpu, cpu_online_map);
-
-       return 0;
-}
-
-void __cpu_die(unsigned int cpu)
-{
-       while (HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) {
-               current->state = TASK_UNINTERRUPTIBLE;
-               schedule_timeout(HZ/10);
-       }
-
-       xen_smp_intr_exit(cpu);
-
-       if (num_online_cpus() == 1)
-               alternatives_smp_switch(0);
-}
-
-#else /* !CONFIG_HOTPLUG_CPU */
-
-int __cpu_disable(void)
-{
-       return -ENOSYS;
-}
-
-void __cpu_die(unsigned int cpu)
-{
-       BUG();
-}
-
-#endif /* CONFIG_HOTPLUG_CPU */
-
-int __devinit __cpu_up(unsigned int cpu)
-{
-       int rc;
-
-       rc = cpu_up_check(cpu);
-       if (rc)
-               return rc;
-
-       cpu_initialize_context(cpu);
-
-       if (num_online_cpus() == 1)
-               alternatives_smp_switch(1);
-
-       /* This must be done before setting cpu_online_map */
-       set_cpu_sibling_map(cpu);
-       wmb();
-
-       rc = xen_smp_intr_init(cpu);
-       if (rc) {
-               remove_siblinginfo(cpu);
-               return rc;
-       }
-
-       cpu_set(cpu, cpu_online_map);
-
-       rc = HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL);
-       BUG_ON(rc);
-
-       return 0;
-}
-
-void __init smp_cpus_done(unsigned int max_cpus)
-{
-}
-
-#ifndef CONFIG_X86_LOCAL_APIC
-int setup_profiling_timer(unsigned int multiplier)
-{
-       return -EINVAL;
-}
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/xen_proc.c b/linux-2.6-xen-sparse/drivers/xen/core/xen_proc.c
deleted file mode 100644 (file)
index 7424273..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-
-#include <linux/module.h>
-#include <linux/proc_fs.h>
-#include <xen/xen_proc.h>
-
-static struct proc_dir_entry *xen_base;
-
-struct proc_dir_entry *create_xen_proc_entry(const char *name, mode_t mode)
-{
-       if ( xen_base == NULL )
-               if ( (xen_base = proc_mkdir("xen", &proc_root)) == NULL )
-                       panic("Couldn't create /proc/xen");
-       return create_proc_entry(name, mode, xen_base);
-}
-
-EXPORT_SYMBOL_GPL(create_xen_proc_entry); 
-
-void remove_xen_proc_entry(const char *name)
-{
-       remove_proc_entry(name, xen_base);
-}
-
-EXPORT_SYMBOL_GPL(remove_xen_proc_entry); 
diff --git a/linux-2.6-xen-sparse/drivers/xen/core/xen_sysfs.c b/linux-2.6-xen-sparse/drivers/xen/core/xen_sysfs.c
deleted file mode 100644 (file)
index fd8bfdb..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- *  copyright (c) 2006 IBM Corporation
- *  Authored by: Mike D. Day <ncmike@us.ibm.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 as
- *  published by the Free Software Foundation.
- */
-
-#include <linux/err.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <asm/hypervisor.h>
-#include <xen/features.h>
-#include <xen/hypervisor_sysfs.h>
-#include <xen/xenbus.h>
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mike D. Day <ncmike@us.ibm.com>");
-
-static ssize_t type_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       return sprintf(buffer, "xen\n");
-}
-
-HYPERVISOR_ATTR_RO(type);
-
-static int __init xen_sysfs_type_init(void)
-{
-       return sysfs_create_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
-}
-
-static void xen_sysfs_type_destroy(void)
-{
-       sysfs_remove_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
-}
-
-/* xen version attributes */
-static ssize_t major_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int version = HYPERVISOR_xen_version(XENVER_version, NULL);
-       if (version)
-               return sprintf(buffer, "%d\n", version >> 16);
-       return -ENODEV;
-}
-
-HYPERVISOR_ATTR_RO(major);
-
-static ssize_t minor_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int version = HYPERVISOR_xen_version(XENVER_version, NULL);
-       if (version)
-               return sprintf(buffer, "%d\n", version & 0xff);
-       return -ENODEV;
-}
-
-HYPERVISOR_ATTR_RO(minor);
-
-static ssize_t extra_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       char *extra;
-
-       extra = kmalloc(XEN_EXTRAVERSION_LEN, GFP_KERNEL);
-       if (extra) {
-               ret = HYPERVISOR_xen_version(XENVER_extraversion, extra);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", extra);
-               kfree(extra);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(extra);
-
-static struct attribute *version_attrs[] = {
-       &major_attr.attr,
-       &minor_attr.attr,
-       &extra_attr.attr,
-       NULL
-};
-
-static struct attribute_group version_group = {
-       .name = "version",
-       .attrs = version_attrs,
-};
-
-static int __init xen_sysfs_version_init(void)
-{
-       return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-                                 &version_group);
-}
-
-static void xen_sysfs_version_destroy(void)
-{
-       sysfs_remove_group(&hypervisor_subsys.kset.kobj, &version_group);
-}
-
-/* UUID */
-
-static ssize_t uuid_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       char *vm, *val;
-       int ret;
-
-       vm = xenbus_read(XBT_NIL, "vm", "", NULL);
-       if (IS_ERR(vm))
-               return PTR_ERR(vm);
-       val = xenbus_read(XBT_NIL, vm, "uuid", NULL);
-       kfree(vm);
-       if (IS_ERR(val))
-               return PTR_ERR(val);
-       ret = sprintf(buffer, "%s\n", val);
-       kfree(val);
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(uuid);
-
-static int __init xen_sysfs_uuid_init(void)
-{
-       return sysfs_create_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
-}
-
-static void xen_sysfs_uuid_destroy(void)
-{
-       sysfs_remove_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
-}
-
-/* xen compilation attributes */
-
-static ssize_t compiler_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       struct xen_compile_info *info;
-
-       info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-       if (info) {
-               ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", info->compiler);
-               kfree(info);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(compiler);
-
-static ssize_t compiled_by_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       struct xen_compile_info *info;
-
-       info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-       if (info) {
-               ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", info->compile_by);
-               kfree(info);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(compiled_by);
-
-static ssize_t compile_date_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       struct xen_compile_info *info;
-
-       info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-       if (info) {
-               ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", info->compile_date);
-               kfree(info);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(compile_date);
-
-static struct attribute *xen_compile_attrs[] = {
-       &compiler_attr.attr,
-       &compiled_by_attr.attr,
-       &compile_date_attr.attr,
-       NULL
-};
-
-static struct attribute_group xen_compilation_group = {
-       .name = "compilation",
-       .attrs = xen_compile_attrs,
-};
-
-int __init static xen_compilation_init(void)
-{
-       return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-                                 &xen_compilation_group);
-}
-
-static void xen_compilation_destroy(void)
-{
-       sysfs_remove_group(&hypervisor_subsys.kset.kobj,
-                          &xen_compilation_group);
-}
-
-/* xen properties info */
-
-static ssize_t capabilities_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       char *caps;
-
-       caps = kmalloc(XEN_CAPABILITIES_INFO_LEN, GFP_KERNEL);
-       if (caps) {
-               ret = HYPERVISOR_xen_version(XENVER_capabilities, caps);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", caps);
-               kfree(caps);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(capabilities);
-
-static ssize_t changeset_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       char *cset;
-
-       cset = kmalloc(XEN_CHANGESET_INFO_LEN, GFP_KERNEL);
-       if (cset) {
-               ret = HYPERVISOR_xen_version(XENVER_changeset, cset);
-               if (!ret)
-                       ret = sprintf(buffer, "%s\n", cset);
-               kfree(cset);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(changeset);
-
-static ssize_t virtual_start_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret = -ENOMEM;
-       struct xen_platform_parameters *parms;
-
-       parms = kmalloc(sizeof(struct xen_platform_parameters), GFP_KERNEL);
-       if (parms) {
-               ret = HYPERVISOR_xen_version(XENVER_platform_parameters,
-                                            parms);
-               if (!ret)
-                       ret = sprintf(buffer, "%lx\n", parms->virt_start);
-               kfree(parms);
-       }
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(virtual_start);
-
-static ssize_t pagesize_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       int ret;
-
-       ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL);
-       if (ret > 0)
-               ret = sprintf(buffer, "%x\n", ret);
-
-       return ret;
-}
-
-HYPERVISOR_ATTR_RO(pagesize);
-
-/* eventually there will be several more features to export */
-static ssize_t xen_feature_show(int index, char *buffer)
-{
-       int ret = -ENOMEM;
-       struct xen_feature_info *info;
-
-       info = kmalloc(sizeof(struct xen_feature_info), GFP_KERNEL);
-       if (info) {
-               info->submap_idx = index;
-               ret = HYPERVISOR_xen_version(XENVER_get_features, info);
-               if (!ret)
-                       ret = sprintf(buffer, "%d\n", info->submap);
-               kfree(info);
-       }
-
-       return ret;
-}
-
-static ssize_t writable_pt_show(struct hyp_sysfs_attr *attr, char *buffer)
-{
-       return xen_feature_show(XENFEAT_writable_page_tables, buffer);
-}
-
-HYPERVISOR_ATTR_RO(writable_pt);
-
-static struct attribute *xen_properties_attrs[] = {
-       &capabilities_attr.attr,
-       &changeset_attr.attr,
-       &virtual_start_attr.attr,
-       &pagesize_attr.attr,
-       &writable_pt_attr.attr,
-       NULL
-};
-
-static struct attribute_group xen_properties_group = {
-       .name = "properties",
-       .attrs = xen_properties_attrs,
-};
-
-static int __init xen_properties_init(void)
-{
-       return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-                                 &xen_properties_group);
-}
-
-static void xen_properties_destroy(void)
-{
-       sysfs_remove_group(&hypervisor_subsys.kset.kobj,
-                          &xen_properties_group);
-}
-
-static int __init hyper_sysfs_init(void)
-{
-       int ret;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       ret = xen_sysfs_type_init();
-       if (ret)
-               goto out;
-       ret = xen_sysfs_version_init();
-       if (ret)
-               goto version_out;
-       ret = xen_compilation_init();
-       if (ret)
-               goto comp_out;
-       ret = xen_sysfs_uuid_init();
-       if (ret)
-               goto uuid_out;
-       ret = xen_properties_init();
-       if (!ret)
-               goto out;
-
-       xen_sysfs_uuid_destroy();
-uuid_out:
-       xen_compilation_destroy();
-comp_out:
-       xen_sysfs_version_destroy();
-version_out:
-       xen_sysfs_type_destroy();
-out:
-       return ret;
-}
-
-static void hyper_sysfs_exit(void)
-{
-       xen_properties_destroy();
-       xen_compilation_destroy();
-       xen_sysfs_uuid_destroy();
-       xen_sysfs_version_destroy();
-       xen_sysfs_type_destroy();
-
-}
-
-module_init(hyper_sysfs_init);
-module_exit(hyper_sysfs_exit);
diff --git a/linux-2.6-xen-sparse/drivers/xen/evtchn/Makefile b/linux-2.6-xen-sparse/drivers/xen/evtchn/Makefile
deleted file mode 100644 (file)
index 7b082a0..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-obj-y  := evtchn.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/evtchn/evtchn.c b/linux-2.6-xen-sparse/drivers/xen/evtchn/evtchn.c
deleted file mode 100644 (file)
index 90f618d..0000000
+++ /dev/null
@@ -1,469 +0,0 @@
-/******************************************************************************
- * evtchn.c
- * 
- * Driver for receiving and demuxing event-channel signals.
- * 
- * Copyright (c) 2004-2005, K A Fraser
- * Multi-process extensions Copyright (c) 2004, Steven Smith
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/errno.h>
-#include <linux/miscdevice.h>
-#include <linux/major.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/poll.h>
-#include <linux/irq.h>
-#include <linux/init.h>
-#include <linux/gfp.h>
-#include <linux/mutex.h>
-#include <xen/evtchn.h>
-#include <xen/public/evtchn.h>
-
-struct per_user_data {
-       /* Notification ring, accessed via /dev/xen/evtchn. */
-#define EVTCHN_RING_SIZE     (PAGE_SIZE / sizeof(evtchn_port_t))
-#define EVTCHN_RING_MASK(_i) ((_i)&(EVTCHN_RING_SIZE-1))
-       evtchn_port_t *ring;
-       unsigned int ring_cons, ring_prod, ring_overflow;
-       struct mutex ring_cons_mutex; /* protect against concurrent readers */
-
-       /* Processes wait on this queue when ring is empty. */
-       wait_queue_head_t evtchn_wait;
-       struct fasync_struct *evtchn_async_queue;
-};
-
-/* Who's bound to each port? */
-static struct per_user_data *port_user[NR_EVENT_CHANNELS];
-static spinlock_t port_user_lock;
-
-void evtchn_device_upcall(int port)
-{
-       struct per_user_data *u;
-
-       spin_lock(&port_user_lock);
-
-       mask_evtchn(port);
-       clear_evtchn(port);
-
-       if ((u = port_user[port]) != NULL) {
-               if ((u->ring_prod - u->ring_cons) < EVTCHN_RING_SIZE) {
-                       u->ring[EVTCHN_RING_MASK(u->ring_prod)] = port;
-                       if (u->ring_cons == u->ring_prod++) {
-                               wake_up_interruptible(&u->evtchn_wait);
-                               kill_fasync(&u->evtchn_async_queue,
-                                           SIGIO, POLL_IN);
-                       }
-               } else {
-                       u->ring_overflow = 1;
-               }
-       }
-
-       spin_unlock(&port_user_lock);
-}
-
-static ssize_t evtchn_read(struct file *file, char __user *buf,
-                          size_t count, loff_t *ppos)
-{
-       int rc;
-       unsigned int c, p, bytes1 = 0, bytes2 = 0;
-       struct per_user_data *u = file->private_data;
-
-       /* Whole number of ports. */
-       count &= ~(sizeof(evtchn_port_t)-1);
-
-       if (count == 0)
-               return 0;
-
-       if (count > PAGE_SIZE)
-               count = PAGE_SIZE;
-
-       for (;;) {
-               mutex_lock(&u->ring_cons_mutex);
-
-               rc = -EFBIG;
-               if (u->ring_overflow)
-                       goto unlock_out;
-
-               if ((c = u->ring_cons) != (p = u->ring_prod))
-                       break;
-
-               mutex_unlock(&u->ring_cons_mutex);
-
-               if (file->f_flags & O_NONBLOCK)
-                       return -EAGAIN;
-
-               rc = wait_event_interruptible(
-                       u->evtchn_wait, u->ring_cons != u->ring_prod);
-               if (rc)
-                       return rc;
-       }
-
-       /* Byte lengths of two chunks. Chunk split (if any) is at ring wrap. */
-       if (((c ^ p) & EVTCHN_RING_SIZE) != 0) {
-               bytes1 = (EVTCHN_RING_SIZE - EVTCHN_RING_MASK(c)) *
-                       sizeof(evtchn_port_t);
-               bytes2 = EVTCHN_RING_MASK(p) * sizeof(evtchn_port_t);
-       } else {
-               bytes1 = (p - c) * sizeof(evtchn_port_t);
-               bytes2 = 0;
-       }
-
-       /* Truncate chunks according to caller's maximum byte count. */
-       if (bytes1 > count) {
-               bytes1 = count;
-               bytes2 = 0;
-       } else if ((bytes1 + bytes2) > count) {
-               bytes2 = count - bytes1;
-       }
-
-       rc = -EFAULT;
-       if (copy_to_user(buf, &u->ring[EVTCHN_RING_MASK(c)], bytes1) ||
-           ((bytes2 != 0) &&
-            copy_to_user(&buf[bytes1], &u->ring[0], bytes2)))
-               goto unlock_out;
-
-       u->ring_cons += (bytes1 + bytes2) / sizeof(evtchn_port_t);
-       rc = bytes1 + bytes2;
-
- unlock_out:
-       mutex_unlock(&u->ring_cons_mutex);
-       return rc;
-}
-
-static ssize_t evtchn_write(struct file *file, const char __user *buf,
-                           size_t count, loff_t *ppos)
-{
-       int rc, i;
-       evtchn_port_t *kbuf = (evtchn_port_t *)__get_free_page(GFP_KERNEL);
-       struct per_user_data *u = file->private_data;
-
-       if (kbuf == NULL)
-               return -ENOMEM;
-
-       /* Whole number of ports. */
-       count &= ~(sizeof(evtchn_port_t)-1);
-
-       rc = 0;
-       if (count == 0)
-               goto out;
-
-       if (count > PAGE_SIZE)
-               count = PAGE_SIZE;
-
-       rc = -EFAULT;
-       if (copy_from_user(kbuf, buf, count) != 0)
-               goto out;
-
-       spin_lock_irq(&port_user_lock);
-       for (i = 0; i < (count/sizeof(evtchn_port_t)); i++)
-               if ((kbuf[i] < NR_EVENT_CHANNELS) && (port_user[kbuf[i]] == u))
-                       unmask_evtchn(kbuf[i]);
-       spin_unlock_irq(&port_user_lock);
-
-       rc = count;
-
- out:
-       free_page((unsigned long)kbuf);
-       return rc;
-}
-
-static void evtchn_bind_to_user(struct per_user_data *u, int port)
-{
-       spin_lock_irq(&port_user_lock);
-       BUG_ON(port_user[port] != NULL);
-       port_user[port] = u;
-       unmask_evtchn(port);
-       spin_unlock_irq(&port_user_lock);
-}
-
-static int evtchn_ioctl(struct inode *inode, struct file *file,
-                       unsigned int cmd, unsigned long arg)
-{
-       int rc;
-       struct per_user_data *u = file->private_data;
-       void __user *uarg = (void __user *) arg;
-
-       switch (cmd) {
-       case IOCTL_EVTCHN_BIND_VIRQ: {
-               struct ioctl_evtchn_bind_virq bind;
-               struct evtchn_bind_virq bind_virq;
-
-               rc = -EFAULT;
-               if (copy_from_user(&bind, uarg, sizeof(bind)))
-                       break;
-
-               bind_virq.virq = bind.virq;
-               bind_virq.vcpu = 0;
-               rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-                                                &bind_virq);
-               if (rc != 0)
-                       break;
-
-               rc = bind_virq.port;
-               evtchn_bind_to_user(u, rc);
-               break;
-       }
-
-       case IOCTL_EVTCHN_BIND_INTERDOMAIN: {
-               struct ioctl_evtchn_bind_interdomain bind;
-               struct evtchn_bind_interdomain bind_interdomain;
-
-               rc = -EFAULT;
-               if (copy_from_user(&bind, uarg, sizeof(bind)))
-                       break;
-
-               bind_interdomain.remote_dom  = bind.remote_domain;
-               bind_interdomain.remote_port = bind.remote_port;
-               rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                                &bind_interdomain);
-               if (rc != 0)
-                       break;
-
-               rc = bind_interdomain.local_port;
-               evtchn_bind_to_user(u, rc);
-               break;
-       }
-
-       case IOCTL_EVTCHN_BIND_UNBOUND_PORT: {
-               struct ioctl_evtchn_bind_unbound_port bind;
-               struct evtchn_alloc_unbound alloc_unbound;
-
-               rc = -EFAULT;
-               if (copy_from_user(&bind, uarg, sizeof(bind)))
-                       break;
-
-               alloc_unbound.dom        = DOMID_SELF;
-               alloc_unbound.remote_dom = bind.remote_domain;
-               rc = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-                                                &alloc_unbound);
-               if (rc != 0)
-                       break;
-
-               rc = alloc_unbound.port;
-               evtchn_bind_to_user(u, rc);
-               break;
-       }
-
-       case IOCTL_EVTCHN_UNBIND: {
-               struct ioctl_evtchn_unbind unbind;
-               struct evtchn_close close;
-               int ret;
-
-               rc = -EFAULT;
-               if (copy_from_user(&unbind, uarg, sizeof(unbind)))
-                       break;
-
-               rc = -EINVAL;
-               if (unbind.port >= NR_EVENT_CHANNELS)
-                       break;
-
-               spin_lock_irq(&port_user_lock);
-    
-               rc = -ENOTCONN;
-               if (port_user[unbind.port] != u) {
-                       spin_unlock_irq(&port_user_lock);
-                       break;
-               }
-
-               port_user[unbind.port] = NULL;
-               mask_evtchn(unbind.port);
-
-               spin_unlock_irq(&port_user_lock);
-
-               close.port = unbind.port;
-               ret = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
-               BUG_ON(ret);
-
-               rc = 0;
-               break;
-       }
-
-       case IOCTL_EVTCHN_NOTIFY: {
-               struct ioctl_evtchn_notify notify;
-
-               rc = -EFAULT;
-               if (copy_from_user(&notify, uarg, sizeof(notify)))
-                       break;
-
-               if (notify.port >= NR_EVENT_CHANNELS) {
-                       rc = -EINVAL;
-               } else if (port_user[notify.port] != u) {
-                       rc = -ENOTCONN;
-               } else {
-                       notify_remote_via_evtchn(notify.port);
-                       rc = 0;
-               }
-               break;
-       }
-
-       case IOCTL_EVTCHN_RESET: {
-               /* Initialise the ring to empty. Clear errors. */
-               mutex_lock(&u->ring_cons_mutex);
-               spin_lock_irq(&port_user_lock);
-               u->ring_cons = u->ring_prod = u->ring_overflow = 0;
-               spin_unlock_irq(&port_user_lock);
-               mutex_unlock(&u->ring_cons_mutex);
-               rc = 0;
-               break;
-       }
-
-       default:
-               rc = -ENOSYS;
-               break;
-       }
-
-       return rc;
-}
-
-static unsigned int evtchn_poll(struct file *file, poll_table *wait)
-{
-       unsigned int mask = POLLOUT | POLLWRNORM;
-       struct per_user_data *u = file->private_data;
-
-       poll_wait(file, &u->evtchn_wait, wait);
-       if (u->ring_cons != u->ring_prod)
-               mask |= POLLIN | POLLRDNORM;
-       if (u->ring_overflow)
-               mask = POLLERR;
-       return mask;
-}
-
-static int evtchn_fasync(int fd, struct file *filp, int on)
-{
-       struct per_user_data *u = filp->private_data;
-       return fasync_helper(fd, filp, on, &u->evtchn_async_queue);
-}
-
-static int evtchn_open(struct inode *inode, struct file *filp)
-{
-       struct per_user_data *u;
-
-       if ((u = kmalloc(sizeof(*u), GFP_KERNEL)) == NULL)
-               return -ENOMEM;
-
-       memset(u, 0, sizeof(*u));
-       init_waitqueue_head(&u->evtchn_wait);
-
-       u->ring = (evtchn_port_t *)__get_free_page(GFP_KERNEL);
-       if (u->ring == NULL) {
-               kfree(u);
-               return -ENOMEM;
-       }
-
-       mutex_init(&u->ring_cons_mutex);
-
-       filp->private_data = u;
-
-       return 0;
-}
-
-static int evtchn_release(struct inode *inode, struct file *filp)
-{
-       int i;
-       struct per_user_data *u = filp->private_data;
-       struct evtchn_close close;
-
-       spin_lock_irq(&port_user_lock);
-
-       free_page((unsigned long)u->ring);
-
-       for (i = 0; i < NR_EVENT_CHANNELS; i++) {
-               int ret;
-               if (port_user[i] != u)
-                       continue;
-
-               port_user[i] = NULL;
-               mask_evtchn(i);
-
-               close.port = i;
-               ret = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
-               BUG_ON(ret);
-       }
-
-       spin_unlock_irq(&port_user_lock);
-
-       kfree(u);
-
-       return 0;
-}
-
-static const struct file_operations evtchn_fops = {
-       .owner   = THIS_MODULE,
-       .read    = evtchn_read,
-       .write   = evtchn_write,
-       .ioctl   = evtchn_ioctl,
-       .poll    = evtchn_poll,
-       .fasync  = evtchn_fasync,
-       .open    = evtchn_open,
-       .release = evtchn_release,
-};
-
-static struct miscdevice evtchn_miscdev = {
-       .minor        = MISC_DYNAMIC_MINOR,
-       .name         = "evtchn",
-       .fops         = &evtchn_fops,
-};
-
-static int __init evtchn_init(void)
-{
-       int err;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       spin_lock_init(&port_user_lock);
-       memset(port_user, 0, sizeof(port_user));
-
-       /* Create '/dev/misc/evtchn'. */
-       err = misc_register(&evtchn_miscdev);
-       if (err != 0) {
-               printk(KERN_ALERT "Could not register /dev/misc/evtchn\n");
-               return err;
-       }
-
-       printk("Event-channel device installed.\n");
-
-       return 0;
-}
-
-static void evtchn_cleanup(void)
-{
-       misc_deregister(&evtchn_miscdev);
-}
-
-module_init(evtchn_init);
-module_exit(evtchn_cleanup);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/fbfront/Makefile b/linux-2.6-xen-sparse/drivers/xen/fbfront/Makefile
deleted file mode 100644 (file)
index e2b8909..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-obj-$(CONFIG_XEN_FRAMEBUFFER)  := xenfb.o
-obj-$(CONFIG_XEN_KEYBOARD)     += xenkbd.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c
deleted file mode 100644 (file)
index 712c928..0000000
+++ /dev/null
@@ -1,752 +0,0 @@
-/*
- * linux/drivers/video/xenfb.c -- Xen para-virtual frame buffer device
- *
- * Copyright (C) 2005-2006 Anthony Liguori <aliguori@us.ibm.com>
- * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
- *
- *  Based on linux/drivers/video/q40fb.c
- *
- *  This file is subject to the terms and conditions of the GNU General Public
- *  License. See the file COPYING in the main directory of this archive for
- *  more details.
- */
-
-/*
- * TODO:
- *
- * Switch to grant tables when they become capable of dealing with the
- * frame buffer.
- */
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/fb.h>
-#include <linux/module.h>
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-#include <linux/mutex.h>
-#include <asm/hypervisor.h>
-#include <xen/evtchn.h>
-#include <xen/interface/io/fbif.h>
-#include <xen/interface/io/protocols.h>
-#include <xen/xenbus.h>
-#include <linux/kthread.h>
-
-struct xenfb_mapping
-{
-       struct list_head        link;
-       struct vm_area_struct   *vma;
-       atomic_t                map_refs;
-       int                     faults;
-       struct xenfb_info       *info;
-};
-
-struct xenfb_info
-{
-       struct task_struct      *kthread;
-       wait_queue_head_t       wq;
-
-       unsigned char           *fb;
-       struct fb_info          *fb_info;
-       struct timer_list       refresh;
-       int                     dirty;
-       int                     x1, y1, x2, y2; /* dirty rectangle,
-                                                  protected by dirty_lock */
-       spinlock_t              dirty_lock;
-       struct mutex            mm_lock;
-       int                     nr_pages;
-       struct page             **pages;
-       struct list_head        mappings; /* protected by mm_lock */
-
-       int                     irq;
-       struct xenfb_page       *page;
-       unsigned long           *mfns;
-       int                     update_wanted; /* XENFB_TYPE_UPDATE wanted */
-
-       struct xenbus_device    *xbdev;
-};
-
-/*
- * How the locks work together
- *
- * There are two locks: spinlock dirty_lock protecting the dirty
- * rectangle, and mutex mm_lock protecting mappings.
- *
- * The problem is that dirty rectangle and mappings aren't
- * independent: the dirty rectangle must cover all faulted pages in
- * mappings.  We need to prove that our locking maintains this
- * invariant.
- *
- * There are several kinds of critical regions:
- *
- * 1. Holding only dirty_lock: xenfb_refresh().  May run in
- *    interrupts.  Extends the dirty rectangle.  Trivially preserves
- *    invariant.
- *
- * 2. Holding only mm_lock: xenfb_mmap() and xenfb_vm_close().  Touch
- *    only mappings.  The former creates unfaulted pages.  Preserves
- *    invariant.  The latter removes pages.  Preserves invariant.
- *
- * 3. Holding both locks: xenfb_vm_nopage().  Extends the dirty
- *    rectangle and updates mappings consistently.  Preserves
- *    invariant.
- *
- * 4. The ugliest one: xenfb_update_screen().  Clear the dirty
- *    rectangle and update mappings consistently.
- *
- *    We can't simply hold both locks, because zap_page_range() cannot
- *    be called with a spinlock held.
- *
- *    Therefore, we first clear the dirty rectangle with both locks
- *    held.  Then we unlock dirty_lock and update the mappings.
- *    Critical regions that hold only dirty_lock may interfere with
- *    that.  This can only be region 1: xenfb_refresh().  But that
- *    just extends the dirty rectangle, which can't harm the
- *    invariant.
- *
- * But FIXME: the invariant is too weak.  It misses that the fault
- * record in mappings must be consistent with the mapping of pages in
- * the associated address space!  do_no_page() updates the PTE after
- * xenfb_vm_nopage() returns, i.e. outside the critical region.  This
- * allows the following race:
- *
- * X writes to some address in the Xen frame buffer
- * Fault - call do_no_page()
- *     call xenfb_vm_nopage()
- *         grab mm_lock
- *         map->faults++;
- *         release mm_lock
- *     return back to do_no_page()
- * (preempted, or SMP)
- * Xen worker thread runs.
- *      grab mm_lock
- *      look at mappings
- *          find this mapping, zaps its pages (but page not in pte yet)
- *          clear map->faults
- *      releases mm_lock
- * (back to X process)
- *     put page in X's pte
- *
- * Oh well, we wont be updating the writes to this page anytime soon.
- */
-
-static int xenfb_fps = 20;
-static unsigned long xenfb_mem_len = XENFB_WIDTH * XENFB_HEIGHT * XENFB_DEPTH / 8;
-
-static int xenfb_remove(struct xenbus_device *);
-static void xenfb_init_shared_page(struct xenfb_info *);
-static int xenfb_connect_backend(struct xenbus_device *, struct xenfb_info *);
-static void xenfb_disconnect_backend(struct xenfb_info *);
-
-static void xenfb_do_update(struct xenfb_info *info,
-                           int x, int y, int w, int h)
-{
-       union xenfb_out_event event;
-       __u32 prod;
-
-       event.type = XENFB_TYPE_UPDATE;
-       event.update.x = x;
-       event.update.y = y;
-       event.update.width = w;
-       event.update.height = h;
-
-       prod = info->page->out_prod;
-       /* caller ensures !xenfb_queue_full() */
-       mb();                   /* ensure ring space available */
-       XENFB_OUT_RING_REF(info->page, prod) = event;
-       wmb();                  /* ensure ring contents visible */
-       info->page->out_prod = prod + 1;
-
-       notify_remote_via_irq(info->irq);
-}
-
-static int xenfb_queue_full(struct xenfb_info *info)
-{
-       __u32 cons, prod;
-
-       prod = info->page->out_prod;
-       cons = info->page->out_cons;
-       return prod - cons == XENFB_OUT_RING_LEN;
-}
-
-static void xenfb_update_screen(struct xenfb_info *info)
-{
-       unsigned long flags;
-       int y1, y2, x1, x2;
-       struct xenfb_mapping *map;
-
-       if (!info->update_wanted)
-               return;
-       if (xenfb_queue_full(info))
-               return;
-
-       mutex_lock(&info->mm_lock);
-
-       spin_lock_irqsave(&info->dirty_lock, flags);
-       y1 = info->y1;
-       y2 = info->y2;
-       x1 = info->x1;
-       x2 = info->x2;
-       info->x1 = info->y1 = INT_MAX;
-       info->x2 = info->y2 = 0;
-       spin_unlock_irqrestore(&info->dirty_lock, flags);
-
-       list_for_each_entry(map, &info->mappings, link) {
-               if (!map->faults)
-                       continue;
-               zap_page_range(map->vma, map->vma->vm_start,
-                              map->vma->vm_end - map->vma->vm_start, NULL);
-               map->faults = 0;
-       }
-
-       mutex_unlock(&info->mm_lock);
-
-       xenfb_do_update(info, x1, y1, x2 - x1, y2 - y1);
-}
-
-static int xenfb_thread(void *data)
-{
-       struct xenfb_info *info = data;
-
-       while (!kthread_should_stop()) {
-               if (info->dirty) {
-                       info->dirty = 0;
-                       xenfb_update_screen(info);
-               }
-               wait_event_interruptible(info->wq,
-                       kthread_should_stop() || info->dirty);
-               try_to_freeze();
-       }
-       return 0;
-}
-
-static int xenfb_setcolreg(unsigned regno, unsigned red, unsigned green,
-                          unsigned blue, unsigned transp,
-                          struct fb_info *info)
-{
-       u32 v;
-
-       if (regno > info->cmap.len)
-               return 1;
-
-       red   >>= (16 - info->var.red.length);
-       green >>= (16 - info->var.green.length);
-       blue  >>= (16 - info->var.blue.length);
-
-       v = (red << info->var.red.offset) |
-           (green << info->var.green.offset) |
-           (blue << info->var.blue.offset);
-
-       /* FIXME is this sane?  check against xxxfb_setcolreg()!  */
-       switch (info->var.bits_per_pixel) {
-       case 16:
-       case 24:
-       case 32:
-               ((u32 *)info->pseudo_palette)[regno] = v;
-               break;
-       }
-       
-       return 0;
-}
-
-static void xenfb_timer(unsigned long data)
-{
-       struct xenfb_info *info = (struct xenfb_info *)data;
-       info->dirty = 1;
-       wake_up(&info->wq);
-}
-
-static void __xenfb_refresh(struct xenfb_info *info,
-                           int x1, int y1, int w, int h)
-{
-       int y2, x2;
-
-       y2 = y1 + h;
-       x2 = x1 + w;
-
-       if (info->y1 > y1)
-               info->y1 = y1;
-       if (info->y2 < y2)
-               info->y2 = y2;
-       if (info->x1 > x1)
-               info->x1 = x1;
-       if (info->x2 < x2)
-               info->x2 = x2;
-
-       if (timer_pending(&info->refresh))
-               return;
-
-       mod_timer(&info->refresh, jiffies + HZ/xenfb_fps);
-}
-
-static void xenfb_refresh(struct xenfb_info *info,
-                         int x1, int y1, int w, int h)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&info->dirty_lock, flags);
-       __xenfb_refresh(info, x1, y1, w, h);
-       spin_unlock_irqrestore(&info->dirty_lock, flags);
-}
-
-static void xenfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect)
-{
-       struct xenfb_info *info = p->par;
-
-       cfb_fillrect(p, rect);
-       xenfb_refresh(info, rect->dx, rect->dy, rect->width, rect->height);
-}
-
-static void xenfb_imageblit(struct fb_info *p, const struct fb_image *image)
-{
-       struct xenfb_info *info = p->par;
-
-       cfb_imageblit(p, image);
-       xenfb_refresh(info, image->dx, image->dy, image->width, image->height);
-}
-
-static void xenfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
-{
-       struct xenfb_info *info = p->par;
-
-       cfb_copyarea(p, area);
-       xenfb_refresh(info, area->dx, area->dy, area->width, area->height);
-}
-
-static void xenfb_vm_open(struct vm_area_struct *vma)
-{
-       struct xenfb_mapping *map = vma->vm_private_data;
-       atomic_inc(&map->map_refs);
-}
-
-static void xenfb_vm_close(struct vm_area_struct *vma)
-{
-       struct xenfb_mapping *map = vma->vm_private_data;
-       struct xenfb_info *info = map->info;
-
-       mutex_lock(&info->mm_lock);
-       if (atomic_dec_and_test(&map->map_refs)) {
-               list_del(&map->link);
-               kfree(map);
-       }
-       mutex_unlock(&info->mm_lock);
-}
-
-static struct page *xenfb_vm_nopage(struct vm_area_struct *vma,
-                                   unsigned long vaddr, int *type)
-{
-       struct xenfb_mapping *map = vma->vm_private_data;
-       struct xenfb_info *info = map->info;
-       int pgnr = (vaddr - vma->vm_start) >> PAGE_SHIFT;
-       unsigned long flags;
-       struct page *page;
-       int y1, y2;
-
-       if (pgnr >= info->nr_pages)
-               return NOPAGE_SIGBUS;
-
-       mutex_lock(&info->mm_lock);
-       spin_lock_irqsave(&info->dirty_lock, flags);
-       page = info->pages[pgnr];
-       get_page(page);
-       map->faults++;
-
-       y1 = pgnr * PAGE_SIZE / info->fb_info->fix.line_length;
-       y2 = (pgnr * PAGE_SIZE + PAGE_SIZE - 1) / info->fb_info->fix.line_length;
-       if (y2 > info->fb_info->var.yres)
-               y2 = info->fb_info->var.yres;
-       __xenfb_refresh(info, 0, y1, info->fb_info->var.xres, y2 - y1);
-       spin_unlock_irqrestore(&info->dirty_lock, flags);
-       mutex_unlock(&info->mm_lock);
-
-       if (type)
-               *type = VM_FAULT_MINOR;
-
-       return page;
-}
-
-static struct vm_operations_struct xenfb_vm_ops = {
-       .open   = xenfb_vm_open,
-       .close  = xenfb_vm_close,
-       .nopage = xenfb_vm_nopage,
-};
-
-static int xenfb_mmap(struct fb_info *fb_info, struct vm_area_struct *vma)
-{
-       struct xenfb_info *info = fb_info->par;
-       struct xenfb_mapping *map;
-       int map_pages;
-
-       if (!(vma->vm_flags & VM_WRITE))
-               return -EINVAL;
-       if (!(vma->vm_flags & VM_SHARED))
-               return -EINVAL;
-       if (vma->vm_pgoff != 0)
-               return -EINVAL;
-
-       map_pages = (vma->vm_end - vma->vm_start + PAGE_SIZE-1) >> PAGE_SHIFT;
-       if (map_pages > info->nr_pages)
-               return -EINVAL;
-
-       map = kzalloc(sizeof(*map), GFP_KERNEL);
-       if (map == NULL)
-               return -ENOMEM;
-
-       map->vma = vma;
-       map->faults = 0;
-       map->info = info;
-       atomic_set(&map->map_refs, 1);
-
-       mutex_lock(&info->mm_lock);
-       list_add(&map->link, &info->mappings);
-       mutex_unlock(&info->mm_lock);
-
-       vma->vm_ops = &xenfb_vm_ops;
-       vma->vm_flags |= (VM_DONTEXPAND | VM_RESERVED);
-       vma->vm_private_data = map;
-
-       return 0;
-}
-
-static struct fb_ops xenfb_fb_ops = {
-       .owner          = THIS_MODULE,
-       .fb_setcolreg   = xenfb_setcolreg,
-       .fb_fillrect    = xenfb_fillrect,
-       .fb_copyarea    = xenfb_copyarea,
-       .fb_imageblit   = xenfb_imageblit,
-       .fb_mmap        = xenfb_mmap,
-};
-
-static irqreturn_t xenfb_event_handler(int rq, void *dev_id,
-                                      struct pt_regs *regs)
-{
-       /*
-        * No in events recognized, simply ignore them all.
-        * If you need to recognize some, see xenbkd's input_handler()
-        * for how to do that.
-        */
-       struct xenfb_info *info = dev_id;
-       struct xenfb_page *page = info->page;
-
-       if (page->in_cons != page->in_prod) {
-               info->page->in_cons = info->page->in_prod;
-               notify_remote_via_irq(info->irq);
-       }
-       return IRQ_HANDLED;
-}
-
-static unsigned long vmalloc_to_mfn(void *address)
-{
-       return pfn_to_mfn(vmalloc_to_pfn(address));
-}
-
-static int __devinit xenfb_probe(struct xenbus_device *dev,
-                                const struct xenbus_device_id *id)
-{
-       struct xenfb_info *info;
-       struct fb_info *fb_info;
-       int ret;
-
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
-       if (info == NULL) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-               return -ENOMEM;
-       }
-       dev->dev.driver_data = info;
-       info->xbdev = dev;
-       info->irq = -1;
-       info->x1 = info->y1 = INT_MAX;
-       spin_lock_init(&info->dirty_lock);
-       mutex_init(&info->mm_lock);
-       init_waitqueue_head(&info->wq);
-       init_timer(&info->refresh);
-       info->refresh.function = xenfb_timer;
-       info->refresh.data = (unsigned long)info;
-       INIT_LIST_HEAD(&info->mappings);
-
-       info->fb = vmalloc(xenfb_mem_len);
-       if (info->fb == NULL)
-               goto error_nomem;
-       memset(info->fb, 0, xenfb_mem_len);
-
-       info->nr_pages = (xenfb_mem_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       info->pages = kmalloc(sizeof(struct page *) * info->nr_pages,
-                             GFP_KERNEL);
-       if (info->pages == NULL)
-               goto error_nomem;
-
-       info->mfns = vmalloc(sizeof(unsigned long) * info->nr_pages);
-       if (!info->mfns)
-               goto error_nomem;
-
-       /* set up shared page */
-       info->page = (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
-       if (!info->page)
-               goto error_nomem;
-
-       xenfb_init_shared_page(info);
-
-       fb_info = framebuffer_alloc(sizeof(u32) * 256, NULL);
-                               /* see fishy hackery below */
-       if (fb_info == NULL)
-               goto error_nomem;
-
-       /* FIXME fishy hackery */
-       fb_info->pseudo_palette = fb_info->par;
-       fb_info->par = info;
-       /* /FIXME */
-       fb_info->screen_base = info->fb;
-
-       fb_info->fbops = &xenfb_fb_ops;
-       fb_info->var.xres_virtual = fb_info->var.xres = info->page->width;
-       fb_info->var.yres_virtual = fb_info->var.yres = info->page->height;
-       fb_info->var.bits_per_pixel = info->page->depth;
-
-       fb_info->var.red = (struct fb_bitfield){16, 8, 0};
-       fb_info->var.green = (struct fb_bitfield){8, 8, 0};
-       fb_info->var.blue = (struct fb_bitfield){0, 8, 0};
-
-       fb_info->var.activate = FB_ACTIVATE_NOW;
-       fb_info->var.height = -1;
-       fb_info->var.width = -1;
-       fb_info->var.vmode = FB_VMODE_NONINTERLACED;
-
-       fb_info->fix.visual = FB_VISUAL_TRUECOLOR;
-       fb_info->fix.line_length = info->page->line_length;
-       fb_info->fix.smem_start = 0;
-       fb_info->fix.smem_len = xenfb_mem_len;
-       strcpy(fb_info->fix.id, "xen");
-       fb_info->fix.type = FB_TYPE_PACKED_PIXELS;
-       fb_info->fix.accel = FB_ACCEL_NONE;
-
-       fb_info->flags = FBINFO_FLAG_DEFAULT;
-
-       ret = fb_alloc_cmap(&fb_info->cmap, 256, 0);
-       if (ret < 0) {
-               framebuffer_release(fb_info);
-               xenbus_dev_fatal(dev, ret, "fb_alloc_cmap");
-               goto error;
-       }
-
-       ret = register_framebuffer(fb_info);
-       if (ret) {
-               fb_dealloc_cmap(&info->fb_info->cmap);
-               framebuffer_release(fb_info);
-               xenbus_dev_fatal(dev, ret, "register_framebuffer");
-               goto error;
-       }
-       info->fb_info = fb_info;
-
-       /* FIXME should this be delayed until backend XenbusStateConnected? */
-       info->kthread = kthread_run(xenfb_thread, info, "xenfb thread");
-       if (IS_ERR(info->kthread)) {
-               ret = PTR_ERR(info->kthread);
-               info->kthread = NULL;
-               xenbus_dev_fatal(dev, ret, "register_framebuffer");
-               goto error;
-       }
-
-       ret = xenfb_connect_backend(dev, info);
-       if (ret < 0)
-               goto error;
-
-       return 0;
-
- error_nomem:
-       ret = -ENOMEM;
-       xenbus_dev_fatal(dev, ret, "allocating device memory");
- error:
-       xenfb_remove(dev);
-       return ret;
-}
-
-static int xenfb_resume(struct xenbus_device *dev)
-{
-       struct xenfb_info *info = dev->dev.driver_data;
-
-       xenfb_disconnect_backend(info);
-       xenfb_init_shared_page(info);
-       return xenfb_connect_backend(dev, info);
-}
-
-static int xenfb_remove(struct xenbus_device *dev)
-{
-       struct xenfb_info *info = dev->dev.driver_data;
-
-       del_timer(&info->refresh);
-       if (info->kthread)
-               kthread_stop(info->kthread);
-       xenfb_disconnect_backend(info);
-       if (info->fb_info) {
-               unregister_framebuffer(info->fb_info);
-               fb_dealloc_cmap(&info->fb_info->cmap);
-               framebuffer_release(info->fb_info);
-       }
-       free_page((unsigned long)info->page);
-       vfree(info->mfns);
-       kfree(info->pages);
-       vfree(info->fb);
-       kfree(info);
-
-       return 0;
-}
-
-static void xenfb_init_shared_page(struct xenfb_info *info)
-{
-       int i;
-
-       for (i = 0; i < info->nr_pages; i++)
-               info->pages[i] = vmalloc_to_page(info->fb + i * PAGE_SIZE);
-
-       for (i = 0; i < info->nr_pages; i++)
-               info->mfns[i] = vmalloc_to_mfn(info->fb + i * PAGE_SIZE);
-
-       info->page->pd[0] = vmalloc_to_mfn(info->mfns);
-       info->page->pd[1] = 0;
-       info->page->width = XENFB_WIDTH;
-       info->page->height = XENFB_HEIGHT;
-       info->page->depth = XENFB_DEPTH;
-       info->page->line_length = (info->page->depth / 8) * info->page->width;
-       info->page->mem_length = xenfb_mem_len;
-       info->page->in_cons = info->page->in_prod = 0;
-       info->page->out_cons = info->page->out_prod = 0;
-}
-
-static int xenfb_connect_backend(struct xenbus_device *dev,
-                                struct xenfb_info *info)
-{
-       int ret;
-       struct xenbus_transaction xbt;
-
-       ret = bind_listening_port_to_irqhandler(
-               dev->otherend_id, xenfb_event_handler, 0, "xenfb", info);
-       if (ret < 0) {
-               xenbus_dev_fatal(dev, ret,
-                                "bind_listening_port_to_irqhandler");
-               return ret;
-       }
-       info->irq = ret;
-
- again:
-       ret = xenbus_transaction_start(&xbt);
-       if (ret) {
-               xenbus_dev_fatal(dev, ret, "starting transaction");
-               return ret;
-       }
-       ret = xenbus_printf(xbt, dev->nodename, "page-ref", "%lu",
-                           virt_to_mfn(info->page));
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           irq_to_evtchn_port(info->irq));
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_printf(xbt, dev->nodename, "protocol", "%s",
-                           XEN_IO_PROTO_ABI_NATIVE);
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_printf(xbt, dev->nodename, "feature-update", "1");
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_transaction_end(xbt, 0);
-       if (ret) {
-               if (ret == -EAGAIN)
-                       goto again;
-               xenbus_dev_fatal(dev, ret, "completing transaction");
-               return ret;
-       }
-
-       xenbus_switch_state(dev, XenbusStateInitialised);
-       return 0;
-
- error_xenbus:
-       xenbus_transaction_end(xbt, 1);
-       xenbus_dev_fatal(dev, ret, "writing xenstore");
-       return ret;
-}
-
-static void xenfb_disconnect_backend(struct xenfb_info *info)
-{
-       if (info->irq >= 0)
-               unbind_from_irqhandler(info->irq, info);
-       info->irq = -1;
-}
-
-static void xenfb_backend_changed(struct xenbus_device *dev,
-                                 enum xenbus_state backend_state)
-{
-       struct xenfb_info *info = dev->dev.driver_data;
-       int val;
-
-       switch (backend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitialised:
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               break;
-
-       case XenbusStateInitWait:
-       InitWait:
-               xenbus_switch_state(dev, XenbusStateConnected);
-               break;
-
-       case XenbusStateConnected:
-               /*
-                * Work around xenbus race condition: If backend goes
-                * through InitWait to Connected fast enough, we can
-                * get Connected twice here.
-                */
-               if (dev->state != XenbusStateConnected)
-                       goto InitWait; /* no InitWait seen yet, fudge it */
-
-               if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-                                "request-update", "%d", &val) < 0)
-                       val = 0;
-               if (val)
-                       info->update_wanted = 1;
-               break;
-
-       case XenbusStateClosing:
-               // FIXME is this safe in any dev->state?
-               xenbus_frontend_closed(dev);
-               break;
-       }
-}
-
-static struct xenbus_device_id xenfb_ids[] = {
-       { "vfb" },
-       { "" }
-};
-
-static struct xenbus_driver xenfb = {
-       .name = "vfb",
-       .owner = THIS_MODULE,
-       .ids = xenfb_ids,
-       .probe = xenfb_probe,
-       .remove = xenfb_remove,
-       .resume = xenfb_resume,
-       .otherend_changed = xenfb_backend_changed,
-};
-
-static int __init xenfb_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       /* Nothing to do if running in dom0. */
-       if (is_initial_xendomain())
-               return -ENODEV;
-
-       return xenbus_register_frontend(&xenfb);
-}
-
-static void __exit xenfb_cleanup(void)
-{
-       return xenbus_unregister_driver(&xenfb);
-}
-
-module_init(xenfb_init);
-module_exit(xenfb_cleanup);
-
-MODULE_LICENSE("GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c
deleted file mode 100644 (file)
index a34beaf..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * linux/drivers/input/keyboard/xenkbd.c -- Xen para-virtual input device
- *
- * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
- * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
- *
- *  Based on linux/drivers/input/mouse/sermouse.c
- *
- *  This file is subject to the terms and conditions of the GNU General Public
- *  License. See the file COPYING in the main directory of this archive for
- *  more details.
- */
-
-/*
- * TODO:
- *
- * Switch to grant tables together with xenfb.c.
- */
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/module.h>
-#include <linux/input.h>
-#include <asm/hypervisor.h>
-#include <xen/evtchn.h>
-#include <xen/interface/io/fbif.h>
-#include <xen/interface/io/kbdif.h>
-#include <xen/xenbus.h>
-
-struct xenkbd_info
-{
-       struct input_dev *kbd;
-       struct input_dev *ptr;
-       struct xenkbd_page *page;
-       int irq;
-       struct xenbus_device *xbdev;
-       char phys[32];
-};
-
-static int xenkbd_remove(struct xenbus_device *);
-static int xenkbd_connect_backend(struct xenbus_device *, struct xenkbd_info *);
-static void xenkbd_disconnect_backend(struct xenkbd_info *);
-
-/*
- * Note: if you need to send out events, see xenfb_do_update() for how
- * to do that.
- */
-
-static irqreturn_t input_handler(int rq, void *dev_id, struct pt_regs *regs)
-{
-       struct xenkbd_info *info = dev_id;
-       struct xenkbd_page *page = info->page;
-       __u32 cons, prod;
-
-       prod = page->in_prod;
-       if (prod == page->out_cons)
-               return IRQ_HANDLED;
-       rmb();                  /* ensure we see ring contents up to prod */
-       for (cons = page->in_cons; cons != prod; cons++) {
-               union xenkbd_in_event *event;
-               struct input_dev *dev;
-               event = &XENKBD_IN_RING_REF(page, cons);
-
-               dev = info->ptr;
-               switch (event->type) {
-               case XENKBD_TYPE_MOTION:
-                       input_report_rel(dev, REL_X, event->motion.rel_x);
-                       input_report_rel(dev, REL_Y, event->motion.rel_y);
-                       break;
-               case XENKBD_TYPE_KEY:
-                       dev = NULL;
-                       if (test_bit(event->key.keycode, info->kbd->keybit))
-                               dev = info->kbd;
-                       if (test_bit(event->key.keycode, info->ptr->keybit))
-                               dev = info->ptr;
-                       if (dev)
-                               input_report_key(dev, event->key.keycode,
-                                                event->key.pressed);
-                       else
-                               printk("xenkbd: unhandled keycode 0x%x\n",
-                                      event->key.keycode);
-                       break;
-               case XENKBD_TYPE_POS:
-                       input_report_abs(dev, ABS_X, event->pos.abs_x);
-                       input_report_abs(dev, ABS_Y, event->pos.abs_y);
-                       break;
-               }
-               if (dev)
-                       input_sync(dev);
-       }
-       mb();                   /* ensure we got ring contents */
-       page->in_cons = cons;
-       notify_remote_via_irq(info->irq);
-
-       return IRQ_HANDLED;
-}
-
-int __devinit xenkbd_probe(struct xenbus_device *dev,
-                          const struct xenbus_device_id *id)
-{
-       int ret, i;
-       struct xenkbd_info *info;
-       struct input_dev *kbd, *ptr;
-
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
-       if (!info) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-               return -ENOMEM;
-       }
-       dev->dev.driver_data = info;
-       info->xbdev = dev;
-       snprintf(info->phys, sizeof(info->phys), "xenbus/%s", dev->nodename);
-
-       info->page = (void *)__get_free_page(GFP_KERNEL);
-       if (!info->page)
-               goto error_nomem;
-       info->page->in_cons = info->page->in_prod = 0;
-       info->page->out_cons = info->page->out_prod = 0;
-
-       /* keyboard */
-       kbd = input_allocate_device();
-       if (!kbd)
-               goto error_nomem;
-       kbd->name = "Xen Virtual Keyboard";
-       kbd->phys = info->phys;
-       kbd->id.bustype = BUS_PCI;
-       kbd->id.vendor = 0x5853;
-       kbd->id.product = 0xffff;
-       kbd->evbit[0] = BIT(EV_KEY);
-       for (i = KEY_ESC; i < KEY_UNKNOWN; i++)
-               set_bit(i, kbd->keybit);
-       for (i = KEY_OK; i < KEY_MAX; i++)
-               set_bit(i, kbd->keybit);
-
-       ret = input_register_device(kbd);
-       if (ret) {
-               input_free_device(kbd);
-               xenbus_dev_fatal(dev, ret, "input_register_device(kbd)");
-               goto error;
-       }
-       info->kbd = kbd;
-
-       /* pointing device */
-       ptr = input_allocate_device();
-       if (!ptr)
-               goto error_nomem;
-       ptr->name = "Xen Virtual Pointer";
-       ptr->phys = info->phys;
-       ptr->id.bustype = BUS_PCI;
-       ptr->id.vendor = 0x5853;
-       ptr->id.product = 0xfffe;
-       ptr->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS);
-       for (i = BTN_LEFT; i <= BTN_TASK; i++)
-               set_bit(i, ptr->keybit);
-       ptr->relbit[0] = BIT(REL_X) | BIT(REL_Y);
-       input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0);
-       input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0);
-
-       ret = input_register_device(ptr);
-       if (ret) {
-               input_free_device(ptr);
-               xenbus_dev_fatal(dev, ret, "input_register_device(ptr)");
-               goto error;
-       }
-       info->ptr = ptr;
-
-       ret = xenkbd_connect_backend(dev, info);
-       if (ret < 0)
-               goto error;
-
-       return 0;
-
- error_nomem:
-       ret = -ENOMEM;
-       xenbus_dev_fatal(dev, ret, "allocating device memory");
- error:
-       xenkbd_remove(dev);
-       return ret;
-}
-
-static int xenkbd_resume(struct xenbus_device *dev)
-{
-       struct xenkbd_info *info = dev->dev.driver_data;
-
-       xenkbd_disconnect_backend(info);
-       return xenkbd_connect_backend(dev, info);
-}
-
-static int xenkbd_remove(struct xenbus_device *dev)
-{
-       struct xenkbd_info *info = dev->dev.driver_data;
-
-       xenkbd_disconnect_backend(info);
-       input_unregister_device(info->kbd);
-       input_unregister_device(info->ptr);
-       free_page((unsigned long)info->page);
-       kfree(info);
-       return 0;
-}
-
-static int xenkbd_connect_backend(struct xenbus_device *dev,
-                                 struct xenkbd_info *info)
-{
-       int ret;
-       struct xenbus_transaction xbt;
-
-       ret = bind_listening_port_to_irqhandler(
-               dev->otherend_id, input_handler, 0, "xenkbd", info);
-       if (ret < 0) {
-               xenbus_dev_fatal(dev, ret,
-                                "bind_listening_port_to_irqhandler");
-               return ret;
-       }
-       info->irq = ret;
-
- again:
-       ret = xenbus_transaction_start(&xbt);
-       if (ret) {
-               xenbus_dev_fatal(dev, ret, "starting transaction");
-               return ret;
-       }
-       ret = xenbus_printf(xbt, dev->nodename, "page-ref", "%lu",
-                           virt_to_mfn(info->page));
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           irq_to_evtchn_port(info->irq));
-       if (ret)
-               goto error_xenbus;
-       ret = xenbus_transaction_end(xbt, 0);
-       if (ret) {
-               if (ret == -EAGAIN)
-                       goto again;
-               xenbus_dev_fatal(dev, ret, "completing transaction");
-               return ret;
-       }
-
-       xenbus_switch_state(dev, XenbusStateInitialised);
-       return 0;
-
- error_xenbus:
-       xenbus_transaction_end(xbt, 1);
-       xenbus_dev_fatal(dev, ret, "writing xenstore");
-       return ret;
-}
-
-static void xenkbd_disconnect_backend(struct xenkbd_info *info)
-{
-       if (info->irq >= 0)
-               unbind_from_irqhandler(info->irq, info);
-       info->irq = -1;
-}
-
-static void xenkbd_backend_changed(struct xenbus_device *dev,
-                                  enum xenbus_state backend_state)
-{
-       struct xenkbd_info *info = dev->dev.driver_data;
-       int ret, val;
-
-       switch (backend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitialised:
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               break;
-
-       case XenbusStateInitWait:
-       InitWait:
-               ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-                                  "feature-abs-pointer", "%d", &val);
-               if (ret < 0)
-                       val = 0;
-               if (val) {
-                       ret = xenbus_printf(XBT_NIL, info->xbdev->nodename,
-                                           "request-abs-pointer", "1");
-                       if (ret)
-                               ; /* FIXME */
-               }
-               xenbus_switch_state(dev, XenbusStateConnected);
-               break;
-
-       case XenbusStateConnected:
-               /*
-                * Work around xenbus race condition: If backend goes
-                * through InitWait to Connected fast enough, we can
-                * get Connected twice here.
-                */
-               if (dev->state != XenbusStateConnected)
-                       goto InitWait; /* no InitWait seen yet, fudge it */
-               break;
-
-       case XenbusStateClosing:
-               xenbus_frontend_closed(dev);
-               break;
-       }
-}
-
-static struct xenbus_device_id xenkbd_ids[] = {
-       { "vkbd" },
-       { "" }
-};
-
-static struct xenbus_driver xenkbd = {
-       .name = "vkbd",
-       .owner = THIS_MODULE,
-       .ids = xenkbd_ids,
-       .probe = xenkbd_probe,
-       .remove = xenkbd_remove,
-       .resume = xenkbd_resume,
-       .otherend_changed = xenkbd_backend_changed,
-};
-
-static int __init xenkbd_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       /* Nothing to do if running in dom0. */
-       if (is_initial_xendomain())
-               return -ENODEV;
-
-       return xenbus_register_frontend(&xenkbd);
-}
-
-static void __exit xenkbd_cleanup(void)
-{
-       return xenbus_unregister_driver(&xenkbd);
-}
-
-module_init(xenkbd_init);
-module_exit(xenkbd_cleanup);
-
-MODULE_LICENSE("GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/gntdev/Makefile b/linux-2.6-xen-sparse/drivers/xen/gntdev/Makefile
deleted file mode 100644 (file)
index 6fbcd64..0000000
+++ /dev/null
@@ -1 +0,0 @@
-obj-y  := gntdev.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/gntdev/gntdev.c b/linux-2.6-xen-sparse/drivers/xen/gntdev/gntdev.c
deleted file mode 100644 (file)
index 68f2555..0000000
+++ /dev/null
@@ -1,973 +0,0 @@
-/******************************************************************************
- * gntdev.c
- * 
- * Device for accessing (in user-space) pages that have been granted by other
- * domains.
- *
- * Copyright (c) 2006-2007, D G Murray.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <asm/atomic.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/device.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <xen/gnttab.h>
-#include <asm/hypervisor.h>
-#include <xen/balloon.h>
-#include <xen/evtchn.h>
-#include <xen/driver_util.h>
-
-#include <linux/types.h>
-#include <xen/public/gntdev.h>
-
-
-#define DRIVER_AUTHOR "Derek G. Murray <Derek.Murray@cl.cam.ac.uk>"
-#define DRIVER_DESC   "User-space granted page access driver"
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-
-#define MAX_GRANTS 128
-
-/* A slot can be in one of three states:
- *
- * 0. GNTDEV_SLOT_INVALID:
- *    This slot is not associated with a grant reference, and is therefore free
- *    to be overwritten by a new grant reference.
- *
- * 1. GNTDEV_SLOT_NOT_YET_MAPPED:
- *    This slot is associated with a grant reference (via the 
- *    IOCTL_GNTDEV_MAP_GRANT_REF ioctl), but it has not yet been mmap()-ed.
- *
- * 2. GNTDEV_SLOT_MAPPED:
- *    This slot is associated with a grant reference, and has been mmap()-ed.
- */
-typedef enum gntdev_slot_state {
-       GNTDEV_SLOT_INVALID = 0,
-       GNTDEV_SLOT_NOT_YET_MAPPED,
-       GNTDEV_SLOT_MAPPED
-} gntdev_slot_state_t;
-
-#define GNTDEV_INVALID_HANDLE    -1
-#define GNTDEV_FREE_LIST_INVALID -1
-/* Each opened instance of gntdev is associated with a list of grants,
- * represented by an array of elements of the following type,
- * gntdev_grant_info_t.
- */
-typedef struct gntdev_grant_info {
-       gntdev_slot_state_t state;
-       union {
-               uint32_t free_list_index;
-               struct {
-                       domid_t domid;
-                       grant_ref_t ref;
-                       grant_handle_t kernel_handle;
-                       grant_handle_t user_handle;
-                       uint64_t dev_bus_addr;
-               } valid;
-       } u;
-} gntdev_grant_info_t;
-
-/* Private data structure, which is stored in the file pointer for files
- * associated with this device.
- */
-typedef struct gntdev_file_private_data {
-  
-       /* Array of grant information. */
-       gntdev_grant_info_t grants[MAX_GRANTS];
-
-       /* Read/write semaphore used to protect the grants array. */
-       struct rw_semaphore grants_sem;
-
-       /* An array of indices of free slots in the grants array.
-        * N.B. An entry in this list may temporarily have the value
-        * GNTDEV_FREE_LIST_INVALID if the corresponding slot has been removed
-        * from the list by the contiguous allocator, but the list has not yet
-        * been compressed. However, this is not visible across invocations of
-        * the device.
-        */
-       int32_t free_list[MAX_GRANTS];
-       
-       /* The number of free slots in the grants array. */
-       uint32_t free_list_size;
-
-       /* Read/write semaphore used to protect the free list. */
-       struct rw_semaphore free_list_sem;
-       
-       /* Index of the next slot after the most recent contiguous allocation, 
-        * for use in a next-fit allocator.
-        */
-       uint32_t next_fit_index;
-
-       /* Used to map grants into the kernel, before mapping them into user
-        * space.
-        */
-       struct page **foreign_pages;
-
-} gntdev_file_private_data_t;
-
-/* Module lifecycle operations. */
-static int __init gntdev_init(void);
-static void __exit gntdev_exit(void);
-
-module_init(gntdev_init);
-module_exit(gntdev_exit);
-
-/* File operations. */
-static int gntdev_open(struct inode *inode, struct file *flip);
-static int gntdev_release(struct inode *inode, struct file *flip);
-static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma);
-static int gntdev_ioctl (struct inode *inode, struct file *flip,
-                        unsigned int cmd, unsigned long arg);
-
-static struct file_operations gntdev_fops = {
-       .owner = THIS_MODULE,
-       .open = gntdev_open,
-       .release = gntdev_release,
-       .mmap = gntdev_mmap,
-       .ioctl = gntdev_ioctl
-};
-
-/* VM operations. */
-static void gntdev_vma_close(struct vm_area_struct *vma);
-static pte_t gntdev_clear_pte(struct vm_area_struct *vma, unsigned long addr,
-                             pte_t *ptep, int is_fullmm);
-
-static struct vm_operations_struct gntdev_vmops = {
-       .close = gntdev_vma_close,
-       .zap_pte = gntdev_clear_pte
-};
-
-/* Global variables. */
-
-/* The driver major number, for use when unregistering the driver. */
-static int gntdev_major;
-
-#define GNTDEV_NAME "gntdev"
-
-/* Memory mapping functions
- * ------------------------
- *
- * Every granted page is mapped into both kernel and user space, and the two
- * following functions return the respective virtual addresses of these pages.
- *
- * When shadow paging is disabled, the granted page is mapped directly into
- * user space; when it is enabled, it is mapped into the kernel and remapped
- * into user space using vm_insert_page() (see gntdev_mmap(), below).
- */
-
-/* Returns the virtual address (in user space) of the @page_index'th page
- * in the given VM area.
- */
-static inline unsigned long get_user_vaddr (struct vm_area_struct *vma,
-                                           int page_index)
-{
-       return (unsigned long) vma->vm_start + (page_index << PAGE_SHIFT);
-}
-
-/* Returns the virtual address (in kernel space) of the @slot_index'th page
- * mapped by the gntdev instance that owns the given private data struct.
- */
-static inline unsigned long get_kernel_vaddr (gntdev_file_private_data_t *priv,
-                                             int slot_index)
-{
-       unsigned long pfn;
-       void *kaddr;
-       pfn = page_to_pfn(priv->foreign_pages[slot_index]);
-       kaddr = pfn_to_kaddr(pfn);
-       return (unsigned long) kaddr;
-}
-
-/* Helper functions. */
-
-/* Adds information about a grant reference to the list of grants in the file's
- * private data structure. Returns non-zero on failure. On success, sets the
- * value of *offset to the offset that should be mmap()-ed in order to map the
- * grant reference.
- */
-static int add_grant_reference(struct file *flip,
-                              struct ioctl_gntdev_grant_ref *op,
-                              uint64_t *offset)
-{
-       gntdev_file_private_data_t *private_data 
-               = (gntdev_file_private_data_t *) flip->private_data;
-
-       uint32_t slot_index;
-
-       if (unlikely(private_data->free_list_size == 0)) {
-               return -ENOMEM;
-       }
-
-       slot_index = private_data->free_list[--private_data->free_list_size];
-
-       /* Copy the grant information into file's private data. */
-       private_data->grants[slot_index].state = GNTDEV_SLOT_NOT_YET_MAPPED;
-       private_data->grants[slot_index].u.valid.domid = op->domid;
-       private_data->grants[slot_index].u.valid.ref = op->ref;
-
-       /* The offset is calculated as the index of the chosen entry in the
-        * file's private data's array of grant information. This is then
-        * shifted to give an offset into the virtual "file address space".
-        */
-       *offset = slot_index << PAGE_SHIFT;
-
-       return 0;
-}
-
-/* Adds the @count grant references to the contiguous range in the slot array
- * beginning at @first_slot. It is assumed that @first_slot was returned by a
- * previous invocation of find_contiguous_free_range(), during the same
- * invocation of the driver.
- */
-static int add_grant_references(struct file *flip,
-                               int count,
-                               struct ioctl_gntdev_grant_ref *ops,
-                               uint32_t first_slot)
-{
-       gntdev_file_private_data_t *private_data 
-               = (gntdev_file_private_data_t *) flip->private_data;
-       int i;
-       
-       for (i = 0; i < count; ++i) {
-
-               /* First, mark the slot's entry in the free list as invalid. */
-               int free_list_index = 
-                       private_data->grants[first_slot+i].u.free_list_index;
-               private_data->free_list[free_list_index] = 
-                       GNTDEV_FREE_LIST_INVALID;
-
-               /* Now, update the slot. */
-               private_data->grants[first_slot+i].state = 
-                       GNTDEV_SLOT_NOT_YET_MAPPED;
-               private_data->grants[first_slot+i].u.valid.domid =
-                       ops[i].domid;
-               private_data->grants[first_slot+i].u.valid.ref = ops[i].ref;
-       }
-
-       return 0;       
-}
-
-/* Scans through the free list for @flip, removing entries that are marked as
- * GNTDEV_SLOT_INVALID. This will reduce the recorded size of the free list to
- * the number of valid entries.
- */
-static void compress_free_list(struct file *flip) 
-{
-       gntdev_file_private_data_t *private_data 
-               = (gntdev_file_private_data_t *) flip->private_data;
-       int i, j = 0, old_size;
-       
-       old_size = private_data->free_list_size;
-       for (i = 0; i < old_size; ++i) {
-               if (private_data->free_list[i] != GNTDEV_FREE_LIST_INVALID) {
-                       private_data->free_list[j] = 
-                               private_data->free_list[i];
-                       ++j;
-               } else {
-                       --private_data->free_list_size;
-               }
-       }
-}
-
-/* Searches the grant array in the private data of @flip for a range of
- * @num_slots contiguous slots in the GNTDEV_SLOT_INVALID state.
- *
- * Returns the index of the first slot if a range is found, otherwise -ENOMEM.
- */
-static int find_contiguous_free_range(struct file *flip,
-                                     uint32_t num_slots) 
-{
-       gntdev_file_private_data_t *private_data 
-               = (gntdev_file_private_data_t *) flip->private_data;
-       
-       int i;
-       int start_index = private_data->next_fit_index;
-       int range_start = 0, range_length;
-
-       if (private_data->free_list_size < num_slots) {
-               return -ENOMEM;
-       }
-
-       /* First search from the start_index to the end of the array. */
-       range_length = 0;
-       for (i = start_index; i < MAX_GRANTS; ++i) {
-               if (private_data->grants[i].state == GNTDEV_SLOT_INVALID) {
-                       if (range_length == 0) {
-                               range_start = i;
-                       }
-                       ++range_length;
-                       if (range_length == num_slots) {
-                               return range_start;
-                       }
-               }
-       }
-       
-       /* Now search from the start of the array to the start_index. */
-       range_length = 0;
-       for (i = 0; i < start_index; ++i) {
-               if (private_data->grants[i].state == GNTDEV_SLOT_INVALID) {
-                       if (range_length == 0) {
-                               range_start = i;
-                       }
-                       ++range_length;
-                       if (range_length == num_slots) {
-                               return range_start;
-                       }
-               }
-       }
-       
-       return -ENOMEM;
-}
-
-/* Interface functions. */
-
-/* Initialises the driver. Called when the module is loaded. */
-static int __init gntdev_init(void)
-{
-       struct class *class;
-       struct class_device *device;
-
-       if (!is_running_on_xen()) {
-               printk(KERN_ERR "You must be running Xen to use gntdev\n");
-               return -ENODEV;
-       }
-
-       gntdev_major = register_chrdev(0, GNTDEV_NAME, &gntdev_fops);
-       if (gntdev_major < 0)
-       {
-               printk(KERN_ERR "Could not register gntdev device\n");
-               return -ENOMEM;
-       }
-
-       /* Note that if the sysfs code fails, we will still initialise the
-        * device, and output the major number so that the device can be
-        * created manually using mknod.
-        */
-       if ((class = get_xen_class()) == NULL) {
-               printk(KERN_ERR "Error setting up xen_class\n");
-               printk(KERN_ERR "gntdev created with major number = %d\n", 
-                      gntdev_major);
-               return 0;
-       }
-
-       device = class_device_create(class, NULL, MKDEV(gntdev_major, 0),
-                                    NULL, GNTDEV_NAME);
-       if (IS_ERR(device)) {
-               printk(KERN_ERR "Error creating gntdev device in xen_class\n");
-               printk(KERN_ERR "gntdev created with major number = %d\n",
-                      gntdev_major);
-               return 0;
-       }
-
-       return 0;
-}
-
-/* Cleans up and unregisters the driver. Called when the driver is unloaded.
- */
-static void __exit gntdev_exit(void)
-{
-       struct class *class;
-       if ((class = get_xen_class()) != NULL)
-               class_device_destroy(class, MKDEV(gntdev_major, 0));
-       unregister_chrdev(gntdev_major, GNTDEV_NAME);
-}
-
-/* Called when the device is opened. */
-static int gntdev_open(struct inode *inode, struct file *flip)
-{
-       gntdev_file_private_data_t *private_data;
-       int i;
-
-       try_module_get(THIS_MODULE);
-
-       /* Allocate space for the per-instance private data. */
-       private_data = kmalloc(sizeof(*private_data), GFP_KERNEL);
-       if (!private_data)
-               goto nomem_out;
-
-       /* Allocate space for the kernel-mapping of granted pages. */
-       private_data->foreign_pages = 
-               alloc_empty_pages_and_pagevec(MAX_GRANTS);
-       if (!private_data->foreign_pages)
-               goto nomem_out2;
-
-       /* Initialise the free-list, which contains all slots at first.
-        */
-       for (i = 0; i < MAX_GRANTS; ++i) {
-               private_data->free_list[MAX_GRANTS - i - 1] = i;
-               private_data->grants[i].state = GNTDEV_SLOT_INVALID;
-               private_data->grants[i].u.free_list_index = MAX_GRANTS - i - 1;
-       }
-       private_data->free_list_size = MAX_GRANTS;
-       private_data->next_fit_index = 0;
-
-       init_rwsem(&private_data->grants_sem);
-       init_rwsem(&private_data->free_list_sem);
-
-       flip->private_data = private_data;
-
-       return 0;
-
-nomem_out2:
-       kfree(private_data);
-nomem_out:
-       return -ENOMEM;
-}
-
-/* Called when the device is closed.
- */
-static int gntdev_release(struct inode *inode, struct file *flip)
-{
-       if (flip->private_data) {
-               gntdev_file_private_data_t *private_data = 
-                       (gntdev_file_private_data_t *) flip->private_data;
-               if (private_data->foreign_pages) {
-                       free_empty_pages_and_pagevec
-                               (private_data->foreign_pages, MAX_GRANTS);
-               }
-               kfree(private_data);
-       }
-       module_put(THIS_MODULE);
-       return 0;
-}
-
-/* Called when an attempt is made to mmap() the device. The private data from
- * @flip contains the list of grant references that can be mapped. The vm_pgoff
- * field of @vma contains the index into that list that refers to the grant
- * reference that will be mapped. Only mappings that are a multiple of
- * PAGE_SIZE are handled.
- */
-static int gntdev_mmap (struct file *flip, struct vm_area_struct *vma) 
-{
-       struct gnttab_map_grant_ref op;
-       unsigned long slot_index = vma->vm_pgoff;
-       unsigned long kernel_vaddr, user_vaddr;
-       uint32_t size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-       uint64_t ptep;
-       int ret;
-       int flags;
-       int i;
-       struct page *page;
-       gntdev_file_private_data_t *private_data = flip->private_data;
-
-       if (unlikely(!private_data)) {
-               printk(KERN_ERR "File's private data is NULL.\n");
-               return -EINVAL;
-       }
-
-       if (unlikely((size <= 0) || (size + slot_index) > MAX_GRANTS)) {
-               printk(KERN_ERR "Invalid number of pages or offset"
-                      "(num_pages = %d, first_slot = %ld).\n",
-                      size, slot_index);
-               return -ENXIO;
-       }
-
-       if ((vma->vm_flags & VM_WRITE) && !(vma->vm_flags & VM_SHARED)) {
-               printk(KERN_ERR "Writable mappings must be shared.\n");
-               return -EINVAL;
-       }
-
-       /* Slots must be in the NOT_YET_MAPPED state. */
-       down_write(&private_data->grants_sem);
-       for (i = 0; i < size; ++i) {
-               if (private_data->grants[slot_index + i].state != 
-                   GNTDEV_SLOT_NOT_YET_MAPPED) {
-                       printk(KERN_ERR "Slot (index = %ld) is in the wrong "
-                              "state (%d).\n", slot_index + i, 
-                              private_data->grants[slot_index + i].state);
-                       up_write(&private_data->grants_sem);
-                       return -EINVAL;
-               }
-       }
-
-       /* Install the hook for unmapping. */
-       vma->vm_ops = &gntdev_vmops;
-    
-       /* The VM area contains pages from another VM. */
-       vma->vm_flags |= VM_FOREIGN;
-       vma->vm_private_data = kzalloc(size * sizeof(struct page_struct *), 
-                                      GFP_KERNEL);
-       if (vma->vm_private_data == NULL) {
-               printk(KERN_ERR "Couldn't allocate mapping structure for VM "
-                      "area.\n");
-               return -ENOMEM;
-       }
-
-       /* This flag prevents Bad PTE errors when the memory is unmapped. */
-       vma->vm_flags |= VM_RESERVED;
-
-       /* This flag prevents this VM area being copied on a fork(). A better
-        * behaviour might be to explicitly carry out the appropriate mappings
-        * on fork(), but I don't know if there's a hook for this.
-        */
-       vma->vm_flags |= VM_DONTCOPY;
-
-#ifdef CONFIG_X86
-       /* This flag ensures that the page tables are not unpinned before the
-        * VM area is unmapped. Therefore Xen still recognises the PTE as
-        * belonging to an L1 pagetable, and the grant unmap operation will
-        * succeed, even if the process does not exit cleanly.
-        */
-       vma->vm_mm->context.has_foreign_mappings = 1;
-#endif
-
-       for (i = 0; i < size; ++i) {
-
-               flags = GNTMAP_host_map;
-               if (!(vma->vm_flags & VM_WRITE))
-                       flags |= GNTMAP_readonly;
-
-               kernel_vaddr = get_kernel_vaddr(private_data, slot_index + i);
-               user_vaddr = get_user_vaddr(vma, i);
-               page = pfn_to_page(__pa(kernel_vaddr) >> PAGE_SHIFT);
-
-               gnttab_set_map_op(&op, kernel_vaddr, flags,   
-                                 private_data->grants[slot_index+i]
-                                 .u.valid.ref, 
-                                 private_data->grants[slot_index+i]
-                                 .u.valid.domid);
-
-               /* Carry out the mapping of the grant reference. */
-               ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, 
-                                               &op, 1);
-               BUG_ON(ret);
-               if (op.status) {
-                       printk(KERN_ERR "Error mapping the grant reference "
-                              "into the kernel (%d). domid = %d; ref = %d\n",
-                              op.status,
-                              private_data->grants[slot_index+i]
-                              .u.valid.domid,
-                              private_data->grants[slot_index+i]
-                              .u.valid.ref);
-                       goto undo_map_out;
-               }
-
-               /* Store a reference to the page that will be mapped into user
-                * space.
-                */
-               ((struct page **) vma->vm_private_data)[i] = page;
-
-               /* Mark mapped page as reserved. */
-               SetPageReserved(page);
-
-               /* Record the grant handle, for use in the unmap operation. */
-               private_data->grants[slot_index+i].u.valid.kernel_handle = 
-                       op.handle;
-               private_data->grants[slot_index+i].u.valid.dev_bus_addr = 
-                       op.dev_bus_addr;
-               
-               private_data->grants[slot_index+i].state = GNTDEV_SLOT_MAPPED;
-               private_data->grants[slot_index+i].u.valid.user_handle =
-                       GNTDEV_INVALID_HANDLE;
-
-               /* Now perform the mapping to user space. */
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-
-                       /* NOT USING SHADOW PAGE TABLES. */
-                       /* In this case, we map the grant(s) straight into user
-                        * space.
-                        */
-
-                       /* Get the machine address of the PTE for the user 
-                        *  page.
-                        */
-                       if ((ret = create_lookup_pte_addr(vma->vm_mm, 
-                                                         vma->vm_start 
-                                                         + (i << PAGE_SHIFT), 
-                                                         &ptep)))
-                       {
-                               printk(KERN_ERR "Error obtaining PTE pointer "
-                                      "(%d).\n", ret);
-                               goto undo_map_out;
-                       }
-                       
-                       /* Configure the map operation. */
-               
-                       /* The reference is to be used by host CPUs. */
-                       flags = GNTMAP_host_map;
-                       
-                       /* Specifies a user space mapping. */
-                       flags |= GNTMAP_application_map;
-                       
-                       /* The map request contains the machine address of the
-                        * PTE to update.
-                        */
-                       flags |= GNTMAP_contains_pte;
-                       
-                       if (!(vma->vm_flags & VM_WRITE))
-                               flags |= GNTMAP_readonly;
-
-                       gnttab_set_map_op(&op, ptep, flags, 
-                                         private_data->grants[slot_index+i]
-                                         .u.valid.ref, 
-                                         private_data->grants[slot_index+i]
-                                         .u.valid.domid);
-
-                       /* Carry out the mapping of the grant reference. */
-                       ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-                                                       &op, 1);
-                       BUG_ON(ret);
-                       if (op.status) {
-                               printk(KERN_ERR "Error mapping the grant "
-                                      "reference into user space (%d). domid "
-                                      "= %d; ref = %d\n", op.status,
-                                      private_data->grants[slot_index+i].u
-                                      .valid.domid,
-                                      private_data->grants[slot_index+i].u
-                                      .valid.ref);
-                               goto undo_map_out;
-                       }
-                       
-                       /* Record the grant handle, for use in the unmap 
-                        * operation. 
-                        */
-                       private_data->grants[slot_index+i].u.
-                               valid.user_handle = op.handle;
-
-                       /* Update p2m structure with the new mapping. */
-                       set_phys_to_machine(__pa(kernel_vaddr) >> PAGE_SHIFT,
-                                           FOREIGN_FRAME(private_data->
-                                                         grants[slot_index+i]
-                                                         .u.valid.dev_bus_addr
-                                                         >> PAGE_SHIFT));
-               } else {
-                       /* USING SHADOW PAGE TABLES. */
-                       /* In this case, we simply insert the page into the VM
-                        * area. */
-                       ret = vm_insert_page(vma, user_vaddr, page);
-               }
-
-       }
-
-       up_write(&private_data->grants_sem);
-       return 0;
-
-undo_map_out:
-       /* If we have a mapping failure, the unmapping will be taken care of
-        * by do_mmap_pgoff(), which will eventually call gntdev_clear_pte().
-        * All we need to do here is free the vma_private_data.
-        */
-       kfree(vma->vm_private_data);
-
-       /* THIS IS VERY UNPLEASANT: do_mmap_pgoff() will set the vma->vm_file
-        * to NULL on failure. However, we need this in gntdev_clear_pte() to
-        * unmap the grants. Therefore, we smuggle a reference to the file's
-        * private data in the VM area's private data pointer.
-        */
-       vma->vm_private_data = private_data;
-       
-       up_write(&private_data->grants_sem);
-
-       return -ENOMEM;
-}
-
-static pte_t gntdev_clear_pte(struct vm_area_struct *vma, unsigned long addr,
-                             pte_t *ptep, int is_fullmm)
-{
-       int slot_index, ret;
-       pte_t copy;
-       struct gnttab_unmap_grant_ref op;
-       gntdev_file_private_data_t *private_data;
-
-       /* THIS IS VERY UNPLEASANT: do_mmap_pgoff() will set the vma->vm_file
-        * to NULL on failure. However, we need this in gntdev_clear_pte() to
-        * unmap the grants. Therefore, we smuggle a reference to the file's
-        * private data in the VM area's private data pointer.
-        */
-       if (vma->vm_file) {
-               private_data = (gntdev_file_private_data_t *)
-                       vma->vm_file->private_data;
-       } else if (vma->vm_private_data) {
-               private_data = (gntdev_file_private_data_t *)
-                       vma->vm_private_data;
-       } else {
-               private_data = NULL; /* gcc warning */
-               BUG();
-       }
-
-       /* Copy the existing value of the PTE for returning. */
-       copy = *ptep;
-
-       /* Calculate the grant relating to this PTE. */
-       slot_index = vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT);
-
-       /* Only unmap grants if the slot has been mapped. This could be being
-        * called from a failing mmap().
-        */
-       if (private_data->grants[slot_index].state == GNTDEV_SLOT_MAPPED) {
-
-               /* First, we clear the user space mapping, if it has been made.
-                */
-               if (private_data->grants[slot_index].u.valid.user_handle !=
-                   GNTDEV_INVALID_HANDLE && 
-                   !xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* NOT USING SHADOW PAGE TABLES. */
-                       gnttab_set_unmap_op(&op, virt_to_machine(ptep), 
-                                           GNTMAP_contains_pte,
-                                           private_data->grants[slot_index]
-                                           .u.valid.user_handle);
-                       ret = HYPERVISOR_grant_table_op(
-                               GNTTABOP_unmap_grant_ref, &op, 1);
-                       BUG_ON(ret);
-                       if (op.status)
-                               printk("User unmap grant status = %d\n", 
-                                      op.status);
-               } else {
-                       /* USING SHADOW PAGE TABLES. */
-                       pte_clear_full(vma->vm_mm, addr, ptep, is_fullmm);
-               }
-
-               /* Finally, we unmap the grant from kernel space. */
-               gnttab_set_unmap_op(&op, 
-                                   get_kernel_vaddr(private_data, slot_index),
-                                   GNTMAP_host_map, 
-                                   private_data->grants[slot_index].u.valid
-                                   .kernel_handle);
-               ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, 
-                                               &op, 1);
-               BUG_ON(ret);
-               if (op.status)
-                       printk("Kernel unmap grant status = %d\n", op.status);
-
-
-               /* Return slot to the not-yet-mapped state, so that it may be
-                * mapped again, or removed by a subsequent ioctl.
-                */
-               private_data->grants[slot_index].state = 
-                       GNTDEV_SLOT_NOT_YET_MAPPED;
-
-               /* Invalidate the physical to machine mapping for this page. */
-               set_phys_to_machine(__pa(get_kernel_vaddr(private_data, 
-                                                         slot_index)) 
-                                   >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-
-       } else {
-               pte_clear_full(vma->vm_mm, addr, ptep, is_fullmm);
-       }
-
-       return copy;
-}
-
-/* "Destructor" for a VM area.
- */
-static void gntdev_vma_close(struct vm_area_struct *vma) {
-       if (vma->vm_private_data) {
-               kfree(vma->vm_private_data);
-       }
-}
-
-/* Called when an ioctl is made on the device.
- */
-static int gntdev_ioctl(struct inode *inode, struct file *flip,
-                       unsigned int cmd, unsigned long arg)
-{
-       int rc = 0;
-       gntdev_file_private_data_t *private_data = 
-               (gntdev_file_private_data_t *) flip->private_data;
-
-       switch (cmd) {
-       case IOCTL_GNTDEV_MAP_GRANT_REF:
-       {
-               struct ioctl_gntdev_map_grant_ref op;
-               down_write(&private_data->grants_sem);
-               down_write(&private_data->free_list_sem);
-
-               if ((rc = copy_from_user(&op, (void __user *) arg, 
-                                        sizeof(op)))) {
-                       rc = -EFAULT;
-                       goto map_out;
-               }
-               if (unlikely(op.count <= 0)) {
-                       rc = -EINVAL;
-                       goto map_out;
-               }
-
-               if (op.count == 1) {
-                       if ((rc = add_grant_reference(flip, &op.refs[0],
-                                                     &op.index)) < 0) {
-                               printk(KERN_ERR "Adding grant reference "
-                                      "failed (%d).\n", rc);
-                               goto map_out;
-                       }
-               } else {
-                       struct ioctl_gntdev_grant_ref *refs, *u;
-                       refs = kmalloc(op.count * sizeof(*refs), GFP_KERNEL);
-                       if (!refs) {
-                               rc = -ENOMEM;
-                               goto map_out;
-                       }
-                       u = ((struct ioctl_gntdev_map_grant_ref *)arg)->refs;
-                       if ((rc = copy_from_user(refs,
-                                                (void __user *)u,
-                                                sizeof(*refs) * op.count))) {
-                               printk(KERN_ERR "Copying refs from user failed"
-                                      " (%d).\n", rc);
-                               rc = -EINVAL;
-                               goto map_out;
-                       }
-                       if ((rc = find_contiguous_free_range(flip, op.count))
-                           < 0) {
-                               printk(KERN_ERR "Finding contiguous range "
-                                      "failed (%d).\n", rc);
-                               kfree(refs);
-                               goto map_out;
-                       }
-                       op.index = rc << PAGE_SHIFT;
-                       if ((rc = add_grant_references(flip, op.count,
-                                                      refs, rc))) {
-                               printk(KERN_ERR "Adding grant references "
-                                      "failed (%d).\n", rc);
-                               kfree(refs);
-                               goto map_out;
-                       }
-                       compress_free_list(flip);
-                       kfree(refs);
-               }
-               if ((rc = copy_to_user((void __user *) arg, 
-                                      &op, 
-                                      sizeof(op)))) {
-                       printk(KERN_ERR "Copying result back to user failed "
-                              "(%d)\n", rc);
-                       rc = -EFAULT;
-                       goto map_out;
-               }
-       map_out:
-               up_write(&private_data->grants_sem);
-               up_write(&private_data->free_list_sem);
-               return rc;
-       }
-       case IOCTL_GNTDEV_UNMAP_GRANT_REF:
-       {
-               struct ioctl_gntdev_unmap_grant_ref op;
-               int i, start_index;
-
-               down_write(&private_data->grants_sem);
-               down_write(&private_data->free_list_sem);
-
-               if ((rc = copy_from_user(&op, 
-                                        (void __user *) arg, 
-                                        sizeof(op)))) {
-                       rc = -EFAULT;
-                       goto unmap_out;
-               }
-
-               start_index = op.index >> PAGE_SHIFT;
-
-               /* First, check that all pages are in the NOT_YET_MAPPED
-                * state.
-                */
-               for (i = 0; i < op.count; ++i) {
-                       if (unlikely
-                           (private_data->grants[start_index + i].state
-                            != GNTDEV_SLOT_NOT_YET_MAPPED)) {
-                               if (private_data->grants[start_index + i].state
-                                   == GNTDEV_SLOT_INVALID) {
-                                       printk(KERN_ERR
-                                              "Tried to remove an invalid "
-                                              "grant at offset 0x%x.",
-                                              (start_index + i) 
-                                              << PAGE_SHIFT);
-                                       rc = -EINVAL;
-                               } else {
-                                       printk(KERN_ERR
-                                              "Tried to remove a grant which "
-                                              "is currently mmap()-ed at "
-                                              "offset 0x%x.",
-                                              (start_index + i) 
-                                              << PAGE_SHIFT);
-                                       rc = -EBUSY;
-                               }
-                               goto unmap_out;
-                       }
-               }
-
-               /* Unmap pages and add them to the free list.
-                */
-               for (i = 0; i < op.count; ++i) {
-                       private_data->grants[start_index+i].state = 
-                               GNTDEV_SLOT_INVALID;
-                       private_data->grants[start_index+i].u.free_list_index =
-                               private_data->free_list_size;
-                       private_data->free_list[private_data->free_list_size] =
-                               start_index + i;
-                       ++private_data->free_list_size;
-               }
-               compress_free_list(flip);
-
-       unmap_out:
-               up_write(&private_data->grants_sem);
-               up_write(&private_data->free_list_sem);
-               return rc;
-       }
-       case IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR:
-       {
-               struct ioctl_gntdev_get_offset_for_vaddr op;
-               struct vm_area_struct *vma;
-               unsigned long vaddr;
-
-               if ((rc = copy_from_user(&op, 
-                                        (void __user *) arg, 
-                                        sizeof(op)))) {
-                       rc = -EFAULT;
-                       goto get_offset_out;
-               }
-               vaddr = (unsigned long)op.vaddr;
-
-               down_read(&current->mm->mmap_sem);              
-               vma = find_vma(current->mm, vaddr);
-               if (vma == NULL) {
-                       rc = -EFAULT;
-                       goto get_offset_unlock_out;
-               }
-               if ((!vma->vm_ops) || (vma->vm_ops != &gntdev_vmops)) {
-                       printk(KERN_ERR "The vaddr specified does not belong "
-                              "to a gntdev instance: %#lx\n", vaddr);
-                       rc = -EFAULT;
-                       goto get_offset_unlock_out;
-               }
-               if (vma->vm_start != vaddr) {
-                       printk(KERN_ERR "The vaddr specified in an "
-                              "IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR must be at "
-                              "the start of the VM area. vma->vm_start = "
-                              "%#lx; vaddr = %#lx\n",
-                              vma->vm_start, vaddr);
-                       rc = -EFAULT;
-                       goto get_offset_unlock_out;
-               }
-               op.offset = vma->vm_pgoff << PAGE_SHIFT;
-               op.count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-               up_read(&current->mm->mmap_sem);
-               if ((rc = copy_to_user((void __user *) arg, 
-                                      &op, 
-                                      sizeof(op)))) {
-                       rc = -EFAULT;
-                       goto get_offset_out;
-               }
-               goto get_offset_out;
-       get_offset_unlock_out:
-               up_read(&current->mm->mmap_sem);
-       get_offset_out:
-               return rc;
-       }
-       default:
-               return -ENOIOCTLCMD;
-       }
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/Makefile b/linux-2.6-xen-sparse/drivers/xen/netback/Makefile
deleted file mode 100644 (file)
index d5d2328..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-obj-$(CONFIG_XEN_NETDEV_BACKEND) := netbk.o
-obj-$(CONFIG_XEN_NETDEV_LOOPBACK) += netloop.o
-
-netbk-y   := netback.o xenbus.o interface.o
-netloop-y := loopback.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/common.h b/linux-2.6-xen-sparse/drivers/xen/netback/common.h
deleted file mode 100644 (file)
index 8d9107f..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/******************************************************************************
- * arch/xen/drivers/netif/backend/common.h
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __NETIF__BACKEND__COMMON_H__
-#define __NETIF__BACKEND__COMMON_H__
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/ip.h>
-#include <linux/in.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/wait.h>
-#include <xen/evtchn.h>
-#include <xen/interface/io/netif.h>
-#include <asm/io.h>
-#include <asm/pgalloc.h>
-#include <xen/interface/grant_table.h>
-#include <xen/gnttab.h>
-#include <xen/driver_util.h>
-
-#define DPRINTK(_f, _a...)                     \
-       pr_debug("(file=%s, line=%d) " _f,      \
-                __FILE__ , __LINE__ , ## _a )
-#define IPRINTK(fmt, args...)                          \
-       printk(KERN_INFO "xen_net: " fmt, ##args)
-#define WPRINTK(fmt, args...)                          \
-       printk(KERN_WARNING "xen_net: " fmt, ##args)
-
-typedef struct netif_st {
-       /* Unique identifier for this interface. */
-       domid_t          domid;
-       unsigned int     handle;
-
-       u8               fe_dev_addr[6];
-
-       /* Physical parameters of the comms window. */
-       grant_handle_t   tx_shmem_handle;
-       grant_ref_t      tx_shmem_ref;
-       grant_handle_t   rx_shmem_handle;
-       grant_ref_t      rx_shmem_ref;
-       unsigned int     irq;
-
-       /* The shared rings and indexes. */
-       netif_tx_back_ring_t tx;
-       netif_rx_back_ring_t rx;
-       struct vm_struct *tx_comms_area;
-       struct vm_struct *rx_comms_area;
-
-       /* Set of features that can be turned on in dev->features. */
-       int features;
-
-       /* Internal feature information. */
-       int can_queue:1;        /* can queue packets for receiver? */
-       int copying_receiver:1; /* copy packets to receiver?       */
-
-       /* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */
-       RING_IDX rx_req_cons_peek;
-
-       /* Transmit shaping: allow 'credit_bytes' every 'credit_usec'. */
-       unsigned long   credit_bytes;
-       unsigned long   credit_usec;
-       unsigned long   remaining_credit;
-       struct timer_list credit_timeout;
-
-       /* Enforce draining of the transmit queue. */
-       struct timer_list tx_queue_timeout;
-
-       /* Miscellaneous private stuff. */
-       struct list_head list;  /* scheduling list */
-       atomic_t         refcnt;
-       struct net_device *dev;
-       struct net_device_stats stats;
-
-       unsigned int carrier;
-
-       wait_queue_head_t waiting_to_free;
-} netif_t;
-
-/*
- * Implement our own carrier flag: the network stack's version causes delays
- * when the carrier is re-enabled (in particular, dev_activate() may not
- * immediately be called, which can cause packet loss; also the etherbridge
- * can be rather lazy in activating its port).
- */
-#define netback_carrier_on(netif)      ((netif)->carrier = 1)
-#define netback_carrier_off(netif)     ((netif)->carrier = 0)
-#define netback_carrier_ok(netif)      ((netif)->carrier)
-
-enum {
-       NETBK_DONT_COPY_SKB,
-       NETBK_DELAYED_COPY_SKB,
-       NETBK_ALWAYS_COPY_SKB,
-};
-
-extern int netbk_copy_skb_mode;
-
-#define NET_TX_RING_SIZE __RING_SIZE((netif_tx_sring_t *)0, PAGE_SIZE)
-#define NET_RX_RING_SIZE __RING_SIZE((netif_rx_sring_t *)0, PAGE_SIZE)
-
-void netif_disconnect(netif_t *netif);
-
-netif_t *netif_alloc(domid_t domid, unsigned int handle);
-int netif_map(netif_t *netif, unsigned long tx_ring_ref,
-             unsigned long rx_ring_ref, unsigned int evtchn);
-
-#define netif_get(_b) (atomic_inc(&(_b)->refcnt))
-#define netif_put(_b)                                          \
-       do {                                                    \
-               if ( atomic_dec_and_test(&(_b)->refcnt) )       \
-                       wake_up(&(_b)->waiting_to_free);        \
-       } while (0)
-
-void netif_xenbus_init(void);
-
-#define netif_schedulable(netif)                               \
-       (netif_running((netif)->dev) && netback_carrier_ok(netif))
-
-void netif_schedule_work(netif_t *netif);
-void netif_deschedule_work(netif_t *netif);
-
-int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev);
-struct net_device_stats *netif_be_get_stats(struct net_device *dev);
-irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-
-static inline int netbk_can_queue(struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-       return netif->can_queue;
-}
-
-static inline int netbk_can_sg(struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-       return netif->features & NETIF_F_SG;
-}
-
-#endif /* __NETIF__BACKEND__COMMON_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c
deleted file mode 100644 (file)
index 610891f..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-/******************************************************************************
- * arch/xen/drivers/netif/backend/interface.c
- * 
- * Network-device interface management.
- * 
- * Copyright (c) 2004-2005, Keir Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "common.h"
-#include <linux/ethtool.h>
-#include <linux/rtnetlink.h>
-
-/*
- * Module parameter 'queue_length':
- * 
- * Enables queuing in the network stack when a client has run out of receive
- * descriptors. Although this feature can improve receive bandwidth by avoiding
- * packet loss, it can also result in packets sitting in the 'tx_queue' for
- * unbounded time. This is bad if those packets hold onto foreign resources.
- * For example, consider a packet that holds onto resources belonging to the
- * guest for which it is queued (e.g., packet received on vif1.0, destined for
- * vif1.1 which is not activated in the guest): in this situation the guest
- * will never be destroyed, unless vif1.1 is taken down. To avoid this, we
- * run a timer (tx_queue_timeout) to drain the queue when the interface is
- * blocked.
- */
-static unsigned long netbk_queue_length = 32;
-module_param_named(queue_length, netbk_queue_length, ulong, 0);
-
-static void __netif_up(netif_t *netif)
-{
-       enable_irq(netif->irq);
-       netif_schedule_work(netif);
-}
-
-static void __netif_down(netif_t *netif)
-{
-       disable_irq(netif->irq);
-       netif_deschedule_work(netif);
-}
-
-static int net_open(struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-       if (netback_carrier_ok(netif)) {
-               __netif_up(netif);
-               netif_start_queue(dev);
-       }
-       return 0;
-}
-
-static int net_close(struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-       if (netback_carrier_ok(netif))
-               __netif_down(netif);
-       netif_stop_queue(dev);
-       return 0;
-}
-
-static int netbk_change_mtu(struct net_device *dev, int mtu)
-{
-       int max = netbk_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
-
-       if (mtu > max)
-               return -EINVAL;
-       dev->mtu = mtu;
-       return 0;
-}
-
-static int netbk_set_sg(struct net_device *dev, u32 data)
-{
-       if (data) {
-               netif_t *netif = netdev_priv(dev);
-
-               if (!(netif->features & NETIF_F_SG))
-                       return -ENOSYS;
-       }
-
-       return ethtool_op_set_sg(dev, data);
-}
-
-static int netbk_set_tso(struct net_device *dev, u32 data)
-{
-       if (data) {
-               netif_t *netif = netdev_priv(dev);
-
-               if (!(netif->features & NETIF_F_TSO))
-                       return -ENOSYS;
-       }
-
-       return ethtool_op_set_tso(dev, data);
-}
-
-static struct ethtool_ops network_ethtool_ops =
-{
-       .get_tx_csum = ethtool_op_get_tx_csum,
-       .set_tx_csum = ethtool_op_set_tx_csum,
-       .get_sg = ethtool_op_get_sg,
-       .set_sg = netbk_set_sg,
-       .get_tso = ethtool_op_get_tso,
-       .set_tso = netbk_set_tso,
-       .get_link = ethtool_op_get_link,
-};
-
-netif_t *netif_alloc(domid_t domid, unsigned int handle)
-{
-       int err = 0;
-       struct net_device *dev;
-       netif_t *netif;
-       char name[IFNAMSIZ] = {};
-
-       snprintf(name, IFNAMSIZ - 1, "vif%u.%u", domid, handle);
-       dev = alloc_netdev(sizeof(netif_t), name, ether_setup);
-       if (dev == NULL) {
-               DPRINTK("Could not create netif: out of memory\n");
-               return ERR_PTR(-ENOMEM);
-       }
-
-       netif = netdev_priv(dev);
-       memset(netif, 0, sizeof(*netif));
-       netif->domid  = domid;
-       netif->handle = handle;
-       atomic_set(&netif->refcnt, 1);
-       init_waitqueue_head(&netif->waiting_to_free);
-       netif->dev = dev;
-
-       netback_carrier_off(netif);
-
-       netif->credit_bytes = netif->remaining_credit = ~0UL;
-       netif->credit_usec  = 0UL;
-       init_timer(&netif->credit_timeout);
-       /* Initialize 'expires' now: it's used to track the credit window. */
-       netif->credit_timeout.expires = jiffies;
-
-       init_timer(&netif->tx_queue_timeout);
-
-       dev->hard_start_xmit = netif_be_start_xmit;
-       dev->get_stats       = netif_be_get_stats;
-       dev->open            = net_open;
-       dev->stop            = net_close;
-       dev->change_mtu      = netbk_change_mtu;
-       dev->features        = NETIF_F_IP_CSUM;
-
-       SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
-
-       dev->tx_queue_len = netbk_queue_length;
-
-       /*
-        * Initialise a dummy MAC address. We choose the numerically
-        * largest non-broadcast address to prevent the address getting
-        * stolen by an Ethernet bridge for STP purposes.
-        * (FE:FF:FF:FF:FF:FF)
-        */ 
-       memset(dev->dev_addr, 0xFF, ETH_ALEN);
-       dev->dev_addr[0] &= ~0x01;
-
-       rtnl_lock();
-       err = register_netdevice(dev);
-       rtnl_unlock();
-       if (err) {
-               DPRINTK("Could not register new net device %s: err=%d\n",
-                       dev->name, err);
-               free_netdev(dev);
-               return ERR_PTR(err);
-       }
-
-       DPRINTK("Successfully created netif\n");
-       return netif;
-}
-
-static int map_frontend_pages(
-       netif_t *netif, grant_ref_t tx_ring_ref, grant_ref_t rx_ring_ref)
-{
-       struct gnttab_map_grant_ref op;
-
-       gnttab_set_map_op(&op, (unsigned long)netif->tx_comms_area->addr,
-                         GNTMAP_host_map, tx_ring_ref, netif->domid);
-    
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status) { 
-               DPRINTK(" Gnttab failure mapping tx_ring_ref!\n");
-               return op.status;
-       }
-
-       netif->tx_shmem_ref    = tx_ring_ref;
-       netif->tx_shmem_handle = op.handle;
-
-       gnttab_set_map_op(&op, (unsigned long)netif->rx_comms_area->addr,
-                         GNTMAP_host_map, rx_ring_ref, netif->domid);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status) {
-               DPRINTK(" Gnttab failure mapping rx_ring_ref!\n");
-               return op.status;
-       }
-
-       netif->rx_shmem_ref    = rx_ring_ref;
-       netif->rx_shmem_handle = op.handle;
-
-       return 0;
-}
-
-static void unmap_frontend_pages(netif_t *netif)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)netif->tx_comms_area->addr,
-                           GNTMAP_host_map, netif->tx_shmem_handle);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-
-       gnttab_set_unmap_op(&op, (unsigned long)netif->rx_comms_area->addr,
-                           GNTMAP_host_map, netif->rx_shmem_handle);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-}
-
-int netif_map(netif_t *netif, unsigned long tx_ring_ref,
-             unsigned long rx_ring_ref, unsigned int evtchn)
-{
-       int err = -ENOMEM;
-       netif_tx_sring_t *txs;
-       netif_rx_sring_t *rxs;
-
-       /* Already connected through? */
-       if (netif->irq)
-               return 0;
-
-       netif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
-       if (netif->tx_comms_area == NULL)
-               return -ENOMEM;
-       netif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
-       if (netif->rx_comms_area == NULL)
-               goto err_rx;
-
-       err = map_frontend_pages(netif, tx_ring_ref, rx_ring_ref);
-       if (err)
-               goto err_map;
-
-       err = bind_interdomain_evtchn_to_irqhandler(
-               netif->domid, evtchn, netif_be_int, 0,
-               netif->dev->name, netif);
-       if (err < 0)
-               goto err_hypervisor;
-       netif->irq = err;
-       disable_irq(netif->irq);
-
-       txs = (netif_tx_sring_t *)netif->tx_comms_area->addr;
-       BACK_RING_INIT(&netif->tx, txs, PAGE_SIZE);
-
-       rxs = (netif_rx_sring_t *)
-               ((char *)netif->rx_comms_area->addr);
-       BACK_RING_INIT(&netif->rx, rxs, PAGE_SIZE);
-
-       netif->rx_req_cons_peek = 0;
-
-       netif_get(netif);
-
-       rtnl_lock();
-       netback_carrier_on(netif);
-       if (netif_running(netif->dev))
-               __netif_up(netif);
-       rtnl_unlock();
-
-       return 0;
-err_hypervisor:
-       unmap_frontend_pages(netif);
-err_map:
-       free_vm_area(netif->rx_comms_area);
-err_rx:
-       free_vm_area(netif->tx_comms_area);
-       return err;
-}
-
-void netif_disconnect(netif_t *netif)
-{
-       if (netback_carrier_ok(netif)) {
-               rtnl_lock();
-               netback_carrier_off(netif);
-               netif_carrier_off(netif->dev); /* discard queued packets */
-               if (netif_running(netif->dev))
-                       __netif_down(netif);
-               rtnl_unlock();
-               netif_put(netif);
-       }
-
-       atomic_dec(&netif->refcnt);
-       wait_event(netif->waiting_to_free, atomic_read(&netif->refcnt) == 0);
-
-       del_timer_sync(&netif->credit_timeout);
-       del_timer_sync(&netif->tx_queue_timeout);
-
-       if (netif->irq)
-               unbind_from_irqhandler(netif->irq, netif);
-       
-       unregister_netdev(netif->dev);
-
-       if (netif->tx.sring) {
-               unmap_frontend_pages(netif);
-               free_vm_area(netif->tx_comms_area);
-               free_vm_area(netif->rx_comms_area);
-       }
-
-       free_netdev(netif->dev);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c b/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c
deleted file mode 100644 (file)
index 8f7c890..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-/******************************************************************************
- * netback/loopback.c
- * 
- * A two-interface loopback device to emulate a local netfront-netback
- * connection. This ensures that local packet delivery looks identical
- * to inter-domain delivery. Most importantly, packets delivered locally
- * originating from other domains will get *copied* when they traverse this
- * driver. This prevents unbounded delays in socket-buffer queues from
- * causing the netback driver to "seize up".
- * 
- * This driver creates a symmetric pair of loopback interfaces with names
- * vif0.0 and veth0. The intention is that 'vif0.0' is bound to an Ethernet
- * bridge, just like a proper netback interface, while a local IP interface
- * is configured on 'veth0'.
- * 
- * As with a real netback interface, vif0.0 is configured with a suitable
- * dummy MAC address. No default is provided for veth0: a reasonable strategy
- * is to transfer eth0's MAC address to veth0, and give eth0 a dummy address
- * (to avoid confusing the Etherbridge).
- * 
- * Copyright (c) 2005 K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/inetdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/ethtool.h>
-#include <net/dst.h>
-#include <net/xfrm.h>          /* secpath_reset() */
-#include <asm/hypervisor.h>    /* is_initial_xendomain() */
-
-static int nloopbacks = -1;
-module_param(nloopbacks, int, 0);
-MODULE_PARM_DESC(nloopbacks, "Number of netback-loopback devices to create");
-
-struct net_private {
-       struct net_device *loopback_dev;
-       struct net_device_stats stats;
-};
-
-static int loopback_open(struct net_device *dev)
-{
-       struct net_private *np = netdev_priv(dev);
-       memset(&np->stats, 0, sizeof(np->stats));
-       netif_start_queue(dev);
-       return 0;
-}
-
-static int loopback_close(struct net_device *dev)
-{
-       netif_stop_queue(dev);
-       return 0;
-}
-
-#ifdef CONFIG_X86
-static int is_foreign(unsigned long pfn)
-{
-       /* NB. Play it safe for auto-translation mode. */
-       return (xen_feature(XENFEAT_auto_translated_physmap) ||
-               (phys_to_machine_mapping[pfn] & FOREIGN_FRAME_BIT));
-}
-#else
-/* How to detect a foreign mapping? Play it safe. */
-#define is_foreign(pfn)        (1)
-#endif
-
-static int skb_remove_foreign_references(struct sk_buff *skb)
-{
-       struct page *page;
-       unsigned long pfn;
-       int i, off;
-       char *vaddr;
-
-       BUG_ON(skb_shinfo(skb)->frag_list);
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               pfn = page_to_pfn(skb_shinfo(skb)->frags[i].page);
-               if (!is_foreign(pfn))
-                       continue;
-               
-               page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-               if (unlikely(!page))
-                       return 0;
-
-               vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
-               off = skb_shinfo(skb)->frags[i].page_offset;
-               memcpy(page_address(page) + off,
-                      vaddr + off,
-                      skb_shinfo(skb)->frags[i].size);
-               kunmap_skb_frag(vaddr);
-
-               put_page(skb_shinfo(skb)->frags[i].page);
-               skb_shinfo(skb)->frags[i].page = page;
-       }
-
-       return 1;
-}
-
-static int loopback_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct net_private *np = netdev_priv(dev);
-
-       if (!skb_remove_foreign_references(skb)) {
-               np->stats.tx_dropped++;
-               dev_kfree_skb(skb);
-               return 0;
-       }
-
-       dst_release(skb->dst);
-       skb->dst = NULL;
-
-       skb_orphan(skb);
-
-       np->stats.tx_bytes += skb->len;
-       np->stats.tx_packets++;
-
-       /* Switch to loopback context. */
-       dev = np->loopback_dev;
-       np  = netdev_priv(dev);
-
-       np->stats.rx_bytes += skb->len;
-       np->stats.rx_packets++;
-
-       if (skb->ip_summed == CHECKSUM_HW) {
-               /* Defer checksum calculation. */
-               skb->proto_csum_blank = 1;
-               /* Must be a local packet: assert its integrity. */
-               skb->proto_data_valid = 1;
-       }
-
-       skb->ip_summed = skb->proto_data_valid ?
-               CHECKSUM_UNNECESSARY : CHECKSUM_NONE;
-
-       skb->pkt_type = PACKET_HOST; /* overridden by eth_type_trans() */
-       skb->protocol = eth_type_trans(skb, dev);
-       skb->dev      = dev;
-       dev->last_rx  = jiffies;
-
-       /* Flush netfilter context: rx'ed skbuffs not expected to have any. */
-       nf_reset(skb);
-       secpath_reset(skb);
-
-       netif_rx(skb);
-
-       return 0;
-}
-
-static struct net_device_stats *loopback_get_stats(struct net_device *dev)
-{
-       struct net_private *np = netdev_priv(dev);
-       return &np->stats;
-}
-
-static struct ethtool_ops network_ethtool_ops =
-{
-       .get_tx_csum = ethtool_op_get_tx_csum,
-       .set_tx_csum = ethtool_op_set_tx_csum,
-       .get_sg = ethtool_op_get_sg,
-       .set_sg = ethtool_op_set_sg,
-       .get_tso = ethtool_op_get_tso,
-       .set_tso = ethtool_op_set_tso,
-       .get_link = ethtool_op_get_link,
-};
-
-/*
- * Nothing to do here. Virtual interface is point-to-point and the
- * physical interface is probably promiscuous anyway.
- */
-static void loopback_set_multicast_list(struct net_device *dev)
-{
-}
-
-static void loopback_construct(struct net_device *dev, struct net_device *lo)
-{
-       struct net_private *np = netdev_priv(dev);
-
-       np->loopback_dev     = lo;
-
-       dev->open            = loopback_open;
-       dev->stop            = loopback_close;
-       dev->hard_start_xmit = loopback_start_xmit;
-       dev->get_stats       = loopback_get_stats;
-       dev->set_multicast_list = loopback_set_multicast_list;
-       dev->change_mtu      = NULL; /* allow arbitrary mtu */
-
-       dev->tx_queue_len    = 0;
-
-       dev->features        = (NETIF_F_HIGHDMA |
-                               NETIF_F_LLTX |
-                               NETIF_F_TSO |
-                               NETIF_F_SG |
-                               NETIF_F_IP_CSUM);
-
-       SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
-
-       /*
-        * We do not set a jumbo MTU on the interface. Otherwise the network
-        * stack will try to send large packets that will get dropped by the
-        * Ethernet bridge (unless the physical Ethernet interface is
-        * configured to transfer jumbo packets). If a larger MTU is desired
-        * then the system administrator can specify it using the 'ifconfig'
-        * command.
-        */
-       /*dev->mtu             = 16*1024;*/
-}
-
-static int __init make_loopback(int i)
-{
-       struct net_device *dev1, *dev2;
-       char dev_name[IFNAMSIZ];
-       int err = -ENOMEM;
-
-       sprintf(dev_name, "vif0.%d", i);
-       dev1 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
-       if (!dev1)
-               return err;
-
-       sprintf(dev_name, "veth%d", i);
-       dev2 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
-       if (!dev2)
-               goto fail_netdev2;
-
-       loopback_construct(dev1, dev2);
-       loopback_construct(dev2, dev1);
-
-       /*
-        * Initialise a dummy MAC address for the 'dummy backend' interface. We
-        * choose the numerically largest non-broadcast address to prevent the
-        * address getting stolen by an Ethernet bridge for STP purposes.
-        */
-       memset(dev1->dev_addr, 0xFF, ETH_ALEN);
-       dev1->dev_addr[0] &= ~0x01;
-
-       if ((err = register_netdev(dev1)) != 0)
-               goto fail;
-
-       if ((err = register_netdev(dev2)) != 0) {
-               unregister_netdev(dev1);
-               goto fail;
-       }
-
-       return 0;
-
- fail:
-       free_netdev(dev2);
- fail_netdev2:
-       free_netdev(dev1);
-       return err;
-}
-
-static void __exit clean_loopback(int i)
-{
-       struct net_device *dev1, *dev2;
-       char dev_name[IFNAMSIZ];
-
-       sprintf(dev_name, "vif0.%d", i);
-       dev1 = dev_get_by_name(dev_name);
-       sprintf(dev_name, "veth%d", i);
-       dev2 = dev_get_by_name(dev_name);
-       if (dev1 && dev2) {
-               unregister_netdev(dev2);
-               unregister_netdev(dev1);
-               free_netdev(dev2);
-               free_netdev(dev1);
-       }
-}
-
-static int __init loopback_init(void)
-{
-       int i, err = 0;
-
-       if (nloopbacks == -1)
-               nloopbacks = is_initial_xendomain() ? 4 : 0;
-
-       for (i = 0; i < nloopbacks; i++)
-               if ((err = make_loopback(i)) != 0)
-                       break;
-
-       return err;
-}
-
-module_init(loopback_init);
-
-static void __exit loopback_exit(void)
-{
-       int i;
-
-       for (i = nloopbacks; i-- > 0; )
-               clean_loopback(i);
-}
-
-module_exit(loopback_exit);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c
deleted file mode 100644 (file)
index 92e1c55..0000000
+++ /dev/null
@@ -1,1606 +0,0 @@
-/******************************************************************************
- * drivers/xen/netback/netback.c
- * 
- * Back-end of the driver for virtual network devices. This portion of the
- * driver exports a 'unified' network-device interface that can be accessed
- * by any operating system that implements a compatible front end. A 
- * reference front-end implementation can be found in:
- *  drivers/xen/netfront/netfront.c
- * 
- * Copyright (c) 2002-2005, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "common.h"
-#include <xen/balloon.h>
-#include <xen/interface/memory.h>
-
-/*define NETBE_DEBUG_INTERRUPT*/
-
-/* extra field used in struct page */
-#define netif_page_index(pg) (*(long *)&(pg)->mapping)
-
-struct netbk_rx_meta {
-       skb_frag_t frag;
-       int id;
-       int copy:1;
-};
-
-struct netbk_tx_pending_inuse {
-       struct list_head list;
-       unsigned long alloc_time;
-};
-
-static void netif_idx_release(u16 pending_idx);
-static void netif_page_release(struct page *page);
-static void make_tx_response(netif_t *netif, 
-                            netif_tx_request_t *txp,
-                            s8       st);
-static netif_rx_response_t *make_rx_response(netif_t *netif, 
-                                            u16      id, 
-                                            s8       st,
-                                            u16      offset,
-                                            u16      size,
-                                            u16      flags);
-
-static void net_tx_action(unsigned long unused);
-static DECLARE_TASKLET(net_tx_tasklet, net_tx_action, 0);
-
-static void net_rx_action(unsigned long unused);
-static DECLARE_TASKLET(net_rx_tasklet, net_rx_action, 0);
-
-static struct timer_list net_timer;
-static struct timer_list netbk_tx_pending_timer;
-
-#define MAX_PENDING_REQS 256
-
-static struct sk_buff_head rx_queue;
-
-static struct page **mmap_pages;
-static inline unsigned long idx_to_pfn(unsigned int idx)
-{
-       return page_to_pfn(mmap_pages[idx]);
-}
-
-static inline unsigned long idx_to_kaddr(unsigned int idx)
-{
-       return (unsigned long)pfn_to_kaddr(idx_to_pfn(idx));
-}
-
-#define PKT_PROT_LEN 64
-
-static struct pending_tx_info {
-       netif_tx_request_t req;
-       netif_t *netif;
-} pending_tx_info[MAX_PENDING_REQS];
-static u16 pending_ring[MAX_PENDING_REQS];
-typedef unsigned int PEND_RING_IDX;
-#define MASK_PEND_IDX(_i) ((_i)&(MAX_PENDING_REQS-1))
-static PEND_RING_IDX pending_prod, pending_cons;
-#define NR_PENDING_REQS (MAX_PENDING_REQS - pending_prod + pending_cons)
-
-/* Freed TX SKBs get batched on this ring before return to pending_ring. */
-static u16 dealloc_ring[MAX_PENDING_REQS];
-static PEND_RING_IDX dealloc_prod, dealloc_cons;
-
-/* Doubly-linked list of in-use pending entries. */
-static struct netbk_tx_pending_inuse pending_inuse[MAX_PENDING_REQS];
-static LIST_HEAD(pending_inuse_head);
-
-static struct sk_buff_head tx_queue;
-
-static grant_handle_t grant_tx_handle[MAX_PENDING_REQS];
-static gnttab_unmap_grant_ref_t tx_unmap_ops[MAX_PENDING_REQS];
-static gnttab_map_grant_ref_t tx_map_ops[MAX_PENDING_REQS];
-
-static struct list_head net_schedule_list;
-static spinlock_t net_schedule_list_lock;
-
-#define MAX_MFN_ALLOC 64
-static unsigned long mfn_list[MAX_MFN_ALLOC];
-static unsigned int alloc_index = 0;
-
-/* Setting this allows the safe use of this driver without netloop. */
-static int MODPARM_copy_skb;
-module_param_named(copy_skb, MODPARM_copy_skb, bool, 0);
-MODULE_PARM_DESC(copy_skb, "Copy data received from netfront without netloop");
-
-int netbk_copy_skb_mode;
-
-static inline unsigned long alloc_mfn(void)
-{
-       BUG_ON(alloc_index == 0);
-       return mfn_list[--alloc_index];
-}
-
-static int check_mfn(int nr)
-{
-       struct xen_memory_reservation reservation = {
-               .extent_order = 0,
-               .domid        = DOMID_SELF
-       };
-
-       if (likely(alloc_index >= nr))
-               return 0;
-
-       set_xen_guest_handle(reservation.extent_start, mfn_list + alloc_index);
-       reservation.nr_extents = MAX_MFN_ALLOC - alloc_index;
-       alloc_index += HYPERVISOR_memory_op(XENMEM_increase_reservation,
-                                           &reservation);
-
-       return alloc_index >= nr ? 0 : -ENOMEM;
-}
-
-static inline void maybe_schedule_tx_action(void)
-{
-       smp_mb();
-       if ((NR_PENDING_REQS < (MAX_PENDING_REQS/2)) &&
-           !list_empty(&net_schedule_list))
-               tasklet_schedule(&net_tx_tasklet);
-}
-
-static struct sk_buff *netbk_copy_skb(struct sk_buff *skb)
-{
-       struct skb_shared_info *ninfo;
-       struct sk_buff *nskb;
-       unsigned long offset;
-       int ret;
-       int len;
-       int headlen;
-
-       BUG_ON(skb_shinfo(skb)->frag_list != NULL);
-
-       nskb = alloc_skb(SKB_MAX_HEAD(0), GFP_ATOMIC | __GFP_NOWARN);
-       if (unlikely(!nskb))
-               goto err;
-
-       skb_reserve(nskb, 16 + NET_IP_ALIGN);
-       headlen = nskb->end - nskb->data;
-       if (headlen > skb_headlen(skb))
-               headlen = skb_headlen(skb);
-       ret = skb_copy_bits(skb, 0, __skb_put(nskb, headlen), headlen);
-       BUG_ON(ret);
-
-       ninfo = skb_shinfo(nskb);
-       ninfo->gso_size = skb_shinfo(skb)->gso_size;
-       ninfo->gso_type = skb_shinfo(skb)->gso_type;
-
-       offset = headlen;
-       len = skb->len - headlen;
-
-       nskb->len = skb->len;
-       nskb->data_len = len;
-       nskb->truesize += len;
-
-       while (len) {
-               struct page *page;
-               int copy;
-               int zero;
-
-               if (unlikely(ninfo->nr_frags >= MAX_SKB_FRAGS)) {
-                       dump_stack();
-                       goto err_free;
-               }
-
-               copy = len >= PAGE_SIZE ? PAGE_SIZE : len;
-               zero = len >= PAGE_SIZE ? 0 : __GFP_ZERO;
-
-               page = alloc_page(GFP_ATOMIC | __GFP_NOWARN | zero);
-               if (unlikely(!page))
-                       goto err_free;
-
-               ret = skb_copy_bits(skb, offset, page_address(page), copy);
-               BUG_ON(ret);
-
-               ninfo->frags[ninfo->nr_frags].page = page;
-               ninfo->frags[ninfo->nr_frags].page_offset = 0;
-               ninfo->frags[ninfo->nr_frags].size = copy;
-               ninfo->nr_frags++;
-
-               offset += copy;
-               len -= copy;
-       }
-
-       offset = nskb->data - skb->data;
-
-       nskb->h.raw = skb->h.raw + offset;
-       nskb->nh.raw = skb->nh.raw + offset;
-       nskb->mac.raw = skb->mac.raw + offset;
-
-       return nskb;
-
- err_free:
-       kfree_skb(nskb);
- err:
-       return NULL;
-}
-
-static inline int netbk_max_required_rx_slots(netif_t *netif)
-{
-       if (netif->features & (NETIF_F_SG|NETIF_F_TSO))
-               return MAX_SKB_FRAGS + 2; /* header + extra_info + frags */
-       return 1; /* all in one */
-}
-
-static inline int netbk_queue_full(netif_t *netif)
-{
-       RING_IDX peek   = netif->rx_req_cons_peek;
-       RING_IDX needed = netbk_max_required_rx_slots(netif);
-
-       return ((netif->rx.sring->req_prod - peek) < needed) ||
-              ((netif->rx.rsp_prod_pvt + NET_RX_RING_SIZE - peek) < needed);
-}
-
-static void tx_queue_callback(unsigned long data)
-{
-       netif_t *netif = (netif_t *)data;
-       if (netif_schedulable(netif))
-               netif_wake_queue(netif->dev);
-}
-
-int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-
-       BUG_ON(skb->dev != dev);
-
-       /* Drop the packet if the target domain has no receive buffers. */
-       if (unlikely(!netif_schedulable(netif) || netbk_queue_full(netif)))
-               goto drop;
-
-       /*
-        * Copy the packet here if it's destined for a flipping interface
-        * but isn't flippable (e.g. extra references to data).
-        * XXX For now we also copy skbuffs whose head crosses a page
-        * boundary, because netbk_gop_skb can't handle them.
-        */
-       if (!netif->copying_receiver ||
-           ((skb_headlen(skb) + offset_in_page(skb->data)) >= PAGE_SIZE)) {
-               struct sk_buff *nskb = netbk_copy_skb(skb);
-               if ( unlikely(nskb == NULL) )
-                       goto drop;
-               /* Copy only the header fields we use in this driver. */
-               nskb->dev = skb->dev;
-               nskb->ip_summed = skb->ip_summed;
-               nskb->proto_data_valid = skb->proto_data_valid;
-               dev_kfree_skb(skb);
-               skb = nskb;
-       }
-
-       netif->rx_req_cons_peek += skb_shinfo(skb)->nr_frags + 1 +
-                                  !!skb_shinfo(skb)->gso_size;
-       netif_get(netif);
-
-       if (netbk_can_queue(dev) && netbk_queue_full(netif)) {
-               netif->rx.sring->req_event = netif->rx_req_cons_peek +
-                       netbk_max_required_rx_slots(netif);
-               mb(); /* request notification /then/ check & stop the queue */
-               if (netbk_queue_full(netif)) {
-                       netif_stop_queue(dev);
-                       /*
-                        * Schedule 500ms timeout to restart the queue, thus
-                        * ensuring that an inactive queue will be drained.
-                        * Packets will be immediately be dropped until more
-                        * receive buffers become available (see
-                        * netbk_queue_full() check above).
-                        */
-                       netif->tx_queue_timeout.data = (unsigned long)netif;
-                       netif->tx_queue_timeout.function = tx_queue_callback;
-                       __mod_timer(&netif->tx_queue_timeout, jiffies + HZ/2);
-               }
-       }
-
-       skb_queue_tail(&rx_queue, skb);
-       tasklet_schedule(&net_rx_tasklet);
-
-       return 0;
-
- drop:
-       netif->stats.tx_dropped++;
-       dev_kfree_skb(skb);
-       return 0;
-}
-
-#if 0
-static void xen_network_done_notify(void)
-{
-       static struct net_device *eth0_dev = NULL;
-       if (unlikely(eth0_dev == NULL))
-               eth0_dev = __dev_get_by_name("eth0");
-       netif_rx_schedule(eth0_dev);
-}
-/* 
- * Add following to poll() function in NAPI driver (Tigon3 is example):
- *  if ( xen_network_done() )
- *      tg3_enable_ints(tp);
- */
-int xen_network_done(void)
-{
-       return skb_queue_empty(&rx_queue);
-}
-#endif
-
-struct netrx_pending_operations {
-       unsigned trans_prod, trans_cons;
-       unsigned mmu_prod, mmu_cons;
-       unsigned mcl_prod, mcl_cons;
-       unsigned copy_prod, copy_cons;
-       unsigned meta_prod, meta_cons;
-       mmu_update_t *mmu;
-       gnttab_transfer_t *trans;
-       gnttab_copy_t *copy;
-       multicall_entry_t *mcl;
-       struct netbk_rx_meta *meta;
-};
-
-/* Set up the grant operations for this fragment.  If it's a flipping
-   interface, we also set up the unmap request from here. */
-static u16 netbk_gop_frag(netif_t *netif, struct netbk_rx_meta *meta,
-                         int i, struct netrx_pending_operations *npo,
-                         struct page *page, unsigned long size,
-                         unsigned long offset)
-{
-       mmu_update_t *mmu;
-       gnttab_transfer_t *gop;
-       gnttab_copy_t *copy_gop;
-       multicall_entry_t *mcl;
-       netif_rx_request_t *req;
-       unsigned long old_mfn, new_mfn;
-
-       old_mfn = virt_to_mfn(page_address(page));
-
-       req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i);
-       if (netif->copying_receiver) {
-               /* The fragment needs to be copied rather than
-                  flipped. */
-               meta->copy = 1;
-               copy_gop = npo->copy + npo->copy_prod++;
-               copy_gop->flags = GNTCOPY_dest_gref;
-               if (PageForeign(page)) {
-                       struct pending_tx_info *src_pend =
-                               &pending_tx_info[netif_page_index(page)];
-                       copy_gop->source.domid = src_pend->netif->domid;
-                       copy_gop->source.u.ref = src_pend->req.gref;
-                       copy_gop->flags |= GNTCOPY_source_gref;
-               } else {
-                       copy_gop->source.domid = DOMID_SELF;
-                       copy_gop->source.u.gmfn = old_mfn;
-               }
-               copy_gop->source.offset = offset;
-               copy_gop->dest.domid = netif->domid;
-               copy_gop->dest.offset = 0;
-               copy_gop->dest.u.ref = req->gref;
-               copy_gop->len = size;
-       } else {
-               meta->copy = 0;
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       new_mfn = alloc_mfn();
-
-                       /*
-                        * Set the new P2M table entry before
-                        * reassigning the old data page. Heed the
-                        * comment in pgtable-2level.h:pte_page(). :-)
-                        */
-                       set_phys_to_machine(page_to_pfn(page), new_mfn);
-
-                       mcl = npo->mcl + npo->mcl_prod++;
-                       MULTI_update_va_mapping(mcl,
-                                            (unsigned long)page_address(page),
-                                            pfn_pte_ma(new_mfn, PAGE_KERNEL),
-                                            0);
-
-                       mmu = npo->mmu + npo->mmu_prod++;
-                       mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
-                               MMU_MACHPHYS_UPDATE;
-                       mmu->val = page_to_pfn(page);
-               }
-
-               gop = npo->trans + npo->trans_prod++;
-               gop->mfn = old_mfn;
-               gop->domid = netif->domid;
-               gop->ref = req->gref;
-       }
-       return req->id;
-}
-
-static void netbk_gop_skb(struct sk_buff *skb,
-                         struct netrx_pending_operations *npo)
-{
-       netif_t *netif = netdev_priv(skb->dev);
-       int nr_frags = skb_shinfo(skb)->nr_frags;
-       int i;
-       int extra;
-       struct netbk_rx_meta *head_meta, *meta;
-
-       head_meta = npo->meta + npo->meta_prod++;
-       head_meta->frag.page_offset = skb_shinfo(skb)->gso_type;
-       head_meta->frag.size = skb_shinfo(skb)->gso_size;
-       extra = !!head_meta->frag.size + 1;
-
-       for (i = 0; i < nr_frags; i++) {
-               meta = npo->meta + npo->meta_prod++;
-               meta->frag = skb_shinfo(skb)->frags[i];
-               meta->id = netbk_gop_frag(netif, meta, i + extra, npo,
-                                         meta->frag.page,
-                                         meta->frag.size,
-                                         meta->frag.page_offset);
-       }
-
-       /*
-        * This must occur at the end to ensure that we don't trash skb_shinfo
-        * until we're done. We know that the head doesn't cross a page
-        * boundary because such packets get copied in netif_be_start_xmit.
-        */
-       head_meta->id = netbk_gop_frag(netif, head_meta, 0, npo,
-                                      virt_to_page(skb->data),
-                                      skb_headlen(skb),
-                                      offset_in_page(skb->data));
-
-       netif->rx.req_cons += nr_frags + extra;
-}
-
-static inline void netbk_free_pages(int nr_frags, struct netbk_rx_meta *meta)
-{
-       int i;
-
-       for (i = 0; i < nr_frags; i++)
-               put_page(meta[i].frag.page);
-}
-
-/* This is a twin to netbk_gop_skb.  Assume that netbk_gop_skb was
-   used to set up the operations on the top of
-   netrx_pending_operations, which have since been done.  Check that
-   they didn't give any errors and advance over them. */
-static int netbk_check_gop(int nr_frags, domid_t domid,
-                          struct netrx_pending_operations *npo)
-{
-       multicall_entry_t *mcl;
-       gnttab_transfer_t *gop;
-       gnttab_copy_t     *copy_op;
-       int status = NETIF_RSP_OKAY;
-       int i;
-
-       for (i = 0; i <= nr_frags; i++) {
-               if (npo->meta[npo->meta_cons + i].copy) {
-                       copy_op = npo->copy + npo->copy_cons++;
-                       if (copy_op->status != GNTST_okay) {
-                               DPRINTK("Bad status %d from copy to DOM%d.\n",
-                                       copy_op->status, domid);
-                               status = NETIF_RSP_ERROR;
-                       }
-               } else {
-                       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                               mcl = npo->mcl + npo->mcl_cons++;
-                               /* The update_va_mapping() must not fail. */
-                               BUG_ON(mcl->result != 0);
-                       }
-
-                       gop = npo->trans + npo->trans_cons++;
-                       /* Check the reassignment error code. */
-                       if (gop->status != 0) {
-                               DPRINTK("Bad status %d from grant transfer to DOM%u\n",
-                                       gop->status, domid);
-                               /*
-                                * Page no longer belongs to us unless
-                                * GNTST_bad_page, but that should be
-                                * a fatal error anyway.
-                                */
-                               BUG_ON(gop->status == GNTST_bad_page);
-                               status = NETIF_RSP_ERROR;
-                       }
-               }
-       }
-
-       return status;
-}
-
-static void netbk_add_frag_responses(netif_t *netif, int status,
-                                    struct netbk_rx_meta *meta, int nr_frags)
-{
-       int i;
-       unsigned long offset;
-
-       for (i = 0; i < nr_frags; i++) {
-               int id = meta[i].id;
-               int flags = (i == nr_frags - 1) ? 0 : NETRXF_more_data;
-
-               if (meta[i].copy)
-                       offset = 0;
-               else
-                       offset = meta[i].frag.page_offset;
-               make_rx_response(netif, id, status, offset,
-                                meta[i].frag.size, flags);
-       }
-}
-
-static void net_rx_action(unsigned long unused)
-{
-       netif_t *netif = NULL;
-       s8 status;
-       u16 id, irq, flags;
-       netif_rx_response_t *resp;
-       multicall_entry_t *mcl;
-       struct sk_buff_head rxq;
-       struct sk_buff *skb;
-       int notify_nr = 0;
-       int ret;
-       int nr_frags;
-       int count;
-       unsigned long offset;
-
-       /*
-        * Putting hundreds of bytes on the stack is considered rude.
-        * Static works because a tasklet can only be on one CPU at any time.
-        */
-       static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+3];
-       static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
-       static gnttab_transfer_t grant_trans_op[NET_RX_RING_SIZE];
-       static gnttab_copy_t grant_copy_op[NET_RX_RING_SIZE];
-       static unsigned char rx_notify[NR_IRQS];
-       static u16 notify_list[NET_RX_RING_SIZE];
-       static struct netbk_rx_meta meta[NET_RX_RING_SIZE];
-
-       struct netrx_pending_operations npo = {
-               mmu: rx_mmu,
-               trans: grant_trans_op,
-               copy: grant_copy_op,
-               mcl: rx_mcl,
-               meta: meta};
-
-       skb_queue_head_init(&rxq);
-
-       count = 0;
-
-       while ((skb = skb_dequeue(&rx_queue)) != NULL) {
-               nr_frags = skb_shinfo(skb)->nr_frags;
-               *(int *)skb->cb = nr_frags;
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap) &&
-                   !((netif_t *)netdev_priv(skb->dev))->copying_receiver &&
-                   check_mfn(nr_frags + 1)) {
-                       /* Memory squeeze? Back off for an arbitrary while. */
-                       if ( net_ratelimit() )
-                               WPRINTK("Memory squeeze in netback "
-                                       "driver.\n");
-                       mod_timer(&net_timer, jiffies + HZ);
-                       skb_queue_head(&rx_queue, skb);
-                       break;
-               }
-
-               netbk_gop_skb(skb, &npo);
-
-               count += nr_frags + 1;
-
-               __skb_queue_tail(&rxq, skb);
-
-               /* Filled the batch queue? */
-               if (count + MAX_SKB_FRAGS >= NET_RX_RING_SIZE)
-                       break;
-       }
-
-       if (npo.mcl_prod &&
-           !xen_feature(XENFEAT_auto_translated_physmap)) {
-               mcl = npo.mcl + npo.mcl_prod++;
-
-               BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
-               mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
-
-               mcl->op = __HYPERVISOR_mmu_update;
-               mcl->args[0] = (unsigned long)rx_mmu;
-               mcl->args[1] = npo.mmu_prod;
-               mcl->args[2] = 0;
-               mcl->args[3] = DOMID_SELF;
-       }
-
-       if (npo.trans_prod) {
-               mcl = npo.mcl + npo.mcl_prod++;
-               mcl->op = __HYPERVISOR_grant_table_op;
-               mcl->args[0] = GNTTABOP_transfer;
-               mcl->args[1] = (unsigned long)grant_trans_op;
-               mcl->args[2] = npo.trans_prod;
-       }
-
-       if (npo.copy_prod) {
-               mcl = npo.mcl + npo.mcl_prod++;
-               mcl->op = __HYPERVISOR_grant_table_op;
-               mcl->args[0] = GNTTABOP_copy;
-               mcl->args[1] = (unsigned long)grant_copy_op;
-               mcl->args[2] = npo.copy_prod;
-       }
-
-       /* Nothing to do? */
-       if (!npo.mcl_prod)
-               return;
-
-       BUG_ON(npo.copy_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.mmu_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.trans_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.mcl_prod > NET_RX_RING_SIZE+3);
-       BUG_ON(npo.meta_prod > NET_RX_RING_SIZE);
-
-       ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
-       BUG_ON(ret != 0);
-
-       while ((skb = __skb_dequeue(&rxq)) != NULL) {
-               nr_frags = *(int *)skb->cb;
-
-               netif = netdev_priv(skb->dev);
-               /* We can't rely on skb_release_data to release the
-                  pages used by fragments for us, since it tries to
-                  touch the pages in the fraglist.  If we're in
-                  flipping mode, that doesn't work.  In copying mode,
-                  we still have access to all of the pages, and so
-                  it's safe to let release_data deal with it. */
-               /* (Freeing the fragments is safe since we copy
-                  non-linear skbs destined for flipping interfaces) */
-               if (!netif->copying_receiver) {
-                       atomic_set(&(skb_shinfo(skb)->dataref), 1);
-                       skb_shinfo(skb)->frag_list = NULL;
-                       skb_shinfo(skb)->nr_frags = 0;
-                       netbk_free_pages(nr_frags, meta + npo.meta_cons + 1);
-               }
-
-               netif->stats.tx_bytes += skb->len;
-               netif->stats.tx_packets++;
-
-               status = netbk_check_gop(nr_frags, netif->domid, &npo);
-
-               id = meta[npo.meta_cons].id;
-               flags = nr_frags ? NETRXF_more_data : 0;
-
-               if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
-                       flags |= NETRXF_csum_blank | NETRXF_data_validated;
-               else if (skb->proto_data_valid) /* remote but checksummed? */
-                       flags |= NETRXF_data_validated;
-
-               if (meta[npo.meta_cons].copy)
-                       offset = 0;
-               else
-                       offset = offset_in_page(skb->data);
-               resp = make_rx_response(netif, id, status, offset,
-                                       skb_headlen(skb), flags);
-
-               if (meta[npo.meta_cons].frag.size) {
-                       struct netif_extra_info *gso =
-                               (struct netif_extra_info *)
-                               RING_GET_RESPONSE(&netif->rx,
-                                                 netif->rx.rsp_prod_pvt++);
-
-                       resp->flags |= NETRXF_extra_info;
-
-                       gso->u.gso.size = meta[npo.meta_cons].frag.size;
-                       gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
-                       gso->u.gso.pad = 0;
-                       gso->u.gso.features = 0;
-
-                       gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
-                       gso->flags = 0;
-               }
-
-               netbk_add_frag_responses(netif, status,
-                                        meta + npo.meta_cons + 1,
-                                        nr_frags);
-
-               RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret);
-               irq = netif->irq;
-               if (ret && !rx_notify[irq]) {
-                       rx_notify[irq] = 1;
-                       notify_list[notify_nr++] = irq;
-               }
-
-               if (netif_queue_stopped(netif->dev) &&
-                   netif_schedulable(netif) &&
-                   !netbk_queue_full(netif))
-                       netif_wake_queue(netif->dev);
-
-               netif_put(netif);
-               dev_kfree_skb(skb);
-               npo.meta_cons += nr_frags + 1;
-       }
-
-       while (notify_nr != 0) {
-               irq = notify_list[--notify_nr];
-               rx_notify[irq] = 0;
-               notify_remote_via_irq(irq);
-       }
-
-       /* More work to do? */
-       if (!skb_queue_empty(&rx_queue) && !timer_pending(&net_timer))
-               tasklet_schedule(&net_rx_tasklet);
-#if 0
-       else
-               xen_network_done_notify();
-#endif
-}
-
-static void net_alarm(unsigned long unused)
-{
-       tasklet_schedule(&net_rx_tasklet);
-}
-
-static void netbk_tx_pending_timeout(unsigned long unused)
-{
-       tasklet_schedule(&net_tx_tasklet);
-}
-
-struct net_device_stats *netif_be_get_stats(struct net_device *dev)
-{
-       netif_t *netif = netdev_priv(dev);
-       return &netif->stats;
-}
-
-static int __on_net_schedule_list(netif_t *netif)
-{
-       return netif->list.next != NULL;
-}
-
-static void remove_from_net_schedule_list(netif_t *netif)
-{
-       spin_lock_irq(&net_schedule_list_lock);
-       if (likely(__on_net_schedule_list(netif))) {
-               list_del(&netif->list);
-               netif->list.next = NULL;
-               netif_put(netif);
-       }
-       spin_unlock_irq(&net_schedule_list_lock);
-}
-
-static void add_to_net_schedule_list_tail(netif_t *netif)
-{
-       if (__on_net_schedule_list(netif))
-               return;
-
-       spin_lock_irq(&net_schedule_list_lock);
-       if (!__on_net_schedule_list(netif) &&
-           likely(netif_schedulable(netif))) {
-               list_add_tail(&netif->list, &net_schedule_list);
-               netif_get(netif);
-       }
-       spin_unlock_irq(&net_schedule_list_lock);
-}
-
-/*
- * Note on CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER:
- * If this driver is pipelining transmit requests then we can be very
- * aggressive in avoiding new-packet notifications -- frontend only needs to
- * send a notification if there are no outstanding unreceived responses.
- * If we may be buffer transmit buffers for any reason then we must be rather
- * more conservative and treat this as the final check for pending work.
- */
-void netif_schedule_work(netif_t *netif)
-{
-       int more_to_do;
-
-#ifdef CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER
-       more_to_do = RING_HAS_UNCONSUMED_REQUESTS(&netif->tx);
-#else
-       RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, more_to_do);
-#endif
-
-       if (more_to_do) {
-               add_to_net_schedule_list_tail(netif);
-               maybe_schedule_tx_action();
-       }
-}
-
-void netif_deschedule_work(netif_t *netif)
-{
-       remove_from_net_schedule_list(netif);
-}
-
-
-static void tx_add_credit(netif_t *netif)
-{
-       unsigned long max_burst, max_credit;
-
-       /*
-        * Allow a burst big enough to transmit a jumbo packet of up to 128kB.
-        * Otherwise the interface can seize up due to insufficient credit.
-        */
-       max_burst = RING_GET_REQUEST(&netif->tx, netif->tx.req_cons)->size;
-       max_burst = min(max_burst, 131072UL);
-       max_burst = max(max_burst, netif->credit_bytes);
-
-       /* Take care that adding a new chunk of credit doesn't wrap to zero. */
-       max_credit = netif->remaining_credit + netif->credit_bytes;
-       if (max_credit < netif->remaining_credit)
-               max_credit = ULONG_MAX; /* wrapped: clamp to ULONG_MAX */
-
-       netif->remaining_credit = min(max_credit, max_burst);
-}
-
-static void tx_credit_callback(unsigned long data)
-{
-       netif_t *netif = (netif_t *)data;
-       tx_add_credit(netif);
-       netif_schedule_work(netif);
-}
-
-static inline int copy_pending_req(PEND_RING_IDX pending_idx)
-{
-       return gnttab_copy_grant_page(grant_tx_handle[pending_idx],
-                                     &mmap_pages[pending_idx]);
-}
-
-inline static void net_tx_action_dealloc(void)
-{
-       struct netbk_tx_pending_inuse *inuse, *n;
-       gnttab_unmap_grant_ref_t *gop;
-       u16 pending_idx;
-       PEND_RING_IDX dc, dp;
-       netif_t *netif;
-       int ret;
-       LIST_HEAD(list);
-
-       dc = dealloc_cons;
-       gop = tx_unmap_ops;
-
-       /*
-        * Free up any grants we have finished using
-        */
-       do {
-               dp = dealloc_prod;
-
-               /* Ensure we see all indices enqueued by netif_idx_release(). */
-               smp_rmb();
-
-               while (dc != dp) {
-                       unsigned long pfn;
-
-                       pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)];
-                       list_move_tail(&pending_inuse[pending_idx].list, &list);
-
-                       pfn = idx_to_pfn(pending_idx);
-                       /* Already unmapped? */
-                       if (!phys_to_machine_mapping_valid(pfn))
-                               continue;
-
-                       gnttab_set_unmap_op(gop, idx_to_kaddr(pending_idx),
-                                           GNTMAP_host_map,
-                                           grant_tx_handle[pending_idx]);
-                       gop++;
-               }
-
-               if (netbk_copy_skb_mode != NETBK_DELAYED_COPY_SKB ||
-                   list_empty(&pending_inuse_head))
-                       break;
-
-               /* Copy any entries that have been pending for too long. */
-               list_for_each_entry_safe(inuse, n, &pending_inuse_head, list) {
-                       if (time_after(inuse->alloc_time + HZ / 2, jiffies))
-                               break;
-
-                       switch (copy_pending_req(inuse - pending_inuse)) {
-                       case 0:
-                               list_move_tail(&inuse->list, &list);
-                               continue;
-                       case -EBUSY:
-                               list_del_init(&inuse->list);
-                               continue;
-                       case -ENOENT:
-                               continue;
-                       }
-
-                       break;
-               }
-       } while (dp != dealloc_prod);
-
-       dealloc_cons = dc;
-
-       ret = HYPERVISOR_grant_table_op(
-               GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops);
-       BUG_ON(ret);
-
-       list_for_each_entry_safe(inuse, n, &list, list) {
-               pending_idx = inuse - pending_inuse;
-
-               netif = pending_tx_info[pending_idx].netif;
-
-               make_tx_response(netif, &pending_tx_info[pending_idx].req, 
-                                NETIF_RSP_OKAY);
-
-               /* Ready for next use. */
-               gnttab_reset_grant_page(mmap_pages[pending_idx]);
-
-               pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-
-               netif_put(netif);
-
-               list_del_init(&inuse->list);
-       }
-}
-
-static void netbk_tx_err(netif_t *netif, netif_tx_request_t *txp, RING_IDX end)
-{
-       RING_IDX cons = netif->tx.req_cons;
-
-       do {
-               make_tx_response(netif, txp, NETIF_RSP_ERROR);
-               if (cons >= end)
-                       break;
-               txp = RING_GET_REQUEST(&netif->tx, cons++);
-       } while (1);
-       netif->tx.req_cons = cons;
-       netif_schedule_work(netif);
-       netif_put(netif);
-}
-
-static int netbk_count_requests(netif_t *netif, netif_tx_request_t *first,
-                               netif_tx_request_t *txp, int work_to_do)
-{
-       RING_IDX cons = netif->tx.req_cons;
-       int frags = 0;
-
-       if (!(first->flags & NETTXF_more_data))
-               return 0;
-
-       do {
-               if (frags >= work_to_do) {
-                       DPRINTK("Need more frags\n");
-                       return -frags;
-               }
-
-               if (unlikely(frags >= MAX_SKB_FRAGS)) {
-                       DPRINTK("Too many frags\n");
-                       return -frags;
-               }
-
-               memcpy(txp, RING_GET_REQUEST(&netif->tx, cons + frags),
-                      sizeof(*txp));
-               if (txp->size > first->size) {
-                       DPRINTK("Frags galore\n");
-                       return -frags;
-               }
-
-               first->size -= txp->size;
-               frags++;
-
-               if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) {
-                       DPRINTK("txp->offset: %x, size: %u\n",
-                               txp->offset, txp->size);
-                       return -frags;
-               }
-       } while ((txp++)->flags & NETTXF_more_data);
-
-       return frags;
-}
-
-static gnttab_map_grant_ref_t *netbk_get_requests(netif_t *netif,
-                                                 struct sk_buff *skb,
-                                                 netif_tx_request_t *txp,
-                                                 gnttab_map_grant_ref_t *mop)
-{
-       struct skb_shared_info *shinfo = skb_shinfo(skb);
-       skb_frag_t *frags = shinfo->frags;
-       unsigned long pending_idx = *((u16 *)skb->data);
-       int i, start;
-
-       /* Skip first skb fragment if it is on same page as header fragment. */
-       start = ((unsigned long)shinfo->frags[0].page == pending_idx);
-
-       for (i = start; i < shinfo->nr_frags; i++, txp++) {
-               pending_idx = pending_ring[MASK_PEND_IDX(pending_cons++)];
-
-               gnttab_set_map_op(mop++, idx_to_kaddr(pending_idx),
-                                 GNTMAP_host_map | GNTMAP_readonly,
-                                 txp->gref, netif->domid);
-
-               memcpy(&pending_tx_info[pending_idx].req, txp, sizeof(*txp));
-               netif_get(netif);
-               pending_tx_info[pending_idx].netif = netif;
-               frags[i].page = (void *)pending_idx;
-       }
-
-       return mop;
-}
-
-static int netbk_tx_check_mop(struct sk_buff *skb,
-                              gnttab_map_grant_ref_t **mopp)
-{
-       gnttab_map_grant_ref_t *mop = *mopp;
-       int pending_idx = *((u16 *)skb->data);
-       netif_t *netif = pending_tx_info[pending_idx].netif;
-       netif_tx_request_t *txp;
-       struct skb_shared_info *shinfo = skb_shinfo(skb);
-       int nr_frags = shinfo->nr_frags;
-       int i, err, start;
-
-       /* Check status of header. */
-       err = mop->status;
-       if (unlikely(err)) {
-               txp = &pending_tx_info[pending_idx].req;
-               make_tx_response(netif, txp, NETIF_RSP_ERROR);
-               pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-               netif_put(netif);
-       } else {
-               set_phys_to_machine(
-                       __pa(idx_to_kaddr(pending_idx)) >> PAGE_SHIFT,
-                       FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT));
-               grant_tx_handle[pending_idx] = mop->handle;
-       }
-
-       /* Skip first skb fragment if it is on same page as header fragment. */
-       start = ((unsigned long)shinfo->frags[0].page == pending_idx);
-
-       for (i = start; i < nr_frags; i++) {
-               int j, newerr;
-
-               pending_idx = (unsigned long)shinfo->frags[i].page;
-
-               /* Check error status: if okay then remember grant handle. */
-               newerr = (++mop)->status;
-               if (likely(!newerr)) {
-                       set_phys_to_machine(
-                               __pa(idx_to_kaddr(pending_idx))>>PAGE_SHIFT,
-                               FOREIGN_FRAME(mop->dev_bus_addr>>PAGE_SHIFT));
-                       grant_tx_handle[pending_idx] = mop->handle;
-                       /* Had a previous error? Invalidate this fragment. */
-                       if (unlikely(err))
-                               netif_idx_release(pending_idx);
-                       continue;
-               }
-
-               /* Error on this fragment: respond to client with an error. */
-               txp = &pending_tx_info[pending_idx].req;
-               make_tx_response(netif, txp, NETIF_RSP_ERROR);
-               pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-               netif_put(netif);
-
-               /* Not the first error? Preceding frags already invalidated. */
-               if (err)
-                       continue;
-
-               /* First error: invalidate header and preceding fragments. */
-               pending_idx = *((u16 *)skb->data);
-               netif_idx_release(pending_idx);
-               for (j = start; j < i; j++) {
-                       pending_idx = (unsigned long)shinfo->frags[i].page;
-                       netif_idx_release(pending_idx);
-               }
-
-               /* Remember the error: invalidate all subsequent fragments. */
-               err = newerr;
-       }
-
-       *mopp = mop + 1;
-       return err;
-}
-
-static void netbk_fill_frags(struct sk_buff *skb)
-{
-       struct skb_shared_info *shinfo = skb_shinfo(skb);
-       int nr_frags = shinfo->nr_frags;
-       int i;
-
-       for (i = 0; i < nr_frags; i++) {
-               skb_frag_t *frag = shinfo->frags + i;
-               netif_tx_request_t *txp;
-               unsigned long pending_idx;
-
-               pending_idx = (unsigned long)frag->page;
-
-               pending_inuse[pending_idx].alloc_time = jiffies;
-               list_add_tail(&pending_inuse[pending_idx].list,
-                             &pending_inuse_head);
-
-               txp = &pending_tx_info[pending_idx].req;
-               frag->page = virt_to_page(idx_to_kaddr(pending_idx));
-               frag->size = txp->size;
-               frag->page_offset = txp->offset;
-
-               skb->len += txp->size;
-               skb->data_len += txp->size;
-               skb->truesize += txp->size;
-       }
-}
-
-int netbk_get_extras(netif_t *netif, struct netif_extra_info *extras,
-                    int work_to_do)
-{
-       struct netif_extra_info extra;
-       RING_IDX cons = netif->tx.req_cons;
-
-       do {
-               if (unlikely(work_to_do-- <= 0)) {
-                       DPRINTK("Missing extra info\n");
-                       return -EBADR;
-               }
-
-               memcpy(&extra, RING_GET_REQUEST(&netif->tx, cons),
-                      sizeof(extra));
-               if (unlikely(!extra.type ||
-                            extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
-                       netif->tx.req_cons = ++cons;
-                       DPRINTK("Invalid extra type: %d\n", extra.type);
-                       return -EINVAL;
-               }
-
-               memcpy(&extras[extra.type - 1], &extra, sizeof(extra));
-               netif->tx.req_cons = ++cons;
-       } while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE);
-
-       return work_to_do;
-}
-
-static int netbk_set_skb_gso(struct sk_buff *skb, struct netif_extra_info *gso)
-{
-       if (!gso->u.gso.size) {
-               DPRINTK("GSO size must not be zero.\n");
-               return -EINVAL;
-       }
-
-       /* Currently only TCPv4 S.O. is supported. */
-       if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
-               DPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
-               return -EINVAL;
-       }
-
-       skb_shinfo(skb)->gso_size = gso->u.gso.size;
-       skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
-
-       /* Header must be checked, and gso_segs computed. */
-       skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
-       skb_shinfo(skb)->gso_segs = 0;
-
-       return 0;
-}
-
-/* Called after netfront has transmitted */
-static void net_tx_action(unsigned long unused)
-{
-       struct list_head *ent;
-       struct sk_buff *skb;
-       netif_t *netif;
-       netif_tx_request_t txreq;
-       netif_tx_request_t txfrags[MAX_SKB_FRAGS];
-       struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
-       u16 pending_idx;
-       RING_IDX i;
-       gnttab_map_grant_ref_t *mop;
-       unsigned int data_len;
-       int ret, work_to_do;
-
-       if (dealloc_cons != dealloc_prod)
-               net_tx_action_dealloc();
-
-       mop = tx_map_ops;
-       while (((NR_PENDING_REQS + MAX_SKB_FRAGS) < MAX_PENDING_REQS) &&
-               !list_empty(&net_schedule_list)) {
-               /* Get a netif from the list with work to do. */
-               ent = net_schedule_list.next;
-               netif = list_entry(ent, netif_t, list);
-               netif_get(netif);
-               remove_from_net_schedule_list(netif);
-
-               RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, work_to_do);
-               if (!work_to_do) {
-                       netif_put(netif);
-                       continue;
-               }
-
-               i = netif->tx.req_cons;
-               rmb(); /* Ensure that we see the request before we copy it. */
-               memcpy(&txreq, RING_GET_REQUEST(&netif->tx, i), sizeof(txreq));
-
-               /* Credit-based scheduling. */
-               if (txreq.size > netif->remaining_credit) {
-                       unsigned long now = jiffies;
-                       unsigned long next_credit = 
-                               netif->credit_timeout.expires +
-                               msecs_to_jiffies(netif->credit_usec / 1000);
-
-                       /* Timer could already be pending in rare cases. */
-                       if (timer_pending(&netif->credit_timeout)) {
-                               netif_put(netif);
-                               continue;
-                       }
-
-                       /* Passed the point where we can replenish credit? */
-                       if (time_after_eq(now, next_credit)) {
-                               netif->credit_timeout.expires = now;
-                               tx_add_credit(netif);
-                       }
-
-                       /* Still too big to send right now? Set a callback. */
-                       if (txreq.size > netif->remaining_credit) {
-                               netif->credit_timeout.data     =
-                                       (unsigned long)netif;
-                               netif->credit_timeout.function =
-                                       tx_credit_callback;
-                               __mod_timer(&netif->credit_timeout,
-                                           next_credit);
-                               netif_put(netif);
-                               continue;
-                       }
-               }
-               netif->remaining_credit -= txreq.size;
-
-               work_to_do--;
-               netif->tx.req_cons = ++i;
-
-               memset(extras, 0, sizeof(extras));
-               if (txreq.flags & NETTXF_extra_info) {
-                       work_to_do = netbk_get_extras(netif, extras,
-                                                     work_to_do);
-                       i = netif->tx.req_cons;
-                       if (unlikely(work_to_do < 0)) {
-                               netbk_tx_err(netif, &txreq, i);
-                               continue;
-                       }
-               }
-
-               ret = netbk_count_requests(netif, &txreq, txfrags, work_to_do);
-               if (unlikely(ret < 0)) {
-                       netbk_tx_err(netif, &txreq, i - ret);
-                       continue;
-               }
-               i += ret;
-
-               if (unlikely(txreq.size < ETH_HLEN)) {
-                       DPRINTK("Bad packet size: %d\n", txreq.size);
-                       netbk_tx_err(netif, &txreq, i);
-                       continue;
-               }
-
-               /* No crossing a page as the payload mustn't fragment. */
-               if (unlikely((txreq.offset + txreq.size) > PAGE_SIZE)) {
-                       DPRINTK("txreq.offset: %x, size: %u, end: %lu\n", 
-                               txreq.offset, txreq.size, 
-                               (txreq.offset &~PAGE_MASK) + txreq.size);
-                       netbk_tx_err(netif, &txreq, i);
-                       continue;
-               }
-
-               pending_idx = pending_ring[MASK_PEND_IDX(pending_cons)];
-
-               data_len = (txreq.size > PKT_PROT_LEN &&
-                           ret < MAX_SKB_FRAGS) ?
-                       PKT_PROT_LEN : txreq.size;
-
-               skb = alloc_skb(data_len + 16 + NET_IP_ALIGN,
-                               GFP_ATOMIC | __GFP_NOWARN);
-               if (unlikely(skb == NULL)) {
-                       DPRINTK("Can't allocate a skb in start_xmit.\n");
-                       netbk_tx_err(netif, &txreq, i);
-                       break;
-               }
-
-               /* Packets passed to netif_rx() must have some headroom. */
-               skb_reserve(skb, 16 + NET_IP_ALIGN);
-
-               if (extras[XEN_NETIF_EXTRA_TYPE_GSO - 1].type) {
-                       struct netif_extra_info *gso;
-                       gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
-
-                       if (netbk_set_skb_gso(skb, gso)) {
-                               kfree_skb(skb);
-                               netbk_tx_err(netif, &txreq, i);
-                               continue;
-                       }
-               }
-
-               gnttab_set_map_op(mop, idx_to_kaddr(pending_idx),
-                                 GNTMAP_host_map | GNTMAP_readonly,
-                                 txreq.gref, netif->domid);
-               mop++;
-
-               memcpy(&pending_tx_info[pending_idx].req,
-                      &txreq, sizeof(txreq));
-               pending_tx_info[pending_idx].netif = netif;
-               *((u16 *)skb->data) = pending_idx;
-
-               __skb_put(skb, data_len);
-
-               skb_shinfo(skb)->nr_frags = ret;
-               if (data_len < txreq.size) {
-                       skb_shinfo(skb)->nr_frags++;
-                       skb_shinfo(skb)->frags[0].page =
-                               (void *)(unsigned long)pending_idx;
-               } else {
-                       /* Discriminate from any valid pending_idx value. */
-                       skb_shinfo(skb)->frags[0].page = (void *)~0UL;
-               }
-
-               __skb_queue_tail(&tx_queue, skb);
-
-               pending_cons++;
-
-               mop = netbk_get_requests(netif, skb, txfrags, mop);
-
-               netif->tx.req_cons = i;
-               netif_schedule_work(netif);
-
-               if ((mop - tx_map_ops) >= ARRAY_SIZE(tx_map_ops))
-                       break;
-       }
-
-       if (mop == tx_map_ops)
-               return;
-
-       ret = HYPERVISOR_grant_table_op(
-               GNTTABOP_map_grant_ref, tx_map_ops, mop - tx_map_ops);
-       BUG_ON(ret);
-
-       mop = tx_map_ops;
-       while ((skb = __skb_dequeue(&tx_queue)) != NULL) {
-               netif_tx_request_t *txp;
-
-               pending_idx = *((u16 *)skb->data);
-               netif       = pending_tx_info[pending_idx].netif;
-               txp         = &pending_tx_info[pending_idx].req;
-
-               /* Check the remap error code. */
-               if (unlikely(netbk_tx_check_mop(skb, &mop))) {
-                       DPRINTK("netback grant failed.\n");
-                       skb_shinfo(skb)->nr_frags = 0;
-                       kfree_skb(skb);
-                       continue;
-               }
-
-               data_len = skb->len;
-               memcpy(skb->data,
-                      (void *)(idx_to_kaddr(pending_idx)|txp->offset),
-                      data_len);
-               if (data_len < txp->size) {
-                       /* Append the packet payload as a fragment. */
-                       txp->offset += data_len;
-                       txp->size -= data_len;
-               } else {
-                       /* Schedule a response immediately. */
-                       netif_idx_release(pending_idx);
-               }
-
-               /*
-                * Old frontends do not assert data_validated but we
-                * can infer it from csum_blank so test both flags.
-                */
-               if (txp->flags & (NETTXF_data_validated|NETTXF_csum_blank)) {
-                       skb->ip_summed = CHECKSUM_UNNECESSARY;
-                       skb->proto_data_valid = 1;
-               } else {
-                       skb->ip_summed = CHECKSUM_NONE;
-                       skb->proto_data_valid = 0;
-               }
-               skb->proto_csum_blank = !!(txp->flags & NETTXF_csum_blank);
-
-               netbk_fill_frags(skb);
-
-               skb->dev      = netif->dev;
-               skb->protocol = eth_type_trans(skb, skb->dev);
-
-               netif->stats.rx_bytes += skb->len;
-               netif->stats.rx_packets++;
-
-               if (unlikely(netbk_copy_skb_mode == NETBK_ALWAYS_COPY_SKB) &&
-                   unlikely(skb_linearize(skb))) {
-                       DPRINTK("Can't linearize skb in net_tx_action.\n");
-                       kfree_skb(skb);
-                       continue;
-               }
-
-               netif_rx(skb);
-               netif->dev->last_rx = jiffies;
-       }
-
-       if (netbk_copy_skb_mode == NETBK_DELAYED_COPY_SKB &&
-           !list_empty(&pending_inuse_head)) {
-               struct netbk_tx_pending_inuse *oldest;
-
-               oldest = list_entry(pending_inuse_head.next,
-                                   struct netbk_tx_pending_inuse, list);
-               mod_timer(&netbk_tx_pending_timer, oldest->alloc_time + HZ);
-       }
-}
-
-static void netif_idx_release(u16 pending_idx)
-{
-       static DEFINE_SPINLOCK(_lock);
-       unsigned long flags;
-
-       spin_lock_irqsave(&_lock, flags);
-       dealloc_ring[MASK_PEND_IDX(dealloc_prod)] = pending_idx;
-       /* Sync with net_tx_action_dealloc: insert idx /then/ incr producer. */
-       smp_wmb();
-       dealloc_prod++;
-       spin_unlock_irqrestore(&_lock, flags);
-
-       tasklet_schedule(&net_tx_tasklet);
-}
-
-static void netif_page_release(struct page *page)
-{
-       netif_idx_release(netif_page_index(page));
-}
-
-irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-{
-       netif_t *netif = dev_id;
-
-       add_to_net_schedule_list_tail(netif);
-       maybe_schedule_tx_action();
-
-       if (netif_schedulable(netif) && !netbk_queue_full(netif))
-               netif_wake_queue(netif->dev);
-
-       return IRQ_HANDLED;
-}
-
-static void make_tx_response(netif_t *netif, 
-                            netif_tx_request_t *txp,
-                            s8       st)
-{
-       RING_IDX i = netif->tx.rsp_prod_pvt;
-       netif_tx_response_t *resp;
-       int notify;
-
-       resp = RING_GET_RESPONSE(&netif->tx, i);
-       resp->id     = txp->id;
-       resp->status = st;
-
-       if (txp->flags & NETTXF_extra_info)
-               RING_GET_RESPONSE(&netif->tx, ++i)->status = NETIF_RSP_NULL;
-
-       netif->tx.rsp_prod_pvt = ++i;
-       RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->tx, notify);
-       if (notify)
-               notify_remote_via_irq(netif->irq);
-
-#ifdef CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER
-       if (i == netif->tx.req_cons) {
-               int more_to_do;
-               RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, more_to_do);
-               if (more_to_do)
-                       add_to_net_schedule_list_tail(netif);
-       }
-#endif
-}
-
-static netif_rx_response_t *make_rx_response(netif_t *netif, 
-                                            u16      id, 
-                                            s8       st,
-                                            u16      offset,
-                                            u16      size,
-                                            u16      flags)
-{
-       RING_IDX i = netif->rx.rsp_prod_pvt;
-       netif_rx_response_t *resp;
-
-       resp = RING_GET_RESPONSE(&netif->rx, i);
-       resp->offset     = offset;
-       resp->flags      = flags;
-       resp->id         = id;
-       resp->status     = (s16)size;
-       if (st < 0)
-               resp->status = (s16)st;
-
-       netif->rx.rsp_prod_pvt = ++i;
-
-       return resp;
-}
-
-#ifdef NETBE_DEBUG_INTERRUPT
-static irqreturn_t netif_be_dbg(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct list_head *ent;
-       netif_t *netif;
-       int i = 0;
-
-       printk(KERN_ALERT "netif_schedule_list:\n");
-       spin_lock_irq(&net_schedule_list_lock);
-
-       list_for_each (ent, &net_schedule_list) {
-               netif = list_entry(ent, netif_t, list);
-               printk(KERN_ALERT " %d: private(rx_req_cons=%08x "
-                      "rx_resp_prod=%08x\n",
-                      i, netif->rx.req_cons, netif->rx.rsp_prod_pvt);
-               printk(KERN_ALERT "   tx_req_cons=%08x tx_resp_prod=%08x)\n",
-                      netif->tx.req_cons, netif->tx.rsp_prod_pvt);
-               printk(KERN_ALERT "   shared(rx_req_prod=%08x "
-                      "rx_resp_prod=%08x\n",
-                      netif->rx.sring->req_prod, netif->rx.sring->rsp_prod);
-               printk(KERN_ALERT "   rx_event=%08x tx_req_prod=%08x\n",
-                      netif->rx.sring->rsp_event, netif->tx.sring->req_prod);
-               printk(KERN_ALERT "   tx_resp_prod=%08x, tx_event=%08x)\n",
-                      netif->tx.sring->rsp_prod, netif->tx.sring->rsp_event);
-               i++;
-       }
-
-       spin_unlock_irq(&net_schedule_list_lock);
-       printk(KERN_ALERT " ** End of netif_schedule_list **\n");
-
-       return IRQ_HANDLED;
-}
-#endif
-
-static int __init netback_init(void)
-{
-       int i;
-       struct page *page;
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       /* We can increase reservation by this much in net_rx_action(). */
-       balloon_update_driver_allowance(NET_RX_RING_SIZE);
-
-       skb_queue_head_init(&rx_queue);
-       skb_queue_head_init(&tx_queue);
-
-       init_timer(&net_timer);
-       net_timer.data = 0;
-       net_timer.function = net_alarm;
-
-       init_timer(&netbk_tx_pending_timer);
-       netbk_tx_pending_timer.data = 0;
-       netbk_tx_pending_timer.function = netbk_tx_pending_timeout;
-
-       mmap_pages = alloc_empty_pages_and_pagevec(MAX_PENDING_REQS);
-       if (mmap_pages == NULL) {
-               printk("%s: out of memory\n", __FUNCTION__);
-               return -ENOMEM;
-       }
-
-       for (i = 0; i < MAX_PENDING_REQS; i++) {
-               page = mmap_pages[i];
-               SetPageForeign(page, netif_page_release);
-               netif_page_index(page) = i;
-               INIT_LIST_HEAD(&pending_inuse[i].list);
-       }
-
-       pending_cons = 0;
-       pending_prod = MAX_PENDING_REQS;
-       for (i = 0; i < MAX_PENDING_REQS; i++)
-               pending_ring[i] = i;
-
-       spin_lock_init(&net_schedule_list_lock);
-       INIT_LIST_HEAD(&net_schedule_list);
-
-       netbk_copy_skb_mode = NETBK_DONT_COPY_SKB;
-       if (MODPARM_copy_skb) {
-               if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_and_replace,
-                                             NULL, 0))
-                       netbk_copy_skb_mode = NETBK_ALWAYS_COPY_SKB;
-               else
-                       netbk_copy_skb_mode = NETBK_DELAYED_COPY_SKB;
-       }
-
-       netif_xenbus_init();
-
-#ifdef NETBE_DEBUG_INTERRUPT
-       (void)bind_virq_to_irqhandler(VIRQ_DEBUG,
-                                     0,
-                                     netif_be_dbg,
-                                     SA_SHIRQ, 
-                                     "net-be-dbg",
-                                     &netif_be_dbg);
-#endif
-
-       return 0;
-}
-
-module_init(netback_init);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
deleted file mode 100644 (file)
index 5046c71..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-/*  Xenbus code for netif backend
-    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-    Copyright (C) 2005 XenSource Ltd
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <stdarg.h>
-#include <linux/module.h>
-#include <xen/xenbus.h>
-#include "common.h"
-
-#if 0
-#undef DPRINTK
-#define DPRINTK(fmt, args...) \
-    printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
-#endif
-
-struct backend_info {
-       struct xenbus_device *dev;
-       netif_t *netif;
-       enum xenbus_state frontend_state;
-};
-
-static int connect_rings(struct backend_info *);
-static void connect(struct backend_info *);
-static void backend_create_netif(struct backend_info *be);
-
-static int netback_remove(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       if (be->netif) {
-               netif_disconnect(be->netif);
-               be->netif = NULL;
-       }
-       kfree(be);
-       dev->dev.driver_data = NULL;
-       return 0;
-}
-
-
-/**
- * Entry point to this code when a new device is created.  Allocate the basic
- * structures and switch to InitWait.
- */
-static int netback_probe(struct xenbus_device *dev,
-                        const struct xenbus_device_id *id)
-{
-       const char *message;
-       struct xenbus_transaction xbt;
-       int err;
-       int sg;
-       struct backend_info *be = kzalloc(sizeof(struct backend_info),
-                                         GFP_KERNEL);
-       if (!be) {
-               xenbus_dev_fatal(dev, -ENOMEM,
-                                "allocating backend structure");
-               return -ENOMEM;
-       }
-
-       be->dev = dev;
-       dev->dev.driver_data = be;
-
-       sg = 1;
-       if (netbk_copy_skb_mode == NETBK_ALWAYS_COPY_SKB)
-               sg = 0;
-
-       do {
-               err = xenbus_transaction_start(&xbt);
-               if (err) {
-                       xenbus_dev_fatal(dev, err, "starting transaction");
-                       goto fail;
-               }
-
-               err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg);
-               if (err) {
-                       message = "writing feature-sg";
-                       goto abort_transaction;
-               }
-
-               err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
-                                   "%d", sg);
-               if (err) {
-                       message = "writing feature-gso-tcpv4";
-                       goto abort_transaction;
-               }
-
-               /* We support rx-copy path. */
-               err = xenbus_printf(xbt, dev->nodename,
-                                   "feature-rx-copy", "%d", 1);
-               if (err) {
-                       message = "writing feature-rx-copy";
-                       goto abort_transaction;
-               }
-
-               /*
-                * We don't support rx-flip path (except old guests who don't
-                * grok this feature flag).
-                */
-               err = xenbus_printf(xbt, dev->nodename,
-                                   "feature-rx-flip", "%d", 0);
-               if (err) {
-                       message = "writing feature-rx-flip";
-                       goto abort_transaction;
-               }
-
-               err = xenbus_transaction_end(xbt, 0);
-       } while (err == -EAGAIN);
-
-       if (err) {
-               xenbus_dev_fatal(dev, err, "completing transaction");
-               goto fail;
-       }
-
-       err = xenbus_switch_state(dev, XenbusStateInitWait);
-       if (err)
-               goto fail;
-
-       /* This kicks hotplug scripts, so do it immediately. */
-       backend_create_netif(be);
-
-       return 0;
-
-abort_transaction:
-       xenbus_transaction_end(xbt, 1);
-       xenbus_dev_fatal(dev, err, "%s", message);
-fail:
-       DPRINTK("failed");
-       netback_remove(dev);
-       return err;
-}
-
-
-/**
- * Handle the creation of the hotplug script environment.  We add the script
- * and vif variables to the environment, for the benefit of the vif-* hotplug
- * scripts.
- */
-static int netback_uevent(struct xenbus_device *xdev, char **envp,
-                         int num_envp, char *buffer, int buffer_size)
-{
-       struct backend_info *be = xdev->dev.driver_data;
-       netif_t *netif = be->netif;
-       int i = 0, length = 0;
-       char *val;
-
-       DPRINTK("netback_uevent");
-
-       val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
-       if (IS_ERR(val)) {
-               int err = PTR_ERR(val);
-               xenbus_dev_fatal(xdev, err, "reading script");
-               return err;
-       }
-       else {
-               add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
-                              &length, "script=%s", val);
-               kfree(val);
-       }
-
-       add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-                      "vif=%s", netif->dev->name);
-
-       envp[i] = NULL;
-
-       return 0;
-}
-
-
-static void backend_create_netif(struct backend_info *be)
-{
-       int err;
-       long handle;
-       struct xenbus_device *dev = be->dev;
-
-       if (be->netif != NULL)
-               return;
-
-       err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
-       if (err != 1) {
-               xenbus_dev_fatal(dev, err, "reading handle");
-               return;
-       }
-
-       be->netif = netif_alloc(dev->otherend_id, handle);
-       if (IS_ERR(be->netif)) {
-               err = PTR_ERR(be->netif);
-               be->netif = NULL;
-               xenbus_dev_fatal(dev, err, "creating interface");
-               return;
-       }
-
-       kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
-}
-
-
-/**
- * Callback received when the frontend's state changes.
- */
-static void frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       DPRINTK("%s", xenbus_strstate(frontend_state));
-
-       be->frontend_state = frontend_state;
-
-       switch (frontend_state) {
-       case XenbusStateInitialising:
-               if (dev->state == XenbusStateClosed) {
-                       printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-                              __FUNCTION__, dev->nodename);
-                       if (be->netif) {
-                               netif_disconnect(be->netif);
-                               be->netif = NULL;
-                       }
-                       xenbus_switch_state(dev, XenbusStateInitWait);
-               }
-               break;
-
-       case XenbusStateInitialised:
-               break;
-
-       case XenbusStateConnected:
-               backend_create_netif(be);
-               if (be->netif)
-                       connect(be);
-               break;
-
-       case XenbusStateClosing:
-               xenbus_switch_state(dev, XenbusStateClosing);
-               break;
-
-       case XenbusStateClosed:
-               xenbus_switch_state(dev, XenbusStateClosed);
-               if (xenbus_dev_is_online(dev))
-                       break;
-               /* fall through if not online */
-       case XenbusStateUnknown:
-               if (be->netif != NULL)
-                       kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
-               device_unregister(&dev->dev);
-               break;
-
-       default:
-               xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-                                frontend_state);
-               break;
-       }
-}
-
-
-static void xen_net_read_rate(struct xenbus_device *dev,
-                             unsigned long *bytes, unsigned long *usec)
-{
-       char *s, *e;
-       unsigned long b, u;
-       char *ratestr;
-
-       /* Default to unlimited bandwidth. */
-       *bytes = ~0UL;
-       *usec = 0;
-
-       ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
-       if (IS_ERR(ratestr))
-               return;
-
-       s = ratestr;
-       b = simple_strtoul(s, &e, 10);
-       if ((s == e) || (*e != ','))
-               goto fail;
-
-       s = e + 1;
-       u = simple_strtoul(s, &e, 10);
-       if ((s == e) || (*e != '\0'))
-               goto fail;
-
-       *bytes = b;
-       *usec = u;
-
-       kfree(ratestr);
-       return;
-
- fail:
-       WPRINTK("Failed to parse network rate limit. Traffic unlimited.\n");
-       kfree(ratestr);
-}
-
-static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
-{
-       char *s, *e, *macstr;
-       int i;
-
-       macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
-       if (IS_ERR(macstr))
-               return PTR_ERR(macstr);
-
-       for (i = 0; i < ETH_ALEN; i++) {
-               mac[i] = simple_strtoul(s, &e, 16);
-               if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
-                       kfree(macstr);
-                       return -ENOENT;
-               }
-               s = e+1;
-       }
-
-       kfree(macstr);
-       return 0;
-}
-
-static void connect(struct backend_info *be)
-{
-       int err;
-       struct xenbus_device *dev = be->dev;
-
-       err = connect_rings(be);
-       if (err)
-               return;
-
-       err = xen_net_read_mac(dev, be->netif->fe_dev_addr);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
-               return;
-       }
-
-       xen_net_read_rate(dev, &be->netif->credit_bytes,
-                         &be->netif->credit_usec);
-       be->netif->remaining_credit = be->netif->credit_bytes;
-
-       xenbus_switch_state(dev, XenbusStateConnected);
-
-       netif_wake_queue(be->netif->dev);
-}
-
-
-static int connect_rings(struct backend_info *be)
-{
-       struct xenbus_device *dev = be->dev;
-       unsigned long tx_ring_ref, rx_ring_ref;
-       unsigned int evtchn, rx_copy;
-       int err;
-       int val;
-
-       DPRINTK("");
-
-       err = xenbus_gather(XBT_NIL, dev->otherend,
-                           "tx-ring-ref", "%lu", &tx_ring_ref,
-                           "rx-ring-ref", "%lu", &rx_ring_ref,
-                           "event-channel", "%u", &evtchn, NULL);
-       if (err) {
-               xenbus_dev_fatal(dev, err,
-                                "reading %s/ring-ref and event-channel",
-                                dev->otherend);
-               return err;
-       }
-
-       err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",
-                          &rx_copy);
-       if (err == -ENOENT) {
-               err = 0;
-               rx_copy = 0;
-       }
-       if (err < 0) {
-               xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",
-                                dev->otherend);
-               return err;
-       }
-       be->netif->copying_receiver = !!rx_copy;
-
-       if (be->netif->dev->tx_queue_len != 0) {
-               if (xenbus_scanf(XBT_NIL, dev->otherend,
-                                "feature-rx-notify", "%d", &val) < 0)
-                       val = 0;
-               if (val)
-                       be->netif->can_queue = 1;
-               else
-                       /* Must be non-zero for pfifo_fast to work. */
-                       be->netif->dev->tx_queue_len = 1;
-       }
-
-       if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) < 0)
-               val = 0;
-       if (val) {
-               be->netif->features |= NETIF_F_SG;
-               be->netif->dev->features |= NETIF_F_SG;
-       }
-
-       if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", "%d",
-                        &val) < 0)
-               val = 0;
-       if (val) {
-               be->netif->features |= NETIF_F_TSO;
-               be->netif->dev->features |= NETIF_F_TSO;
-       }
-
-       if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
-                        "%d", &val) < 0)
-               val = 0;
-       if (val) {
-               be->netif->features &= ~NETIF_F_IP_CSUM;
-               be->netif->dev->features &= ~NETIF_F_IP_CSUM;
-       }
-
-       /* Map the shared frame, irq etc. */
-       err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
-       if (err) {
-               xenbus_dev_fatal(dev, err,
-                                "mapping shared-frames %lu/%lu port %u",
-                                tx_ring_ref, rx_ring_ref, evtchn);
-               return err;
-       }
-       return 0;
-}
-
-
-/* ** Driver Registration ** */
-
-
-static struct xenbus_device_id netback_ids[] = {
-       { "vif" },
-       { "" }
-};
-
-
-static struct xenbus_driver netback = {
-       .name = "vif",
-       .owner = THIS_MODULE,
-       .ids = netback_ids,
-       .probe = netback_probe,
-       .remove = netback_remove,
-       .uevent = netback_uevent,
-       .otherend_changed = frontend_changed,
-};
-
-
-void netif_xenbus_init(void)
-{
-       xenbus_register_backend(&netback);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/Makefile b/linux-2.6-xen-sparse/drivers/xen/netfront/Makefile
deleted file mode 100644 (file)
index dc22829..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-obj-$(CONFIG_XEN_NETDEV_FRONTEND)      := xennet.o
-
-xennet-objs := netfront.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
deleted file mode 100644 (file)
index 653e72f..0000000
+++ /dev/null
@@ -1,2133 +0,0 @@
-/******************************************************************************
- * Virtual network driver for conversing with remote driver backends.
- *
- * Copyright (c) 2002-2005, K A Fraser
- * Copyright (c) 2005, XenSource Ltd
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/netdevice.h>
-#include <linux/inetdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-#include <linux/bitops.h>
-#include <linux/ethtool.h>
-#include <linux/in.h>
-#include <linux/if_ether.h>
-#include <linux/io.h>
-#include <linux/moduleparam.h>
-#include <net/sock.h>
-#include <net/pkt_sched.h>
-#include <net/arp.h>
-#include <net/route.h>
-#include <asm/uaccess.h>
-#include <xen/evtchn.h>
-#include <xen/xenbus.h>
-#include <xen/interface/io/netif.h>
-#include <xen/interface/memory.h>
-#include <xen/balloon.h>
-#include <asm/page.h>
-#include <asm/maddr.h>
-#include <asm/uaccess.h>
-#include <xen/interface/grant_table.h>
-#include <xen/gnttab.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-struct netfront_cb {
-       struct page *page;
-       unsigned offset;
-};
-
-#define NETFRONT_SKB_CB(skb)   ((struct netfront_cb *)((skb)->cb))
-
-/*
- * Mutually-exclusive module options to select receive data path:
- *  rx_copy : Packets are copied by network backend into local memory
- *  rx_flip : Page containing packet data is transferred to our ownership
- * For fully-virtualised guests there is no option - copying must be used.
- * For paravirtualised guests, flipping is the default.
- */
-#ifdef CONFIG_XEN
-static int MODPARM_rx_copy = 0;
-module_param_named(rx_copy, MODPARM_rx_copy, bool, 0);
-MODULE_PARM_DESC(rx_copy, "Copy packets from network card (rather than flip)");
-static int MODPARM_rx_flip = 0;
-module_param_named(rx_flip, MODPARM_rx_flip, bool, 0);
-MODULE_PARM_DESC(rx_flip, "Flip packets from network card (rather than copy)");
-#else
-static const int MODPARM_rx_copy = 1;
-static const int MODPARM_rx_flip = 0;
-#endif
-
-#define RX_COPY_THRESHOLD 256
-
-/* If we don't have GSO, fake things up so that we never try to use it. */
-#if defined(NETIF_F_GSO)
-#define HAVE_GSO                       1
-#define HAVE_TSO                       1 /* TSO is a subset of GSO */
-static inline void dev_disable_gso_features(struct net_device *dev)
-{
-       /* Turn off all GSO bits except ROBUST. */
-       dev->features &= (1 << NETIF_F_GSO_SHIFT) - 1;
-       dev->features |= NETIF_F_GSO_ROBUST;
-}
-#elif defined(NETIF_F_TSO)
-#define HAVE_TSO                       1
-
-/* Some older kernels cannot cope with incorrect checksums,
- * particularly in netfilter. I'm not sure there is 100% correlation
- * with the presence of NETIF_F_TSO but it appears to be a good first
- * approximiation.
- */
-#define HAVE_NO_CSUM_OFFLOAD           1
-
-#define gso_size tso_size
-#define gso_segs tso_segs
-static inline void dev_disable_gso_features(struct net_device *dev)
-{
-       /* Turn off all TSO bits. */
-       dev->features &= ~NETIF_F_TSO;
-}
-static inline int skb_is_gso(const struct sk_buff *skb)
-{
-        return skb_shinfo(skb)->tso_size;
-}
-static inline int skb_gso_ok(struct sk_buff *skb, int features)
-{
-        return (features & NETIF_F_TSO);
-}
-
-static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
-{
-        return skb_is_gso(skb) &&
-               (!skb_gso_ok(skb, dev->features) ||
-                unlikely(skb->ip_summed != CHECKSUM_HW));
-}
-#else
-#define netif_needs_gso(dev, skb)      0
-#define dev_disable_gso_features(dev)  ((void)0)
-#endif
-
-#define GRANT_INVALID_REF      0
-
-#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
-#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
-
-struct netfront_info {
-       struct list_head list;
-       struct net_device *netdev;
-
-       struct net_device_stats stats;
-
-       struct netif_tx_front_ring tx;
-       struct netif_rx_front_ring rx;
-
-       spinlock_t   tx_lock;
-       spinlock_t   rx_lock;
-
-       unsigned int irq;
-       unsigned int copying_receiver;
-       unsigned int carrier;
-
-       /* Receive-ring batched refills. */
-#define RX_MIN_TARGET 8
-#define RX_DFL_MIN_TARGET 64
-#define RX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
-       unsigned rx_min_target, rx_max_target, rx_target;
-       struct sk_buff_head rx_batch;
-
-       struct timer_list rx_refill_timer;
-
-       /*
-        * {tx,rx}_skbs store outstanding skbuffs. The first entry in tx_skbs
-        * is an index into a chain of free entries.
-        */
-       struct sk_buff *tx_skbs[NET_TX_RING_SIZE+1];
-       struct sk_buff *rx_skbs[NET_RX_RING_SIZE];
-
-#define TX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
-       grant_ref_t gref_tx_head;
-       grant_ref_t grant_tx_ref[NET_TX_RING_SIZE + 1];
-       grant_ref_t gref_rx_head;
-       grant_ref_t grant_rx_ref[NET_RX_RING_SIZE];
-
-       struct xenbus_device *xbdev;
-       int tx_ring_ref;
-       int rx_ring_ref;
-       u8 mac[ETH_ALEN];
-
-       unsigned long rx_pfn_array[NET_RX_RING_SIZE];
-       struct multicall_entry rx_mcl[NET_RX_RING_SIZE+1];
-       struct mmu_update rx_mmu[NET_RX_RING_SIZE];
-};
-
-struct netfront_rx_info {
-       struct netif_rx_response rx;
-       struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
-};
-
-/*
- * Implement our own carrier flag: the network stack's version causes delays
- * when the carrier is re-enabled (in particular, dev_activate() may not
- * immediately be called, which can cause packet loss).
- */
-#define netfront_carrier_on(netif)     ((netif)->carrier = 1)
-#define netfront_carrier_off(netif)    ((netif)->carrier = 0)
-#define netfront_carrier_ok(netif)     ((netif)->carrier)
-
-/*
- * Access macros for acquiring freeing slots in tx_skbs[].
- */
-
-static inline void add_id_to_freelist(struct sk_buff **list, unsigned short id)
-{
-       list[id] = list[0];
-       list[0]  = (void *)(unsigned long)id;
-}
-
-static inline unsigned short get_id_from_freelist(struct sk_buff **list)
-{
-       unsigned int id = (unsigned int)(unsigned long)list[0];
-       list[0] = list[id];
-       return id;
-}
-
-static inline int xennet_rxidx(RING_IDX idx)
-{
-       return idx & (NET_RX_RING_SIZE - 1);
-}
-
-static inline struct sk_buff *xennet_get_rx_skb(struct netfront_info *np,
-                                               RING_IDX ri)
-{
-       int i = xennet_rxidx(ri);
-       struct sk_buff *skb = np->rx_skbs[i];
-       np->rx_skbs[i] = NULL;
-       return skb;
-}
-
-static inline grant_ref_t xennet_get_rx_ref(struct netfront_info *np,
-                                           RING_IDX ri)
-{
-       int i = xennet_rxidx(ri);
-       grant_ref_t ref = np->grant_rx_ref[i];
-       np->grant_rx_ref[i] = GRANT_INVALID_REF;
-       return ref;
-}
-
-#define DPRINTK(fmt, args...)                          \
-       pr_debug("netfront (%s:%d) " fmt,               \
-                __FUNCTION__, __LINE__, ##args)
-#define IPRINTK(fmt, args...)                          \
-       printk(KERN_INFO "netfront: " fmt, ##args)
-#define WPRINTK(fmt, args...)                          \
-       printk(KERN_WARNING "netfront: " fmt, ##args)
-
-static int setup_device(struct xenbus_device *, struct netfront_info *);
-static struct net_device *create_netdev(struct xenbus_device *);
-
-static void end_access(int, void *);
-static void netif_disconnect_backend(struct netfront_info *);
-
-static int network_connect(struct net_device *);
-static void network_tx_buf_gc(struct net_device *);
-static void network_alloc_rx_buffers(struct net_device *);
-static int send_fake_arp(struct net_device *);
-
-static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs);
-
-#ifdef CONFIG_SYSFS
-static int xennet_sysfs_addif(struct net_device *netdev);
-static void xennet_sysfs_delif(struct net_device *netdev);
-#else /* !CONFIG_SYSFS */
-#define xennet_sysfs_addif(dev) (0)
-#define xennet_sysfs_delif(dev) do { } while(0)
-#endif
-
-static inline int xennet_can_sg(struct net_device *dev)
-{
-       return dev->features & NETIF_F_SG;
-}
-
-/**
- * Entry point to this code when a new device is created.  Allocate the basic
- * structures and the ring buffers for communication with the backend, and
- * inform the backend of the appropriate details for those.
- */
-static int __devinit netfront_probe(struct xenbus_device *dev,
-                                   const struct xenbus_device_id *id)
-{
-       int err;
-       struct net_device *netdev;
-       struct netfront_info *info;
-
-       netdev = create_netdev(dev);
-       if (IS_ERR(netdev)) {
-               err = PTR_ERR(netdev);
-               xenbus_dev_fatal(dev, err, "creating netdev");
-               return err;
-       }
-
-       info = netdev_priv(netdev);
-       dev->dev.driver_data = info;
-
-       err = register_netdev(info->netdev);
-       if (err) {
-               printk(KERN_WARNING "%s: register_netdev err=%d\n",
-                      __FUNCTION__, err);
-               goto fail;
-       }
-
-       err = xennet_sysfs_addif(info->netdev);
-       if (err) {
-               unregister_netdev(info->netdev);
-               printk(KERN_WARNING "%s: add sysfs failed err=%d\n",
-                      __FUNCTION__, err);
-               goto fail;
-       }
-
-       return 0;
-
- fail:
-       free_netdev(netdev);
-       dev->dev.driver_data = NULL;
-       return err;
-}
-
-static int __devexit netfront_remove(struct xenbus_device *dev)
-{
-       struct netfront_info *info = dev->dev.driver_data;
-
-       DPRINTK("%s\n", dev->nodename);
-
-       netif_disconnect_backend(info);
-
-       del_timer_sync(&info->rx_refill_timer);
-
-       xennet_sysfs_delif(info->netdev);
-
-       unregister_netdev(info->netdev);
-
-       free_netdev(info->netdev);
-
-       return 0;
-}
-
-/**
- * We are reconnecting to the backend, due to a suspend/resume, or a backend
- * driver restart.  We tear down our netif structure and recreate it, but
- * leave the device-layer structures intact so that this is transparent to the
- * rest of the kernel.
- */
-static int netfront_resume(struct xenbus_device *dev)
-{
-       struct netfront_info *info = dev->dev.driver_data;
-
-       DPRINTK("%s\n", dev->nodename);
-
-       netif_disconnect_backend(info);
-       return 0;
-}
-
-static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
-{
-       char *s, *e, *macstr;
-       int i;
-
-       macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
-       if (IS_ERR(macstr))
-               return PTR_ERR(macstr);
-
-       for (i = 0; i < ETH_ALEN; i++) {
-               mac[i] = simple_strtoul(s, &e, 16);
-               if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
-                       kfree(macstr);
-                       return -ENOENT;
-               }
-               s = e+1;
-       }
-
-       kfree(macstr);
-       return 0;
-}
-
-/* Common code used when first setting up, and when resuming. */
-static int talk_to_backend(struct xenbus_device *dev,
-                          struct netfront_info *info)
-{
-       const char *message;
-       struct xenbus_transaction xbt;
-       int err;
-
-       err = xen_net_read_mac(dev, info->mac);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
-               goto out;
-       }
-
-       /* Create shared ring, alloc event channel. */
-       err = setup_device(dev, info);
-       if (err)
-               goto out;
-
-again:
-       err = xenbus_transaction_start(&xbt);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "starting transaction");
-               goto destroy_ring;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename, "tx-ring-ref","%u",
-                           info->tx_ring_ref);
-       if (err) {
-               message = "writing tx ring-ref";
-               goto abort_transaction;
-       }
-       err = xenbus_printf(xbt, dev->nodename, "rx-ring-ref","%u",
-                           info->rx_ring_ref);
-       if (err) {
-               message = "writing rx ring-ref";
-               goto abort_transaction;
-       }
-       err = xenbus_printf(xbt, dev->nodename,
-                           "event-channel", "%u",
-                           irq_to_evtchn_port(info->irq));
-       if (err) {
-               message = "writing event-channel";
-               goto abort_transaction;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename, "request-rx-copy", "%u",
-                           info->copying_receiver);
-       if (err) {
-               message = "writing request-rx-copy";
-               goto abort_transaction;
-       }
-
-       err = xenbus_printf(xbt, dev->nodename, "feature-rx-notify", "%d", 1);
-       if (err) {
-               message = "writing feature-rx-notify";
-               goto abort_transaction;
-       }
-
-#ifdef HAVE_NO_CSUM_OFFLOAD
-       err = xenbus_printf(xbt, dev->nodename, "feature-no-csum-offload", "%d", 1);
-       if (err) {
-               message = "writing feature-no-csum-offload";
-               goto abort_transaction;
-       }
-#endif
-
-       err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", 1);
-       if (err) {
-               message = "writing feature-sg";
-               goto abort_transaction;
-       }
-
-#ifdef HAVE_TSO
-       err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d", 1);
-       if (err) {
-               message = "writing feature-gso-tcpv4";
-               goto abort_transaction;
-       }
-#endif
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err) {
-               if (err == -EAGAIN)
-                       goto again;
-               xenbus_dev_fatal(dev, err, "completing transaction");
-               goto destroy_ring;
-       }
-
-       return 0;
-
- abort_transaction:
-       xenbus_transaction_end(xbt, 1);
-       xenbus_dev_fatal(dev, err, "%s", message);
- destroy_ring:
-       netif_disconnect_backend(info);
- out:
-       return err;
-}
-
-static int setup_device(struct xenbus_device *dev, struct netfront_info *info)
-{
-       struct netif_tx_sring *txs;
-       struct netif_rx_sring *rxs;
-       int err;
-       struct net_device *netdev = info->netdev;
-
-       info->tx_ring_ref = GRANT_INVALID_REF;
-       info->rx_ring_ref = GRANT_INVALID_REF;
-       info->rx.sring = NULL;
-       info->tx.sring = NULL;
-       info->irq = 0;
-
-       txs = (struct netif_tx_sring *)get_zeroed_page(GFP_KERNEL);
-       if (!txs) {
-               err = -ENOMEM;
-               xenbus_dev_fatal(dev, err, "allocating tx ring page");
-               goto fail;
-       }
-       SHARED_RING_INIT(txs);
-       FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE);
-
-       err = xenbus_grant_ring(dev, virt_to_mfn(txs));
-       if (err < 0) {
-               free_page((unsigned long)txs);
-               goto fail;
-       }
-       info->tx_ring_ref = err;
-
-       rxs = (struct netif_rx_sring *)get_zeroed_page(GFP_KERNEL);
-       if (!rxs) {
-               err = -ENOMEM;
-               xenbus_dev_fatal(dev, err, "allocating rx ring page");
-               goto fail;
-       }
-       SHARED_RING_INIT(rxs);
-       FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE);
-
-       err = xenbus_grant_ring(dev, virt_to_mfn(rxs));
-       if (err < 0) {
-               free_page((unsigned long)rxs);
-               goto fail;
-       }
-       info->rx_ring_ref = err;
-
-       memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
-
-       err = bind_listening_port_to_irqhandler(
-               dev->otherend_id, netif_int, SA_SAMPLE_RANDOM, netdev->name,
-               netdev);
-       if (err < 0)
-               goto fail;
-       info->irq = err;
-
-       return 0;
-
- fail:
-       return err;
-}
-
-/**
- * Callback received when the backend's state changes.
- */
-static void backend_changed(struct xenbus_device *dev,
-                           enum xenbus_state backend_state)
-{
-       struct netfront_info *np = dev->dev.driver_data;
-       struct net_device *netdev = np->netdev;
-
-       DPRINTK("%s\n", xenbus_strstate(backend_state));
-
-       switch (backend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitialised:
-       case XenbusStateConnected:
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               break;
-
-       case XenbusStateInitWait:
-               if (dev->state != XenbusStateInitialising)
-                       break;
-               if (network_connect(netdev) != 0)
-                       break;
-               xenbus_switch_state(dev, XenbusStateConnected);
-               (void)send_fake_arp(netdev);
-               break;
-
-       case XenbusStateClosing:
-               xenbus_frontend_closed(dev);
-               break;
-       }
-}
-
-/** Send a packet on a net device to encourage switches to learn the
- * MAC. We send a fake ARP request.
- *
- * @param dev device
- * @return 0 on success, error code otherwise
- */
-static int send_fake_arp(struct net_device *dev)
-{
-       struct sk_buff *skb;
-       u32             src_ip, dst_ip;
-
-       dst_ip = INADDR_BROADCAST;
-       src_ip = inet_select_addr(dev, dst_ip, RT_SCOPE_LINK);
-
-       /* No IP? Then nothing to do. */
-       if (src_ip == 0)
-               return 0;
-
-       skb = arp_create(ARPOP_REPLY, ETH_P_ARP,
-                        dst_ip, dev, src_ip,
-                        /*dst_hw*/ NULL, /*src_hw*/ NULL,
-                        /*target_hw*/ dev->dev_addr);
-       if (skb == NULL)
-               return -ENOMEM;
-
-       return dev_queue_xmit(skb);
-}
-
-static inline int netfront_tx_slot_available(struct netfront_info *np)
-{
-       return ((np->tx.req_prod_pvt - np->tx.rsp_cons) <
-               (TX_MAX_TARGET - MAX_SKB_FRAGS - 2));
-}
-
-static inline void network_maybe_wake_tx(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-
-       if (unlikely(netif_queue_stopped(dev)) &&
-           netfront_tx_slot_available(np) &&
-           likely(netif_running(dev)))
-               netif_wake_queue(dev);
-}
-
-static int network_open(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-
-       memset(&np->stats, 0, sizeof(np->stats));
-
-       spin_lock_bh(&np->rx_lock);
-       if (netfront_carrier_ok(np)) {
-               network_alloc_rx_buffers(dev);
-               np->rx.sring->rsp_event = np->rx.rsp_cons + 1;
-               if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
-                       netif_rx_schedule(dev);
-       }
-       spin_unlock_bh(&np->rx_lock);
-
-       network_maybe_wake_tx(dev);
-
-       return 0;
-}
-
-static void network_tx_buf_gc(struct net_device *dev)
-{
-       RING_IDX cons, prod;
-       unsigned short id;
-       struct netfront_info *np = netdev_priv(dev);
-       struct sk_buff *skb;
-
-       BUG_ON(!netfront_carrier_ok(np));
-
-       do {
-               prod = np->tx.sring->rsp_prod;
-               rmb(); /* Ensure we see responses up to 'rp'. */
-
-               for (cons = np->tx.rsp_cons; cons != prod; cons++) {
-                       struct netif_tx_response *txrsp;
-
-                       txrsp = RING_GET_RESPONSE(&np->tx, cons);
-                       if (txrsp->status == NETIF_RSP_NULL)
-                               continue;
-
-                       id  = txrsp->id;
-                       skb = np->tx_skbs[id];
-                       if (unlikely(gnttab_query_foreign_access(
-                               np->grant_tx_ref[id]) != 0)) {
-                               printk(KERN_ALERT "network_tx_buf_gc: warning "
-                                      "-- grant still in use by backend "
-                                      "domain.\n");
-                               BUG();
-                       }
-                       gnttab_end_foreign_access_ref(
-                               np->grant_tx_ref[id], GNTMAP_readonly);
-                       gnttab_release_grant_reference(
-                               &np->gref_tx_head, np->grant_tx_ref[id]);
-                       np->grant_tx_ref[id] = GRANT_INVALID_REF;
-                       add_id_to_freelist(np->tx_skbs, id);
-                       dev_kfree_skb_irq(skb);
-               }
-
-               np->tx.rsp_cons = prod;
-
-               /*
-                * Set a new event, then check for race with update of tx_cons.
-                * Note that it is essential to schedule a callback, no matter
-                * how few buffers are pending. Even if there is space in the
-                * transmit ring, higher layers may be blocked because too much
-                * data is outstanding: in such cases notification from Xen is
-                * likely to be the only kick that we'll get.
-                */
-               np->tx.sring->rsp_event =
-                       prod + ((np->tx.sring->req_prod - prod) >> 1) + 1;
-               mb();
-       } while ((cons == prod) && (prod != np->tx.sring->rsp_prod));
-
-       network_maybe_wake_tx(dev);
-}
-
-static void rx_refill_timeout(unsigned long data)
-{
-       struct net_device *dev = (struct net_device *)data;
-       netif_rx_schedule(dev);
-}
-
-static void network_alloc_rx_buffers(struct net_device *dev)
-{
-       unsigned short id;
-       struct netfront_info *np = netdev_priv(dev);
-       struct sk_buff *skb;
-       struct page *page;
-       int i, batch_target, notify;
-       RING_IDX req_prod = np->rx.req_prod_pvt;
-       struct xen_memory_reservation reservation;
-       grant_ref_t ref;
-       unsigned long pfn;
-       void *vaddr;
-       int nr_flips;
-       netif_rx_request_t *req;
-
-       if (unlikely(!netfront_carrier_ok(np)))
-               return;
-
-       /*
-        * Allocate skbuffs greedily, even though we batch updates to the
-        * receive ring. This creates a less bursty demand on the memory
-        * allocator, so should reduce the chance of failed allocation requests
-        * both for ourself and for other kernel subsystems.
-        */
-       batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
-       for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
-               /*
-                * Allocate an skb and a page. Do not use __dev_alloc_skb as
-                * that will allocate page-sized buffers which is not
-                * necessary here.
-                * 16 bytes added as necessary headroom for netif_receive_skb.
-                */
-               skb = alloc_skb(RX_COPY_THRESHOLD + 16 + NET_IP_ALIGN,
-                               GFP_ATOMIC | __GFP_NOWARN);
-               if (unlikely(!skb))
-                       goto no_skb;
-
-               page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-               if (!page) {
-                       kfree_skb(skb);
-no_skb:
-                       /* Any skbuffs queued for refill? Force them out. */
-                       if (i != 0)
-                               goto refill;
-                       /* Could not allocate any skbuffs. Try again later. */
-                       mod_timer(&np->rx_refill_timer,
-                                 jiffies + (HZ/10));
-                       break;
-               }
-
-               skb_reserve(skb, 16 + NET_IP_ALIGN); /* mimic dev_alloc_skb() */
-               skb_shinfo(skb)->frags[0].page = page;
-               skb_shinfo(skb)->nr_frags = 1;
-               __skb_queue_tail(&np->rx_batch, skb);
-       }
-
-       /* Is the batch large enough to be worthwhile? */
-       if (i < (np->rx_target/2)) {
-               if (req_prod > np->rx.sring->req_prod)
-                       goto push;
-               return;
-       }
-
-       /* Adjust our fill target if we risked running out of buffers. */
-       if (((req_prod - np->rx.sring->rsp_prod) < (np->rx_target / 4)) &&
-           ((np->rx_target *= 2) > np->rx_max_target))
-               np->rx_target = np->rx_max_target;
-
- refill:
-       for (nr_flips = i = 0; ; i++) {
-               if ((skb = __skb_dequeue(&np->rx_batch)) == NULL)
-                       break;
-
-               skb->dev = dev;
-
-               id = xennet_rxidx(req_prod + i);
-
-               BUG_ON(np->rx_skbs[id]);
-               np->rx_skbs[id] = skb;
-
-               ref = gnttab_claim_grant_reference(&np->gref_rx_head);
-               BUG_ON((signed short)ref < 0);
-               np->grant_rx_ref[id] = ref;
-
-               pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
-               vaddr = page_address(skb_shinfo(skb)->frags[0].page);
-
-               req = RING_GET_REQUEST(&np->rx, req_prod + i);
-               if (!np->copying_receiver) {
-                       gnttab_grant_foreign_transfer_ref(ref,
-                                                         np->xbdev->otherend_id,
-                                                         pfn);
-                       np->rx_pfn_array[nr_flips] = pfn_to_mfn(pfn);
-                       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                               /* Remove this page before passing
-                                * back to Xen. */
-                               set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
-                               MULTI_update_va_mapping(np->rx_mcl+i,
-                                                       (unsigned long)vaddr,
-                                                       __pte(0), 0);
-                       }
-                       nr_flips++;
-               } else {
-                       gnttab_grant_foreign_access_ref(ref,
-                                                       np->xbdev->otherend_id,
-                                                       pfn_to_mfn(pfn),
-                                                       0);
-               }
-
-               req->id = id;
-               req->gref = ref;
-       }
-
-       if ( nr_flips != 0 ) {
-               /* Tell the ballon driver what is going on. */
-               balloon_update_driver_allowance(i);
-
-               set_xen_guest_handle(reservation.extent_start,
-                                    np->rx_pfn_array);
-               reservation.nr_extents   = nr_flips;
-               reservation.extent_order = 0;
-               reservation.address_bits = 0;
-               reservation.domid        = DOMID_SELF;
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* After all PTEs have been zapped, flush the TLB. */
-                       np->rx_mcl[i-1].args[MULTI_UVMFLAGS_INDEX] =
-                               UVMF_TLB_FLUSH|UVMF_ALL;
-
-                       /* Give away a batch of pages. */
-                       np->rx_mcl[i].op = __HYPERVISOR_memory_op;
-                       np->rx_mcl[i].args[0] = XENMEM_decrease_reservation;
-                       np->rx_mcl[i].args[1] = (unsigned long)&reservation;
-
-                       /* Zap PTEs and give away pages in one big
-                        * multicall. */
-                       (void)HYPERVISOR_multicall(np->rx_mcl, i+1);
-
-                       /* Check return status of HYPERVISOR_memory_op(). */
-                       if (unlikely(np->rx_mcl[i].result != i))
-                               panic("Unable to reduce memory reservation\n");
-               } else {
-                       if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-                                                &reservation) != i)
-                               panic("Unable to reduce memory reservation\n");
-               }
-       } else {
-               wmb();
-       }
-
-       /* Above is a suitable barrier to ensure backend will see requests. */
-       np->rx.req_prod_pvt = req_prod + i;
- push:
-       RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->rx, notify);
-       if (notify)
-               notify_remote_via_irq(np->irq);
-}
-
-static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
-                             struct netif_tx_request *tx)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       char *data = skb->data;
-       unsigned long mfn;
-       RING_IDX prod = np->tx.req_prod_pvt;
-       int frags = skb_shinfo(skb)->nr_frags;
-       unsigned int offset = offset_in_page(data);
-       unsigned int len = skb_headlen(skb);
-       unsigned int id;
-       grant_ref_t ref;
-       int i;
-
-       while (len > PAGE_SIZE - offset) {
-               tx->size = PAGE_SIZE - offset;
-               tx->flags |= NETTXF_more_data;
-               len -= tx->size;
-               data += tx->size;
-               offset = 0;
-
-               id = get_id_from_freelist(np->tx_skbs);
-               np->tx_skbs[id] = skb_get(skb);
-               tx = RING_GET_REQUEST(&np->tx, prod++);
-               tx->id = id;
-               ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-               BUG_ON((signed short)ref < 0);
-
-               mfn = virt_to_mfn(data);
-               gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
-                                               mfn, GNTMAP_readonly);
-
-               tx->gref = np->grant_tx_ref[id] = ref;
-               tx->offset = offset;
-               tx->size = len;
-               tx->flags = 0;
-       }
-
-       for (i = 0; i < frags; i++) {
-               skb_frag_t *frag = skb_shinfo(skb)->frags + i;
-
-               tx->flags |= NETTXF_more_data;
-
-               id = get_id_from_freelist(np->tx_skbs);
-               np->tx_skbs[id] = skb_get(skb);
-               tx = RING_GET_REQUEST(&np->tx, prod++);
-               tx->id = id;
-               ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-               BUG_ON((signed short)ref < 0);
-
-               mfn = pfn_to_mfn(page_to_pfn(frag->page));
-               gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
-                                               mfn, GNTMAP_readonly);
-
-               tx->gref = np->grant_tx_ref[id] = ref;
-               tx->offset = frag->page_offset;
-               tx->size = frag->size;
-               tx->flags = 0;
-       }
-
-       np->tx.req_prod_pvt = prod;
-}
-
-static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       unsigned short id;
-       struct netfront_info *np = netdev_priv(dev);
-       struct netif_tx_request *tx;
-       struct netif_extra_info *extra;
-       char *data = skb->data;
-       RING_IDX i;
-       grant_ref_t ref;
-       unsigned long mfn;
-       int notify;
-       int frags = skb_shinfo(skb)->nr_frags;
-       unsigned int offset = offset_in_page(data);
-       unsigned int len = skb_headlen(skb);
-
-       frags += (offset + len + PAGE_SIZE - 1) / PAGE_SIZE;
-       if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
-               printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n",
-                      frags);
-               dump_stack();
-               goto drop;
-       }
-
-       spin_lock_irq(&np->tx_lock);
-
-       if (unlikely(!netfront_carrier_ok(np) ||
-                    (frags > 1 && !xennet_can_sg(dev)) ||
-                    netif_needs_gso(dev, skb))) {
-               spin_unlock_irq(&np->tx_lock);
-               goto drop;
-       }
-
-       i = np->tx.req_prod_pvt;
-
-       id = get_id_from_freelist(np->tx_skbs);
-       np->tx_skbs[id] = skb;
-
-       tx = RING_GET_REQUEST(&np->tx, i);
-
-       tx->id   = id;
-       ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-       BUG_ON((signed short)ref < 0);
-       mfn = virt_to_mfn(data);
-       gnttab_grant_foreign_access_ref(
-               ref, np->xbdev->otherend_id, mfn, GNTMAP_readonly);
-       tx->gref = np->grant_tx_ref[id] = ref;
-       tx->offset = offset;
-       tx->size = len;
-
-       tx->flags = 0;
-       extra = NULL;
-
-       if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
-               tx->flags |= NETTXF_csum_blank | NETTXF_data_validated;
-#ifdef CONFIG_XEN
-       if (skb->proto_data_valid) /* remote but checksummed? */
-               tx->flags |= NETTXF_data_validated;
-#endif
-
-#ifdef HAVE_TSO
-       if (skb_shinfo(skb)->gso_size) {
-               struct netif_extra_info *gso = (struct netif_extra_info *)
-                       RING_GET_REQUEST(&np->tx, ++i);
-
-               if (extra)
-                       extra->flags |= XEN_NETIF_EXTRA_FLAG_MORE;
-               else
-                       tx->flags |= NETTXF_extra_info;
-
-               gso->u.gso.size = skb_shinfo(skb)->gso_size;
-               gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
-               gso->u.gso.pad = 0;
-               gso->u.gso.features = 0;
-
-               gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
-               gso->flags = 0;
-               extra = gso;
-       }
-#endif
-
-       np->tx.req_prod_pvt = i + 1;
-
-       xennet_make_frags(skb, dev, tx);
-       tx->size = skb->len;
-
-       RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->tx, notify);
-       if (notify)
-               notify_remote_via_irq(np->irq);
-
-       network_tx_buf_gc(dev);
-
-       if (!netfront_tx_slot_available(np))
-               netif_stop_queue(dev);
-
-       spin_unlock_irq(&np->tx_lock);
-
-       np->stats.tx_bytes += skb->len;
-       np->stats.tx_packets++;
-
-       return 0;
-
- drop:
-       np->stats.tx_dropped++;
-       dev_kfree_skb(skb);
-       return 0;
-}
-
-static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs)
-{
-       struct net_device *dev = dev_id;
-       struct netfront_info *np = netdev_priv(dev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&np->tx_lock, flags);
-
-       if (likely(netfront_carrier_ok(np))) {
-               network_tx_buf_gc(dev);
-               /* Under tx_lock: protects access to rx shared-ring indexes. */
-               if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
-                       netif_rx_schedule(dev);
-       }
-
-       spin_unlock_irqrestore(&np->tx_lock, flags);
-
-       return IRQ_HANDLED;
-}
-
-static void xennet_move_rx_slot(struct netfront_info *np, struct sk_buff *skb,
-                               grant_ref_t ref)
-{
-       int new = xennet_rxidx(np->rx.req_prod_pvt);
-
-       BUG_ON(np->rx_skbs[new]);
-       np->rx_skbs[new] = skb;
-       np->grant_rx_ref[new] = ref;
-       RING_GET_REQUEST(&np->rx, np->rx.req_prod_pvt)->id = new;
-       RING_GET_REQUEST(&np->rx, np->rx.req_prod_pvt)->gref = ref;
-       np->rx.req_prod_pvt++;
-}
-
-int xennet_get_extras(struct netfront_info *np,
-                     struct netif_extra_info *extras, RING_IDX rp)
-
-{
-       struct netif_extra_info *extra;
-       RING_IDX cons = np->rx.rsp_cons;
-       int err = 0;
-
-       do {
-               struct sk_buff *skb;
-               grant_ref_t ref;
-
-               if (unlikely(cons + 1 == rp)) {
-                       if (net_ratelimit())
-                               WPRINTK("Missing extra info\n");
-                       err = -EBADR;
-                       break;
-               }
-
-               extra = (struct netif_extra_info *)
-                       RING_GET_RESPONSE(&np->rx, ++cons);
-
-               if (unlikely(!extra->type ||
-                            extra->type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
-                       if (net_ratelimit())
-                               WPRINTK("Invalid extra type: %d\n",
-                                       extra->type);
-                       err = -EINVAL;
-               } else {
-                       memcpy(&extras[extra->type - 1], extra,
-                              sizeof(*extra));
-               }
-
-               skb = xennet_get_rx_skb(np, cons);
-               ref = xennet_get_rx_ref(np, cons);
-               xennet_move_rx_slot(np, skb, ref);
-       } while (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE);
-
-       np->rx.rsp_cons = cons;
-       return err;
-}
-
-static int xennet_get_responses(struct netfront_info *np,
-                               struct netfront_rx_info *rinfo, RING_IDX rp,
-                               struct sk_buff_head *list,
-                               int *pages_flipped_p)
-{
-       int pages_flipped = *pages_flipped_p;
-       struct mmu_update *mmu;
-       struct multicall_entry *mcl;
-       struct netif_rx_response *rx = &rinfo->rx;
-       struct netif_extra_info *extras = rinfo->extras;
-       RING_IDX cons = np->rx.rsp_cons;
-       struct sk_buff *skb = xennet_get_rx_skb(np, cons);
-       grant_ref_t ref = xennet_get_rx_ref(np, cons);
-       int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD);
-       int frags = 1;
-       int err = 0;
-       unsigned long ret;
-
-       if (rx->flags & NETRXF_extra_info) {
-               err = xennet_get_extras(np, extras, rp);
-               cons = np->rx.rsp_cons;
-       }
-
-       for (;;) {
-               unsigned long mfn;
-
-               if (unlikely(rx->status < 0 ||
-                            rx->offset + rx->status > PAGE_SIZE)) {
-                       if (net_ratelimit())
-                               WPRINTK("rx->offset: %x, size: %u\n",
-                                       rx->offset, rx->status);
-                       xennet_move_rx_slot(np, skb, ref);
-                       err = -EINVAL;
-                       goto next;
-               }
-
-               /*
-                * This definitely indicates a bug, either in this driver or in
-                * the backend driver. In future this should flag the bad
-                * situation to the system controller to reboot the backed.
-                */
-               if (ref == GRANT_INVALID_REF) {
-                       if (net_ratelimit())
-                               WPRINTK("Bad rx response id %d.\n", rx->id);
-                       err = -EINVAL;
-                       goto next;
-               }
-
-               if (!np->copying_receiver) {
-                       /* Memory pressure, insufficient buffer
-                        * headroom, ... */
-                       if (!(mfn = gnttab_end_foreign_transfer_ref(ref))) {
-                               if (net_ratelimit())
-                                       WPRINTK("Unfulfilled rx req "
-                                               "(id=%d, st=%d).\n",
-                                               rx->id, rx->status);
-                               xennet_move_rx_slot(np, skb, ref);
-                               err = -ENOMEM;
-                               goto next;
-                       }
-
-                       if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                               /* Remap the page. */
-                               struct page *page =
-                                       skb_shinfo(skb)->frags[0].page;
-                               unsigned long pfn = page_to_pfn(page);
-                               void *vaddr = page_address(page);
-
-                               mcl = np->rx_mcl + pages_flipped;
-                               mmu = np->rx_mmu + pages_flipped;
-
-                               MULTI_update_va_mapping(mcl,
-                                                       (unsigned long)vaddr,
-                                                       pfn_pte_ma(mfn,
-                                                                  PAGE_KERNEL),
-                                                       0);
-                               mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
-                                       | MMU_MACHPHYS_UPDATE;
-                               mmu->val = pfn;
-
-                               set_phys_to_machine(pfn, mfn);
-                       }
-                       pages_flipped++;
-               } else {
-                       ret = gnttab_end_foreign_access_ref(ref, 0);
-                       BUG_ON(!ret);
-               }
-
-               gnttab_release_grant_reference(&np->gref_rx_head, ref);
-
-               __skb_queue_tail(list, skb);
-
-next:
-               if (!(rx->flags & NETRXF_more_data))
-                       break;
-
-               if (cons + frags == rp) {
-                       if (net_ratelimit())
-                               WPRINTK("Need more frags\n");
-                       err = -ENOENT;
-                       break;
-               }
-
-               rx = RING_GET_RESPONSE(&np->rx, cons + frags);
-               skb = xennet_get_rx_skb(np, cons + frags);
-               ref = xennet_get_rx_ref(np, cons + frags);
-               frags++;
-       }
-
-       if (unlikely(frags > max)) {
-               if (net_ratelimit())
-                       WPRINTK("Too many frags\n");
-               err = -E2BIG;
-       }
-
-       if (unlikely(err))
-               np->rx.rsp_cons = cons + frags;
-
-       *pages_flipped_p = pages_flipped;
-
-       return err;
-}
-
-static RING_IDX xennet_fill_frags(struct netfront_info *np,
-                                 struct sk_buff *skb,
-                                 struct sk_buff_head *list)
-{
-       struct skb_shared_info *shinfo = skb_shinfo(skb);
-       int nr_frags = shinfo->nr_frags;
-       RING_IDX cons = np->rx.rsp_cons;
-       skb_frag_t *frag = shinfo->frags + nr_frags;
-       struct sk_buff *nskb;
-
-       while ((nskb = __skb_dequeue(list))) {
-               struct netif_rx_response *rx =
-                       RING_GET_RESPONSE(&np->rx, ++cons);
-
-               frag->page = skb_shinfo(nskb)->frags[0].page;
-               frag->page_offset = rx->offset;
-               frag->size = rx->status;
-
-               skb->data_len += rx->status;
-
-               skb_shinfo(nskb)->nr_frags = 0;
-               kfree_skb(nskb);
-
-               frag++;
-               nr_frags++;
-       }
-
-       shinfo->nr_frags = nr_frags;
-       return cons;
-}
-
-static int xennet_set_skb_gso(struct sk_buff *skb,
-                             struct netif_extra_info *gso)
-{
-       if (!gso->u.gso.size) {
-               if (net_ratelimit())
-                       WPRINTK("GSO size must not be zero.\n");
-               return -EINVAL;
-       }
-
-       /* Currently only TCPv4 S.O. is supported. */
-       if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
-               if (net_ratelimit())
-                       WPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
-               return -EINVAL;
-       }
-
-#ifdef HAVE_TSO
-       skb_shinfo(skb)->gso_size = gso->u.gso.size;
-#ifdef HAVE_GSO
-       skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
-
-       /* Header must be checked, and gso_segs computed. */
-       skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
-#endif
-       skb_shinfo(skb)->gso_segs = 0;
-
-       return 0;
-#else
-       if (net_ratelimit())
-               WPRINTK("GSO unsupported by this kernel.\n");
-       return -EINVAL;
-#endif
-}
-
-static int netif_poll(struct net_device *dev, int *pbudget)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       struct sk_buff *skb;
-       struct netfront_rx_info rinfo;
-       struct netif_rx_response *rx = &rinfo.rx;
-       struct netif_extra_info *extras = rinfo.extras;
-       RING_IDX i, rp;
-       struct multicall_entry *mcl;
-       int work_done, budget, more_to_do = 1;
-       struct sk_buff_head rxq;
-       struct sk_buff_head errq;
-       struct sk_buff_head tmpq;
-       unsigned long flags;
-       unsigned int len;
-       int pages_flipped = 0;
-       int err;
-
-       spin_lock(&np->rx_lock); /* no need for spin_lock_bh() in ->poll() */
-
-       if (unlikely(!netfront_carrier_ok(np))) {
-               spin_unlock(&np->rx_lock);
-               return 0;
-       }
-
-       skb_queue_head_init(&rxq);
-       skb_queue_head_init(&errq);
-       skb_queue_head_init(&tmpq);
-
-       if ((budget = *pbudget) > dev->quota)
-               budget = dev->quota;
-       rp = np->rx.sring->rsp_prod;
-       rmb(); /* Ensure we see queued responses up to 'rp'. */
-
-       i = np->rx.rsp_cons;
-       work_done = 0;
-       while ((i != rp) && (work_done < budget)) {
-               memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
-               memset(extras, 0, sizeof(rinfo.extras));
-
-               err = xennet_get_responses(np, &rinfo, rp, &tmpq,
-                                          &pages_flipped);
-
-               if (unlikely(err)) {
-err:   
-                       while ((skb = __skb_dequeue(&tmpq)))
-                               __skb_queue_tail(&errq, skb);
-                       np->stats.rx_errors++;
-                       i = np->rx.rsp_cons;
-                       continue;
-               }
-
-               skb = __skb_dequeue(&tmpq);
-
-               if (extras[XEN_NETIF_EXTRA_TYPE_GSO - 1].type) {
-                       struct netif_extra_info *gso;
-                       gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
-
-                       if (unlikely(xennet_set_skb_gso(skb, gso))) {
-                               __skb_queue_head(&tmpq, skb);
-                               np->rx.rsp_cons += skb_queue_len(&tmpq);
-                               goto err;
-                       }
-               }
-
-               NETFRONT_SKB_CB(skb)->page = skb_shinfo(skb)->frags[0].page;
-               NETFRONT_SKB_CB(skb)->offset = rx->offset;
-
-               len = rx->status;
-               if (len > RX_COPY_THRESHOLD)
-                       len = RX_COPY_THRESHOLD;
-               skb_put(skb, len);
-
-               if (rx->status > len) {
-                       skb_shinfo(skb)->frags[0].page_offset =
-                               rx->offset + len;
-                       skb_shinfo(skb)->frags[0].size = rx->status - len;
-                       skb->data_len = rx->status - len;
-               } else {
-                       skb_shinfo(skb)->frags[0].page = NULL;
-                       skb_shinfo(skb)->nr_frags = 0;
-               }
-
-               i = xennet_fill_frags(np, skb, &tmpq);
-
-               /*
-                * Truesize must approximates the size of true data plus
-                * any supervisor overheads. Adding hypervisor overheads
-                * has been shown to significantly reduce achievable
-                * bandwidth with the default receive buffer size. It is
-                * therefore not wise to account for it here.
-                *
-                * After alloc_skb(RX_COPY_THRESHOLD), truesize is set to
-                * RX_COPY_THRESHOLD + the supervisor overheads. Here, we
-                * add the size of the data pulled in xennet_fill_frags().
-                *
-                * We also adjust for any unused space in the main data
-                * area by subtracting (RX_COPY_THRESHOLD - len). This is
-                * especially important with drivers which split incoming
-                * packets into header and data, using only 66 bytes of
-                * the main data area (see the e1000 driver for example.)
-                * On such systems, without this last adjustement, our
-                * achievable receive throughout using the standard receive
-                * buffer size was cut by 25%(!!!).
-                */
-               skb->truesize += skb->data_len - (RX_COPY_THRESHOLD - len);
-               skb->len += skb->data_len;
-
-               /*
-                * Old backends do not assert data_validated but we
-                * can infer it from csum_blank so test both flags.
-                */
-               if (rx->flags & (NETRXF_data_validated|NETRXF_csum_blank))
-                       skb->ip_summed = CHECKSUM_UNNECESSARY;
-               else
-                       skb->ip_summed = CHECKSUM_NONE;
-#ifdef CONFIG_XEN
-               skb->proto_data_valid = (skb->ip_summed != CHECKSUM_NONE);
-               skb->proto_csum_blank = !!(rx->flags & NETRXF_csum_blank);
-#endif
-               np->stats.rx_packets++;
-               np->stats.rx_bytes += skb->len;
-
-               __skb_queue_tail(&rxq, skb);
-
-               np->rx.rsp_cons = ++i;
-               work_done++;
-       }
-
-       if (pages_flipped) {
-               /* Some pages are no longer absent... */
-               balloon_update_driver_allowance(-pages_flipped);
-
-               /* Do all the remapping work and M2P updates. */
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       mcl = np->rx_mcl + pages_flipped;
-                       mcl->op = __HYPERVISOR_mmu_update;
-                       mcl->args[0] = (unsigned long)np->rx_mmu;
-                       mcl->args[1] = pages_flipped;
-                       mcl->args[2] = 0;
-                       mcl->args[3] = DOMID_SELF;
-                       (void)HYPERVISOR_multicall(np->rx_mcl,
-                                                  pages_flipped + 1);
-               }
-       }
-
-       while ((skb = __skb_dequeue(&errq)))
-               kfree_skb(skb);
-
-       while ((skb = __skb_dequeue(&rxq)) != NULL) {
-               struct page *page = NETFRONT_SKB_CB(skb)->page;
-               void *vaddr = page_address(page);
-               unsigned offset = NETFRONT_SKB_CB(skb)->offset;
-
-               memcpy(skb->data, vaddr + offset, skb_headlen(skb));
-
-               if (page != skb_shinfo(skb)->frags[0].page)
-                       __free_page(page);
-
-               /* Ethernet work: Delayed to here as it peeks the header. */
-               skb->protocol = eth_type_trans(skb, dev);
-
-               /* Pass it up. */
-               netif_receive_skb(skb);
-               dev->last_rx = jiffies;
-       }
-
-       /* If we get a callback with very few responses, reduce fill target. */
-       /* NB. Note exponential increase, linear decrease. */
-       if (((np->rx.req_prod_pvt - np->rx.sring->rsp_prod) >
-            ((3*np->rx_target) / 4)) &&
-           (--np->rx_target < np->rx_min_target))
-               np->rx_target = np->rx_min_target;
-
-       network_alloc_rx_buffers(dev);
-
-       *pbudget   -= work_done;
-       dev->quota -= work_done;
-
-       if (work_done < budget) {
-               local_irq_save(flags);
-
-               RING_FINAL_CHECK_FOR_RESPONSES(&np->rx, more_to_do);
-               if (!more_to_do)
-                       __netif_rx_complete(dev);
-
-               local_irq_restore(flags);
-       }
-
-       spin_unlock(&np->rx_lock);
-
-       return more_to_do;
-}
-
-static void netif_release_tx_bufs(struct netfront_info *np)
-{
-       struct sk_buff *skb;
-       int i;
-
-       for (i = 1; i <= NET_TX_RING_SIZE; i++) {
-               if ((unsigned long)np->tx_skbs[i] < PAGE_OFFSET)
-                       continue;
-
-               skb = np->tx_skbs[i];
-               gnttab_end_foreign_access_ref(
-                       np->grant_tx_ref[i], GNTMAP_readonly);
-               gnttab_release_grant_reference(
-                       &np->gref_tx_head, np->grant_tx_ref[i]);
-               np->grant_tx_ref[i] = GRANT_INVALID_REF;
-               add_id_to_freelist(np->tx_skbs, i);
-               dev_kfree_skb_irq(skb);
-       }
-}
-
-static void netif_release_rx_bufs(struct netfront_info *np)
-{
-       struct mmu_update      *mmu = np->rx_mmu;
-       struct multicall_entry *mcl = np->rx_mcl;
-       struct sk_buff_head free_list;
-       struct sk_buff *skb;
-       unsigned long mfn;
-       int xfer = 0, noxfer = 0, unused = 0;
-       int id, ref, rc;
-
-       if (np->copying_receiver) {
-               WPRINTK("%s: fix me for copying receiver.\n", __FUNCTION__);
-               return;
-       }
-
-       skb_queue_head_init(&free_list);
-
-       spin_lock_bh(&np->rx_lock);
-
-       for (id = 0; id < NET_RX_RING_SIZE; id++) {
-               if ((ref = np->grant_rx_ref[id]) == GRANT_INVALID_REF) {
-                       unused++;
-                       continue;
-               }
-
-               skb = np->rx_skbs[id];
-               mfn = gnttab_end_foreign_transfer_ref(ref);
-               gnttab_release_grant_reference(&np->gref_rx_head, ref);
-               np->grant_rx_ref[id] = GRANT_INVALID_REF;
-               add_id_to_freelist(np->rx_skbs, id);
-
-               if (0 == mfn) {
-                       struct page *page = skb_shinfo(skb)->frags[0].page;
-                       balloon_release_driver_page(page);
-                       skb_shinfo(skb)->nr_frags = 0;
-                       dev_kfree_skb(skb);
-                       noxfer++;
-                       continue;
-               }
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* Remap the page. */
-                       struct page *page = skb_shinfo(skb)->frags[0].page;
-                       unsigned long pfn = page_to_pfn(page);
-                       void *vaddr = page_address(page);
-
-                       MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
-                                               pfn_pte_ma(mfn, PAGE_KERNEL),
-                                               0);
-                       mcl++;
-                       mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
-                               | MMU_MACHPHYS_UPDATE;
-                       mmu->val = pfn;
-                       mmu++;
-
-                       set_phys_to_machine(pfn, mfn);
-               }
-               __skb_queue_tail(&free_list, skb);
-               xfer++;
-       }
-
-       IPRINTK("%s: %d xfer, %d noxfer, %d unused\n",
-               __FUNCTION__, xfer, noxfer, unused);
-
-       if (xfer) {
-               /* Some pages are no longer absent... */
-               balloon_update_driver_allowance(-xfer);
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       /* Do all the remapping work and M2P updates. */
-                       mcl->op = __HYPERVISOR_mmu_update;
-                       mcl->args[0] = (unsigned long)np->rx_mmu;
-                       mcl->args[1] = mmu - np->rx_mmu;
-                       mcl->args[2] = 0;
-                       mcl->args[3] = DOMID_SELF;
-                       mcl++;
-                       rc = HYPERVISOR_multicall_check(
-                               np->rx_mcl, mcl - np->rx_mcl, NULL);
-                       BUG_ON(rc);
-               }
-       }
-
-       while ((skb = __skb_dequeue(&free_list)) != NULL)
-               dev_kfree_skb(skb);
-
-       spin_unlock_bh(&np->rx_lock);
-}
-
-static int network_close(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       netif_stop_queue(np->netdev);
-       return 0;
-}
-
-
-static struct net_device_stats *network_get_stats(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       return &np->stats;
-}
-
-static int xennet_change_mtu(struct net_device *dev, int mtu)
-{
-       int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
-
-       if (mtu > max)
-               return -EINVAL;
-       dev->mtu = mtu;
-       return 0;
-}
-
-static int xennet_set_sg(struct net_device *dev, u32 data)
-{
-       if (data) {
-               struct netfront_info *np = netdev_priv(dev);
-               int val;
-
-               if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg",
-                                "%d", &val) < 0)
-                       val = 0;
-               if (!val)
-                       return -ENOSYS;
-       } else if (dev->mtu > ETH_DATA_LEN)
-               dev->mtu = ETH_DATA_LEN;
-
-       return ethtool_op_set_sg(dev, data);
-}
-
-static int xennet_set_tso(struct net_device *dev, u32 data)
-{
-#ifdef HAVE_TSO
-       if (data) {
-               struct netfront_info *np = netdev_priv(dev);
-               int val;
-
-               if (xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-                                "feature-gso-tcpv4", "%d", &val) < 0)
-                       val = 0;
-               if (!val)
-                       return -ENOSYS;
-       }
-
-       return ethtool_op_set_tso(dev, data);
-#else
-       return -ENOSYS;
-#endif
-}
-
-static void xennet_set_features(struct net_device *dev)
-{
-       dev_disable_gso_features(dev);
-       xennet_set_sg(dev, 0);
-
-       /* We need checksum offload to enable scatter/gather and TSO. */
-       if (!(dev->features & NETIF_F_IP_CSUM))
-               return;
-
-       if (xennet_set_sg(dev, 1))
-               return;
-
-       /* Before 2.6.9 TSO seems to be unreliable so do not enable it
-        * on older kernels.
-        */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9)
-       xennet_set_tso(dev, 1);
-#endif
-
-}
-
-static int network_connect(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       int i, requeue_idx, err;
-       struct sk_buff *skb;
-       grant_ref_t ref;
-       netif_rx_request_t *req;
-       unsigned int feature_rx_copy, feature_rx_flip;
-
-       err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-                          "feature-rx-copy", "%u", &feature_rx_copy);
-       if (err != 1)
-               feature_rx_copy = 0;
-       err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-                          "feature-rx-flip", "%u", &feature_rx_flip);
-       if (err != 1)
-               feature_rx_flip = 1;
-
-       /*
-        * Copy packets on receive path if:
-        *  (a) This was requested by user, and the backend supports it; or
-        *  (b) Flipping was requested, but this is unsupported by the backend.
-        */
-       np->copying_receiver = ((MODPARM_rx_copy && feature_rx_copy) ||
-                               (MODPARM_rx_flip && !feature_rx_flip));
-
-       err = talk_to_backend(np->xbdev, np);
-       if (err)
-               return err;
-
-       xennet_set_features(dev);
-
-       IPRINTK("device %s has %sing receive path.\n",
-               dev->name, np->copying_receiver ? "copy" : "flipp");
-
-       spin_lock_bh(&np->rx_lock);
-       spin_lock_irq(&np->tx_lock);
-
-       /*
-        * Recovery procedure:
-        *  NB. Freelist index entries are always going to be less than
-        *  PAGE_OFFSET, whereas pointers to skbs will always be equal or
-        *  greater than PAGE_OFFSET: we use this property to distinguish
-        *  them.
-        */
-
-       /* Step 1: Discard all pending TX packet fragments. */
-       netif_release_tx_bufs(np);
-
-       /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
-       for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
-               if (!np->rx_skbs[i])
-                       continue;
-
-               skb = np->rx_skbs[requeue_idx] = xennet_get_rx_skb(np, i);
-               ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);
-               req = RING_GET_REQUEST(&np->rx, requeue_idx);
-
-               if (!np->copying_receiver) {
-                       gnttab_grant_foreign_transfer_ref(
-                               ref, np->xbdev->otherend_id,
-                               page_to_pfn(skb_shinfo(skb)->frags->page));
-               } else {
-                       gnttab_grant_foreign_access_ref(
-                               ref, np->xbdev->otherend_id,
-                               pfn_to_mfn(page_to_pfn(skb_shinfo(skb)->
-                                                      frags->page)),
-                               0);
-               }
-               req->gref = ref;
-               req->id   = requeue_idx;
-
-               requeue_idx++;
-       }
-
-       np->rx.req_prod_pvt = requeue_idx;
-
-       /*
-        * Step 3: All public and private state should now be sane.  Get
-        * ready to start sending and receiving packets and give the driver
-        * domain a kick because we've probably just requeued some
-        * packets.
-        */
-       netfront_carrier_on(np);
-       notify_remote_via_irq(np->irq);
-       network_tx_buf_gc(dev);
-       network_alloc_rx_buffers(dev);
-
-       spin_unlock_irq(&np->tx_lock);
-       spin_unlock_bh(&np->rx_lock);
-
-       return 0;
-}
-
-static void netif_uninit(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       netif_release_tx_bufs(np);
-       netif_release_rx_bufs(np);
-       gnttab_free_grant_references(np->gref_tx_head);
-       gnttab_free_grant_references(np->gref_rx_head);
-}
-
-static struct ethtool_ops network_ethtool_ops =
-{
-       .get_tx_csum = ethtool_op_get_tx_csum,
-       .set_tx_csum = ethtool_op_set_tx_csum,
-       .get_sg = ethtool_op_get_sg,
-       .set_sg = xennet_set_sg,
-       .get_tso = ethtool_op_get_tso,
-       .set_tso = xennet_set_tso,
-       .get_link = ethtool_op_get_link,
-};
-
-#ifdef CONFIG_SYSFS
-static ssize_t show_rxbuf_min(struct class_device *cd, char *buf)
-{
-       struct net_device *netdev = container_of(cd, struct net_device,
-                                                class_dev);
-       struct netfront_info *info = netdev_priv(netdev);
-
-       return sprintf(buf, "%u\n", info->rx_min_target);
-}
-
-static ssize_t store_rxbuf_min(struct class_device *cd,
-                              const char *buf, size_t len)
-{
-       struct net_device *netdev = container_of(cd, struct net_device,
-                                                class_dev);
-       struct netfront_info *np = netdev_priv(netdev);
-       char *endp;
-       unsigned long target;
-
-       if (!capable(CAP_NET_ADMIN))
-               return -EPERM;
-
-       target = simple_strtoul(buf, &endp, 0);
-       if (endp == buf)
-               return -EBADMSG;
-
-       if (target < RX_MIN_TARGET)
-               target = RX_MIN_TARGET;
-       if (target > RX_MAX_TARGET)
-               target = RX_MAX_TARGET;
-
-       spin_lock_bh(&np->rx_lock);
-       if (target > np->rx_max_target)
-               np->rx_max_target = target;
-       np->rx_min_target = target;
-       if (target > np->rx_target)
-               np->rx_target = target;
-
-       network_alloc_rx_buffers(netdev);
-
-       spin_unlock_bh(&np->rx_lock);
-       return len;
-}
-
-static ssize_t show_rxbuf_max(struct class_device *cd, char *buf)
-{
-       struct net_device *netdev = container_of(cd, struct net_device,
-                                                class_dev);
-       struct netfront_info *info = netdev_priv(netdev);
-
-       return sprintf(buf, "%u\n", info->rx_max_target);
-}
-
-static ssize_t store_rxbuf_max(struct class_device *cd,
-                              const char *buf, size_t len)
-{
-       struct net_device *netdev = container_of(cd, struct net_device,
-                                                class_dev);
-       struct netfront_info *np = netdev_priv(netdev);
-       char *endp;
-       unsigned long target;
-
-       if (!capable(CAP_NET_ADMIN))
-               return -EPERM;
-
-       target = simple_strtoul(buf, &endp, 0);
-       if (endp == buf)
-               return -EBADMSG;
-
-       if (target < RX_MIN_TARGET)
-               target = RX_MIN_TARGET;
-       if (target > RX_MAX_TARGET)
-               target = RX_MAX_TARGET;
-
-       spin_lock_bh(&np->rx_lock);
-       if (target < np->rx_min_target)
-               np->rx_min_target = target;
-       np->rx_max_target = target;
-       if (target < np->rx_target)
-               np->rx_target = target;
-
-       network_alloc_rx_buffers(netdev);
-
-       spin_unlock_bh(&np->rx_lock);
-       return len;
-}
-
-static ssize_t show_rxbuf_cur(struct class_device *cd, char *buf)
-{
-       struct net_device *netdev = container_of(cd, struct net_device,
-                                                class_dev);
-       struct netfront_info *info = netdev_priv(netdev);
-
-       return sprintf(buf, "%u\n", info->rx_target);
-}
-
-static const struct class_device_attribute xennet_attrs[] = {
-       __ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf_min, store_rxbuf_min),
-       __ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf_max, store_rxbuf_max),
-       __ATTR(rxbuf_cur, S_IRUGO, show_rxbuf_cur, NULL),
-};
-
-static int xennet_sysfs_addif(struct net_device *netdev)
-{
-       int i;
-       int error = 0;
-
-       for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
-               error = class_device_create_file(&netdev->class_dev, 
-                                                &xennet_attrs[i]);
-               if (error)
-                       goto fail;
-       }
-       return 0;
-
- fail:
-       while (--i >= 0)
-               class_device_remove_file(&netdev->class_dev,
-                                        &xennet_attrs[i]);
-       return error;
-}
-
-static void xennet_sysfs_delif(struct net_device *netdev)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
-               class_device_remove_file(&netdev->class_dev,
-                                        &xennet_attrs[i]);
-       }
-}
-
-#endif /* CONFIG_SYSFS */
-
-
-/*
- * Nothing to do here. Virtual interface is point-to-point and the
- * physical interface is probably promiscuous anyway.
- */
-static void network_set_multicast_list(struct net_device *dev)
-{
-}
-
-static struct net_device * __devinit create_netdev(struct xenbus_device *dev)
-{
-       int i, err = 0;
-       struct net_device *netdev = NULL;
-       struct netfront_info *np = NULL;
-
-       netdev = alloc_etherdev(sizeof(struct netfront_info));
-       if (!netdev) {
-               printk(KERN_WARNING "%s> alloc_etherdev failed.\n",
-                      __FUNCTION__);
-               return ERR_PTR(-ENOMEM);
-       }
-
-       np                   = netdev_priv(netdev);
-       np->xbdev            = dev;
-
-       spin_lock_init(&np->tx_lock);
-       spin_lock_init(&np->rx_lock);
-
-       skb_queue_head_init(&np->rx_batch);
-       np->rx_target     = RX_DFL_MIN_TARGET;
-       np->rx_min_target = RX_DFL_MIN_TARGET;
-       np->rx_max_target = RX_MAX_TARGET;
-
-       init_timer(&np->rx_refill_timer);
-       np->rx_refill_timer.data = (unsigned long)netdev;
-       np->rx_refill_timer.function = rx_refill_timeout;
-
-       /* Initialise {tx,rx}_skbs as a free chain containing every entry. */
-       for (i = 0; i <= NET_TX_RING_SIZE; i++) {
-               np->tx_skbs[i] = (void *)((unsigned long) i+1);
-               np->grant_tx_ref[i] = GRANT_INVALID_REF;
-       }
-
-       for (i = 0; i < NET_RX_RING_SIZE; i++) {
-               np->rx_skbs[i] = NULL;
-               np->grant_rx_ref[i] = GRANT_INVALID_REF;
-       }
-
-       /* A grant for every tx ring slot */
-       if (gnttab_alloc_grant_references(TX_MAX_TARGET,
-                                         &np->gref_tx_head) < 0) {
-               printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n");
-               err = -ENOMEM;
-               goto exit;
-       }
-       /* A grant for every rx ring slot */
-       if (gnttab_alloc_grant_references(RX_MAX_TARGET,
-                                         &np->gref_rx_head) < 0) {
-               printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n");
-               err = -ENOMEM;
-               goto exit_free_tx;
-       }
-
-       netdev->open            = network_open;
-       netdev->hard_start_xmit = network_start_xmit;
-       netdev->stop            = network_close;
-       netdev->get_stats       = network_get_stats;
-       netdev->poll            = netif_poll;
-       netdev->set_multicast_list = network_set_multicast_list;
-       netdev->uninit          = netif_uninit;
-       netdev->change_mtu      = xennet_change_mtu;
-       netdev->weight          = 64;
-       netdev->features        = NETIF_F_IP_CSUM;
-
-       SET_ETHTOOL_OPS(netdev, &network_ethtool_ops);
-       SET_MODULE_OWNER(netdev);
-       SET_NETDEV_DEV(netdev, &dev->dev);
-
-       np->netdev = netdev;
-
-       netfront_carrier_off(np);
-
-       return netdev;
-
- exit_free_tx:
-       gnttab_free_grant_references(np->gref_tx_head);
- exit:
-       free_netdev(netdev);
-       return ERR_PTR(err);
-}
-
-/*
- * We use this notifier to send out a fake ARP reply to reset switches and
- * router ARP caches when an IP interface is brought up on a VIF.
- */
-static int
-inetdev_notify(struct notifier_block *this, unsigned long event, void *ptr)
-{
-       struct in_ifaddr  *ifa = (struct in_ifaddr *)ptr;
-       struct net_device *dev = ifa->ifa_dev->dev;
-
-       /* UP event and is it one of our devices? */
-       if (event == NETDEV_UP && dev->open == network_open)
-               (void)send_fake_arp(dev);
-
-       return NOTIFY_DONE;
-}
-
-
-static void netif_disconnect_backend(struct netfront_info *info)
-{
-       /* Stop old i/f to prevent errors whilst we rebuild the state. */
-       spin_lock_bh(&info->rx_lock);
-       spin_lock_irq(&info->tx_lock);
-       netfront_carrier_off(info);
-       spin_unlock_irq(&info->tx_lock);
-       spin_unlock_bh(&info->rx_lock);
-
-       if (info->irq)
-               unbind_from_irqhandler(info->irq, info->netdev);
-       info->irq = 0;
-
-       end_access(info->tx_ring_ref, info->tx.sring);
-       end_access(info->rx_ring_ref, info->rx.sring);
-       info->tx_ring_ref = GRANT_INVALID_REF;
-       info->rx_ring_ref = GRANT_INVALID_REF;
-       info->tx.sring = NULL;
-       info->rx.sring = NULL;
-}
-
-
-static void end_access(int ref, void *page)
-{
-       if (ref != GRANT_INVALID_REF)
-               gnttab_end_foreign_access(ref, 0, (unsigned long)page);
-}
-
-
-/* ** Driver registration ** */
-
-
-static struct xenbus_device_id netfront_ids[] = {
-       { "vif" },
-       { "" }
-};
-
-
-static struct xenbus_driver netfront = {
-       .name = "vif",
-       .owner = THIS_MODULE,
-       .ids = netfront_ids,
-       .probe = netfront_probe,
-       .remove = __devexit_p(netfront_remove),
-       .resume = netfront_resume,
-       .otherend_changed = backend_changed,
-};
-
-
-static struct notifier_block notifier_inetdev = {
-       .notifier_call  = inetdev_notify,
-       .next           = NULL,
-       .priority       = 0
-};
-
-static int __init netif_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-#ifdef CONFIG_XEN
-       if (MODPARM_rx_flip && MODPARM_rx_copy) {
-               WPRINTK("Cannot specify both rx_copy and rx_flip.\n");
-               return -EINVAL;
-       }
-
-       if (!MODPARM_rx_flip && !MODPARM_rx_copy)
-               MODPARM_rx_flip = 1; /* Default is to flip. */
-#endif
-
-       if (is_initial_xendomain())
-               return 0;
-
-       IPRINTK("Initialising virtual ethernet driver.\n");
-
-       (void)register_inetaddr_notifier(&notifier_inetdev);
-
-       return xenbus_register_frontend(&netfront);
-}
-module_init(netif_init);
-
-
-static void __exit netif_exit(void)
-{
-       if (is_initial_xendomain())
-               return;
-
-       unregister_inetaddr_notifier(&notifier_inetdev);
-
-       return xenbus_unregister_driver(&netfront);
-}
-module_exit(netif_exit);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/Makefile b/linux-2.6-xen-sparse/drivers/xen/pciback/Makefile
deleted file mode 100644 (file)
index c7185fb..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-obj-$(CONFIG_XEN_PCIDEV_BACKEND) += pciback.o
-
-pciback-y := pci_stub.o pciback_ops.o xenbus.o
-pciback-y += conf_space.o conf_space_header.o \
-            conf_space_capability.o \
-            conf_space_capability_vpd.o \
-            conf_space_capability_pm.o \
-             conf_space_quirks.o
-pciback-$(CONFIG_XEN_PCIDEV_BACKEND_VPCI) += vpci.o
-pciback-$(CONFIG_XEN_PCIDEV_BACKEND_SLOT) += slot.o
-pciback-$(CONFIG_XEN_PCIDEV_BACKEND_PASS) += passthrough.o
-
-ifeq ($(CONFIG_XEN_PCIDEV_BE_DEBUG),y)
-EXTRA_CFLAGS += -DDEBUG
-endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c
deleted file mode 100644 (file)
index 4c99534..0000000
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * PCI Backend - Functions for creating a virtual configuration space for
- *               exported PCI Devices.
- *               It's dangerous to allow PCI Driver Domains to change their
- *               device's resources (memory, i/o ports, interrupts). We need to
- *               restrict changes to certain PCI Configuration registers:
- *               BARs, INTERRUPT_PIN, most registers in the header...
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include "pciback.h"
-#include "conf_space.h"
-#include "conf_space_quirks.h"
-
-#define DEFINE_PCI_CONFIG(op,size,type)                        \
-int pciback_##op##_config_##size                               \
-(struct pci_dev *dev, int offset, type value, void *data)      \
-{                                                              \
-       return pci_##op##_config_##size (dev, offset, value);   \
-}
-
-DEFINE_PCI_CONFIG(read, byte, u8 *)
-DEFINE_PCI_CONFIG(read, word, u16 *)
-DEFINE_PCI_CONFIG(read, dword, u32 *)
-
-DEFINE_PCI_CONFIG(write, byte, u8)
-DEFINE_PCI_CONFIG(write, word, u16)
-DEFINE_PCI_CONFIG(write, dword, u32)
-
-static int conf_space_read(struct pci_dev *dev,
-                          struct config_field_entry *entry, int offset,
-                          u32 * value)
-{
-       int ret = 0;
-       struct config_field *field = entry->field;
-
-       *value = 0;
-
-       switch (field->size) {
-       case 1:
-               if (field->u.b.read)
-                       ret = field->u.b.read(dev, offset, (u8 *) value,
-                                             entry->data);
-               break;
-       case 2:
-               if (field->u.w.read)
-                       ret = field->u.w.read(dev, offset, (u16 *) value,
-                                             entry->data);
-               break;
-       case 4:
-               if (field->u.dw.read)
-                       ret = field->u.dw.read(dev, offset, value, entry->data);
-               break;
-       }
-       return ret;
-}
-
-static int conf_space_write(struct pci_dev *dev,
-                           struct config_field_entry *entry, int offset,
-                           u32 value)
-{
-       int ret = 0;
-       struct config_field *field = entry->field;
-
-       switch (field->size) {
-       case 1:
-               if (field->u.b.write)
-                       ret = field->u.b.write(dev, offset, (u8) value,
-                                              entry->data);
-               break;
-       case 2:
-               if (field->u.w.write)
-                       ret = field->u.w.write(dev, offset, (u16) value,
-                                              entry->data);
-               break;
-       case 4:
-               if (field->u.dw.write)
-                       ret = field->u.dw.write(dev, offset, value,
-                                               entry->data);
-               break;
-       }
-       return ret;
-}
-
-static inline u32 get_mask(int size)
-{
-       if (size == 1)
-               return 0xff;
-       else if (size == 2)
-               return 0xffff;
-       else
-               return 0xffffffff;
-}
-
-static inline int valid_request(int offset, int size)
-{
-       /* Validate request (no un-aligned requests) */
-       if ((size == 1 || size == 2 || size == 4) && (offset % size) == 0)
-               return 1;
-       return 0;
-}
-
-static inline u32 merge_value(u32 val, u32 new_val, u32 new_val_mask,
-                             int offset)
-{
-       if (offset >= 0) {
-               new_val_mask <<= (offset * 8);
-               new_val <<= (offset * 8);
-       } else {
-               new_val_mask >>= (offset * -8);
-               new_val >>= (offset * -8);
-       }
-       val = (val & ~new_val_mask) | (new_val & new_val_mask);
-
-       return val;
-}
-
-static int pcibios_err_to_errno(int err)
-{
-       switch (err) {
-       case PCIBIOS_SUCCESSFUL:
-               return XEN_PCI_ERR_success;
-       case PCIBIOS_DEVICE_NOT_FOUND:
-               return XEN_PCI_ERR_dev_not_found;
-       case PCIBIOS_BAD_REGISTER_NUMBER:
-               return XEN_PCI_ERR_invalid_offset;
-       case PCIBIOS_FUNC_NOT_SUPPORTED:
-               return XEN_PCI_ERR_not_implemented;
-       case PCIBIOS_SET_FAILED:
-               return XEN_PCI_ERR_access_denied;
-       }
-       return err;
-}
-
-int pciback_config_read(struct pci_dev *dev, int offset, int size,
-                       u32 * ret_val)
-{
-       int err = 0;
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry;
-       struct config_field *field;
-       int req_start, req_end, field_start, field_end;
-       /* if read fails for any reason, return 0 (as if device didn't respond) */
-       u32 value = 0, tmp_val;
-
-       if (unlikely(verbose_request))
-               printk(KERN_DEBUG "pciback: %s: read %d bytes at 0x%x\n",
-                      pci_name(dev), size, offset);
-
-       if (!valid_request(offset, size)) {
-               err = XEN_PCI_ERR_invalid_offset;
-               goto out;
-       }
-
-       /* Get the real value first, then modify as appropriate */
-       switch (size) {
-       case 1:
-               err = pci_read_config_byte(dev, offset, (u8 *) & value);
-               break;
-       case 2:
-               err = pci_read_config_word(dev, offset, (u16 *) & value);
-               break;
-       case 4:
-               err = pci_read_config_dword(dev, offset, &value);
-               break;
-       }
-
-       list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-               field = cfg_entry->field;
-
-               req_start = offset;
-               req_end = offset + size;
-               field_start = OFFSET(cfg_entry);
-               field_end = OFFSET(cfg_entry) + field->size;
-
-               if ((req_start >= field_start && req_start < field_end)
-                   || (req_end > field_start && req_end <= field_end)) {
-                       err = conf_space_read(dev, cfg_entry, field_start,
-                                             &tmp_val);
-                       if (err)
-                               goto out;
-
-                       value = merge_value(value, tmp_val,
-                                           get_mask(field->size),
-                                           field_start - req_start);
-               }
-       }
-
-      out:
-       if (unlikely(verbose_request))
-               printk(KERN_DEBUG "pciback: %s: read %d bytes at 0x%x = %x\n",
-                      pci_name(dev), size, offset, value);
-
-       *ret_val = value;
-       return pcibios_err_to_errno(err);
-}
-
-int pciback_config_write(struct pci_dev *dev, int offset, int size, u32 value)
-{
-       int err = 0, handled = 0;
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry;
-       struct config_field *field;
-       u32 tmp_val;
-       int req_start, req_end, field_start, field_end;
-
-       if (unlikely(verbose_request))
-               printk(KERN_DEBUG
-                      "pciback: %s: write request %d bytes at 0x%x = %x\n",
-                      pci_name(dev), size, offset, value);
-
-       if (!valid_request(offset, size))
-               return XEN_PCI_ERR_invalid_offset;
-
-       list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-               field = cfg_entry->field;
-
-               req_start = offset;
-               req_end = offset + size;
-               field_start = OFFSET(cfg_entry);
-               field_end = OFFSET(cfg_entry) + field->size;
-
-               if ((req_start >= field_start && req_start < field_end)
-                   || (req_end > field_start && req_end <= field_end)) {
-                       tmp_val = 0;
-
-                       err = pciback_config_read(dev, field_start,
-                                                 field->size, &tmp_val);
-                       if (err)
-                               break;
-
-                       tmp_val = merge_value(tmp_val, value, get_mask(size),
-                                             req_start - field_start);
-
-                       err = conf_space_write(dev, cfg_entry, field_start,
-                                              tmp_val);
-
-                       /* handled is set true here, but not every byte
-                        * may have been written! Properly detecting if
-                        * every byte is handled is unnecessary as the
-                        * flag is used to detect devices that need
-                        * special helpers to work correctly.
-                        */
-                       handled = 1;
-               }
-       }
-
-       if (!handled && !err) {
-               /* By default, anything not specificially handled above is
-                * read-only. The permissive flag changes this behavior so
-                * that anything not specifically handled above is writable.
-                * This means that some fields may still be read-only because
-                * they have entries in the config_field list that intercept
-                * the write and do nothing. */
-               if (dev_data->permissive) {
-                       switch (size) {
-                       case 1:
-                               err = pci_write_config_byte(dev, offset,
-                                                           (u8) value);
-                               break;
-                       case 2:
-                               err = pci_write_config_word(dev, offset,
-                                                           (u16) value);
-                               break;
-                       case 4:
-                               err = pci_write_config_dword(dev, offset,
-                                                            (u32) value);
-                               break;
-                       }
-               } else if (!dev_data->warned_on_write) {
-                       dev_data->warned_on_write = 1;
-                       dev_warn(&dev->dev, "Driver tried to write to a "
-                                "read-only configuration space field at offset "
-                                "0x%x, size %d. This may be harmless, but if "
-                                "you have problems with your device:\n"
-                                "1) see permissive attribute in sysfs\n"
-                                "2) report problems to the xen-devel "
-                                "mailing list along with details of your "
-                                "device obtained from lspci.\n", offset, size);
-               }
-       }
-
-       return pcibios_err_to_errno(err);
-}
-
-void pciback_config_free_dyn_fields(struct pci_dev *dev)
-{
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry, *t;
-       struct config_field *field;
-
-       dev_dbg(&dev->dev,
-               "free-ing dynamically allocated virtual configuration space fields\n");
-
-       list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
-               field = cfg_entry->field;
-
-               if (field->clean) {
-                       field->clean(field);
-
-                       if (cfg_entry->data)
-                               kfree(cfg_entry->data);
-
-                       list_del(&cfg_entry->list);
-                       kfree(cfg_entry);
-               }
-
-       }
-}
-
-void pciback_config_reset_dev(struct pci_dev *dev)
-{
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry;
-       struct config_field *field;
-
-       dev_dbg(&dev->dev, "resetting virtual configuration space\n");
-
-       list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-               field = cfg_entry->field;
-
-               if (field->reset)
-                       field->reset(dev, OFFSET(cfg_entry), cfg_entry->data);
-       }
-}
-
-void pciback_config_free_dev(struct pci_dev *dev)
-{
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry, *t;
-       struct config_field *field;
-
-       dev_dbg(&dev->dev, "free-ing virtual configuration space fields\n");
-
-       list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
-               list_del(&cfg_entry->list);
-
-               field = cfg_entry->field;
-
-               if (field->release)
-                       field->release(dev, OFFSET(cfg_entry), cfg_entry->data);
-
-               kfree(cfg_entry);
-       }
-}
-
-int pciback_config_add_field_offset(struct pci_dev *dev,
-                                   struct config_field *field,
-                                   unsigned int base_offset)
-{
-       int err = 0;
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry;
-       void *tmp;
-
-       cfg_entry = kmalloc(sizeof(*cfg_entry), GFP_KERNEL);
-       if (!cfg_entry) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       cfg_entry->data = NULL;
-       cfg_entry->field = field;
-       cfg_entry->base_offset = base_offset;
-
-       /* silently ignore duplicate fields */
-       err = pciback_field_is_dup(dev,OFFSET(cfg_entry));
-       if (err)
-               goto out;
-
-       if (field->init) {
-               tmp = field->init(dev, OFFSET(cfg_entry));
-
-               if (IS_ERR(tmp)) {
-                       err = PTR_ERR(tmp);
-                       goto out;
-               }
-
-               cfg_entry->data = tmp;
-       }
-
-       dev_dbg(&dev->dev, "added config field at offset 0x%02x\n",
-               OFFSET(cfg_entry));
-       list_add_tail(&cfg_entry->list, &dev_data->config_fields);
-
-      out:
-       if (err)
-               kfree(cfg_entry);
-
-       return err;
-}
-
-/* This sets up the device's virtual configuration space to keep track of 
- * certain registers (like the base address registers (BARs) so that we can
- * keep the client from manipulating them directly.
- */
-int pciback_config_init_dev(struct pci_dev *dev)
-{
-       int err = 0;
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-
-       dev_dbg(&dev->dev, "initializing virtual configuration space\n");
-
-       INIT_LIST_HEAD(&dev_data->config_fields);
-
-       err = pciback_config_header_add_fields(dev);
-       if (err)
-               goto out;
-
-       err = pciback_config_capability_add_fields(dev);
-       if (err)
-               goto out;
-
-       err = pciback_config_quirks_init(dev);
-
-      out:
-       return err;
-}
-
-int pciback_config_init(void)
-{
-       return pciback_config_capability_init();
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.h b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.h
deleted file mode 100644 (file)
index 76fe5d8..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * PCI Backend - Common data structures for overriding the configuration space
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#ifndef __XEN_PCIBACK_CONF_SPACE_H__
-#define __XEN_PCIBACK_CONF_SPACE_H__
-
-#include <linux/list.h>
-#include <linux/err.h>
-
-/* conf_field_init can return an errno in a ptr with ERR_PTR() */
-typedef void *(*conf_field_init) (struct pci_dev * dev, int offset);
-typedef void (*conf_field_reset) (struct pci_dev * dev, int offset, void *data);
-typedef void (*conf_field_free) (struct pci_dev * dev, int offset, void *data);
-
-typedef int (*conf_dword_write) (struct pci_dev * dev, int offset, u32 value,
-                                void *data);
-typedef int (*conf_word_write) (struct pci_dev * dev, int offset, u16 value,
-                               void *data);
-typedef int (*conf_byte_write) (struct pci_dev * dev, int offset, u8 value,
-                               void *data);
-typedef int (*conf_dword_read) (struct pci_dev * dev, int offset, u32 * value,
-                               void *data);
-typedef int (*conf_word_read) (struct pci_dev * dev, int offset, u16 * value,
-                              void *data);
-typedef int (*conf_byte_read) (struct pci_dev * dev, int offset, u8 * value,
-                              void *data);
-
-/* These are the fields within the configuration space which we
- * are interested in intercepting reads/writes to and changing their
- * values.
- */
-struct config_field {
-       unsigned int offset;
-       unsigned int size;
-       unsigned int mask;
-       conf_field_init init;
-       conf_field_reset reset;
-       conf_field_free release;
-       void (*clean) (struct config_field * field);
-       union {
-               struct {
-                       conf_dword_write write;
-                       conf_dword_read read;
-               } dw;
-               struct {
-                       conf_word_write write;
-                       conf_word_read read;
-               } w;
-               struct {
-                       conf_byte_write write;
-                       conf_byte_read read;
-               } b;
-       } u;
-       struct list_head list;
-};
-
-struct config_field_entry {
-       struct list_head list;
-       struct config_field *field;
-       unsigned int base_offset;
-       void *data;
-};
-
-#define OFFSET(cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset)
-
-/* Add fields to a device - the add_fields macro expects to get a pointer to
- * the first entry in an array (of which the ending is marked by size==0)
- */
-int pciback_config_add_field_offset(struct pci_dev *dev,
-                                   struct config_field *field,
-                                   unsigned int offset);
-
-static inline int pciback_config_add_field(struct pci_dev *dev,
-                                          struct config_field *field)
-{
-       return pciback_config_add_field_offset(dev, field, 0);
-}
-
-static inline int pciback_config_add_fields(struct pci_dev *dev,
-                                           struct config_field *field)
-{
-       int i, err = 0;
-       for (i = 0; field[i].size != 0; i++) {
-               err = pciback_config_add_field(dev, &field[i]);
-               if (err)
-                       break;
-       }
-       return err;
-}
-
-static inline int pciback_config_add_fields_offset(struct pci_dev *dev,
-                                                  struct config_field *field,
-                                                  unsigned int offset)
-{
-       int i, err = 0;
-       for (i = 0; field[i].size != 0; i++) {
-               err = pciback_config_add_field_offset(dev, &field[i], offset);
-               if (err)
-                       break;
-       }
-       return err;
-}
-
-/* Read/Write the real configuration space */
-int pciback_read_config_byte(struct pci_dev *dev, int offset, u8 * value,
-                            void *data);
-int pciback_read_config_word(struct pci_dev *dev, int offset, u16 * value,
-                            void *data);
-int pciback_read_config_dword(struct pci_dev *dev, int offset, u32 * value,
-                             void *data);
-int pciback_write_config_byte(struct pci_dev *dev, int offset, u8 value,
-                             void *data);
-int pciback_write_config_word(struct pci_dev *dev, int offset, u16 value,
-                             void *data);
-int pciback_write_config_dword(struct pci_dev *dev, int offset, u32 value,
-                              void *data);
-
-int pciback_config_capability_init(void);
-
-int pciback_config_header_add_fields(struct pci_dev *dev);
-int pciback_config_capability_add_fields(struct pci_dev *dev);
-
-#endif                         /* __XEN_PCIBACK_CONF_SPACE_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.c
deleted file mode 100644 (file)
index 832a0c8..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * PCI Backend - Handles the virtual fields found on the capability lists
- *               in the configuration space.
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include "pciback.h"
-#include "conf_space.h"
-#include "conf_space_capability.h"
-
-static LIST_HEAD(capabilities);
-
-static struct config_field caplist_header[] = {
-       {
-        .offset    = PCI_CAP_LIST_ID,
-        .size      = 2, /* encompass PCI_CAP_LIST_ID & PCI_CAP_LIST_NEXT */
-        .u.w.read  = pciback_read_config_word,
-        .u.w.write = NULL,
-       },
-       {
-        .size = 0,
-       },
-};
-
-static inline void register_capability(struct pciback_config_capability *cap)
-{
-       list_add_tail(&cap->cap_list, &capabilities);
-}
-
-int pciback_config_capability_add_fields(struct pci_dev *dev)
-{
-       int err = 0;
-       struct pciback_config_capability *cap;
-       int cap_offset;
-
-       list_for_each_entry(cap, &capabilities, cap_list) {
-               cap_offset = pci_find_capability(dev, cap->capability);
-               if (cap_offset) {
-                       dev_dbg(&dev->dev, "Found capability 0x%x at 0x%x\n",
-                               cap->capability, cap_offset);
-
-                       err = pciback_config_add_fields_offset(dev,
-                                                              caplist_header,
-                                                              cap_offset);
-                       if (err)
-                               goto out;
-                       err = pciback_config_add_fields_offset(dev,
-                                                              cap->fields,
-                                                              cap_offset);
-                       if (err)
-                               goto out;
-               }
-       }
-
-      out:
-       return err;
-}
-
-extern struct pciback_config_capability pciback_config_capability_vpd;
-extern struct pciback_config_capability pciback_config_capability_pm;
-
-int pciback_config_capability_init(void)
-{
-       register_capability(&pciback_config_capability_vpd);
-       register_capability(&pciback_config_capability_pm);
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.h b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability.h
deleted file mode 100644 (file)
index 02bfcad..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * PCI Backend - Data structures for special overlays for structures on
- *               the capability list.
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#ifndef __PCIBACK_CONFIG_CAPABILITY_H__
-#define __PCIBACK_CONFIG_CAPABILITY_H__
-
-#include <linux/pci.h>
-#include <linux/list.h>
-
-struct pciback_config_capability {
-       struct list_head cap_list;
-
-       int capability;
-
-       /* If the device has the capability found above, add these fields */
-       struct config_field *fields;
-};
-
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c
deleted file mode 100644 (file)
index 1cdc6e9..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * PCI Backend - Configuration space overlay for power management
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/pci.h>
-#include "conf_space.h"
-#include "conf_space_capability.h"
-
-static int pm_caps_read(struct pci_dev *dev, int offset, u16 *value,
-                       void *data)
-{
-       int err;
-       u16 real_value;
-
-       err = pci_read_config_word(dev, offset, &real_value);
-       if (err)
-               goto out;
-
-       *value = real_value & ~PCI_PM_CAP_PME_MASK;
-
-      out:
-       return err;
-}
-
-/* PM_OK_BITS specifies the bits that the driver domain is allowed to change.
- * Can't allow driver domain to enable PMEs - they're shared */
-#define PM_OK_BITS (PCI_PM_CTRL_PME_STATUS|PCI_PM_CTRL_DATA_SEL_MASK)
-
-static int pm_ctrl_write(struct pci_dev *dev, int offset, u16 new_value,
-                        void *data)
-{
-       int err;
-       u16 old_value;
-       pci_power_t new_state, old_state;
-
-       err = pci_read_config_word(dev, offset, &old_value);
-       if (err)
-               goto out;
-
-       old_state = (pci_power_t)(old_value & PCI_PM_CTRL_STATE_MASK);
-       new_state = (pci_power_t)(new_value & PCI_PM_CTRL_STATE_MASK);
-
-       new_value &= PM_OK_BITS;
-       if ((old_value & PM_OK_BITS) != new_value) {
-               new_value = (old_value & ~PM_OK_BITS) | new_value;
-               err = pci_write_config_word(dev, offset, new_value);
-               if (err)
-                       goto out;
-       }
-
-       /* Let pci core handle the power management change */
-       dev_dbg(&dev->dev, "set power state to %x\n", new_state);
-       err = pci_set_power_state(dev, new_state);
-       if (err) {
-               err = PCIBIOS_SET_FAILED;
-               goto out;
-       }
-
-       /*
-        * Device may lose PCI config info on D3->D0 transition. This
-        * is a problem for some guests which will not reset BARs. Even
-        * those that have a go will be foiled by our BAR-write handler
-        * which will discard the write! Since Linux won't re-init
-        * the config space automatically in all cases, we do it here.
-        * Future: Should we re-initialise all first 64 bytes of config space?
-        */
-       if (new_state == PCI_D0 &&
-           (old_state == PCI_D3hot || old_state == PCI_D3cold) &&
-           !(old_value & PCI_PM_CTRL_NO_SOFT_RESET))
-               pci_restore_bars(dev);
-
- out:
-       return err;
-}
-
-/* Ensure PMEs are disabled */
-static void *pm_ctrl_init(struct pci_dev *dev, int offset)
-{
-       int err;
-       u16 value;
-
-       err = pci_read_config_word(dev, offset, &value);
-       if (err)
-               goto out;
-
-       if (value & PCI_PM_CTRL_PME_ENABLE) {
-               value &= ~PCI_PM_CTRL_PME_ENABLE;
-               err = pci_write_config_word(dev, offset, value);
-       }
-
-      out:
-       return ERR_PTR(err);
-}
-
-static struct config_field caplist_pm[] = {
-       {
-               .offset     = PCI_PM_PMC,
-               .size       = 2,
-               .u.w.read   = pm_caps_read,
-       },
-       {
-               .offset     = PCI_PM_CTRL,
-               .size       = 2,
-               .init       = pm_ctrl_init,
-               .u.w.read   = pciback_read_config_word,
-               .u.w.write  = pm_ctrl_write,
-       },
-       {
-               .offset     = PCI_PM_PPB_EXTENSIONS,
-               .size       = 1,
-               .u.b.read   = pciback_read_config_byte,
-       },
-       {
-               .offset     = PCI_PM_DATA_REGISTER,
-               .size       = 1,
-               .u.b.read   = pciback_read_config_byte,
-       },
-       {
-               .size = 0,
-       },
-};
-
-struct pciback_config_capability pciback_config_capability_pm = {
-       .capability = PCI_CAP_ID_PM,
-       .fields = caplist_pm,
-};
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_vpd.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_vpd.c
deleted file mode 100644 (file)
index cc6b853..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * PCI Backend - Configuration space overlay for Vital Product Data
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/pci.h>
-#include "conf_space.h"
-#include "conf_space_capability.h"
-
-static int vpd_address_write(struct pci_dev *dev, int offset, u16 value,
-                            void *data)
-{
-       /* Disallow writes to the vital product data */
-       if (value & PCI_VPD_ADDR_F)
-               return PCIBIOS_SET_FAILED;
-       else
-               return pci_write_config_word(dev, offset, value);
-}
-
-static struct config_field caplist_vpd[] = {
-       {
-        .offset    = PCI_VPD_ADDR,
-        .size      = 2,
-        .u.w.read  = pciback_read_config_word,
-        .u.w.write = vpd_address_write,
-        },
-       {
-        .offset     = PCI_VPD_DATA,
-        .size       = 4,
-        .u.dw.read  = pciback_read_config_dword,
-        .u.dw.write = NULL,
-        },
-       {
-        .size = 0,
-        },
-};
-struct pciback_config_capability pciback_config_capability_vpd = {
-       .capability = PCI_CAP_ID_VPD,
-       .fields = caplist_vpd,
-};
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_header.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_header.c
deleted file mode 100644 (file)
index c289621..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * PCI Backend - Handles the virtual fields in the configuration space headers.
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include "pciback.h"
-#include "conf_space.h"
-
-struct pci_bar_info {
-       u32 val;
-       u32 len_val;
-       int which;
-};
-
-#define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO))
-#define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER)
-
-static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
-{
-       int err;
-
-       if (!dev->is_enabled && is_enable_cmd(value)) {
-               if (unlikely(verbose_request))
-                       printk(KERN_DEBUG "pciback: %s: enable\n",
-                              pci_name(dev));
-               err = pci_enable_device(dev);
-               if (err)
-                       return err;
-       } else if (dev->is_enabled && !is_enable_cmd(value)) {
-               if (unlikely(verbose_request))
-                       printk(KERN_DEBUG "pciback: %s: disable\n",
-                              pci_name(dev));
-               pci_disable_device(dev);
-       }
-
-       if (!dev->is_busmaster && is_master_cmd(value)) {
-               if (unlikely(verbose_request))
-                       printk(KERN_DEBUG "pciback: %s: set bus master\n",
-                              pci_name(dev));
-               pci_set_master(dev);
-       }
-
-       if (value & PCI_COMMAND_INVALIDATE) {
-               if (unlikely(verbose_request))
-                       printk(KERN_DEBUG
-                              "pciback: %s: enable memory-write-invalidate\n",
-                              pci_name(dev));
-               err = pci_set_mwi(dev);
-               if (err) {
-                       printk(KERN_WARNING
-                              "pciback: %s: cannot enable memory-write-invalidate (%d)\n",
-                              pci_name(dev), err);
-                       value &= ~PCI_COMMAND_INVALIDATE;
-               }
-       }
-
-       return pci_write_config_word(dev, offset, value);
-}
-
-static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data)
-{
-       struct pci_bar_info *bar = data;
-
-       if (unlikely(!bar)) {
-               printk(KERN_WARNING "pciback: driver data not found for %s\n",
-                      pci_name(dev));
-               return XEN_PCI_ERR_op_failed;
-       }
-
-       /* A write to obtain the length must happen as a 32-bit write.
-        * This does not (yet) support writing individual bytes
-        */
-       if (value == ~PCI_ROM_ADDRESS_ENABLE)
-               bar->which = 1;
-       else
-               bar->which = 0;
-
-       /* Do we need to support enabling/disabling the rom address here? */
-
-       return 0;
-}
-
-/* For the BARs, only allow writes which write ~0 or
- * the correct resource information
- * (Needed for when the driver probes the resource usage)
- */
-static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
-{
-       struct pci_bar_info *bar = data;
-
-       if (unlikely(!bar)) {
-               printk(KERN_WARNING "pciback: driver data not found for %s\n",
-                      pci_name(dev));
-               return XEN_PCI_ERR_op_failed;
-       }
-
-       /* A write to obtain the length must happen as a 32-bit write.
-        * This does not (yet) support writing individual bytes
-        */
-       if (value == ~0)
-               bar->which = 1;
-       else
-               bar->which = 0;
-
-       return 0;
-}
-
-static int bar_read(struct pci_dev *dev, int offset, u32 * value, void *data)
-{
-       struct pci_bar_info *bar = data;
-
-       if (unlikely(!bar)) {
-               printk(KERN_WARNING "pciback: driver data not found for %s\n",
-                      pci_name(dev));
-               return XEN_PCI_ERR_op_failed;
-       }
-
-       *value = bar->which ? bar->len_val : bar->val;
-
-       return 0;
-}
-
-static inline void read_dev_bar(struct pci_dev *dev,
-                               struct pci_bar_info *bar_info, int offset,
-                               u32 len_mask)
-{
-       pci_read_config_dword(dev, offset, &bar_info->val);
-       pci_write_config_dword(dev, offset, len_mask);
-       pci_read_config_dword(dev, offset, &bar_info->len_val);
-       pci_write_config_dword(dev, offset, bar_info->val);
-}
-
-static void *bar_init(struct pci_dev *dev, int offset)
-{
-       struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL);
-
-       if (!bar)
-               return ERR_PTR(-ENOMEM);
-
-       read_dev_bar(dev, bar, offset, ~0);
-       bar->which = 0;
-
-       return bar;
-}
-
-static void *rom_init(struct pci_dev *dev, int offset)
-{
-       struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL);
-
-       if (!bar)
-               return ERR_PTR(-ENOMEM);
-
-       read_dev_bar(dev, bar, offset, ~PCI_ROM_ADDRESS_ENABLE);
-       bar->which = 0;
-
-       return bar;
-}
-
-static void bar_reset(struct pci_dev *dev, int offset, void *data)
-{
-       struct pci_bar_info *bar = data;
-
-       bar->which = 0;
-}
-
-static void bar_release(struct pci_dev *dev, int offset, void *data)
-{
-       kfree(data);
-}
-
-static int interrupt_read(struct pci_dev *dev, int offset, u8 * value,
-                         void *data)
-{
-       *value = (u8) dev->irq;
-
-       return 0;
-}
-
-static int bist_write(struct pci_dev *dev, int offset, u8 value, void *data)
-{
-       u8 cur_value;
-       int err;
-
-       err = pci_read_config_byte(dev, offset, &cur_value);
-       if (err)
-               goto out;
-
-       if ((cur_value & ~PCI_BIST_START) == (value & ~PCI_BIST_START)
-           || value == PCI_BIST_START)
-               err = pci_write_config_byte(dev, offset, value);
-
-      out:
-       return err;
-}
-
-static struct config_field header_common[] = {
-       {
-        .offset    = PCI_COMMAND,
-        .size      = 2,
-        .u.w.read  = pciback_read_config_word,
-        .u.w.write = command_write,
-       },
-       {
-        .offset    = PCI_INTERRUPT_LINE,
-        .size      = 1,
-        .u.b.read  = interrupt_read,
-       },
-       {
-        .offset    = PCI_INTERRUPT_PIN,
-        .size      = 1,
-        .u.b.read  = pciback_read_config_byte,
-       },
-       {
-        /* Any side effects of letting driver domain control cache line? */
-        .offset    = PCI_CACHE_LINE_SIZE,
-        .size      = 1,
-        .u.b.read  = pciback_read_config_byte,
-        .u.b.write = pciback_write_config_byte,
-       },
-       {
-        .offset    = PCI_LATENCY_TIMER,
-        .size      = 1,
-        .u.b.read  = pciback_read_config_byte,
-       },
-       {
-        .offset    = PCI_BIST,
-        .size      = 1,
-        .u.b.read  = pciback_read_config_byte,
-        .u.b.write = bist_write,
-       },
-       {
-        .size = 0,
-       },
-};
-
-#define CFG_FIELD_BAR(reg_offset)                      \
-       {                                               \
-        .offset     = reg_offset,                      \
-        .size       = 4,                               \
-        .init       = bar_init,                        \
-        .reset      = bar_reset,                       \
-        .release    = bar_release,                     \
-        .u.dw.read  = bar_read,                        \
-        .u.dw.write = bar_write,                       \
-        }
-
-#define CFG_FIELD_ROM(reg_offset)                      \
-       {                                               \
-        .offset     = reg_offset,                      \
-        .size       = 4,                               \
-        .init       = rom_init,                        \
-        .reset      = bar_reset,                       \
-        .release    = bar_release,                     \
-        .u.dw.read  = bar_read,                        \
-        .u.dw.write = rom_write,                       \
-        }
-
-static struct config_field header_0[] = {
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_2),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_3),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_4),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_5),
-       CFG_FIELD_ROM(PCI_ROM_ADDRESS),
-       {
-        .size = 0,
-       },
-};
-
-static struct config_field header_1[] = {
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
-       CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
-       CFG_FIELD_ROM(PCI_ROM_ADDRESS1),
-       {
-        .size = 0,
-       },
-};
-
-int pciback_config_header_add_fields(struct pci_dev *dev)
-{
-       int err;
-
-       err = pciback_config_add_fields(dev, header_common);
-       if (err)
-               goto out;
-
-       switch (dev->hdr_type) {
-       case PCI_HEADER_TYPE_NORMAL:
-               err = pciback_config_add_fields(dev, header_0);
-               break;
-
-       case PCI_HEADER_TYPE_BRIDGE:
-               err = pciback_config_add_fields(dev, header_1);
-               break;
-
-       default:
-               err = -EINVAL;
-               printk(KERN_ERR "pciback: %s: Unsupported header type %d!\n",
-                      pci_name(dev), dev->hdr_type);
-               break;
-       }
-
-      out:
-       return err;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c
deleted file mode 100644 (file)
index 525ec95..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * PCI Backend - Handle special overlays for broken devices.
- *
- * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- * Author: Chris Bookholt <hap10@epoch.ncsc.mil>
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include "pciback.h"
-#include "conf_space.h"
-#include "conf_space_quirks.h"
-
-LIST_HEAD(pciback_quirks);
-
-struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev)
-{
-       struct pciback_config_quirk *tmp_quirk;
-
-       list_for_each_entry(tmp_quirk, &pciback_quirks, quirks_list)
-           if (pci_match_id(&tmp_quirk->devid, dev))
-               goto out;
-       tmp_quirk = NULL;
-       printk(KERN_DEBUG
-              "quirk didn't match any device pciback knows about\n");
-      out:
-       return tmp_quirk;
-}
-
-static inline void register_quirk(struct pciback_config_quirk *quirk)
-{
-       list_add_tail(&quirk->quirks_list, &pciback_quirks);
-}
-
-int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg)
-{
-       int ret = 0;
-       struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field_entry *cfg_entry;
-
-       list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-               if ( OFFSET(cfg_entry) == reg) {
-                       ret = 1;
-                       break;
-               }
-       }
-       return ret;
-}
-
-int pciback_config_quirks_add_field(struct pci_dev *dev, struct config_field
-                                   *field)
-{
-       int err = 0;
-
-       switch (field->size) {
-       case 1:
-               field->u.b.read = pciback_read_config_byte;
-               field->u.b.write = pciback_write_config_byte;
-               break;
-       case 2:
-               field->u.w.read = pciback_read_config_word;
-               field->u.w.write = pciback_write_config_word;
-               break;
-       case 4:
-               field->u.dw.read = pciback_read_config_dword;
-               field->u.dw.write = pciback_write_config_dword;
-               break;
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-
-       pciback_config_add_field(dev, field);
-
-      out:
-       return err;
-}
-
-int pciback_config_quirks_init(struct pci_dev *dev)
-{
-       struct pciback_config_quirk *quirk;
-       int ret = 0;
-
-       quirk = kzalloc(sizeof(*quirk), GFP_ATOMIC);
-       if (!quirk) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       quirk->devid.vendor = dev->vendor;
-       quirk->devid.device = dev->device;
-       quirk->devid.subvendor = dev->subsystem_vendor;
-       quirk->devid.subdevice = dev->subsystem_device;
-       quirk->devid.class = 0;
-       quirk->devid.class_mask = 0;
-       quirk->devid.driver_data = 0UL;
-
-       quirk->pdev = dev;
-
-       register_quirk(quirk);
-      out:
-       return ret;
-}
-
-void pciback_config_field_free(struct config_field *field)
-{
-       kfree(field);
-}
-
-int pciback_config_quirk_release(struct pci_dev *dev)
-{
-       struct pciback_config_quirk *quirk;
-       int ret = 0;
-
-       quirk = pciback_find_quirk(dev);
-       if (!quirk) {
-               ret = -ENXIO;
-               goto out;
-       }
-
-       list_del(&quirk->quirks_list);
-       kfree(quirk);
-
-      out:
-       return ret;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h
deleted file mode 100644 (file)
index acd0e1a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * PCI Backend - Data structures for special overlays for broken devices.
- *
- * Ryan Wilson <hap9@epoch.ncsc.mil>
- * Chris Bookholt <hap10@epoch.ncsc.mil>
- */
-
-#ifndef __XEN_PCIBACK_CONF_SPACE_QUIRKS_H__
-#define __XEN_PCIBACK_CONF_SPACE_QUIRKS_H__
-
-#include <linux/pci.h>
-#include <linux/list.h>
-
-struct pciback_config_quirk {
-       struct list_head quirks_list;
-       struct pci_device_id devid;
-       struct pci_dev *pdev;
-};
-
-struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev);
-
-int pciback_config_quirks_add_field(struct pci_dev *dev, struct config_field
-                                   *field);
-
-int pciback_config_quirks_remove_field(struct pci_dev *dev, int reg);
-
-int pciback_config_quirks_init(struct pci_dev *dev);
-
-void pciback_config_field_free(struct config_field *field);
-
-int pciback_config_quirk_release(struct pci_dev *dev);
-
-int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg);
-
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/passthrough.c b/linux-2.6-xen-sparse/drivers/xen/pciback/passthrough.c
deleted file mode 100644 (file)
index 5ee7638..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * PCI Backend - Provides restricted access to the real PCI bus topology
- *               to the frontend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/list.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include "pciback.h"
-
-struct passthrough_dev_data {
-       /* Access to dev_list must be protected by lock */
-       struct list_head dev_list;
-       spinlock_t lock;
-};
-
-struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-                                   unsigned int domain, unsigned int bus,
-                                   unsigned int devfn)
-{
-       struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry;
-       struct pci_dev *dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&dev_data->lock, flags);
-
-       list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
-               if (domain == (unsigned int)pci_domain_nr(dev_entry->dev->bus)
-                   && bus == (unsigned int)dev_entry->dev->bus->number
-                   && devfn == dev_entry->dev->devfn) {
-                       dev = dev_entry->dev;
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&dev_data->lock, flags);
-
-       return dev;
-}
-
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry;
-       unsigned long flags;
-
-       dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL);
-       if (!dev_entry)
-               return -ENOMEM;
-       dev_entry->dev = dev;
-
-       spin_lock_irqsave(&dev_data->lock, flags);
-       list_add_tail(&dev_entry->list, &dev_data->dev_list);
-       spin_unlock_irqrestore(&dev_data->lock, flags);
-
-       return 0;
-}
-
-void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry, *t;
-       struct pci_dev *found_dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&dev_data->lock, flags);
-
-       list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
-               if (dev_entry->dev == dev) {
-                       list_del(&dev_entry->list);
-                       found_dev = dev_entry->dev;
-                       kfree(dev_entry);
-               }
-       }
-
-       spin_unlock_irqrestore(&dev_data->lock, flags);
-
-       if (found_dev)
-               pcistub_put_pci_dev(found_dev);
-}
-
-int pciback_init_devices(struct pciback_device *pdev)
-{
-       struct passthrough_dev_data *dev_data;
-
-       dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL);
-       if (!dev_data)
-               return -ENOMEM;
-
-       spin_lock_init(&dev_data->lock);
-
-       INIT_LIST_HEAD(&dev_data->dev_list);
-
-       pdev->pci_dev_data = dev_data;
-
-       return 0;
-}
-
-int pciback_publish_pci_roots(struct pciback_device *pdev,
-                             publish_pci_root_cb publish_root_cb)
-{
-       int err = 0;
-       struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry, *e;
-       struct pci_dev *dev;
-       int found;
-       unsigned int domain, bus;
-
-       spin_lock(&dev_data->lock);
-
-       list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
-               /* Only publish this device as a root if none of its
-                * parent bridges are exported
-                */
-               found = 0;
-               dev = dev_entry->dev->bus->self;
-               for (; !found && dev != NULL; dev = dev->bus->self) {
-                       list_for_each_entry(e, &dev_data->dev_list, list) {
-                               if (dev == e->dev) {
-                                       found = 1;
-                                       break;
-                               }
-                       }
-               }
-
-               domain = (unsigned int)pci_domain_nr(dev_entry->dev->bus);
-               bus = (unsigned int)dev_entry->dev->bus->number;
-
-               if (!found) {
-                       err = publish_root_cb(pdev, domain, bus);
-                       if (err)
-                               break;
-               }
-       }
-
-       spin_unlock(&dev_data->lock);
-
-       return err;
-}
-
-void pciback_release_devices(struct pciback_device *pdev)
-{
-       struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry, *t;
-
-       list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
-               list_del(&dev_entry->list);
-               pcistub_put_pci_dev(dev_entry->dev);
-               kfree(dev_entry);
-       }
-
-       kfree(dev_data);
-       pdev->pci_dev_data = NULL;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c b/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c
deleted file mode 100644 (file)
index 50ea4be..0000000
+++ /dev/null
@@ -1,929 +0,0 @@
-/*
- * PCI Stub Driver - Grabs devices in backend to be exported later
- *
- * Ryan Wilson <hap9@epoch.ncsc.mil>
- * Chris Bookholt <hap10@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/kref.h>
-#include <asm/atomic.h>
-#include "pciback.h"
-#include "conf_space.h"
-#include "conf_space_quirks.h"
-
-static char *pci_devs_to_hide = NULL;
-module_param_named(hide, pci_devs_to_hide, charp, 0444);
-
-struct pcistub_device_id {
-       struct list_head slot_list;
-       int domain;
-       unsigned char bus;
-       unsigned int devfn;
-};
-static LIST_HEAD(pcistub_device_ids);
-static DEFINE_SPINLOCK(device_ids_lock);
-
-struct pcistub_device {
-       struct kref kref;
-       struct list_head dev_list;
-       spinlock_t lock;
-
-       struct pci_dev *dev;
-       struct pciback_device *pdev;    /* non-NULL if struct pci_dev is in use */
-};
-
-/* Access to pcistub_devices & seized_devices lists and the initialize_devices
- * flag must be locked with pcistub_devices_lock
- */
-static DEFINE_SPINLOCK(pcistub_devices_lock);
-static LIST_HEAD(pcistub_devices);
-
-/* wait for device_initcall before initializing our devices
- * (see pcistub_init_devices_late)
- */
-static int initialize_devices = 0;
-static LIST_HEAD(seized_devices);
-
-static struct pcistub_device *pcistub_device_alloc(struct pci_dev *dev)
-{
-       struct pcistub_device *psdev;
-
-       dev_dbg(&dev->dev, "pcistub_device_alloc\n");
-
-       psdev = kzalloc(sizeof(*psdev), GFP_ATOMIC);
-       if (!psdev)
-               return NULL;
-
-       psdev->dev = pci_dev_get(dev);
-       if (!psdev->dev) {
-               kfree(psdev);
-               return NULL;
-       }
-
-       kref_init(&psdev->kref);
-       spin_lock_init(&psdev->lock);
-
-       return psdev;
-}
-
-/* Don't call this directly as it's called by pcistub_device_put */
-static void pcistub_device_release(struct kref *kref)
-{
-       struct pcistub_device *psdev;
-
-       psdev = container_of(kref, struct pcistub_device, kref);
-
-       dev_dbg(&psdev->dev->dev, "pcistub_device_release\n");
-
-       /* Clean-up the device */
-       pciback_reset_device(psdev->dev);
-       pciback_config_free_dyn_fields(psdev->dev);
-       pciback_config_free_dev(psdev->dev);
-       kfree(pci_get_drvdata(psdev->dev));
-       pci_set_drvdata(psdev->dev, NULL);
-
-       pci_dev_put(psdev->dev);
-
-       kfree(psdev);
-}
-
-static inline void pcistub_device_get(struct pcistub_device *psdev)
-{
-       kref_get(&psdev->kref);
-}
-
-static inline void pcistub_device_put(struct pcistub_device *psdev)
-{
-       kref_put(&psdev->kref, pcistub_device_release);
-}
-
-static struct pcistub_device *pcistub_device_find(int domain, int bus,
-                                                 int slot, int func)
-{
-       struct pcistub_device *psdev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (psdev->dev != NULL
-                   && domain == pci_domain_nr(psdev->dev->bus)
-                   && bus == psdev->dev->bus->number
-                   && PCI_DEVFN(slot, func) == psdev->dev->devfn) {
-                       pcistub_device_get(psdev);
-                       goto out;
-               }
-       }
-
-       /* didn't find it */
-       psdev = NULL;
-
-      out:
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-       return psdev;
-}
-
-static struct pci_dev *pcistub_device_get_pci_dev(struct pciback_device *pdev,
-                                                 struct pcistub_device *psdev)
-{
-       struct pci_dev *pci_dev = NULL;
-       unsigned long flags;
-
-       pcistub_device_get(psdev);
-
-       spin_lock_irqsave(&psdev->lock, flags);
-       if (!psdev->pdev) {
-               psdev->pdev = pdev;
-               pci_dev = psdev->dev;
-       }
-       spin_unlock_irqrestore(&psdev->lock, flags);
-
-       if (!pci_dev)
-               pcistub_device_put(psdev);
-
-       return pci_dev;
-}
-
-struct pci_dev *pcistub_get_pci_dev_by_slot(struct pciback_device *pdev,
-                                           int domain, int bus,
-                                           int slot, int func)
-{
-       struct pcistub_device *psdev;
-       struct pci_dev *found_dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (psdev->dev != NULL
-                   && domain == pci_domain_nr(psdev->dev->bus)
-                   && bus == psdev->dev->bus->number
-                   && PCI_DEVFN(slot, func) == psdev->dev->devfn) {
-                       found_dev = pcistub_device_get_pci_dev(pdev, psdev);
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-       return found_dev;
-}
-
-struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev,
-                                   struct pci_dev *dev)
-{
-       struct pcistub_device *psdev;
-       struct pci_dev *found_dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (psdev->dev == dev) {
-                       found_dev = pcistub_device_get_pci_dev(pdev, psdev);
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-       return found_dev;
-}
-
-void pcistub_put_pci_dev(struct pci_dev *dev)
-{
-       struct pcistub_device *psdev, *found_psdev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (psdev->dev == dev) {
-                       found_psdev = psdev;
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-       /* Cleanup our device
-        * (so it's ready for the next domain)
-        */
-       pciback_reset_device(found_psdev->dev);
-       pciback_config_free_dyn_fields(found_psdev->dev);
-       pciback_config_reset_dev(found_psdev->dev);
-
-       spin_lock_irqsave(&found_psdev->lock, flags);
-       found_psdev->pdev = NULL;
-       spin_unlock_irqrestore(&found_psdev->lock, flags);
-
-       pcistub_device_put(found_psdev);
-}
-
-static int __devinit pcistub_match_one(struct pci_dev *dev,
-                                      struct pcistub_device_id *pdev_id)
-{
-       /* Match the specified device by domain, bus, slot, func and also if
-        * any of the device's parent bridges match.
-        */
-       for (; dev != NULL; dev = dev->bus->self) {
-               if (pci_domain_nr(dev->bus) == pdev_id->domain
-                   && dev->bus->number == pdev_id->bus
-                   && dev->devfn == pdev_id->devfn)
-                       return 1;
-
-               /* Sometimes topmost bridge links to itself. */
-               if (dev == dev->bus->self)
-                       break;
-       }
-
-       return 0;
-}
-
-static int __devinit pcistub_match(struct pci_dev *dev)
-{
-       struct pcistub_device_id *pdev_id;
-       unsigned long flags;
-       int found = 0;
-
-       spin_lock_irqsave(&device_ids_lock, flags);
-       list_for_each_entry(pdev_id, &pcistub_device_ids, slot_list) {
-               if (pcistub_match_one(dev, pdev_id)) {
-                       found = 1;
-                       break;
-               }
-       }
-       spin_unlock_irqrestore(&device_ids_lock, flags);
-
-       return found;
-}
-
-static int __devinit pcistub_init_device(struct pci_dev *dev)
-{
-       struct pciback_dev_data *dev_data;
-       int err = 0;
-
-       dev_dbg(&dev->dev, "initializing...\n");
-
-       /* The PCI backend is not intended to be a module (or to work with
-        * removable PCI devices (yet). If it were, pciback_config_free()
-        * would need to be called somewhere to free the memory allocated
-        * here and then to call kfree(pci_get_drvdata(psdev->dev)).
-        */
-       dev_data = kzalloc(sizeof(*dev_data), GFP_ATOMIC);
-       if (!dev_data) {
-               err = -ENOMEM;
-               goto out;
-       }
-       pci_set_drvdata(dev, dev_data);
-
-       dev_dbg(&dev->dev, "initializing config\n");
-       err = pciback_config_init_dev(dev);
-       if (err)
-               goto out;
-
-       /* HACK: Force device (& ACPI) to determine what IRQ it's on - we
-        * must do this here because pcibios_enable_device may specify
-        * the pci device's true irq (and possibly its other resources)
-        * if they differ from what's in the configuration space.
-        * This makes the assumption that the device's resources won't
-        * change after this point (otherwise this code may break!)
-        */
-       dev_dbg(&dev->dev, "enabling device\n");
-       err = pci_enable_device(dev);
-       if (err)
-               goto config_release;
-
-       /* Now disable the device (this also ensures some private device
-        * data is setup before we export)
-        */
-       dev_dbg(&dev->dev, "reset device\n");
-       pciback_reset_device(dev);
-
-       return 0;
-
-      config_release:
-       pciback_config_free_dev(dev);
-
-      out:
-       pci_set_drvdata(dev, NULL);
-       kfree(dev_data);
-       return err;
-}
-
-/*
- * Because some initialization still happens on
- * devices during fs_initcall, we need to defer
- * full initialization of our devices until
- * device_initcall.
- */
-static int __init pcistub_init_devices_late(void)
-{
-       struct pcistub_device *psdev;
-       unsigned long flags;
-       int err = 0;
-
-       pr_debug("pciback: pcistub_init_devices_late\n");
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       while (!list_empty(&seized_devices)) {
-               psdev = container_of(seized_devices.next,
-                                    struct pcistub_device, dev_list);
-               list_del(&psdev->dev_list);
-
-               spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-               err = pcistub_init_device(psdev->dev);
-               if (err) {
-                       dev_err(&psdev->dev->dev,
-                               "error %d initializing device\n", err);
-                       kfree(psdev);
-                       psdev = NULL;
-               }
-
-               spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-               if (psdev)
-                       list_add_tail(&psdev->dev_list, &pcistub_devices);
-       }
-
-       initialize_devices = 1;
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-       return 0;
-}
-
-static int __devinit pcistub_seize(struct pci_dev *dev)
-{
-       struct pcistub_device *psdev;
-       unsigned long flags;
-       int err = 0;
-
-       psdev = pcistub_device_alloc(dev);
-       if (!psdev)
-               return -ENOMEM;
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       if (initialize_devices) {
-               spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-               /* don't want irqs disabled when calling pcistub_init_device */
-               err = pcistub_init_device(psdev->dev);
-
-               spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-               if (!err)
-                       list_add(&psdev->dev_list, &pcistub_devices);
-       } else {
-               dev_dbg(&dev->dev, "deferring initialization\n");
-               list_add(&psdev->dev_list, &seized_devices);
-       }
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-       if (err)
-               pcistub_device_put(psdev);
-
-       return err;
-}
-
-static int __devinit pcistub_probe(struct pci_dev *dev,
-                                  const struct pci_device_id *id)
-{
-       int err = 0;
-
-       dev_dbg(&dev->dev, "probing...\n");
-
-       if (pcistub_match(dev)) {
-
-               if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL
-                   && dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
-                       dev_err(&dev->dev, "can't export pci devices that "
-                               "don't have a normal (0) or bridge (1) "
-                               "header type!\n");
-                       err = -ENODEV;
-                       goto out;
-               }
-
-               dev_info(&dev->dev, "seizing device\n");
-               err = pcistub_seize(dev);
-       } else
-               /* Didn't find the device */
-               err = -ENODEV;
-
-      out:
-       return err;
-}
-
-static void pcistub_remove(struct pci_dev *dev)
-{
-       struct pcistub_device *psdev, *found_psdev = NULL;
-       unsigned long flags;
-
-       dev_dbg(&dev->dev, "removing\n");
-
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-
-       pciback_config_quirk_release(dev);
-
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (psdev->dev == dev) {
-                       found_psdev = psdev;
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-       if (found_psdev) {
-               dev_dbg(&dev->dev, "found device to remove - in use? %p\n",
-                       found_psdev->pdev);
-
-               if (found_psdev->pdev) {
-                       printk(KERN_WARNING "pciback: ****** removing device "
-                              "%s while still in-use! ******\n",
-                              pci_name(found_psdev->dev));
-                       printk(KERN_WARNING "pciback: ****** driver domain may "
-                              "still access this device's i/o resources!\n");
-                       printk(KERN_WARNING "pciback: ****** shutdown driver "
-                              "domain before binding device\n");
-                       printk(KERN_WARNING "pciback: ****** to other drivers "
-                              "or domains\n");
-
-                       pciback_release_pci_dev(found_psdev->pdev,
-                                               found_psdev->dev);
-               }
-
-               spin_lock_irqsave(&pcistub_devices_lock, flags);
-               list_del(&found_psdev->dev_list);
-               spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-
-               /* the final put for releasing from the list */
-               pcistub_device_put(found_psdev);
-       }
-}
-
-static struct pci_device_id pcistub_ids[] = {
-       {
-        .vendor = PCI_ANY_ID,
-        .device = PCI_ANY_ID,
-        .subvendor = PCI_ANY_ID,
-        .subdevice = PCI_ANY_ID,
-        },
-       {0,},
-};
-
-/*
- * Note: There is no MODULE_DEVICE_TABLE entry here because this isn't
- * for a normal device. I don't want it to be loaded automatically.
- */
-
-static struct pci_driver pciback_pci_driver = {
-       .name = "pciback",
-       .id_table = pcistub_ids,
-       .probe = pcistub_probe,
-       .remove = pcistub_remove,
-};
-
-static inline int str_to_slot(const char *buf, int *domain, int *bus,
-                             int *slot, int *func)
-{
-       int err;
-
-       err = sscanf(buf, " %x:%x:%x.%x", domain, bus, slot, func);
-       if (err == 4)
-               return 0;
-       else if (err < 0)
-               return -EINVAL;
-
-       /* try again without domain */
-       *domain = 0;
-       err = sscanf(buf, " %x:%x.%x", bus, slot, func);
-       if (err == 3)
-               return 0;
-
-       return -EINVAL;
-}
-
-static inline int str_to_quirk(const char *buf, int *domain, int *bus, int
-                              *slot, int *func, int *reg, int *size, int *mask)
-{
-       int err;
-
-       err =
-           sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot,
-                  func, reg, size, mask);
-       if (err == 7)
-               return 0;
-       return -EINVAL;
-}
-
-static int pcistub_device_id_add(int domain, int bus, int slot, int func)
-{
-       struct pcistub_device_id *pci_dev_id;
-       unsigned long flags;
-
-       pci_dev_id = kmalloc(sizeof(*pci_dev_id), GFP_KERNEL);
-       if (!pci_dev_id)
-               return -ENOMEM;
-
-       pci_dev_id->domain = domain;
-       pci_dev_id->bus = bus;
-       pci_dev_id->devfn = PCI_DEVFN(slot, func);
-
-       pr_debug("pciback: wants to seize %04x:%02x:%02x.%01x\n",
-                domain, bus, slot, func);
-
-       spin_lock_irqsave(&device_ids_lock, flags);
-       list_add_tail(&pci_dev_id->slot_list, &pcistub_device_ids);
-       spin_unlock_irqrestore(&device_ids_lock, flags);
-
-       return 0;
-}
-
-static int pcistub_device_id_remove(int domain, int bus, int slot, int func)
-{
-       struct pcistub_device_id *pci_dev_id, *t;
-       int devfn = PCI_DEVFN(slot, func);
-       int err = -ENOENT;
-       unsigned long flags;
-
-       spin_lock_irqsave(&device_ids_lock, flags);
-       list_for_each_entry_safe(pci_dev_id, t, &pcistub_device_ids, slot_list) {
-
-               if (pci_dev_id->domain == domain
-                   && pci_dev_id->bus == bus && pci_dev_id->devfn == devfn) {
-                       /* Don't break; here because it's possible the same
-                        * slot could be in the list more than once
-                        */
-                       list_del(&pci_dev_id->slot_list);
-                       kfree(pci_dev_id);
-
-                       err = 0;
-
-                       pr_debug("pciback: removed %04x:%02x:%02x.%01x from "
-                                "seize list\n", domain, bus, slot, func);
-               }
-       }
-       spin_unlock_irqrestore(&device_ids_lock, flags);
-
-       return err;
-}
-
-static int pcistub_reg_add(int domain, int bus, int slot, int func, int reg,
-                          int size, int mask)
-{
-       int err = 0;
-       struct pcistub_device *psdev;
-       struct pci_dev *dev;
-       struct config_field *field;
-
-       psdev = pcistub_device_find(domain, bus, slot, func);
-       if (!psdev || !psdev->dev) {
-               err = -ENODEV;
-               goto out;
-       }
-       dev = psdev->dev;
-
-       field = kzalloc(sizeof(*field), GFP_ATOMIC);
-       if (!field) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       field->offset = reg;
-       field->size = size;
-       field->mask = mask;
-       field->init = NULL;
-       field->reset = NULL;
-       field->release = NULL;
-       field->clean = pciback_config_field_free;
-
-       err = pciback_config_quirks_add_field(dev, field);
-       if (err)
-               kfree(field);
-      out:
-       return err;
-}
-
-static ssize_t pcistub_slot_add(struct device_driver *drv, const char *buf,
-                               size_t count)
-{
-       int domain, bus, slot, func;
-       int err;
-
-       err = str_to_slot(buf, &domain, &bus, &slot, &func);
-       if (err)
-               goto out;
-
-       err = pcistub_device_id_add(domain, bus, slot, func);
-
-      out:
-       if (!err)
-               err = count;
-       return err;
-}
-
-DRIVER_ATTR(new_slot, S_IWUSR, NULL, pcistub_slot_add);
-
-static ssize_t pcistub_slot_remove(struct device_driver *drv, const char *buf,
-                                  size_t count)
-{
-       int domain, bus, slot, func;
-       int err;
-
-       err = str_to_slot(buf, &domain, &bus, &slot, &func);
-       if (err)
-               goto out;
-
-       err = pcistub_device_id_remove(domain, bus, slot, func);
-
-      out:
-       if (!err)
-               err = count;
-       return err;
-}
-
-DRIVER_ATTR(remove_slot, S_IWUSR, NULL, pcistub_slot_remove);
-
-static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf)
-{
-       struct pcistub_device_id *pci_dev_id;
-       size_t count = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&device_ids_lock, flags);
-       list_for_each_entry(pci_dev_id, &pcistub_device_ids, slot_list) {
-               if (count >= PAGE_SIZE)
-                       break;
-
-               count += scnprintf(buf + count, PAGE_SIZE - count,
-                                  "%04x:%02x:%02x.%01x\n",
-                                  pci_dev_id->domain, pci_dev_id->bus,
-                                  PCI_SLOT(pci_dev_id->devfn),
-                                  PCI_FUNC(pci_dev_id->devfn));
-       }
-       spin_unlock_irqrestore(&device_ids_lock, flags);
-
-       return count;
-}
-
-DRIVER_ATTR(slots, S_IRUSR, pcistub_slot_show, NULL);
-
-static ssize_t pcistub_quirk_add(struct device_driver *drv, const char *buf,
-                                size_t count)
-{
-       int domain, bus, slot, func, reg, size, mask;
-       int err;
-
-       err = str_to_quirk(buf, &domain, &bus, &slot, &func, &reg, &size,
-                          &mask);
-       if (err)
-               goto out;
-
-       err = pcistub_reg_add(domain, bus, slot, func, reg, size, mask);
-
-      out:
-       if (!err)
-               err = count;
-       return err;
-}
-
-static ssize_t pcistub_quirk_show(struct device_driver *drv, char *buf)
-{
-       int count = 0;
-       unsigned long flags;
-       extern struct list_head pciback_quirks;
-       struct pciback_config_quirk *quirk;
-       struct pciback_dev_data *dev_data;
-       struct config_field *field;
-       struct config_field_entry *cfg_entry;
-
-       spin_lock_irqsave(&device_ids_lock, flags);
-       list_for_each_entry(quirk, &pciback_quirks, quirks_list) {
-               if (count >= PAGE_SIZE)
-                       goto out;
-
-               count += scnprintf(buf + count, PAGE_SIZE - count,
-                                  "%02x:%02x.%01x\n\t%04x:%04x:%04x:%04x\n",
-                                  quirk->pdev->bus->number,
-                                  PCI_SLOT(quirk->pdev->devfn),
-                                  PCI_FUNC(quirk->pdev->devfn),
-                                  quirk->devid.vendor, quirk->devid.device,
-                                  quirk->devid.subvendor,
-                                  quirk->devid.subdevice);
-
-               dev_data = pci_get_drvdata(quirk->pdev);
-
-               list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-                       field = cfg_entry->field;
-                       if (count >= PAGE_SIZE)
-                               goto out;
-
-                       count += scnprintf(buf + count, PAGE_SIZE - count,
-                                          "\t\t%08x:%01x:%08x\n",
-                                          cfg_entry->base_offset + field->offset, 
-                                          field->size, field->mask);
-               }
-       }
-
-      out:
-       spin_unlock_irqrestore(&device_ids_lock, flags);
-
-       return count;
-}
-
-DRIVER_ATTR(quirks, S_IRUSR | S_IWUSR, pcistub_quirk_show, pcistub_quirk_add);
-
-static ssize_t permissive_add(struct device_driver *drv, const char *buf,
-                             size_t count)
-{
-       int domain, bus, slot, func;
-       int err;
-       struct pcistub_device *psdev;
-       struct pciback_dev_data *dev_data;
-       err = str_to_slot(buf, &domain, &bus, &slot, &func);
-       if (err)
-               goto out;
-       psdev = pcistub_device_find(domain, bus, slot, func);
-       if (!psdev) {
-               err = -ENODEV;
-               goto out;
-       }
-       if (!psdev->dev) {
-               err = -ENODEV;
-               goto release;
-       }
-       dev_data = pci_get_drvdata(psdev->dev);
-       /* the driver data for a device should never be null at this point */
-       if (!dev_data) {
-               err = -ENXIO;
-               goto release;
-       }
-       if (!dev_data->permissive) {
-               dev_data->permissive = 1;
-               /* Let user know that what they're doing could be unsafe */
-               dev_warn(&psdev->dev->dev,
-                        "enabling permissive mode configuration space accesses!\n");
-               dev_warn(&psdev->dev->dev,
-                        "permissive mode is potentially unsafe!\n");
-       }
-      release:
-       pcistub_device_put(psdev);
-      out:
-       if (!err)
-               err = count;
-       return err;
-}
-
-static ssize_t permissive_show(struct device_driver *drv, char *buf)
-{
-       struct pcistub_device *psdev;
-       struct pciback_dev_data *dev_data;
-       size_t count = 0;
-       unsigned long flags;
-       spin_lock_irqsave(&pcistub_devices_lock, flags);
-       list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-               if (count >= PAGE_SIZE)
-                       break;
-               if (!psdev->dev)
-                       continue;
-               dev_data = pci_get_drvdata(psdev->dev);
-               if (!dev_data || !dev_data->permissive)
-                       continue;
-               count +=
-                   scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
-                             pci_name(psdev->dev));
-       }
-       spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-       return count;
-}
-
-DRIVER_ATTR(permissive, S_IRUSR | S_IWUSR, permissive_show, permissive_add);
-
-static void pcistub_exit(void)
-{
-       driver_remove_file(&pciback_pci_driver.driver, &driver_attr_new_slot);
-       driver_remove_file(&pciback_pci_driver.driver,
-                          &driver_attr_remove_slot);
-       driver_remove_file(&pciback_pci_driver.driver, &driver_attr_slots);
-       driver_remove_file(&pciback_pci_driver.driver, &driver_attr_quirks);
-       driver_remove_file(&pciback_pci_driver.driver, &driver_attr_permissive);
-
-       pci_unregister_driver(&pciback_pci_driver);
-}
-
-static int __init pcistub_init(void)
-{
-       int pos = 0;
-       int err = 0;
-       int domain, bus, slot, func;
-       int parsed;
-
-       if (pci_devs_to_hide && *pci_devs_to_hide) {
-               do {
-                       parsed = 0;
-
-                       err = sscanf(pci_devs_to_hide + pos,
-                                    " (%x:%x:%x.%x) %n",
-                                    &domain, &bus, &slot, &func, &parsed);
-                       if (err != 4) {
-                               domain = 0;
-                               err = sscanf(pci_devs_to_hide + pos,
-                                            " (%x:%x.%x) %n",
-                                            &bus, &slot, &func, &parsed);
-                               if (err != 3)
-                                       goto parse_error;
-                       }
-
-                       err = pcistub_device_id_add(domain, bus, slot, func);
-                       if (err)
-                               goto out;
-
-                       /* if parsed<=0, we've reached the end of the string */
-                       pos += parsed;
-               } while (parsed > 0 && pci_devs_to_hide[pos]);
-       }
-
-       /* If we're the first PCI Device Driver to register, we're the
-        * first one to get offered PCI devices as they become
-        * available (and thus we can be the first to grab them)
-        */
-       err = pci_register_driver(&pciback_pci_driver);
-       if (err < 0)
-               goto out;
-
-       err = driver_create_file(&pciback_pci_driver.driver,
-                                &driver_attr_new_slot);
-       if (!err)
-               err = driver_create_file(&pciback_pci_driver.driver,
-                                        &driver_attr_remove_slot);
-       if (!err)
-               err = driver_create_file(&pciback_pci_driver.driver,
-                                        &driver_attr_slots);
-       if (!err)
-               err = driver_create_file(&pciback_pci_driver.driver,
-                                        &driver_attr_quirks);
-       if (!err)
-               err = driver_create_file(&pciback_pci_driver.driver,
-                                        &driver_attr_permissive);
-
-       if (err)
-               pcistub_exit();
-
-      out:
-       return err;
-
-      parse_error:
-       printk(KERN_ERR "pciback: Error parsing pci_devs_to_hide at \"%s\"\n",
-              pci_devs_to_hide + pos);
-       return -EINVAL;
-}
-
-#ifndef MODULE
-/*
- * fs_initcall happens before device_initcall
- * so pciback *should* get called first (b/c we 
- * want to suck up any device before other drivers
- * get a chance by being the first pci device
- * driver to register)
- */
-fs_initcall(pcistub_init);
-#endif
-
-static int __init pciback_init(void)
-{
-       int err;
-
-       err = pciback_config_init();
-       if (err)
-               return err;
-
-#ifdef MODULE
-       err = pcistub_init();
-       if (err < 0)
-               return err;
-#endif
-
-       pcistub_init_devices_late();
-       err = pciback_xenbus_register();
-       if (err)
-               pcistub_exit();
-
-       return err;
-}
-
-static void __exit pciback_cleanup(void)
-{
-       pciback_xenbus_unregister();
-       pcistub_exit();
-}
-
-module_init(pciback_init);
-module_exit(pciback_cleanup);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h
deleted file mode 100644 (file)
index 4b876e4..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * PCI Backend Common Data Structures & Function Declarations
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#ifndef __XEN_PCIBACK_H__
-#define __XEN_PCIBACK_H__
-
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <xen/xenbus.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/workqueue.h>
-#include <asm/atomic.h>
-#include <xen/interface/io/pciif.h>
-
-struct pci_dev_entry {
-       struct list_head list;
-       struct pci_dev *dev;
-};
-
-#define _PDEVF_op_active       (0)
-#define PDEVF_op_active        (1<<(_PDEVF_op_active))
-
-struct pciback_device {
-       void *pci_dev_data;
-       spinlock_t dev_lock;
-
-       struct xenbus_device *xdev;
-
-       struct xenbus_watch be_watch;
-       u8 be_watching;
-
-       int evtchn_irq;
-
-       struct vm_struct *sh_area;
-       struct xen_pci_sharedinfo *sh_info;
-
-       unsigned long flags;
-
-       struct work_struct op_work;
-};
-
-struct pciback_dev_data {
-       struct list_head config_fields;
-       int permissive;
-       int warned_on_write;
-};
-
-/* Get/Put PCI Devices that are hidden from the PCI Backend Domain */
-struct pci_dev *pcistub_get_pci_dev_by_slot(struct pciback_device *pdev,
-                                           int domain, int bus,
-                                           int slot, int func);
-struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev,
-                                   struct pci_dev *dev);
-void pcistub_put_pci_dev(struct pci_dev *dev);
-
-/* Ensure a device is turned off or reset */
-void pciback_reset_device(struct pci_dev *pdev);
-
-/* Access a virtual configuration space for a PCI device */
-int pciback_config_init(void);
-int pciback_config_init_dev(struct pci_dev *dev);
-void pciback_config_free_dyn_fields(struct pci_dev *dev);
-void pciback_config_reset_dev(struct pci_dev *dev);
-void pciback_config_free_dev(struct pci_dev *dev);
-int pciback_config_read(struct pci_dev *dev, int offset, int size,
-                       u32 * ret_val);
-int pciback_config_write(struct pci_dev *dev, int offset, int size, u32 value);
-
-/* Handle requests for specific devices from the frontend */
-typedef int (*publish_pci_root_cb) (struct pciback_device * pdev,
-                                   unsigned int domain, unsigned int bus);
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev);
-void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev);
-struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-                                   unsigned int domain, unsigned int bus,
-                                   unsigned int devfn);
-int pciback_init_devices(struct pciback_device *pdev);
-int pciback_publish_pci_roots(struct pciback_device *pdev,
-                             publish_pci_root_cb cb);
-void pciback_release_devices(struct pciback_device *pdev);
-
-/* Handles events from front-end */
-irqreturn_t pciback_handle_event(int irq, void *dev_id, struct pt_regs *regs);
-void pciback_do_op(void *data);
-
-int pciback_xenbus_register(void);
-void pciback_xenbus_unregister(void);
-
-extern int verbose_request;
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback_ops.c b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback_ops.c
deleted file mode 100644 (file)
index 690941b..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * PCI Backend Operations - respond to PCI requests from Frontend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <asm/bitops.h>
-#include <xen/evtchn.h>
-#include "pciback.h"
-
-int verbose_request = 0;
-module_param(verbose_request, int, 0644);
-
-/* Ensure a device is "turned off" and ready to be exported.
- * (Also see pciback_config_reset to ensure virtual configuration space is
- * ready to be re-exported)
- */
-void pciback_reset_device(struct pci_dev *dev)
-{
-       u16 cmd;
-
-       /* Disable devices (but not bridges) */
-       if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) {
-               pci_disable_device(dev);
-
-               pci_write_config_word(dev, PCI_COMMAND, 0);
-
-               dev->is_enabled = 0;
-               dev->is_busmaster = 0;
-       } else {
-               pci_read_config_word(dev, PCI_COMMAND, &cmd);
-               if (cmd & (PCI_COMMAND_INVALIDATE)) {
-                       cmd &= ~(PCI_COMMAND_INVALIDATE);
-                       pci_write_config_word(dev, PCI_COMMAND, cmd);
-
-                       dev->is_busmaster = 0;
-               }
-       }
-}
-
-static inline void test_and_schedule_op(struct pciback_device *pdev)
-{
-       /* Check that frontend is requesting an operation and that we are not
-        * already processing a request */
-       if (test_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags)
-           && !test_and_set_bit(_PDEVF_op_active, &pdev->flags))
-               schedule_work(&pdev->op_work);
-}
-
-/* Performing the configuration space reads/writes must not be done in atomic
- * context because some of the pci_* functions can sleep (mostly due to ACPI
- * use of semaphores). This function is intended to be called from a work
- * queue in process context taking a struct pciback_device as a parameter */
-void pciback_do_op(void *data)
-{
-       struct pciback_device *pdev = data;
-       struct pci_dev *dev;
-       struct xen_pci_op *op = &pdev->sh_info->op;
-
-       dev = pciback_get_pci_dev(pdev, op->domain, op->bus, op->devfn);
-
-       if (dev == NULL)
-               op->err = XEN_PCI_ERR_dev_not_found;
-       else if (op->cmd == XEN_PCI_OP_conf_read)
-               op->err = pciback_config_read(dev, op->offset, op->size,
-                                             &op->value);
-       else if (op->cmd == XEN_PCI_OP_conf_write)
-               op->err = pciback_config_write(dev, op->offset, op->size,
-                                              op->value);
-       else
-               op->err = XEN_PCI_ERR_not_implemented;
-
-       /* Tell the driver domain that we're done. */ 
-       wmb();
-       clear_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
-       notify_remote_via_irq(pdev->evtchn_irq);
-
-       /* Mark that we're done. */
-       smp_mb__before_clear_bit(); /* /after/ clearing PCIF_active */
-       clear_bit(_PDEVF_op_active, &pdev->flags);
-       smp_mb__after_clear_bit(); /* /before/ final check for work */
-
-       /* Check to see if the driver domain tried to start another request in
-        * between clearing _XEN_PCIF_active and clearing _PDEVF_op_active. */
-       test_and_schedule_op(pdev);
-}
-
-irqreturn_t pciback_handle_event(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct pciback_device *pdev = dev_id;
-
-       test_and_schedule_op(pdev);
-
-       return IRQ_HANDLED;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/slot.c b/linux-2.6-xen-sparse/drivers/xen/pciback/slot.c
deleted file mode 100644 (file)
index 09293fc..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * PCI Backend - Provides a Virtual PCI bus (with real devices)
- *               to the frontend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil> (vpci.c)
- *   Author: Tristan Gingold <tristan.gingold@bull.net>, from vpci.c
- */
-
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include "pciback.h"
-
-/* There are at most 32 slots in a pci bus.  */
-#define PCI_SLOT_MAX 32
-
-#define PCI_BUS_NBR 2
-
-struct slot_dev_data {
-       /* Access to dev_list must be protected by lock */
-       struct pci_dev *slots[PCI_BUS_NBR][PCI_SLOT_MAX];
-       spinlock_t lock;
-};
-
-struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-                                   unsigned int domain, unsigned int bus,
-                                   unsigned int devfn)
-{
-       struct pci_dev *dev = NULL;
-       struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-       unsigned long flags;
-
-       if (domain != 0 || PCI_FUNC(devfn) != 0)
-               return NULL;
-
-       if (PCI_SLOT(devfn) >= PCI_SLOT_MAX || bus >= PCI_BUS_NBR)
-               return NULL;
-
-       spin_lock_irqsave(&slot_dev->lock, flags);
-       dev = slot_dev->slots[bus][PCI_SLOT(devfn)];
-       spin_unlock_irqrestore(&slot_dev->lock, flags);
-
-       return dev;
-}
-
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       int err = 0, slot, bus;
-       struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-       unsigned long flags;
-
-       if ((dev->class >> 24) == PCI_BASE_CLASS_BRIDGE) {
-               err = -EFAULT;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Can't export bridges on the virtual PCI bus");
-               goto out;
-       }
-
-       spin_lock_irqsave(&slot_dev->lock, flags);
-
-       /* Assign to a new slot on the virtual PCI bus */
-       for (bus = 0; bus < PCI_BUS_NBR; bus++)
-               for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-                       if (slot_dev->slots[bus][slot] == NULL) {
-                               printk(KERN_INFO
-                                      "pciback: slot: %s: assign to virtual slot %d, bus %d\n",
-                                      pci_name(dev), slot, bus);
-                               slot_dev->slots[bus][slot] = dev;
-                               goto unlock;
-                       }
-               }
-
-       err = -ENOMEM;
-       xenbus_dev_fatal(pdev->xdev, err,
-                        "No more space on root virtual PCI bus");
-
-      unlock:
-       spin_unlock_irqrestore(&slot_dev->lock, flags);
-      out:
-       return err;
-}
-
-void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       int slot, bus;
-       struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-       struct pci_dev *found_dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&slot_dev->lock, flags);
-
-       for (bus = 0; bus < PCI_BUS_NBR; bus++)
-               for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-                       if (slot_dev->slots[bus][slot] == dev) {
-                               slot_dev->slots[bus][slot] = NULL;
-                               found_dev = dev;
-                               goto out;
-                       }
-               }
-
-      out:
-       spin_unlock_irqrestore(&slot_dev->lock, flags);
-
-       if (found_dev)
-               pcistub_put_pci_dev(found_dev);
-}
-
-int pciback_init_devices(struct pciback_device *pdev)
-{
-       int slot, bus;
-       struct slot_dev_data *slot_dev;
-
-       slot_dev = kmalloc(sizeof(*slot_dev), GFP_KERNEL);
-       if (!slot_dev)
-               return -ENOMEM;
-
-       spin_lock_init(&slot_dev->lock);
-
-       for (bus = 0; bus < PCI_BUS_NBR; bus++)
-               for (slot = 0; slot < PCI_SLOT_MAX; slot++)
-                       slot_dev->slots[bus][slot] = NULL;
-
-       pdev->pci_dev_data = slot_dev;
-
-       return 0;
-}
-
-int pciback_publish_pci_roots(struct pciback_device *pdev,
-                             publish_pci_root_cb publish_cb)
-{
-       /* The Virtual PCI bus has only one root */
-       return publish_cb(pdev, 0, 0);
-}
-
-void pciback_release_devices(struct pciback_device *pdev)
-{
-       int slot, bus;
-       struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-       struct pci_dev *dev;
-
-       for (bus = 0; bus < PCI_BUS_NBR; bus++)
-               for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-                       dev = slot_dev->slots[bus][slot];
-                       if (dev != NULL)
-                               pcistub_put_pci_dev(dev);
-               }
-
-       kfree(slot_dev);
-       pdev->pci_dev_data = NULL;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/vpci.c b/linux-2.6-xen-sparse/drivers/xen/pciback/vpci.c
deleted file mode 100644 (file)
index 84bc4b9..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * PCI Backend - Provides a Virtual PCI bus (with real devices)
- *               to the frontend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include "pciback.h"
-
-#define PCI_SLOT_MAX 32
-
-struct vpci_dev_data {
-       /* Access to dev_list must be protected by lock */
-       struct list_head dev_list[PCI_SLOT_MAX];
-       spinlock_t lock;
-};
-
-static inline struct list_head *list_first(struct list_head *head)
-{
-       return head->next;
-}
-
-struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-                                   unsigned int domain, unsigned int bus,
-                                   unsigned int devfn)
-{
-       struct pci_dev_entry *entry;
-       struct pci_dev *dev = NULL;
-       struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-       unsigned long flags;
-
-       if (domain != 0 || bus != 0)
-               return NULL;
-
-       if (PCI_SLOT(devfn) < PCI_SLOT_MAX) {
-               spin_lock_irqsave(&vpci_dev->lock, flags);
-
-               list_for_each_entry(entry,
-                                   &vpci_dev->dev_list[PCI_SLOT(devfn)],
-                                   list) {
-                       if (PCI_FUNC(entry->dev->devfn) == PCI_FUNC(devfn)) {
-                               dev = entry->dev;
-                               break;
-                       }
-               }
-
-               spin_unlock_irqrestore(&vpci_dev->lock, flags);
-       }
-       return dev;
-}
-
-static inline int match_slot(struct pci_dev *l, struct pci_dev *r)
-{
-       if (pci_domain_nr(l->bus) == pci_domain_nr(r->bus)
-           && l->bus == r->bus && PCI_SLOT(l->devfn) == PCI_SLOT(r->devfn))
-               return 1;
-
-       return 0;
-}
-
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       int err = 0, slot;
-       struct pci_dev_entry *t, *dev_entry;
-       struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-       unsigned long flags;
-
-       if ((dev->class >> 24) == PCI_BASE_CLASS_BRIDGE) {
-               err = -EFAULT;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Can't export bridges on the virtual PCI bus");
-               goto out;
-       }
-
-       dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL);
-       if (!dev_entry) {
-               err = -ENOMEM;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error adding entry to virtual PCI bus");
-               goto out;
-       }
-
-       dev_entry->dev = dev;
-
-       spin_lock_irqsave(&vpci_dev->lock, flags);
-
-       /* Keep multi-function devices together on the virtual PCI bus */
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               if (!list_empty(&vpci_dev->dev_list[slot])) {
-                       t = list_entry(list_first(&vpci_dev->dev_list[slot]),
-                                      struct pci_dev_entry, list);
-
-                       if (match_slot(dev, t->dev)) {
-                               pr_info("pciback: vpci: %s: "
-                                       "assign to virtual slot %d func %d\n",
-                                       pci_name(dev), slot,
-                                       PCI_FUNC(dev->devfn));
-                               list_add_tail(&dev_entry->list,
-                                             &vpci_dev->dev_list[slot]);
-                               goto unlock;
-                       }
-               }
-       }
-
-       /* Assign to a new slot on the virtual PCI bus */
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               if (list_empty(&vpci_dev->dev_list[slot])) {
-                       printk(KERN_INFO
-                              "pciback: vpci: %s: assign to virtual slot %d\n",
-                              pci_name(dev), slot);
-                       list_add_tail(&dev_entry->list,
-                                     &vpci_dev->dev_list[slot]);
-                       goto unlock;
-               }
-       }
-
-       err = -ENOMEM;
-       xenbus_dev_fatal(pdev->xdev, err,
-                        "No more space on root virtual PCI bus");
-
-      unlock:
-       spin_unlock_irqrestore(&vpci_dev->lock, flags);
-      out:
-       return err;
-}
-
-void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-       int slot;
-       struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-       struct pci_dev *found_dev = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&vpci_dev->lock, flags);
-
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               struct pci_dev_entry *e, *tmp;
-               list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot],
-                                        list) {
-                       if (e->dev == dev) {
-                               list_del(&e->list);
-                               found_dev = e->dev;
-                               kfree(e);
-                               goto out;
-                       }
-               }
-       }
-
-      out:
-       spin_unlock_irqrestore(&vpci_dev->lock, flags);
-
-       if (found_dev)
-               pcistub_put_pci_dev(found_dev);
-}
-
-int pciback_init_devices(struct pciback_device *pdev)
-{
-       int slot;
-       struct vpci_dev_data *vpci_dev;
-
-       vpci_dev = kmalloc(sizeof(*vpci_dev), GFP_KERNEL);
-       if (!vpci_dev)
-               return -ENOMEM;
-
-       spin_lock_init(&vpci_dev->lock);
-
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               INIT_LIST_HEAD(&vpci_dev->dev_list[slot]);
-       }
-
-       pdev->pci_dev_data = vpci_dev;
-
-       return 0;
-}
-
-int pciback_publish_pci_roots(struct pciback_device *pdev,
-                             publish_pci_root_cb publish_cb)
-{
-       /* The Virtual PCI bus has only one root */
-       return publish_cb(pdev, 0, 0);
-}
-
-void pciback_release_devices(struct pciback_device *pdev)
-{
-       int slot;
-       struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               struct pci_dev_entry *e, *tmp;
-               list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot],
-                                        list) {
-                       list_del(&e->list);
-                       pcistub_put_pci_dev(e->dev);
-                       kfree(e);
-               }
-       }
-
-       kfree(vpci_dev);
-       pdev->pci_dev_data = NULL;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
deleted file mode 100644 (file)
index 3ebd4b1..0000000
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * PCI Backend Xenbus Setup - handles setup with frontend and xend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/vmalloc.h>
-#include <xen/xenbus.h>
-#include <xen/evtchn.h>
-#include "pciback.h"
-
-#define INVALID_EVTCHN_IRQ  (-1)
-
-static struct pciback_device *alloc_pdev(struct xenbus_device *xdev)
-{
-       struct pciback_device *pdev;
-
-       pdev = kzalloc(sizeof(struct pciback_device), GFP_KERNEL);
-       if (pdev == NULL)
-               goto out;
-       dev_dbg(&xdev->dev, "allocated pdev @ 0x%p\n", pdev);
-
-       pdev->xdev = xdev;
-       xdev->dev.driver_data = pdev;
-
-       spin_lock_init(&pdev->dev_lock);
-
-       pdev->sh_area = NULL;
-       pdev->sh_info = NULL;
-       pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
-       pdev->be_watching = 0;
-
-       INIT_WORK(&pdev->op_work, pciback_do_op, pdev);
-
-       if (pciback_init_devices(pdev)) {
-               kfree(pdev);
-               pdev = NULL;
-       }
-      out:
-       return pdev;
-}
-
-static void free_pdev(struct pciback_device *pdev)
-{
-       if (pdev->be_watching)
-               unregister_xenbus_watch(&pdev->be_watch);
-
-       /* Ensure the guest can't trigger our handler before removing devices */
-       if (pdev->evtchn_irq != INVALID_EVTCHN_IRQ)
-               unbind_from_irqhandler(pdev->evtchn_irq, pdev);
-
-       /* If the driver domain started an op, make sure we complete it or
-        * delete it before releasing the shared memory */
-       cancel_delayed_work(&pdev->op_work);
-       flush_scheduled_work();
-
-       if (pdev->sh_info)
-               xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_area);
-
-       pciback_release_devices(pdev);
-
-       pdev->xdev->dev.driver_data = NULL;
-       pdev->xdev = NULL;
-
-       kfree(pdev);
-}
-
-static int pciback_do_attach(struct pciback_device *pdev, int gnt_ref,
-                            int remote_evtchn)
-{
-       int err = 0;
-       struct vm_struct *area;
-
-       dev_dbg(&pdev->xdev->dev,
-               "Attaching to frontend resources - gnt_ref=%d evtchn=%d\n",
-               gnt_ref, remote_evtchn);
-
-       area = xenbus_map_ring_valloc(pdev->xdev, gnt_ref);
-       if (IS_ERR(area)) {
-               err = PTR_ERR(area);
-               goto out;
-       }
-       pdev->sh_area = area;
-       pdev->sh_info = area->addr;
-
-       err = bind_interdomain_evtchn_to_irqhandler(
-               pdev->xdev->otherend_id, remote_evtchn, pciback_handle_event,
-               SA_SAMPLE_RANDOM, "pciback", pdev);
-       if (err < 0) {
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error binding event channel to IRQ");
-               goto out;
-       }
-       pdev->evtchn_irq = err;
-       err = 0;
-
-       dev_dbg(&pdev->xdev->dev, "Attached!\n");
-      out:
-       return err;
-}
-
-static int pciback_attach(struct pciback_device *pdev)
-{
-       int err = 0;
-       int gnt_ref, remote_evtchn;
-       char *magic = NULL;
-
-       spin_lock(&pdev->dev_lock);
-
-       /* Make sure we only do this setup once */
-       if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-           XenbusStateInitialised)
-               goto out;
-
-       /* Wait for frontend to state that it has published the configuration */
-       if (xenbus_read_driver_state(pdev->xdev->otherend) !=
-           XenbusStateInitialised)
-               goto out;
-
-       dev_dbg(&pdev->xdev->dev, "Reading frontend config\n");
-
-       err = xenbus_gather(XBT_NIL, pdev->xdev->otherend,
-                           "pci-op-ref", "%u", &gnt_ref,
-                           "event-channel", "%u", &remote_evtchn,
-                           "magic", NULL, &magic, NULL);
-       if (err) {
-               /* If configuration didn't get read correctly, wait longer */
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error reading configuration from frontend");
-               goto out;
-       }
-
-       if (magic == NULL || strcmp(magic, XEN_PCI_MAGIC) != 0) {
-               xenbus_dev_fatal(pdev->xdev, -EFAULT,
-                                "version mismatch (%s/%s) with pcifront - "
-                                "halting pciback",
-                                magic, XEN_PCI_MAGIC);
-               goto out;
-       }
-
-       err = pciback_do_attach(pdev, gnt_ref, remote_evtchn);
-       if (err)
-               goto out;
-
-       dev_dbg(&pdev->xdev->dev, "Connecting...\n");
-
-       err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
-       if (err)
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error switching to connected state!");
-
-       dev_dbg(&pdev->xdev->dev, "Connected? %d\n", err);
-      out:
-       spin_unlock(&pdev->dev_lock);
-
-       if (magic)
-               kfree(magic);
-
-       return err;
-}
-
-static void pciback_frontend_changed(struct xenbus_device *xdev,
-                                    enum xenbus_state fe_state)
-{
-       struct pciback_device *pdev = xdev->dev.driver_data;
-
-       dev_dbg(&xdev->dev, "fe state changed %d\n", fe_state);
-
-       switch (fe_state) {
-       case XenbusStateInitialised:
-               pciback_attach(pdev);
-               break;
-
-       case XenbusStateClosing:
-               xenbus_switch_state(xdev, XenbusStateClosing);
-               break;
-
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               dev_dbg(&xdev->dev, "frontend is gone! unregister device\n");
-               device_unregister(&xdev->dev);
-               break;
-
-       default:
-               break;
-       }
-}
-
-static int pciback_publish_pci_root(struct pciback_device *pdev,
-                                   unsigned int domain, unsigned int bus)
-{
-       unsigned int d, b;
-       int i, root_num, len, err;
-       char str[64];
-
-       dev_dbg(&pdev->xdev->dev, "Publishing pci roots\n");
-
-       err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-                          "root_num", "%d", &root_num);
-       if (err == 0 || err == -ENOENT)
-               root_num = 0;
-       else if (err < 0)
-               goto out;
-
-       /* Verify that we haven't already published this pci root */
-       for (i = 0; i < root_num; i++) {
-               len = snprintf(str, sizeof(str), "root-%d", i);
-               if (unlikely(len >= (sizeof(str) - 1))) {
-                       err = -ENOMEM;
-                       goto out;
-               }
-
-               err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-                                  str, "%x:%x", &d, &b);
-               if (err < 0)
-                       goto out;
-               if (err != 2) {
-                       err = -EINVAL;
-                       goto out;
-               }
-
-               if (d == domain && b == bus) {
-                       err = 0;
-                       goto out;
-               }
-       }
-
-       len = snprintf(str, sizeof(str), "root-%d", root_num);
-       if (unlikely(len >= (sizeof(str) - 1))) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       dev_dbg(&pdev->xdev->dev, "writing root %d at %04x:%02x\n",
-               root_num, domain, bus);
-
-       err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
-                           "%04x:%02x", domain, bus);
-       if (err)
-               goto out;
-
-       err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
-                           "root_num", "%d", (root_num + 1));
-
-      out:
-       return err;
-}
-
-static int pciback_export_device(struct pciback_device *pdev,
-                                int domain, int bus, int slot, int func)
-{
-       struct pci_dev *dev;
-       int err = 0;
-
-       dev_dbg(&pdev->xdev->dev, "exporting dom %x bus %x slot %x func %x\n",
-               domain, bus, slot, func);
-
-       dev = pcistub_get_pci_dev_by_slot(pdev, domain, bus, slot, func);
-       if (!dev) {
-               err = -EINVAL;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Couldn't locate PCI device "
-                                "(%04x:%02x:%02x.%01x)! "
-                                "perhaps already in-use?",
-                                domain, bus, slot, func);
-               goto out;
-       }
-
-       err = pciback_add_pci_dev(pdev, dev);
-       if (err)
-               goto out;
-
-       /* TODO: It'd be nice to export a bridge and have all of its children
-        * get exported with it. This may be best done in xend (which will
-        * have to calculate resource usage anyway) but we probably want to
-        * put something in here to ensure that if a bridge gets given to a
-        * driver domain, that all devices under that bridge are not given
-        * to other driver domains (as he who controls the bridge can disable
-        * it and stop the other devices from working).
-        */
-      out:
-       return err;
-}
-
-static int pciback_setup_backend(struct pciback_device *pdev)
-{
-       /* Get configuration from xend (if available now) */
-       int domain, bus, slot, func;
-       int err = 0;
-       int i, num_devs;
-       char dev_str[64];
-
-       spin_lock(&pdev->dev_lock);
-
-       /* It's possible we could get the call to setup twice, so make sure
-        * we're not already connected.
-        */
-       if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-           XenbusStateInitWait)
-               goto out;
-
-       dev_dbg(&pdev->xdev->dev, "getting be setup\n");
-
-       err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
-                          &num_devs);
-       if (err != 1) {
-               if (err >= 0)
-                       err = -EINVAL;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error reading number of devices");
-               goto out;
-       }
-
-       for (i = 0; i < num_devs; i++) {
-               int l = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
-               if (unlikely(l >= (sizeof(dev_str) - 1))) {
-                       err = -ENOMEM;
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "String overflow while reading "
-                                        "configuration");
-                       goto out;
-               }
-
-               err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, dev_str,
-                                  "%x:%x:%x.%x", &domain, &bus, &slot, &func);
-               if (err < 0) {
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "Error reading device configuration");
-                       goto out;
-               }
-               if (err != 4) {
-                       err = -EINVAL;
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "Error parsing pci device "
-                                        "configuration");
-                       goto out;
-               }
-
-               err = pciback_export_device(pdev, domain, bus, slot, func);
-               if (err)
-                       goto out;
-       }
-
-       err = pciback_publish_pci_roots(pdev, pciback_publish_pci_root);
-       if (err) {
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error while publish PCI root buses "
-                                "for frontend");
-               goto out;
-       }
-
-       err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
-       if (err)
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error switching to initialised state!");
-
-      out:
-       spin_unlock(&pdev->dev_lock);
-
-       if (!err)
-               /* see if pcifront is already configured (if not, we'll wait) */
-               pciback_attach(pdev);
-
-       return err;
-}
-
-static void pciback_be_watch(struct xenbus_watch *watch,
-                            const char **vec, unsigned int len)
-{
-       struct pciback_device *pdev =
-           container_of(watch, struct pciback_device, be_watch);
-
-       switch (xenbus_read_driver_state(pdev->xdev->nodename)) {
-       case XenbusStateInitWait:
-               pciback_setup_backend(pdev);
-               break;
-
-       default:
-               break;
-       }
-}
-
-static int pciback_xenbus_probe(struct xenbus_device *dev,
-                               const struct xenbus_device_id *id)
-{
-       int err = 0;
-       struct pciback_device *pdev = alloc_pdev(dev);
-
-       if (pdev == NULL) {
-               err = -ENOMEM;
-               xenbus_dev_fatal(dev, err,
-                                "Error allocating pciback_device struct");
-               goto out;
-       }
-
-       /* wait for xend to configure us */
-       err = xenbus_switch_state(dev, XenbusStateInitWait);
-       if (err)
-               goto out;
-
-       /* watch the backend node for backend configuration information */
-       err = xenbus_watch_path(dev, dev->nodename, &pdev->be_watch,
-                               pciback_be_watch);
-       if (err)
-               goto out;
-       pdev->be_watching = 1;
-
-       /* We need to force a call to our callback here in case
-        * xend already configured us!
-        */
-       pciback_be_watch(&pdev->be_watch, NULL, 0);
-
-      out:
-       return err;
-}
-
-static int pciback_xenbus_remove(struct xenbus_device *dev)
-{
-       struct pciback_device *pdev = dev->dev.driver_data;
-
-       if (pdev != NULL)
-               free_pdev(pdev);
-
-       return 0;
-}
-
-static struct xenbus_device_id xenpci_ids[] = {
-       {"pci"},
-       {{0}},
-};
-
-static struct xenbus_driver xenbus_pciback_driver = {
-       .name                   = "pciback",
-       .owner                  = THIS_MODULE,
-       .ids                    = xenpci_ids,
-       .probe                  = pciback_xenbus_probe,
-       .remove                 = pciback_xenbus_remove,
-       .otherend_changed       = pciback_frontend_changed,
-};
-
-int __init pciback_xenbus_register(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       return xenbus_register_backend(&xenbus_pciback_driver);
-}
-
-void __exit pciback_xenbus_unregister(void)
-{
-       xenbus_unregister_driver(&xenbus_pciback_driver);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pcifront/Makefile b/linux-2.6-xen-sparse/drivers/xen/pcifront/Makefile
deleted file mode 100644 (file)
index 621e988..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-obj-y += pcifront.o
-
-pcifront-y := pci_op.o xenbus.o pci.o
-
-ifeq ($(CONFIG_XEN_PCIDEV_FE_DEBUG),y)
-EXTRA_CFLAGS += -DDEBUG
-endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/pcifront/pci.c b/linux-2.6-xen-sparse/drivers/xen/pcifront/pci.c
deleted file mode 100644 (file)
index 4239f00..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * PCI Frontend Operations - ensure only one PCI frontend runs at a time
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include "pcifront.h"
-
-DEFINE_SPINLOCK(pcifront_dev_lock);
-static struct pcifront_device *pcifront_dev = NULL;
-
-int pcifront_connect(struct pcifront_device *pdev)
-{
-       int err = 0;
-
-       spin_lock(&pcifront_dev_lock);
-
-       if (!pcifront_dev) {
-               dev_info(&pdev->xdev->dev, "Installing PCI frontend\n");
-               pcifront_dev = pdev;
-       }
-       else {
-               dev_err(&pdev->xdev->dev, "PCI frontend already installed!\n");
-               err = -EEXIST;
-       }
-
-       spin_unlock(&pcifront_dev_lock);
-
-       return err;
-}
-
-void pcifront_disconnect(struct pcifront_device *pdev)
-{
-       spin_lock(&pcifront_dev_lock);
-
-       if (pdev == pcifront_dev) {
-               dev_info(&pdev->xdev->dev,
-                        "Disconnecting PCI Frontend Buses\n");
-               pcifront_dev = NULL;
-       }
-
-       spin_unlock(&pcifront_dev_lock);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pcifront/pci_op.c b/linux-2.6-xen-sparse/drivers/xen/pcifront/pci_op.c
deleted file mode 100644 (file)
index 608c277..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * PCI Frontend Operations - Communicates with frontend
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include <linux/time.h>
-#include <xen/evtchn.h>
-#include "pcifront.h"
-
-static int verbose_request = 0;
-module_param(verbose_request, int, 0644);
-
-static int errno_to_pcibios_err(int errno)
-{
-       switch (errno) {
-       case XEN_PCI_ERR_success:
-               return PCIBIOS_SUCCESSFUL;
-
-       case XEN_PCI_ERR_dev_not_found:
-               return PCIBIOS_DEVICE_NOT_FOUND;
-
-       case XEN_PCI_ERR_invalid_offset:
-       case XEN_PCI_ERR_op_failed:
-               return PCIBIOS_BAD_REGISTER_NUMBER;
-
-       case XEN_PCI_ERR_not_implemented:
-               return PCIBIOS_FUNC_NOT_SUPPORTED;
-
-       case XEN_PCI_ERR_access_denied:
-               return PCIBIOS_SET_FAILED;
-       }
-       return errno;
-}
-
-static int do_pci_op(struct pcifront_device *pdev, struct xen_pci_op *op)
-{
-       int err = 0;
-       struct xen_pci_op *active_op = &pdev->sh_info->op;
-       unsigned long irq_flags;
-       evtchn_port_t port = pdev->evtchn;
-       s64 ns, ns_timeout;
-       struct timeval tv;
-
-       spin_lock_irqsave(&pdev->sh_info_lock, irq_flags);
-
-       memcpy(active_op, op, sizeof(struct xen_pci_op));
-
-       /* Go */
-       wmb();
-       set_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
-       notify_remote_via_evtchn(port);
-
-       /*
-        * We set a poll timeout of 3 seconds but give up on return after
-        * 2 seconds. It is better to time out too late rather than too early
-        * (in the latter case we end up continually re-executing poll() with a
-        * timeout in the past). 1s difference gives plenty of slack for error.
-        */
-       do_gettimeofday(&tv);
-       ns_timeout = timeval_to_ns(&tv) + 2 * (s64)NSEC_PER_SEC;
-
-       clear_evtchn(port);
-
-       while (test_bit(_XEN_PCIF_active,
-                       (unsigned long *)&pdev->sh_info->flags)) {
-               if (HYPERVISOR_poll(&port, 1, jiffies + 3*HZ))
-                       BUG();
-               clear_evtchn(port);
-               do_gettimeofday(&tv);
-               ns = timeval_to_ns(&tv);
-               if (ns > ns_timeout) {
-                       dev_err(&pdev->xdev->dev,
-                               "pciback not responding!!!\n");
-                       clear_bit(_XEN_PCIF_active,
-                                 (unsigned long *)&pdev->sh_info->flags);
-                       err = XEN_PCI_ERR_dev_not_found;
-                       goto out;
-               }
-       }
-
-       memcpy(op, active_op, sizeof(struct xen_pci_op));
-
-       err = op->err;
-      out:
-       spin_unlock_irqrestore(&pdev->sh_info_lock, irq_flags);
-       return err;
-}
-
-/* Access to this function is spinlocked in drivers/pci/access.c */
-static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn,
-                            int where, int size, u32 * val)
-{
-       int err = 0;
-       struct xen_pci_op op = {
-               .cmd    = XEN_PCI_OP_conf_read,
-               .domain = pci_domain_nr(bus),
-               .bus    = bus->number,
-               .devfn  = devfn,
-               .offset = where,
-               .size   = size,
-       };
-       struct pcifront_sd *sd = bus->sysdata;
-       struct pcifront_device *pdev = pcifront_get_pdev(sd);
-
-       if (verbose_request)
-               dev_info(&pdev->xdev->dev,
-                        "read dev=%04x:%02x:%02x.%01x - offset %x size %d\n",
-                        pci_domain_nr(bus), bus->number, PCI_SLOT(devfn),
-                        PCI_FUNC(devfn), where, size);
-
-       err = do_pci_op(pdev, &op);
-
-       if (likely(!err)) {
-               if (verbose_request)
-                       dev_info(&pdev->xdev->dev, "read got back value %x\n",
-                                op.value);
-
-               *val = op.value;
-       } else if (err == -ENODEV) {
-               /* No device here, pretend that it just returned 0 */
-               err = 0;
-               *val = 0;
-       }
-
-       return errno_to_pcibios_err(err);
-}
-
-/* Access to this function is spinlocked in drivers/pci/access.c */
-static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn,
-                             int where, int size, u32 val)
-{
-       struct xen_pci_op op = {
-               .cmd    = XEN_PCI_OP_conf_write,
-               .domain = pci_domain_nr(bus),
-               .bus    = bus->number,
-               .devfn  = devfn,
-               .offset = where,
-               .size   = size,
-               .value  = val,
-       };
-       struct pcifront_sd *sd = bus->sysdata;
-       struct pcifront_device *pdev = pcifront_get_pdev(sd);
-
-       if (verbose_request)
-               dev_info(&pdev->xdev->dev,
-                        "write dev=%04x:%02x:%02x.%01x - "
-                        "offset %x size %d val %x\n",
-                        pci_domain_nr(bus), bus->number,
-                        PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val);
-
-       return errno_to_pcibios_err(do_pci_op(pdev, &op));
-}
-
-struct pci_ops pcifront_bus_ops = {
-       .read = pcifront_bus_read,
-       .write = pcifront_bus_write,
-};
-
-/* Claim resources for the PCI frontend as-is, backend won't allow changes */
-static void pcifront_claim_resource(struct pci_dev *dev, void *data)
-{
-       struct pcifront_device *pdev = data;
-       int i;
-       struct resource *r;
-
-       for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-               r = &dev->resource[i];
-
-               if (!r->parent && r->start && r->flags) {
-                       dev_dbg(&pdev->xdev->dev, "claiming resource %s/%d\n",
-                               pci_name(dev), i);
-                       pci_claim_resource(dev, i);
-               }
-       }
-}
-
-int pcifront_scan_root(struct pcifront_device *pdev,
-                      unsigned int domain, unsigned int bus)
-{
-       struct pci_bus *b;
-       struct pcifront_sd *sd = NULL;
-       struct pci_bus_entry *bus_entry = NULL;
-       int err = 0;
-
-#ifndef CONFIG_PCI_DOMAINS
-       if (domain != 0) {
-               dev_err(&pdev->xdev->dev,
-                       "PCI Root in non-zero PCI Domain! domain=%d\n", domain);
-               dev_err(&pdev->xdev->dev,
-                       "Please compile with CONFIG_PCI_DOMAINS\n");
-               err = -EINVAL;
-               goto err_out;
-       }
-#endif
-
-       dev_info(&pdev->xdev->dev, "Creating PCI Frontend Bus %04x:%02x\n",
-                domain, bus);
-
-       bus_entry = kmalloc(sizeof(*bus_entry), GFP_KERNEL);
-       sd = kmalloc(sizeof(*sd), GFP_KERNEL);
-       if (!bus_entry || !sd) {
-               err = -ENOMEM;
-               goto err_out;
-       }
-       pcifront_init_sd(sd, domain, pdev);
-
-       b = pci_scan_bus_parented(&pdev->xdev->dev, bus,
-                                 &pcifront_bus_ops, sd);
-       if (!b) {
-               dev_err(&pdev->xdev->dev,
-                       "Error creating PCI Frontend Bus!\n");
-               err = -ENOMEM;
-               goto err_out;
-       }
-       bus_entry->bus = b;
-
-       list_add(&bus_entry->list, &pdev->root_buses);
-
-       /* Claim resources before going "live" with our devices */
-       pci_walk_bus(b, pcifront_claim_resource, pdev);
-
-       pci_bus_add_devices(b);
-
-       return 0;
-
-      err_out:
-       kfree(bus_entry);
-       kfree(sd);
-
-       return err;
-}
-
-static void free_root_bus_devs(struct pci_bus *bus)
-{
-       struct pci_dev *dev;
-
-       while (!list_empty(&bus->devices)) {
-               dev = container_of(bus->devices.next, struct pci_dev,
-                                  bus_list);
-               dev_dbg(&dev->dev, "removing device\n");
-               pci_remove_bus_device(dev);
-       }
-}
-
-void pcifront_free_roots(struct pcifront_device *pdev)
-{
-       struct pci_bus_entry *bus_entry, *t;
-
-       dev_dbg(&pdev->xdev->dev, "cleaning up root buses\n");
-
-       list_for_each_entry_safe(bus_entry, t, &pdev->root_buses, list) {
-               list_del(&bus_entry->list);
-
-               free_root_bus_devs(bus_entry->bus);
-
-               kfree(bus_entry->bus->sysdata);
-
-               device_unregister(bus_entry->bus->bridge);
-               pci_remove_bus(bus_entry->bus);
-
-               kfree(bus_entry);
-       }
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/pcifront/pcifront.h b/linux-2.6-xen-sparse/drivers/xen/pcifront/pcifront.h
deleted file mode 100644 (file)
index 70bbf3b..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * PCI Frontend - Common data structures & function declarations
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#ifndef __XEN_PCIFRONT_H__
-#define __XEN_PCIFRONT_H__
-
-#include <linux/spinlock.h>
-#include <linux/pci.h>
-#include <xen/xenbus.h>
-#include <xen/interface/io/pciif.h>
-#include <xen/pcifront.h>
-
-struct pci_bus_entry {
-       struct list_head list;
-       struct pci_bus *bus;
-};
-
-struct pcifront_device {
-       struct xenbus_device *xdev;
-       struct list_head root_buses;
-       spinlock_t dev_lock;
-
-       int evtchn;
-       int gnt_ref;
-
-       /* Lock this when doing any operations in sh_info */
-       spinlock_t sh_info_lock;
-       struct xen_pci_sharedinfo *sh_info;
-};
-
-int pcifront_connect(struct pcifront_device *pdev);
-void pcifront_disconnect(struct pcifront_device *pdev);
-
-int pcifront_scan_root(struct pcifront_device *pdev,
-                      unsigned int domain, unsigned int bus);
-void pcifront_free_roots(struct pcifront_device *pdev);
-
-#endif /* __XEN_PCIFRONT_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c
deleted file mode 100644 (file)
index c5fca76..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * PCI Frontend Xenbus Setup - handles setup with backend (imports page/evtchn)
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <xen/xenbus.h>
-#include <xen/gnttab.h>
-#include "pcifront.h"
-
-#define INVALID_GRANT_REF (0)
-#define INVALID_EVTCHN    (-1)
-
-static struct pcifront_device *alloc_pdev(struct xenbus_device *xdev)
-{
-       struct pcifront_device *pdev;
-
-       pdev = kmalloc(sizeof(struct pcifront_device), GFP_KERNEL);
-       if (pdev == NULL)
-               goto out;
-
-       pdev->sh_info =
-           (struct xen_pci_sharedinfo *)__get_free_page(GFP_KERNEL);
-       if (pdev->sh_info == NULL) {
-               kfree(pdev);
-               pdev = NULL;
-               goto out;
-       }
-       pdev->sh_info->flags = 0;
-
-       xdev->dev.driver_data = pdev;
-       pdev->xdev = xdev;
-
-       INIT_LIST_HEAD(&pdev->root_buses);
-
-       spin_lock_init(&pdev->dev_lock);
-       spin_lock_init(&pdev->sh_info_lock);
-
-       pdev->evtchn = INVALID_EVTCHN;
-       pdev->gnt_ref = INVALID_GRANT_REF;
-
-       dev_dbg(&xdev->dev, "Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n",
-               pdev, pdev->sh_info);
-      out:
-       return pdev;
-}
-
-static void free_pdev(struct pcifront_device *pdev)
-{
-       dev_dbg(&pdev->xdev->dev, "freeing pdev @ 0x%p\n", pdev);
-
-       pcifront_free_roots(pdev);
-
-       if (pdev->evtchn != INVALID_EVTCHN)
-               xenbus_free_evtchn(pdev->xdev, pdev->evtchn);
-
-       if (pdev->gnt_ref != INVALID_GRANT_REF)
-               gnttab_end_foreign_access(pdev->gnt_ref, 0,
-                                         (unsigned long)pdev->sh_info);
-
-       pdev->xdev->dev.driver_data = NULL;
-
-       kfree(pdev);
-}
-
-static int pcifront_publish_info(struct pcifront_device *pdev)
-{
-       int err = 0;
-       struct xenbus_transaction trans;
-
-       err = xenbus_grant_ring(pdev->xdev, virt_to_mfn(pdev->sh_info));
-       if (err < 0)
-               goto out;
-
-       pdev->gnt_ref = err;
-
-       err = xenbus_alloc_evtchn(pdev->xdev, &pdev->evtchn);
-       if (err)
-               goto out;
-
-      do_publish:
-       err = xenbus_transaction_start(&trans);
-       if (err) {
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error writing configuration for backend "
-                                "(start transaction)");
-               goto out;
-       }
-
-       err = xenbus_printf(trans, pdev->xdev->nodename,
-                           "pci-op-ref", "%u", pdev->gnt_ref);
-       if (!err)
-               err = xenbus_printf(trans, pdev->xdev->nodename,
-                                   "event-channel", "%u", pdev->evtchn);
-       if (!err)
-               err = xenbus_printf(trans, pdev->xdev->nodename,
-                                   "magic", XEN_PCI_MAGIC);
-
-       if (err) {
-               xenbus_transaction_end(trans, 1);
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error writing configuration for backend");
-               goto out;
-       } else {
-               err = xenbus_transaction_end(trans, 0);
-               if (err == -EAGAIN)
-                       goto do_publish;
-               else if (err) {
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "Error completing transaction "
-                                        "for backend");
-                       goto out;
-               }
-       }
-
-       xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
-
-       dev_dbg(&pdev->xdev->dev, "publishing successful!\n");
-
-      out:
-       return err;
-}
-
-static int pcifront_try_connect(struct pcifront_device *pdev)
-{
-       int err = -EFAULT;
-       int i, num_roots, len;
-       char str[64];
-       unsigned int domain, bus;
-
-       spin_lock(&pdev->dev_lock);
-
-       /* Only connect once */
-       if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-           XenbusStateInitialised)
-               goto out;
-
-       err = pcifront_connect(pdev);
-       if (err) {
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error connecting PCI Frontend");
-               goto out;
-       }
-
-       err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-                          "root_num", "%d", &num_roots);
-       if (err == -ENOENT) {
-               xenbus_dev_error(pdev->xdev, err,
-                                "No PCI Roots found, trying 0000:00");
-               err = pcifront_scan_root(pdev, 0, 0);
-               num_roots = 0;
-       } else if (err != 1) {
-               if (err == 0)
-                       err = -EINVAL;
-               xenbus_dev_fatal(pdev->xdev, err,
-                                "Error reading number of PCI roots");
-               goto out;
-       }
-
-       for (i = 0; i < num_roots; i++) {
-               len = snprintf(str, sizeof(str), "root-%d", i);
-               if (unlikely(len >= (sizeof(str) - 1))) {
-                       err = -ENOMEM;
-                       goto out;
-               }
-
-               err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
-                                  "%x:%x", &domain, &bus);
-               if (err != 2) {
-                       if (err >= 0)
-                               err = -EINVAL;
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "Error reading PCI root %d", i);
-                       goto out;
-               }
-
-               err = pcifront_scan_root(pdev, domain, bus);
-               if (err) {
-                       xenbus_dev_fatal(pdev->xdev, err,
-                                        "Error scanning PCI root %04x:%02x",
-                                        domain, bus);
-                       goto out;
-               }
-       }
-
-       err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
-       if (err)
-               goto out;
-
-      out:
-       spin_unlock(&pdev->dev_lock);
-       return err;
-}
-
-static int pcifront_try_disconnect(struct pcifront_device *pdev)
-{
-       int err = 0;
-       enum xenbus_state prev_state;
-
-       spin_lock(&pdev->dev_lock);
-
-       prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
-
-       if (prev_state < XenbusStateClosing)
-               err = xenbus_switch_state(pdev->xdev, XenbusStateClosing);
-
-       if (!err && prev_state == XenbusStateConnected)
-               pcifront_disconnect(pdev);
-
-       spin_unlock(&pdev->dev_lock);
-
-       return err;
-}
-
-static void pcifront_backend_changed(struct xenbus_device *xdev,
-                                    enum xenbus_state be_state)
-{
-       struct pcifront_device *pdev = xdev->dev.driver_data;
-
-       switch (be_state) {
-       case XenbusStateClosing:
-               dev_warn(&xdev->dev, "backend going away!\n");
-               pcifront_try_disconnect(pdev);
-               break;
-
-       case XenbusStateUnknown:
-       case XenbusStateClosed:
-               dev_warn(&xdev->dev, "backend went away!\n");
-               pcifront_try_disconnect(pdev);
-
-               device_unregister(&pdev->xdev->dev);
-               break;
-
-       case XenbusStateConnected:
-               pcifront_try_connect(pdev);
-               break;
-
-       default:
-               break;
-       }
-}
-
-static int pcifront_xenbus_probe(struct xenbus_device *xdev,
-                                const struct xenbus_device_id *id)
-{
-       int err = 0;
-       struct pcifront_device *pdev = alloc_pdev(xdev);
-
-       if (pdev == NULL) {
-               err = -ENOMEM;
-               xenbus_dev_fatal(xdev, err,
-                                "Error allocating pcifront_device struct");
-               goto out;
-       }
-
-       err = pcifront_publish_info(pdev);
-
-      out:
-       return err;
-}
-
-static int pcifront_xenbus_remove(struct xenbus_device *xdev)
-{
-       if (xdev->dev.driver_data)
-               free_pdev(xdev->dev.driver_data);
-
-       return 0;
-}
-
-static struct xenbus_device_id xenpci_ids[] = {
-       {"pci"},
-       {{0}},
-};
-
-static struct xenbus_driver xenbus_pcifront_driver = {
-       .name                   = "pcifront",
-       .owner                  = THIS_MODULE,
-       .ids                    = xenpci_ids,
-       .probe                  = pcifront_xenbus_probe,
-       .remove                 = pcifront_xenbus_remove,
-       .otherend_changed       = pcifront_backend_changed,
-};
-
-static int __init pcifront_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       return xenbus_register_frontend(&xenbus_pcifront_driver);
-}
-
-/* Initialize after the Xen PCI Frontend Stub is initialized */
-subsys_initcall(pcifront_init);
diff --git a/linux-2.6-xen-sparse/drivers/xen/privcmd/Makefile b/linux-2.6-xen-sparse/drivers/xen/privcmd/Makefile
deleted file mode 100644 (file)
index de090ba..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-obj-$(CONFIG_XEN_PRIVCMD)      := privcmd.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
deleted file mode 100644 (file)
index 0defc39..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/******************************************************************************
- * privcmd.c
- * 
- * Interface to privileged domain-0 commands.
- * 
- * Copyright (c) 2002-2004, K A Fraser, B Dragovic
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/swap.h>
-#include <linux/smp_lock.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/seq_file.h>
-#include <linux/kthread.h>
-#include <asm/hypervisor.h>
-
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-#include <asm/hypervisor.h>
-#include <xen/public/privcmd.h>
-#include <xen/interface/xen.h>
-#include <xen/xen_proc.h>
-
-static struct proc_dir_entry *privcmd_intf;
-static struct proc_dir_entry *capabilities_intf;
-
-#ifndef HAVE_ARCH_PRIVCMD_MMAP
-static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
-#endif
-
-static int privcmd_ioctl(struct inode *inode, struct file *file,
-                        unsigned int cmd, unsigned long data)
-{
-       int ret = -ENOSYS;
-       void __user *udata = (void __user *) data;
-
-       switch (cmd) {
-       case IOCTL_PRIVCMD_HYPERCALL: {
-               privcmd_hypercall_t hypercall;
-  
-               if (copy_from_user(&hypercall, udata, sizeof(hypercall)))
-                       return -EFAULT;
-
-#if defined(__i386__)
-               if (hypercall.op >= (PAGE_SIZE >> 5))
-                       break;
-               __asm__ __volatile__ (
-                       "pushl %%ebx; pushl %%ecx; pushl %%edx; "
-                       "pushl %%esi; pushl %%edi; "
-                       "movl  8(%%eax),%%ebx ;"
-                       "movl 16(%%eax),%%ecx ;"
-                       "movl 24(%%eax),%%edx ;"
-                       "movl 32(%%eax),%%esi ;"
-                       "movl 40(%%eax),%%edi ;"
-                       "movl   (%%eax),%%eax ;"
-                       "shll $5,%%eax ;"
-                       "addl $hypercall_page,%%eax ;"
-                       "call *%%eax ;"
-                       "popl %%edi; popl %%esi; popl %%edx; "
-                       "popl %%ecx; popl %%ebx"
-                       : "=a" (ret) : "0" (&hypercall) : "memory" );
-#elif defined (__x86_64__)
-               if (hypercall.op < (PAGE_SIZE >> 5)) {
-                       long ign1, ign2, ign3;
-                       __asm__ __volatile__ (
-                               "movq %8,%%r10; movq %9,%%r8;"
-                               "shll $5,%%eax ;"
-                               "addq $hypercall_page,%%rax ;"
-                               "call *%%rax"
-                               : "=a" (ret), "=D" (ign1),
-                                 "=S" (ign2), "=d" (ign3)
-                               : "0" ((unsigned int)hypercall.op),
-                               "1" (hypercall.arg[0]),
-                               "2" (hypercall.arg[1]),
-                               "3" (hypercall.arg[2]),
-                               "g" (hypercall.arg[3]),
-                               "g" (hypercall.arg[4])
-                               : "r8", "r10", "memory" );
-               }
-#elif defined (__ia64__)
-               ret = privcmd_hypercall(&hypercall);
-#endif
-       }
-       break;
-
-       case IOCTL_PRIVCMD_MMAP: {
-               privcmd_mmap_t mmapcmd;
-               privcmd_mmap_entry_t msg;
-               privcmd_mmap_entry_t __user *p;
-               struct mm_struct *mm = current->mm;
-               struct vm_area_struct *vma;
-               unsigned long va;
-               int i, rc;
-
-               if (!is_initial_xendomain())
-                       return -EPERM;
-
-               if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
-                       return -EFAULT;
-
-               p = mmapcmd.entry;
-               if (copy_from_user(&msg, p, sizeof(msg)))
-                       return -EFAULT;
-
-               down_read(&mm->mmap_sem);
-
-               vma = find_vma(mm, msg.va);
-               rc = -EINVAL;
-               if (!vma || (msg.va != vma->vm_start) ||
-                   !privcmd_enforce_singleshot_mapping(vma))
-                       goto mmap_out;
-
-               va = vma->vm_start;
-
-               for (i = 0; i < mmapcmd.num; i++) {
-                       rc = -EFAULT;
-                       if (copy_from_user(&msg, p, sizeof(msg)))
-                               goto mmap_out;
-
-                       /* Do not allow range to wrap the address space. */
-                       rc = -EINVAL;
-                       if ((msg.npages > (LONG_MAX >> PAGE_SHIFT)) ||
-                           ((unsigned long)(msg.npages << PAGE_SHIFT) >= -va))
-                               goto mmap_out;
-
-                       /* Range chunks must be contiguous in va space. */
-                       if ((msg.va != va) ||
-                           ((msg.va+(msg.npages<<PAGE_SHIFT)) > vma->vm_end))
-                               goto mmap_out;
-
-                       if ((rc = direct_remap_pfn_range(
-                               vma,
-                               msg.va & PAGE_MASK, 
-                               msg.mfn, 
-                               msg.npages << PAGE_SHIFT, 
-                               vma->vm_page_prot,
-                               mmapcmd.dom)) < 0)
-                               goto mmap_out;
-
-                       p++;
-                       va += msg.npages << PAGE_SHIFT;
-               }
-
-               rc = 0;
-
-       mmap_out:
-               up_read(&mm->mmap_sem);
-               ret = rc;
-       }
-       break;
-
-       case IOCTL_PRIVCMD_MMAPBATCH: {
-               privcmd_mmapbatch_t m;
-               struct mm_struct *mm = current->mm;
-               struct vm_area_struct *vma;
-               xen_pfn_t __user *p;
-               unsigned long addr, mfn, nr_pages;
-               int i;
-
-               if (!is_initial_xendomain())
-                       return -EPERM;
-
-               if (copy_from_user(&m, udata, sizeof(m)))
-                       return -EFAULT;
-
-               nr_pages = m.num;
-               if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT)))
-                       return -EINVAL;
-
-               down_read(&mm->mmap_sem);
-
-               vma = find_vma(mm, m.addr);
-               if (!vma ||
-                   (m.addr != vma->vm_start) ||
-                   ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) ||
-                   !privcmd_enforce_singleshot_mapping(vma)) {
-                       up_read(&mm->mmap_sem);
-                       return -EINVAL;
-               }
-
-               p = m.arr;
-               addr = m.addr;
-               for (i = 0; i < nr_pages; i++, addr += PAGE_SIZE, p++) {
-                       if (get_user(mfn, p)) {
-                               up_read(&mm->mmap_sem);
-                               return -EFAULT;
-                       }
-
-                       ret = direct_remap_pfn_range(vma, addr & PAGE_MASK,
-                                                    mfn, PAGE_SIZE,
-                                                    vma->vm_page_prot, m.dom);
-                       if (ret < 0)
-                               put_user(0xF0000000 | mfn, p);
-               }
-
-               up_read(&mm->mmap_sem);
-               ret = 0;
-       }
-       break;
-
-       default:
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-#ifndef HAVE_ARCH_PRIVCMD_MMAP
-static struct page *privcmd_nopage(struct vm_area_struct *vma,
-                                  unsigned long address,
-                                  int *type)
-{
-       return NOPAGE_SIGBUS;
-}
-
-static struct vm_operations_struct privcmd_vm_ops = {
-       .nopage = privcmd_nopage
-};
-
-static int privcmd_mmap(struct file * file, struct vm_area_struct * vma)
-{
-       /* Unsupported for auto-translate guests. */
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return -ENOSYS;
-
-       /* DONTCOPY is essential for Xen as copy_page_range is broken. */
-       vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY;
-       vma->vm_ops = &privcmd_vm_ops;
-       vma->vm_private_data = NULL;
-
-       return 0;
-}
-
-static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
-{
-       return (xchg(&vma->vm_private_data, (void *)1) == NULL);
-}
-#endif
-
-static const struct file_operations privcmd_file_ops = {
-       .ioctl = privcmd_ioctl,
-       .mmap  = privcmd_mmap,
-};
-
-static int capabilities_read(char *page, char **start, off_t off,
-                            int count, int *eof, void *data)
-{
-       int len = 0;
-       *page = 0;
-
-       if (is_initial_xendomain())
-               len = sprintf( page, "control_d\n" );
-
-       *eof = 1;
-       return len;
-}
-
-static int __init privcmd_init(void)
-{
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       privcmd_intf = create_xen_proc_entry("privcmd", 0400);
-       if (privcmd_intf != NULL)
-               privcmd_intf->proc_fops = &privcmd_file_ops;
-
-       capabilities_intf = create_xen_proc_entry("capabilities", 0400 );
-       if (capabilities_intf != NULL)
-               capabilities_intf->read_proc = capabilities_read;
-
-       return 0;
-}
-
-__initcall(privcmd_init);
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/Makefile b/linux-2.6-xen-sparse/drivers/xen/tpmback/Makefile
deleted file mode 100644 (file)
index d5865c4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-obj-$(CONFIG_XEN_TPMDEV_BACKEND)       += tpmbk.o
-
-tpmbk-y += tpmback.o interface.o xenbus.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h
deleted file mode 100644 (file)
index 80655eb..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/******************************************************************************
- * drivers/xen/tpmback/common.h
- */
-
-#ifndef __TPM__BACKEND__COMMON_H__
-#define __TPM__BACKEND__COMMON_H__
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <xen/evtchn.h>
-#include <xen/driver_util.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/io/tpmif.h>
-#include <asm/io.h>
-#include <asm/pgalloc.h>
-
-#define DPRINTK(_f, _a...)                     \
-       pr_debug("(file=%s, line=%d) " _f,      \
-                __FILE__ , __LINE__ , ## _a )
-
-struct backend_info;
-
-typedef struct tpmif_st {
-       struct list_head tpmif_list;
-       /* Unique identifier for this interface. */
-       domid_t domid;
-       unsigned int handle;
-
-       /* Physical parameters of the comms window. */
-       unsigned int irq;
-
-       /* The shared rings and indexes. */
-       tpmif_tx_interface_t *tx;
-       struct vm_struct *tx_area;
-
-       /* Miscellaneous private stuff. */
-       enum { DISCONNECTED, DISCONNECTING, CONNECTED } status;
-       int active;
-
-       struct tpmif_st *hash_next;
-       struct list_head list;  /* scheduling list */
-       atomic_t refcnt;
-
-       struct backend_info *bi;
-
-       grant_handle_t shmem_handle;
-       grant_ref_t shmem_ref;
-       struct page **mmap_pages;
-
-       char devname[20];
-} tpmif_t;
-
-void tpmif_disconnect_complete(tpmif_t * tpmif);
-tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi);
-void tpmif_interface_init(void);
-void tpmif_interface_exit(void);
-void tpmif_schedule_work(tpmif_t * tpmif);
-void tpmif_deschedule_work(tpmif_t * tpmif);
-void tpmif_xenbus_init(void);
-void tpmif_xenbus_exit(void);
-int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn);
-irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-
-long int tpmback_get_instance(struct backend_info *bi);
-
-int vtpm_release_packets(tpmif_t * tpmif, int send_msgs);
-
-
-#define tpmif_get(_b) (atomic_inc(&(_b)->refcnt))
-#define tpmif_put(_b)                                  \
-       do {                                            \
-               if (atomic_dec_and_test(&(_b)->refcnt)) \
-                       tpmif_disconnect_complete(_b);  \
-       } while (0)
-
-extern int num_frontends;
-
-static inline unsigned long idx_to_kaddr(tpmif_t *t, unsigned int idx)
-{
-       return (unsigned long)pfn_to_kaddr(page_to_pfn(t->mmap_pages[idx]));
-}
-
-#endif /* __TPMIF__BACKEND__COMMON_H__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
deleted file mode 100644 (file)
index 3ae227a..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
- /*****************************************************************************
- * drivers/xen/tpmback/interface.c
- *
- * Vritual TPM interface management.
- *
- * Copyright (c) 2005, IBM Corporation
- *
- * Author: Stefan Berger, stefanb@us.ibm.com
- *
- * This code has been derived from drivers/xen/netback/interface.c
- * Copyright (c) 2004, Keir Fraser
- */
-
-#include "common.h"
-#include <xen/balloon.h>
-#include <xen/gnttab.h>
-
-static kmem_cache_t *tpmif_cachep;
-int num_frontends = 0;
-
-LIST_HEAD(tpmif_list);
-
-static tpmif_t *alloc_tpmif(domid_t domid, struct backend_info *bi)
-{
-       tpmif_t *tpmif;
-
-       tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
-       if (tpmif == NULL)
-               goto out_of_memory;
-
-       memset(tpmif, 0, sizeof (*tpmif));
-       tpmif->domid = domid;
-       tpmif->status = DISCONNECTED;
-       tpmif->bi = bi;
-       snprintf(tpmif->devname, sizeof(tpmif->devname), "tpmif%d", domid);
-       atomic_set(&tpmif->refcnt, 1);
-
-       tpmif->mmap_pages = alloc_empty_pages_and_pagevec(TPMIF_TX_RING_SIZE);
-       if (tpmif->mmap_pages == NULL)
-               goto out_of_memory;
-
-       list_add(&tpmif->tpmif_list, &tpmif_list);
-       num_frontends++;
-
-       return tpmif;
-
- out_of_memory:
-       if (tpmif != NULL)
-               kmem_cache_free(tpmif_cachep, tpmif);
-       printk("%s: out of memory\n", __FUNCTION__);
-       return ERR_PTR(-ENOMEM);
-}
-
-static void free_tpmif(tpmif_t * tpmif)
-{
-       num_frontends--;
-       list_del(&tpmif->tpmif_list);
-       free_empty_pages_and_pagevec(tpmif->mmap_pages, TPMIF_TX_RING_SIZE);
-       kmem_cache_free(tpmif_cachep, tpmif);
-}
-
-tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi)
-{
-       tpmif_t *tpmif;
-
-       list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
-               if (tpmif->bi == bi) {
-                       if (tpmif->domid == domid) {
-                               tpmif_get(tpmif);
-                               return tpmif;
-                       } else {
-                               return ERR_PTR(-EEXIST);
-                       }
-               }
-       }
-
-       return alloc_tpmif(domid, bi);
-}
-
-static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page)
-{
-       struct gnttab_map_grant_ref op;
-
-       gnttab_set_map_op(&op, (unsigned long)tpmif->tx_area->addr,
-                         GNTMAP_host_map, shared_page, tpmif->domid);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status) {
-               DPRINTK(" Grant table operation failure !\n");
-               return op.status;
-       }
-
-       tpmif->shmem_ref = shared_page;
-       tpmif->shmem_handle = op.handle;
-
-       return 0;
-}
-
-static void unmap_frontend_page(tpmif_t *tpmif)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)tpmif->tx_area->addr,
-                           GNTMAP_host_map, tpmif->shmem_handle);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-}
-
-int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn)
-{
-       int err;
-
-       if (tpmif->irq)
-               return 0;
-
-       if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
-               return -ENOMEM;
-
-       err = map_frontend_page(tpmif, shared_page);
-       if (err) {
-               free_vm_area(tpmif->tx_area);
-               return err;
-       }
-
-       tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
-
-       err = bind_interdomain_evtchn_to_irqhandler(
-               tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
-       if (err < 0) {
-               unmap_frontend_page(tpmif);
-               free_vm_area(tpmif->tx_area);
-               return err;
-       }
-       tpmif->irq = err;
-
-       tpmif->shmem_ref = shared_page;
-       tpmif->active = 1;
-
-       return 0;
-}
-
-void tpmif_disconnect_complete(tpmif_t *tpmif)
-{
-       if (tpmif->irq)
-               unbind_from_irqhandler(tpmif->irq, tpmif);
-
-       if (tpmif->tx) {
-               unmap_frontend_page(tpmif);
-               free_vm_area(tpmif->tx_area);
-       }
-
-       free_tpmif(tpmif);
-}
-
-void __init tpmif_interface_init(void)
-{
-       tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t),
-                                        0, 0, NULL, NULL);
-}
-
-void __exit tpmif_interface_exit(void)
-{
-       kmem_cache_destroy(tpmif_cachep);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c
deleted file mode 100644 (file)
index 662144d..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
-/******************************************************************************
- * drivers/xen/tpmback/tpmback.c
- *
- * Copyright (c) 2005, IBM Corporation
- *
- * Author: Stefan Berger, stefanb@us.ibm.com
- * Grant table support: Mahadevan Gomathisankaran
- *
- * This code has been derived from drivers/xen/netback/netback.c
- * Copyright (c) 2002-2004, K A Fraser
- *
- */
-
-#include "common.h"
-#include <xen/evtchn.h>
-
-#include <linux/types.h>
-#include <linux/list.h>
-#include <linux/miscdevice.h>
-#include <linux/poll.h>
-#include <asm/uaccess.h>
-#include <xen/xenbus.h>
-#include <xen/interface/grant_table.h>
-#include <xen/gnttab.h>
-
-/* local data structures */
-struct data_exchange {
-       struct list_head pending_pak;
-       struct list_head current_pak;
-       unsigned int copied_so_far;
-       u8 has_opener:1;
-       u8 aborted:1;
-       rwlock_t pak_lock;      // protects all of the previous fields
-       wait_queue_head_t wait_queue;
-};
-
-struct vtpm_resp_hdr {
-       uint32_t instance_no;
-       uint16_t tag_no;
-       uint32_t len_no;
-       uint32_t ordinal_no;
-} __attribute__ ((packed));
-
-struct packet {
-       struct list_head next;
-       unsigned int data_len;
-       u8 *data_buffer;
-       tpmif_t *tpmif;
-       u32 tpm_instance;
-       u8 req_tag;
-       u32 last_read;
-       u8 flags;
-       struct timer_list processing_timer;
-};
-
-enum {
-       PACKET_FLAG_DISCARD_RESPONSE = 1,
-};
-
-/* local variables */
-static struct data_exchange dataex;
-
-/* local function prototypes */
-static int _packet_write(struct packet *pak,
-                        const char *data, size_t size, int userbuffer);
-static void processing_timeout(unsigned long ptr);
-static int packet_read_shmem(struct packet *pak,
-                            tpmif_t * tpmif,
-                            u32 offset,
-                            char *buffer, int isuserbuffer, u32 left);
-static int vtpm_queue_packet(struct packet *pak);
-
-/***************************************************************
- Buffer copying fo user and kernel space buffes.
-***************************************************************/
-static inline int copy_from_buffer(void *to,
-                                  const void *from, unsigned long size,
-                                  int isuserbuffer)
-{
-       if (isuserbuffer) {
-               if (copy_from_user(to, (void __user *)from, size))
-                       return -EFAULT;
-       } else {
-               memcpy(to, from, size);
-       }
-       return 0;
-}
-
-static inline int copy_to_buffer(void *to,
-                                const void *from, unsigned long size,
-                                int isuserbuffer)
-{
-       if (isuserbuffer) {
-               if (copy_to_user((void __user *)to, from, size))
-                       return -EFAULT;
-       } else {
-               memcpy(to, from, size);
-       }
-       return 0;
-}
-
-
-static void dataex_init(struct data_exchange *dataex)
-{
-       INIT_LIST_HEAD(&dataex->pending_pak);
-       INIT_LIST_HEAD(&dataex->current_pak);
-       dataex->has_opener = 0;
-       rwlock_init(&dataex->pak_lock);
-       init_waitqueue_head(&dataex->wait_queue);
-}
-
-/***************************************************************
- Packet-related functions
-***************************************************************/
-
-static struct packet *packet_find_instance(struct list_head *head,
-                                          u32 tpm_instance)
-{
-       struct packet *pak;
-       struct list_head *p;
-
-       /*
-        * traverse the list of packets and return the first
-        * one with the given instance number
-        */
-       list_for_each(p, head) {
-               pak = list_entry(p, struct packet, next);
-
-               if (pak->tpm_instance == tpm_instance) {
-                       return pak;
-               }
-       }
-       return NULL;
-}
-
-static struct packet *packet_find_packet(struct list_head *head, void *packet)
-{
-       struct packet *pak;
-       struct list_head *p;
-
-       /*
-        * traverse the list of packets and return the first
-        * one with the given instance number
-        */
-       list_for_each(p, head) {
-               pak = list_entry(p, struct packet, next);
-
-               if (pak == packet) {
-                       return pak;
-               }
-       }
-       return NULL;
-}
-
-static struct packet *packet_alloc(tpmif_t * tpmif,
-                                  u32 size, u8 req_tag, u8 flags)
-{
-       struct packet *pak = NULL;
-       pak = kzalloc(sizeof (struct packet), GFP_ATOMIC);
-       if (NULL != pak) {
-               if (tpmif) {
-                       pak->tpmif = tpmif;
-                       pak->tpm_instance = tpmback_get_instance(tpmif->bi);
-                       tpmif_get(tpmif);
-               }
-               pak->data_len = size;
-               pak->req_tag = req_tag;
-               pak->last_read = 0;
-               pak->flags = flags;
-
-               /*
-                * cannot do tpmif_get(tpmif); bad things happen
-                * on the last tpmif_put()
-                */
-               init_timer(&pak->processing_timer);
-               pak->processing_timer.function = processing_timeout;
-               pak->processing_timer.data = (unsigned long)pak;
-       }
-       return pak;
-}
-
-static void inline packet_reset(struct packet *pak)
-{
-       pak->last_read = 0;
-}
-
-static void packet_free(struct packet *pak)
-{
-       if (timer_pending(&pak->processing_timer)) {
-               BUG();
-       }
-
-       if (pak->tpmif)
-               tpmif_put(pak->tpmif);
-       kfree(pak->data_buffer);
-       /*
-        * cannot do tpmif_put(pak->tpmif); bad things happen
-        * on the last tpmif_put()
-        */
-       kfree(pak);
-}
-
-
-/*
- * Write data to the shared memory and send it to the FE.
- */
-static int packet_write(struct packet *pak,
-                       const char *data, size_t size, int isuserbuffer)
-{
-       int rc = 0;
-
-       if (0 != (pak->flags & PACKET_FLAG_DISCARD_RESPONSE)) {
-               /* Don't send a respone to this packet. Just acknowledge it. */
-               rc = size;
-       } else {
-               rc = _packet_write(pak, data, size, isuserbuffer);
-       }
-
-       return rc;
-}
-
-int _packet_write(struct packet *pak,
-                 const char *data, size_t size, int isuserbuffer)
-{
-       /*
-        * Write into the shared memory pages directly
-        * and send it to the front end.
-        */
-       tpmif_t *tpmif = pak->tpmif;
-       grant_handle_t handle;
-       int rc = 0;
-       unsigned int i = 0;
-       unsigned int offset = 0;
-
-       if (tpmif == NULL) {
-               return -EFAULT;
-       }
-
-       if (tpmif->status == DISCONNECTED) {
-               return size;
-       }
-
-       while (offset < size && i < TPMIF_TX_RING_SIZE) {
-               unsigned int tocopy;
-               struct gnttab_map_grant_ref map_op;
-               struct gnttab_unmap_grant_ref unmap_op;
-               tpmif_tx_request_t *tx;
-
-               tx = &tpmif->tx->ring[i].req;
-
-               if (0 == tx->addr) {
-                       DPRINTK("ERROR: Buffer for outgoing packet NULL?! i=%d\n", i);
-                       return 0;
-               }
-
-               gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
-                                 GNTMAP_host_map, tx->ref, tpmif->domid);
-
-               if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-                                                      &map_op, 1))) {
-                       BUG();
-               }
-
-               handle = map_op.handle;
-
-               if (map_op.status) {
-                       DPRINTK(" Grant table operation failure !\n");
-                       return 0;
-               }
-
-               tocopy = min_t(size_t, size - offset, PAGE_SIZE);
-
-               if (copy_from_buffer((void *)(idx_to_kaddr(tpmif, i) |
-                                             (tx->addr & ~PAGE_MASK)),
-                                    &data[offset], tocopy, isuserbuffer)) {
-                       tpmif_put(tpmif);
-                       return -EFAULT;
-               }
-               tx->size = tocopy;
-
-               gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
-                                   GNTMAP_host_map, handle);
-
-               if (unlikely
-                   (HYPERVISOR_grant_table_op
-                    (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) {
-                       BUG();
-               }
-
-               offset += tocopy;
-               i++;
-       }
-
-       rc = offset;
-       DPRINTK("Notifying frontend via irq %d\n", tpmif->irq);
-       notify_remote_via_irq(tpmif->irq);
-
-       return rc;
-}
-
-/*
- * Read data from the shared memory and copy it directly into the
- * provided buffer. Advance the read_last indicator which tells
- * how many bytes have already been read.
- */
-static int packet_read(struct packet *pak, size_t numbytes,
-                      char *buffer, size_t buffersize, int isuserbuffer)
-{
-       tpmif_t *tpmif = pak->tpmif;
-
-       /*
-        * Read 'numbytes' of data from the buffer. The first 4
-        * bytes are the instance number in network byte order,
-        * after that come the data from the shared memory buffer.
-        */
-       u32 to_copy;
-       u32 offset = 0;
-       u32 room_left = buffersize;
-
-       if (pak->last_read < 4) {
-               /*
-                * copy the instance number into the buffer
-                */
-               u32 instance_no = htonl(pak->tpm_instance);
-               u32 last_read = pak->last_read;
-
-               to_copy = min_t(size_t, 4 - last_read, numbytes);
-
-               if (copy_to_buffer(&buffer[0],
-                                  &(((u8 *) & instance_no)[last_read]),
-                                  to_copy, isuserbuffer)) {
-                       return -EFAULT;
-               }
-
-               pak->last_read += to_copy;
-               offset += to_copy;
-               room_left -= to_copy;
-       }
-
-       /*
-        * If the packet has a data buffer appended, read from it...
-        */
-
-       if (room_left > 0) {
-               if (pak->data_buffer) {
-                       u32 to_copy = min_t(u32, pak->data_len - offset, room_left);
-                       u32 last_read = pak->last_read - 4;
-
-                       if (copy_to_buffer(&buffer[offset],
-                                          &pak->data_buffer[last_read],
-                                          to_copy, isuserbuffer)) {
-                               return -EFAULT;
-                       }
-                       pak->last_read += to_copy;
-                       offset += to_copy;
-               } else {
-                       offset = packet_read_shmem(pak,
-                                                  tpmif,
-                                                  offset,
-                                                  buffer,
-                                                  isuserbuffer, room_left);
-               }
-       }
-       return offset;
-}
-
-static int packet_read_shmem(struct packet *pak,
-                            tpmif_t * tpmif,
-                            u32 offset, char *buffer, int isuserbuffer,
-                            u32 room_left)
-{
-       u32 last_read = pak->last_read - 4;
-       u32 i = (last_read / PAGE_SIZE);
-       u32 pg_offset = last_read & (PAGE_SIZE - 1);
-       u32 to_copy;
-       grant_handle_t handle;
-
-       tpmif_tx_request_t *tx;
-
-       tx = &tpmif->tx->ring[0].req;
-       /*
-        * Start copying data at the page with index 'index'
-        * and within that page at offset 'offset'.
-        * Copy a maximum of 'room_left' bytes.
-        */
-       to_copy = min_t(u32, PAGE_SIZE - pg_offset, room_left);
-       while (to_copy > 0) {
-               void *src;
-               struct gnttab_map_grant_ref map_op;
-               struct gnttab_unmap_grant_ref unmap_op;
-
-               tx = &tpmif->tx->ring[i].req;
-
-               gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
-                                 GNTMAP_host_map, tx->ref, tpmif->domid);
-
-               if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-                                                      &map_op, 1))) {
-                       BUG();
-               }
-
-               if (map_op.status) {
-                       DPRINTK(" Grant table operation failure !\n");
-                       return -EFAULT;
-               }
-
-               handle = map_op.handle;
-
-               if (to_copy > tx->size) {
-                       /*
-                        * User requests more than what's available
-                        */
-                       to_copy = min_t(u32, tx->size, to_copy);
-               }
-
-               DPRINTK("Copying from mapped memory at %08lx\n",
-                       (unsigned long)(idx_to_kaddr(tpmif, i) |
-                                       (tx->addr & ~PAGE_MASK)));
-
-               src = (void *)(idx_to_kaddr(tpmif, i) |
-                              ((tx->addr & ~PAGE_MASK) + pg_offset));
-               if (copy_to_buffer(&buffer[offset],
-                                  src, to_copy, isuserbuffer)) {
-                       return -EFAULT;
-               }
-
-               DPRINTK("Data from TPM-FE of domain %d are %d %d %d %d\n",
-                       tpmif->domid, buffer[offset], buffer[offset + 1],
-                       buffer[offset + 2], buffer[offset + 3]);
-
-               gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
-                                   GNTMAP_host_map, handle);
-
-               if (unlikely
-                   (HYPERVISOR_grant_table_op
-                    (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) {
-                       BUG();
-               }
-
-               offset += to_copy;
-               pg_offset = 0;
-               last_read += to_copy;
-               room_left -= to_copy;
-
-               to_copy = min_t(u32, PAGE_SIZE, room_left);
-               i++;
-       }                       /* while (to_copy > 0) */
-       /*
-        * Adjust the last_read pointer
-        */
-       pak->last_read = last_read + 4;
-       return offset;
-}
-
-/* ============================================================
- * The file layer for reading data from this device
- * ============================================================
- */
-static int vtpm_op_open(struct inode *inode, struct file *f)
-{
-       int rc = 0;
-       unsigned long flags;
-
-       write_lock_irqsave(&dataex.pak_lock, flags);
-       if (dataex.has_opener == 0) {
-               dataex.has_opener = 1;
-       } else {
-               rc = -EPERM;
-       }
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-       return rc;
-}
-
-static ssize_t vtpm_op_read(struct file *file,
-                           char __user * data, size_t size, loff_t * offset)
-{
-       int ret_size = -ENODATA;
-       struct packet *pak = NULL;
-       unsigned long flags;
-
-       write_lock_irqsave(&dataex.pak_lock, flags);
-       if (dataex.aborted) {
-               dataex.aborted = 0;
-               dataex.copied_so_far = 0;
-               write_unlock_irqrestore(&dataex.pak_lock, flags);
-               return -EIO;
-       }
-
-       if (list_empty(&dataex.pending_pak)) {
-               write_unlock_irqrestore(&dataex.pak_lock, flags);
-               wait_event_interruptible(dataex.wait_queue,
-                                        !list_empty(&dataex.pending_pak));
-               write_lock_irqsave(&dataex.pak_lock, flags);
-               dataex.copied_so_far = 0;
-       }
-
-       if (!list_empty(&dataex.pending_pak)) {
-               unsigned int left;
-
-               pak = list_entry(dataex.pending_pak.next, struct packet, next);
-               left = pak->data_len - dataex.copied_so_far;
-               list_del(&pak->next);
-               write_unlock_irqrestore(&dataex.pak_lock, flags);
-
-               DPRINTK("size given by app: %d, available: %d\n", size, left);
-
-               ret_size = min_t(size_t, size, left);
-
-               ret_size = packet_read(pak, ret_size, data, size, 1);
-
-               write_lock_irqsave(&dataex.pak_lock, flags);
-
-               if (ret_size < 0) {
-                       del_singleshot_timer_sync(&pak->processing_timer);
-                       packet_free(pak);
-                       dataex.copied_so_far = 0;
-               } else {
-                       DPRINTK("Copied %d bytes to user buffer\n", ret_size);
-
-                       dataex.copied_so_far += ret_size;
-                       if (dataex.copied_so_far >= pak->data_len + 4) {
-                               DPRINTK("All data from this packet given to app.\n");
-                               /* All data given to app */
-
-                               del_singleshot_timer_sync(&pak->
-                                                         processing_timer);
-                               list_add_tail(&pak->next, &dataex.current_pak);
-                               /*
-                                * The more fontends that are handled at the same time,
-                                * the more time we give the TPM to process the request.
-                                */
-                               mod_timer(&pak->processing_timer,
-                                         jiffies + (num_frontends * 60 * HZ));
-                               dataex.copied_so_far = 0;
-                       } else {
-                               list_add(&pak->next, &dataex.pending_pak);
-                       }
-               }
-       }
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-
-       DPRINTK("Returning result from read to app: %d\n", ret_size);
-
-       return ret_size;
-}
-
-/*
- * Write operation - only works after a previous read operation!
- */
-static ssize_t vtpm_op_write(struct file *file,
-                            const char __user * data, size_t size,
-                            loff_t * offset)
-{
-       struct packet *pak;
-       int rc = 0;
-       unsigned int off = 4;
-       unsigned long flags;
-       struct vtpm_resp_hdr vrh;
-
-       /*
-        * Minimum required packet size is:
-        * 4 bytes for instance number
-        * 2 bytes for tag
-        * 4 bytes for paramSize
-        * 4 bytes for the ordinal
-        * sum: 14 bytes
-        */
-       if (size < sizeof (vrh))
-               return -EFAULT;
-
-       if (copy_from_user(&vrh, data, sizeof (vrh)))
-               return -EFAULT;
-
-       /* malformed packet? */
-       if ((off + ntohl(vrh.len_no)) != size)
-               return -EFAULT;
-
-       write_lock_irqsave(&dataex.pak_lock, flags);
-       pak = packet_find_instance(&dataex.current_pak,
-                                  ntohl(vrh.instance_no));
-
-       if (pak == NULL) {
-               write_unlock_irqrestore(&dataex.pak_lock, flags);
-               DPRINTK(KERN_ALERT "No associated packet! (inst=%d)\n",
-                       ntohl(vrh.instance_no));
-               return -EFAULT;
-       }
-
-       del_singleshot_timer_sync(&pak->processing_timer);
-       list_del(&pak->next);
-
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-
-       /*
-        * The first 'offset' bytes must be the instance number - skip them.
-        */
-       size -= off;
-
-       rc = packet_write(pak, &data[off], size, 1);
-
-       if (rc > 0) {
-               /* I neglected the first 4 bytes */
-               rc += off;
-       }
-       packet_free(pak);
-       return rc;
-}
-
-static int vtpm_op_release(struct inode *inode, struct file *file)
-{
-       unsigned long flags;
-
-       vtpm_release_packets(NULL, 1);
-       write_lock_irqsave(&dataex.pak_lock, flags);
-       dataex.has_opener = 0;
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-       return 0;
-}
-
-static unsigned int vtpm_op_poll(struct file *file,
-                                struct poll_table_struct *pts)
-{
-       unsigned int flags = POLLOUT | POLLWRNORM;
-
-       poll_wait(file, &dataex.wait_queue, pts);
-       if (!list_empty(&dataex.pending_pak)) {
-               flags |= POLLIN | POLLRDNORM;
-       }
-       return flags;
-}
-
-static const struct file_operations vtpm_ops = {
-       .owner = THIS_MODULE,
-       .llseek = no_llseek,
-       .open = vtpm_op_open,
-       .read = vtpm_op_read,
-       .write = vtpm_op_write,
-       .release = vtpm_op_release,
-       .poll = vtpm_op_poll,
-};
-
-static struct miscdevice vtpms_miscdevice = {
-       .minor = 225,
-       .name = "vtpm",
-       .fops = &vtpm_ops,
-};
-
-/***************************************************************
- Utility functions
-***************************************************************/
-
-static int tpm_send_fail_message(struct packet *pak, u8 req_tag)
-{
-       int rc;
-       static const unsigned char tpm_error_message_fail[] = {
-               0x00, 0x00,
-               0x00, 0x00, 0x00, 0x0a,
-               0x00, 0x00, 0x00, 0x09  /* TPM_FAIL */
-       };
-       unsigned char buffer[sizeof (tpm_error_message_fail)];
-
-       memcpy(buffer, tpm_error_message_fail,
-              sizeof (tpm_error_message_fail));
-       /*
-        * Insert the right response tag depending on the given tag
-        * All response tags are '+3' to the request tag.
-        */
-       buffer[1] = req_tag + 3;
-
-       /*
-        * Write the data to shared memory and notify the front-end
-        */
-       rc = packet_write(pak, buffer, sizeof (buffer), 0);
-
-       return rc;
-}
-
-static int _vtpm_release_packets(struct list_head *head,
-                                tpmif_t * tpmif, int send_msgs)
-{
-       int aborted = 0;
-       int c = 0;
-       struct packet *pak;
-       struct list_head *pos, *tmp;
-
-       list_for_each_safe(pos, tmp, head) {
-               pak = list_entry(pos, struct packet, next);
-               c += 1;
-
-               if (tpmif == NULL || pak->tpmif == tpmif) {
-                       int can_send = 0;
-
-                       del_singleshot_timer_sync(&pak->processing_timer);
-                       list_del(&pak->next);
-
-                       if (pak->tpmif && pak->tpmif->status == CONNECTED) {
-                               can_send = 1;
-                       }
-
-                       if (send_msgs && can_send) {
-                               tpm_send_fail_message(pak, pak->req_tag);
-                       }
-                       packet_free(pak);
-                       if (c == 1)
-                               aborted = 1;
-               }
-       }
-       return aborted;
-}
-
-int vtpm_release_packets(tpmif_t * tpmif, int send_msgs)
-{
-       unsigned long flags;
-
-       write_lock_irqsave(&dataex.pak_lock, flags);
-
-       dataex.aborted = _vtpm_release_packets(&dataex.pending_pak,
-                                              tpmif,
-                                              send_msgs);
-       _vtpm_release_packets(&dataex.current_pak, tpmif, send_msgs);
-
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-       return 0;
-}
-
-static int vtpm_queue_packet(struct packet *pak)
-{
-       int rc = 0;
-
-       if (dataex.has_opener) {
-               unsigned long flags;
-
-               write_lock_irqsave(&dataex.pak_lock, flags);
-               list_add_tail(&pak->next, &dataex.pending_pak);
-               /* give the TPM some time to pick up the request */
-               mod_timer(&pak->processing_timer, jiffies + (30 * HZ));
-               write_unlock_irqrestore(&dataex.pak_lock, flags);
-
-               wake_up_interruptible(&dataex.wait_queue);
-       } else {
-               rc = -EFAULT;
-       }
-       return rc;
-}
-
-static int vtpm_receive(tpmif_t * tpmif, u32 size)
-{
-       int rc = 0;
-       unsigned char buffer[10];
-       __be32 *native_size;
-       struct packet *pak = packet_alloc(tpmif, size, 0, 0);
-
-       if (!pak)
-               return -ENOMEM;
-       /*
-        * Read 10 bytes from the received buffer to test its
-        * content for validity.
-        */
-       if (sizeof (buffer) != packet_read(pak,
-                                          sizeof (buffer), buffer,
-                                          sizeof (buffer), 0)) {
-               goto failexit;
-       }
-       /*
-        * Reset the packet read pointer so we can read all its
-        * contents again.
-        */
-       packet_reset(pak);
-
-       native_size = (__force __be32 *) (&buffer[4 + 2]);
-       /*
-        * Verify that the size of the packet is correct
-        * as indicated and that there's actually someone reading packets.
-        * The minimum size of the packet is '10' for tag, size indicator
-        * and ordinal.
-        */
-       if (size < 10 ||
-           be32_to_cpu(*native_size) != size ||
-           0 == dataex.has_opener || tpmif->status != CONNECTED) {
-               rc = -EINVAL;
-               goto failexit;
-       } else {
-               rc = vtpm_queue_packet(pak);
-               if (rc < 0)
-                       goto failexit;
-       }
-       return 0;
-
-      failexit:
-       if (pak) {
-               tpm_send_fail_message(pak, buffer[4 + 1]);
-               packet_free(pak);
-       }
-       return rc;
-}
-
-/*
- * Timeout function that gets invoked when a packet has not been processed
- * during the timeout period.
- * The packet must be on a list when this function is invoked. This
- * also means that once its taken off a list, the timer must be
- * destroyed as well.
- */
-static void processing_timeout(unsigned long ptr)
-{
-       struct packet *pak = (struct packet *)ptr;
-       unsigned long flags;
-
-       write_lock_irqsave(&dataex.pak_lock, flags);
-       /*
-        * The packet needs to be searched whether it
-        * is still on the list.
-        */
-       if (pak == packet_find_packet(&dataex.pending_pak, pak) ||
-           pak == packet_find_packet(&dataex.current_pak, pak)) {
-               if ((pak->flags & PACKET_FLAG_DISCARD_RESPONSE) == 0) {
-                       tpm_send_fail_message(pak, pak->req_tag);
-               }
-               /* discard future responses */
-               pak->flags |= PACKET_FLAG_DISCARD_RESPONSE;
-       }
-
-       write_unlock_irqrestore(&dataex.pak_lock, flags);
-}
-
-static void tpm_tx_action(unsigned long unused);
-static DECLARE_TASKLET(tpm_tx_tasklet, tpm_tx_action, 0);
-
-static struct list_head tpm_schedule_list;
-static spinlock_t tpm_schedule_list_lock;
-
-static inline void maybe_schedule_tx_action(void)
-{
-       smp_mb();
-       tasklet_schedule(&tpm_tx_tasklet);
-}
-
-static inline int __on_tpm_schedule_list(tpmif_t * tpmif)
-{
-       return tpmif->list.next != NULL;
-}
-
-static void remove_from_tpm_schedule_list(tpmif_t * tpmif)
-{
-       spin_lock_irq(&tpm_schedule_list_lock);
-       if (likely(__on_tpm_schedule_list(tpmif))) {
-               list_del(&tpmif->list);
-               tpmif->list.next = NULL;
-               tpmif_put(tpmif);
-       }
-       spin_unlock_irq(&tpm_schedule_list_lock);
-}
-
-static void add_to_tpm_schedule_list_tail(tpmif_t * tpmif)
-{
-       if (__on_tpm_schedule_list(tpmif))
-               return;
-
-       spin_lock_irq(&tpm_schedule_list_lock);
-       if (!__on_tpm_schedule_list(tpmif) && tpmif->active) {
-               list_add_tail(&tpmif->list, &tpm_schedule_list);
-               tpmif_get(tpmif);
-       }
-       spin_unlock_irq(&tpm_schedule_list_lock);
-}
-
-void tpmif_schedule_work(tpmif_t * tpmif)
-{
-       add_to_tpm_schedule_list_tail(tpmif);
-       maybe_schedule_tx_action();
-}
-
-void tpmif_deschedule_work(tpmif_t * tpmif)
-{
-       remove_from_tpm_schedule_list(tpmif);
-}
-
-static void tpm_tx_action(unsigned long unused)
-{
-       struct list_head *ent;
-       tpmif_t *tpmif;
-       tpmif_tx_request_t *tx;
-
-       DPRINTK("%s: Getting data from front-end(s)!\n", __FUNCTION__);
-
-       while (!list_empty(&tpm_schedule_list)) {
-               /* Get a tpmif from the list with work to do. */
-               ent = tpm_schedule_list.next;
-               tpmif = list_entry(ent, tpmif_t, list);
-               tpmif_get(tpmif);
-               remove_from_tpm_schedule_list(tpmif);
-
-               tx = &tpmif->tx->ring[0].req;
-
-               /* pass it up */
-               vtpm_receive(tpmif, tx->size);
-
-               tpmif_put(tpmif);
-       }
-}
-
-irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-{
-       tpmif_t *tpmif = (tpmif_t *) dev_id;
-
-       add_to_tpm_schedule_list_tail(tpmif);
-       maybe_schedule_tx_action();
-       return IRQ_HANDLED;
-}
-
-static int __init tpmback_init(void)
-{
-       int rc;
-
-       if ((rc = misc_register(&vtpms_miscdevice)) != 0) {
-               printk(KERN_ALERT
-                      "Could not register misc device for TPM BE.\n");
-               return rc;
-       }
-
-       dataex_init(&dataex);
-
-       spin_lock_init(&tpm_schedule_list_lock);
-       INIT_LIST_HEAD(&tpm_schedule_list);
-
-       tpmif_interface_init();
-       tpmif_xenbus_init();
-
-       printk(KERN_ALERT "Successfully initialized TPM backend driver.\n");
-
-       return 0;
-}
-
-module_init(tpmback_init);
-
-void __exit tpmback_exit(void)
-{
-       vtpm_release_packets(NULL, 0);
-       tpmif_xenbus_exit();
-       tpmif_interface_exit();
-       misc_deregister(&vtpms_miscdevice);
-}
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c
deleted file mode 100644 (file)
index f48b0e3..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*  Xenbus code for tpmif backend
-    Copyright (C) 2005 IBM Corporation
-    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-#include <stdarg.h>
-#include <linux/module.h>
-#include <xen/xenbus.h>
-#include "common.h"
-
-struct backend_info
-{
-       struct xenbus_device *dev;
-
-       /* our communications channel */
-       tpmif_t *tpmif;
-
-       long int frontend_id;
-       long int instance; // instance of TPM
-       u8 is_instance_set;// whether instance number has been set
-
-       /* watch front end for changes */
-       struct xenbus_watch backend_watch;
-};
-
-static void maybe_connect(struct backend_info *be);
-static void connect(struct backend_info *be);
-static int connect_ring(struct backend_info *be);
-static void backend_changed(struct xenbus_watch *watch,
-                           const char **vec, unsigned int len);
-static void frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state);
-
-long int tpmback_get_instance(struct backend_info *bi)
-{
-       long int res = -1;
-       if (bi && bi->is_instance_set)
-               res = bi->instance;
-       return res;
-}
-
-static int tpmback_remove(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       if (!be) return 0;
-
-       if (be->backend_watch.node) {
-               unregister_xenbus_watch(&be->backend_watch);
-               kfree(be->backend_watch.node);
-               be->backend_watch.node = NULL;
-       }
-       if (be->tpmif) {
-               be->tpmif->bi = NULL;
-               vtpm_release_packets(be->tpmif, 0);
-               tpmif_put(be->tpmif);
-               be->tpmif = NULL;
-       }
-       kfree(be);
-       dev->dev.driver_data = NULL;
-       return 0;
-}
-
-static int tpmback_probe(struct xenbus_device *dev,
-                        const struct xenbus_device_id *id)
-{
-       int err;
-       struct backend_info *be = kzalloc(sizeof(struct backend_info),
-                                         GFP_KERNEL);
-
-       if (!be) {
-               xenbus_dev_fatal(dev, -ENOMEM,
-                                "allocating backend structure");
-               return -ENOMEM;
-       }
-
-       be->is_instance_set = 0;
-       be->dev = dev;
-       dev->dev.driver_data = be;
-
-       err = xenbus_watch_path2(dev, dev->nodename,
-                                "instance", &be->backend_watch,
-                                backend_changed);
-       if (err) {
-               goto fail;
-       }
-
-       err = xenbus_switch_state(dev, XenbusStateInitWait);
-       if (err) {
-               goto fail;
-       }
-       return 0;
-fail:
-       tpmback_remove(dev);
-       return err;
-}
-
-
-static void backend_changed(struct xenbus_watch *watch,
-                           const char **vec, unsigned int len)
-{
-       int err;
-       long instance;
-       struct backend_info *be
-               = container_of(watch, struct backend_info, backend_watch);
-       struct xenbus_device *dev = be->dev;
-
-       err = xenbus_scanf(XBT_NIL, dev->nodename,
-                          "instance","%li", &instance);
-       if (XENBUS_EXIST_ERR(err)) {
-               return;
-       }
-
-       if (err != 1) {
-               xenbus_dev_fatal(dev, err, "reading instance");
-               return;
-       }
-
-       if (be->is_instance_set == 0) {
-               be->instance = instance;
-               be->is_instance_set = 1;
-       }
-}
-
-
-static void frontend_changed(struct xenbus_device *dev,
-                            enum xenbus_state frontend_state)
-{
-       struct backend_info *be = dev->dev.driver_data;
-       int err;
-
-       switch (frontend_state) {
-       case XenbusStateInitialising:
-       case XenbusStateInitialised:
-               break;
-
-       case XenbusStateConnected:
-               err = connect_ring(be);
-               if (err) {
-                       return;
-               }
-               maybe_connect(be);
-               break;
-
-       case XenbusStateClosing:
-               be->instance = -1;
-               xenbus_switch_state(dev, XenbusStateClosing);
-               break;
-
-       case XenbusStateUnknown: /* keep it here */
-       case XenbusStateClosed:
-               xenbus_switch_state(dev, XenbusStateClosed);
-               device_unregister(&be->dev->dev);
-               tpmback_remove(dev);
-               break;
-
-       default:
-               xenbus_dev_fatal(dev, -EINVAL,
-                                "saw state %d at frontend",
-                                frontend_state);
-               break;
-       }
-}
-
-
-
-static void maybe_connect(struct backend_info *be)
-{
-       if (be->tpmif == NULL || be->tpmif->status == CONNECTED)
-               return;
-
-       connect(be);
-}
-
-
-static void connect(struct backend_info *be)
-{
-       struct xenbus_transaction xbt;
-       int err;
-       struct xenbus_device *dev = be->dev;
-       unsigned long ready = 1;
-
-again:
-       err = xenbus_transaction_start(&xbt);
-       if (err) {
-               xenbus_dev_fatal(be->dev, err, "starting transaction");
-               return;
-       }
-
-       err = xenbus_printf(xbt, be->dev->nodename,
-                           "ready", "%lu", ready);
-       if (err) {
-               xenbus_dev_fatal(be->dev, err, "writing 'ready'");
-               goto abort;
-       }
-
-       err = xenbus_transaction_end(xbt, 0);
-       if (err == -EAGAIN)
-               goto again;
-       if (err)
-               xenbus_dev_fatal(be->dev, err, "end of transaction");
-
-       err = xenbus_switch_state(dev, XenbusStateConnected);
-       if (!err)
-               be->tpmif->status = CONNECTED;
-       return;
-abort:
-       xenbus_transaction_end(xbt, 1);
-}
-
-
-static int connect_ring(struct backend_info *be)
-{
-       struct xenbus_device *dev = be->dev;
-       unsigned long ring_ref;
-       unsigned int evtchn;
-       int err;
-
-       err = xenbus_gather(XBT_NIL, dev->otherend,
-                           "ring-ref", "%lu", &ring_ref,
-                           "event-channel", "%u", &evtchn, NULL);
-       if (err) {
-               xenbus_dev_error(dev, err,
-                                "reading %s/ring-ref and event-channel",
-                                dev->otherend);
-               return err;
-       }
-
-       if (!be->tpmif) {
-               be->tpmif = tpmif_find(dev->otherend_id, be);
-               if (IS_ERR(be->tpmif)) {
-                       err = PTR_ERR(be->tpmif);
-                       be->tpmif = NULL;
-                       xenbus_dev_fatal(dev,err,"creating vtpm interface");
-                       return err;
-               }
-       }
-
-       if (be->tpmif != NULL) {
-               err = tpmif_map(be->tpmif, ring_ref, evtchn);
-               if (err) {
-                       xenbus_dev_error(dev, err,
-                                        "mapping shared-frame %lu port %u",
-                                        ring_ref, evtchn);
-                       return err;
-               }
-       }
-       return 0;
-}
-
-
-static struct xenbus_device_id tpmback_ids[] = {
-       { "vtpm" },
-       { "" }
-};
-
-
-static struct xenbus_driver tpmback = {
-       .name = "vtpm",
-       .owner = THIS_MODULE,
-       .ids = tpmback_ids,
-       .probe = tpmback_probe,
-       .remove = tpmback_remove,
-       .otherend_changed = frontend_changed,
-};
-
-
-void tpmif_xenbus_init(void)
-{
-       xenbus_register_backend(&tpmback);
-}
-
-void tpmif_xenbus_exit(void)
-{
-       xenbus_unregister_driver(&tpmback);
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/util.c b/linux-2.6-xen-sparse/drivers/xen/util.c
deleted file mode 100644 (file)
index f9da527..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <asm/uaccess.h>
-#include <xen/driver_util.h>
-
-struct class *get_xen_class(void)
-{
-       static struct class *xen_class;
-
-       if (xen_class)
-               return xen_class;
-
-       xen_class = class_create(THIS_MODULE, "xen");
-       if (IS_ERR(xen_class)) {
-               printk("Failed to create xen sysfs class.\n");
-               xen_class = NULL;
-       }
-
-       return xen_class;
-}
-EXPORT_SYMBOL_GPL(get_xen_class);
-
-/* Todo: merge ia64 ('auto-translate physmap') versions of these functions. */
-#ifndef __ia64__
-
-static int f(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-{
-       /* apply_to_page_range() does all the hard work. */
-       return 0;
-}
-
-struct vm_struct *alloc_vm_area(unsigned long size)
-{
-       struct vm_struct *area;
-
-       area = get_vm_area(size, VM_IOREMAP);
-       if (area == NULL)
-               return NULL;
-
-       /*
-        * This ensures that page tables are constructed for this region
-        * of kernel virtual address space and mapped into init_mm.
-        */
-       if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
-                               area->size, f, NULL)) {
-               free_vm_area(area);
-               return NULL;
-       }
-
-       /* Map page directories into every address space. */
-#ifdef CONFIG_X86
-       vmalloc_sync_all();
-#endif
-
-       return area;
-}
-EXPORT_SYMBOL_GPL(alloc_vm_area);
-
-void free_vm_area(struct vm_struct *area)
-{
-       struct vm_struct *ret;
-       ret = remove_vm_area(area->addr);
-       BUG_ON(ret != area);
-       kfree(area);
-}
-EXPORT_SYMBOL_GPL(free_vm_area);
-
-#endif /* !__ia64__ */
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile b/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile
deleted file mode 100644 (file)
index d7091dc..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-obj-y += xenbus_client.o xenbus_comms.o xenbus_xs.o xenbus_probe.o
-obj-$(CONFIG_XEN_BACKEND) += xenbus_be.o
-
-xenbus_be-objs =
-xenbus_be-objs += xenbus_backend_client.o
-
-xenbus-$(CONFIG_XEN_BACKEND) += xenbus_probe_backend.o
-obj-y += $(xenbus-y) $(xenbus-m)
-obj-$(CONFIG_XEN_XENBUS_DEV) += xenbus_dev.o
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c
deleted file mode 100644 (file)
index 9b6fbc9..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/******************************************************************************
- * Backend-client-facing interface for the Xenbus driver.  In other words, the
- * interface between the Xenbus and the device-specific code in the backend
- * driver.
- *
- * Copyright (C) 2005-2006 XenSource Ltd
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/err.h>
-#include <xen/gnttab.h>
-#include <xen/xenbus.h>
-#include <xen/driver_util.h>
-
-/* Based on Rusty Russell's skeleton driver's map_page */
-struct vm_struct *xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref)
-{
-       struct gnttab_map_grant_ref op;
-       struct vm_struct *area;
-
-       area = alloc_vm_area(PAGE_SIZE);
-       if (!area)
-               return ERR_PTR(-ENOMEM);
-
-       gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
-                         gnt_ref, dev->otherend_id);
-       
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status != GNTST_okay) {
-               free_vm_area(area);
-               xenbus_dev_fatal(dev, op.status,
-                                "mapping in shared page %d from domain %d",
-                                gnt_ref, dev->otherend_id);
-               BUG_ON(!IS_ERR(ERR_PTR(op.status)));
-               return ERR_PTR(op.status);
-       }
-
-       /* Stuff the handle in an unused field */
-       area->phys_addr = (unsigned long)op.handle;
-
-       return area;
-}
-EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
-
-
-int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
-                  grant_handle_t *handle, void *vaddr)
-{
-       struct gnttab_map_grant_ref op;
-       
-       gnttab_set_map_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
-                         gnt_ref, dev->otherend_id);
-       if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status != GNTST_okay) {
-               xenbus_dev_fatal(dev, op.status,
-                                "mapping in shared page %d from domain %d",
-                                gnt_ref, dev->otherend_id);
-       } else
-               *handle = op.handle;
-
-       return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_map_ring);
-
-
-/* Based on Rusty Russell's skeleton driver's unmap_page */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, struct vm_struct *area)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
-                           (grant_handle_t)area->phys_addr);
-
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status == GNTST_okay)
-               free_vm_area(area);
-       else
-               xenbus_dev_error(dev, op.status,
-                                "unmapping page at handle %d error %d",
-                                (int16_t)area->phys_addr, op.status);
-
-       return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
-
-
-int xenbus_unmap_ring(struct xenbus_device *dev,
-                    grant_handle_t handle, void *vaddr)
-{
-       struct gnttab_unmap_grant_ref op;
-
-       gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
-                           handle);
-       if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-               BUG();
-
-       if (op.status != GNTST_okay)
-               xenbus_dev_error(dev, op.status,
-                                "unmapping page at handle %d error %d",
-                                handle, op.status);
-
-       return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring);
-
-int xenbus_dev_is_online(struct xenbus_device *dev)
-{
-       int rc, val;
-
-       rc = xenbus_scanf(XBT_NIL, dev->nodename, "online", "%d", &val);
-       if (rc != 1)
-               val = 0; /* no online node present */
-
-       return val;
-}
-EXPORT_SYMBOL_GPL(xenbus_dev_is_online);
-
-MODULE_LICENSE("Dual BSD/GPL");
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
deleted file mode 100644 (file)
index 49878d1..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/******************************************************************************
- * Client-facing interface for the Xenbus driver.  In other words, the
- * interface between the Xenbus and the device-specific code, be it the
- * frontend or the backend of that driver.
- *
- * Copyright (C) 2005 XenSource Ltd
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <xen/evtchn.h>
-#include <xen/gnttab.h>
-#include <xen/xenbus.h>
-#include <xen/driver_util.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#define DPRINTK(fmt, args...) \
-    pr_debug("xenbus_client (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
-
-const char *xenbus_strstate(enum xenbus_state state)
-{
-       static const char *const name[] = {
-               [ XenbusStateUnknown      ] = "Unknown",
-               [ XenbusStateInitialising ] = "Initialising",
-               [ XenbusStateInitWait     ] = "InitWait",
-               [ XenbusStateInitialised  ] = "Initialised",
-               [ XenbusStateConnected    ] = "Connected",
-               [ XenbusStateClosing      ] = "Closing",
-               [ XenbusStateClosed       ] = "Closed",
-       };
-       return (state < ARRAY_SIZE(name)) ? name[state] : "INVALID";
-}
-EXPORT_SYMBOL_GPL(xenbus_strstate);
-
-int xenbus_watch_path(struct xenbus_device *dev, const char *path,
-                     struct xenbus_watch *watch,
-                     void (*callback)(struct xenbus_watch *,
-                                      const char **, unsigned int))
-{
-       int err;
-
-       watch->node = path;
-       watch->callback = callback;
-
-       err = register_xenbus_watch(watch);
-
-       if (err) {
-               watch->node = NULL;
-               watch->callback = NULL;
-               xenbus_dev_fatal(dev, err, "adding watch on %s", path);
-       }
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_watch_path);
-
-
-int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
-                      const char *path2, struct xenbus_watch *watch,
-                      void (*callback)(struct xenbus_watch *,
-                                       const char **, unsigned int))
-{
-       int err;
-       char *state = kasprintf(GFP_KERNEL, "%s/%s", path, path2);
-       if (!state) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating path for watch");
-               return -ENOMEM;
-       }
-       err = xenbus_watch_path(dev, state, watch, callback);
-
-       if (err)
-               kfree(state);
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_watch_path2);
-
-
-int xenbus_switch_state(struct xenbus_device *dev, enum xenbus_state state)
-{
-       /* We check whether the state is currently set to the given value, and
-          if not, then the state is set.  We don't want to unconditionally
-          write the given state, because we don't want to fire watches
-          unnecessarily.  Furthermore, if the node has gone, we don't write
-          to it, as the device will be tearing down, and we don't want to
-          resurrect that directory.
-
-          Note that, because of this cached value of our state, this function
-          will not work inside a Xenstore transaction (something it was
-          trying to in the past) because dev->state would not get reset if
-          the transaction was aborted.
-
-        */
-
-       int current_state;
-       int err;
-
-       if (state == dev->state)
-               return 0;
-
-       err = xenbus_scanf(XBT_NIL, dev->nodename, "state", "%d",
-                          &current_state);
-       if (err != 1)
-               return 0;
-
-       err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%d", state);
-       if (err) {
-               if (state != XenbusStateClosing) /* Avoid looping */
-                       xenbus_dev_fatal(dev, err, "writing new state");
-               return err;
-       }
-
-       dev->state = state;
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(xenbus_switch_state);
-
-int xenbus_frontend_closed(struct xenbus_device *dev)
-{
-       xenbus_switch_state(dev, XenbusStateClosed);
-       complete(&dev->down);
-       return 0;
-}
-EXPORT_SYMBOL_GPL(xenbus_frontend_closed);
-
-/**
- * Return the path to the error node for the given device, or NULL on failure.
- * If the value returned is non-NULL, then it is the caller's to kfree.
- */
-static char *error_path(struct xenbus_device *dev)
-{
-       return kasprintf(GFP_KERNEL, "error/%s", dev->nodename);
-}
-
-
-void _dev_error(struct xenbus_device *dev, int err, const char *fmt,
-               va_list ap)
-{
-       int ret;
-       unsigned int len;
-       char *printf_buffer = NULL, *path_buffer = NULL;
-
-#define PRINTF_BUFFER_SIZE 4096
-       printf_buffer = kmalloc(PRINTF_BUFFER_SIZE, GFP_KERNEL);
-       if (printf_buffer == NULL)
-               goto fail;
-
-       len = sprintf(printf_buffer, "%i ", -err);
-       ret = vsnprintf(printf_buffer+len, PRINTF_BUFFER_SIZE-len, fmt, ap);
-
-       BUG_ON(len + ret > PRINTF_BUFFER_SIZE-1);
-
-       dev_err(&dev->dev, "%s\n", printf_buffer);
-
-       path_buffer = error_path(dev);
-
-       if (path_buffer == NULL) {
-               printk("xenbus: failed to write error node for %s (%s)\n",
-                      dev->nodename, printf_buffer);
-               goto fail;
-       }
-
-       if (xenbus_write(XBT_NIL, path_buffer, "error", printf_buffer) != 0) {
-               printk("xenbus: failed to write error node for %s (%s)\n",
-                      dev->nodename, printf_buffer);
-               goto fail;
-       }
-
-fail:
-       if (printf_buffer)
-               kfree(printf_buffer);
-       if (path_buffer)
-               kfree(path_buffer);
-}
-
-
-void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt,
-                     ...)
-{
-       va_list ap;
-
-       va_start(ap, fmt);
-       _dev_error(dev, err, fmt, ap);
-       va_end(ap);
-}
-EXPORT_SYMBOL_GPL(xenbus_dev_error);
-
-
-void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt,
-                     ...)
-{
-       va_list ap;
-
-       va_start(ap, fmt);
-       _dev_error(dev, err, fmt, ap);
-       va_end(ap);
-
-       xenbus_switch_state(dev, XenbusStateClosing);
-}
-EXPORT_SYMBOL_GPL(xenbus_dev_fatal);
-
-
-int xenbus_grant_ring(struct xenbus_device *dev, unsigned long ring_mfn)
-{
-       int err = gnttab_grant_foreign_access(dev->otherend_id, ring_mfn, 0);
-       if (err < 0)
-               xenbus_dev_fatal(dev, err, "granting access to ring page");
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_grant_ring);
-
-
-int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port)
-{
-       struct evtchn_alloc_unbound alloc_unbound;
-       int err;
-
-       alloc_unbound.dom        = DOMID_SELF;
-       alloc_unbound.remote_dom = dev->otherend_id;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-                                         &alloc_unbound);
-       if (err)
-               xenbus_dev_fatal(dev, err, "allocating event channel");
-       else
-               *port = alloc_unbound.port;
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn);
-
-
-int xenbus_free_evtchn(struct xenbus_device *dev, int port)
-{
-       struct evtchn_close close;
-       int err;
-
-       close.port = port;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
-       if (err)
-               xenbus_dev_error(dev, err, "freeing event channel %d", port);
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
-
-
-enum xenbus_state xenbus_read_driver_state(const char *path)
-{
-       enum xenbus_state result;
-       int err = xenbus_gather(XBT_NIL, path, "state", "%d", &result, NULL);
-       if (err)
-               result = XenbusStateUnknown;
-
-       return result;
-}
-EXPORT_SYMBOL_GPL(xenbus_read_driver_state);
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
deleted file mode 100644 (file)
index 2521b82..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/******************************************************************************
- * xenbus_comms.c
- *
- * Low level code to talks to Xen Store: ringbuffer and event channel.
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/wait.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/err.h>
-#include <linux/ptrace.h>
-#include <xen/evtchn.h>
-#include <xen/xenbus.h>
-
-#include <asm/hypervisor.h>
-
-#include "xenbus_comms.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-static int xenbus_irq;
-
-extern void xenbus_probe(void *);
-extern int xenstored_ready;
-static DECLARE_WORK(probe_work, xenbus_probe, NULL);
-
-static DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
-
-static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs)
-{
-       if (unlikely(xenstored_ready == 0)) {
-               xenstored_ready = 1;
-               schedule_work(&probe_work);
-       }
-
-       wake_up(&xb_waitq);
-       return IRQ_HANDLED;
-}
-
-static int check_indexes(XENSTORE_RING_IDX cons, XENSTORE_RING_IDX prod)
-{
-       return ((prod - cons) <= XENSTORE_RING_SIZE);
-}
-
-static void *get_output_chunk(XENSTORE_RING_IDX cons,
-                             XENSTORE_RING_IDX prod,
-                             char *buf, uint32_t *len)
-{
-       *len = XENSTORE_RING_SIZE - MASK_XENSTORE_IDX(prod);
-       if ((XENSTORE_RING_SIZE - (prod - cons)) < *len)
-               *len = XENSTORE_RING_SIZE - (prod - cons);
-       return buf + MASK_XENSTORE_IDX(prod);
-}
-
-static const void *get_input_chunk(XENSTORE_RING_IDX cons,
-                                  XENSTORE_RING_IDX prod,
-                                  const char *buf, uint32_t *len)
-{
-       *len = XENSTORE_RING_SIZE - MASK_XENSTORE_IDX(cons);
-       if ((prod - cons) < *len)
-               *len = prod - cons;
-       return buf + MASK_XENSTORE_IDX(cons);
-}
-
-int xb_write(const void *data, unsigned len)
-{
-       struct xenstore_domain_interface *intf = xen_store_interface;
-       XENSTORE_RING_IDX cons, prod;
-       int rc;
-
-       while (len != 0) {
-               void *dst;
-               unsigned int avail;
-
-               rc = wait_event_interruptible(
-                       xb_waitq,
-                       (intf->req_prod - intf->req_cons) !=
-                       XENSTORE_RING_SIZE);
-               if (rc < 0)
-                       return rc;
-
-               /* Read indexes, then verify. */
-               cons = intf->req_cons;
-               prod = intf->req_prod;
-               if (!check_indexes(cons, prod)) {
-                       intf->req_cons = intf->req_prod = 0;
-                       return -EIO;
-               }
-
-               dst = get_output_chunk(cons, prod, intf->req, &avail);
-               if (avail == 0)
-                       continue;
-               if (avail > len)
-                       avail = len;
-
-               /* Must write data /after/ reading the consumer index. */
-               mb();
-
-               memcpy(dst, data, avail);
-               data += avail;
-               len -= avail;
-
-               /* Other side must not see new producer until data is there. */
-               wmb();
-               intf->req_prod += avail;
-
-               /* Implies mb(): other side will see the updated producer. */
-               notify_remote_via_evtchn(xen_store_evtchn);
-       }
-
-       return 0;
-}
-
-int xb_data_to_read(void)
-{
-       struct xenstore_domain_interface *intf = xen_store_interface;
-       return (intf->rsp_cons != intf->rsp_prod);
-}
-
-int xb_wait_for_data_to_read(void)
-{
-       return wait_event_interruptible(xb_waitq, xb_data_to_read());
-}
-
-int xb_read(void *data, unsigned len)
-{
-       struct xenstore_domain_interface *intf = xen_store_interface;
-       XENSTORE_RING_IDX cons, prod;
-       int rc;
-
-       while (len != 0) {
-               unsigned int avail;
-               const char *src;
-
-               rc = xb_wait_for_data_to_read();
-               if (rc < 0)
-                       return rc;
-
-               /* Read indexes, then verify. */
-               cons = intf->rsp_cons;
-               prod = intf->rsp_prod;
-               if (!check_indexes(cons, prod)) {
-                       intf->rsp_cons = intf->rsp_prod = 0;
-                       return -EIO;
-               }
-
-               src = get_input_chunk(cons, prod, intf->rsp, &avail);
-               if (avail == 0)
-                       continue;
-               if (avail > len)
-                       avail = len;
-
-               /* Must read data /after/ reading the producer index. */
-               rmb();
-
-               memcpy(data, src, avail);
-               data += avail;
-               len -= avail;
-
-               /* Other side must not see free space until we've copied out */
-               mb();
-               intf->rsp_cons += avail;
-
-               pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
-
-               /* Implies mb(): other side will see the updated consumer. */
-               notify_remote_via_evtchn(xen_store_evtchn);
-       }
-
-       return 0;
-}
-
-/* Set up interrupt handler off store event channel. */
-int xb_init_comms(void)
-{
-       struct xenstore_domain_interface *intf = xen_store_interface;
-       int err;
-
-       if (intf->req_prod != intf->req_cons)
-               printk(KERN_ERR "XENBUS request ring is not quiescent "
-                      "(%08x:%08x)!\n", intf->req_cons, intf->req_prod);
-
-       if (intf->rsp_prod != intf->rsp_cons) {
-               printk(KERN_WARNING "XENBUS response ring is not quiescent "
-                      "(%08x:%08x): fixing up\n",
-                      intf->rsp_cons, intf->rsp_prod);
-               intf->rsp_cons = intf->rsp_prod;
-       }
-
-       if (xenbus_irq)
-               unbind_from_irqhandler(xenbus_irq, &xb_waitq);
-
-       err = bind_caller_port_to_irqhandler(
-               xen_store_evtchn, wake_waiting,
-               0, "xenbus", &xb_waitq);
-       if (err <= 0) {
-               printk(KERN_ERR "XENBUS request irq failed %i\n", err);
-               return err;
-       }
-
-       xenbus_irq = err;
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h
deleted file mode 100644 (file)
index 505100d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Private include for xenbus communications.
- * 
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef _XENBUS_COMMS_H
-#define _XENBUS_COMMS_H
-
-int xs_init(void);
-int xb_init_comms(void);
-
-/* Low level routines. */
-int xb_write(const void *data, unsigned len);
-int xb_read(void *data, unsigned len);
-int xb_data_to_read(void);
-int xb_wait_for_data_to_read(void);
-int xs_input_avail(void);
-extern struct xenstore_domain_interface *xen_store_interface;
-extern int xen_store_evtchn;
-
-#endif /* _XENBUS_COMMS_H */
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
deleted file mode 100644 (file)
index 854982e..0000000
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * xenbus_dev.c
- * 
- * Driver giving user-space access to the kernel's xenbus connection
- * to xenstore.
- * 
- * Copyright (c) 2005, Christian Limpach
- * Copyright (c) 2005, Rusty Russell, IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/uio.h>
-#include <linux/notifier.h>
-#include <linux/wait.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/mutex.h>
-
-#include "xenbus_comms.h"
-
-#include <asm/uaccess.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <xen/xen_proc.h>
-#include <asm/hypervisor.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-struct xenbus_dev_transaction {
-       struct list_head list;
-       struct xenbus_transaction handle;
-};
-
-struct read_buffer {
-       struct list_head list;
-       unsigned int cons;
-       unsigned int len;
-       char msg[];
-};
-
-struct xenbus_dev_data {
-       /* In-progress transaction. */
-       struct list_head transactions;
-
-       /* Active watches. */
-       struct list_head watches;
-
-       /* Partial request. */
-       unsigned int len;
-       union {
-               struct xsd_sockmsg msg;
-               char buffer[PAGE_SIZE];
-       } u;
-
-       /* Response queue. */
-       struct list_head read_buffers;
-       wait_queue_head_t read_waitq;
-
-       struct mutex reply_mutex;
-};
-
-static struct proc_dir_entry *xenbus_dev_intf;
-
-static ssize_t xenbus_dev_read(struct file *filp,
-                              char __user *ubuf,
-                              size_t len, loff_t *ppos)
-{
-       struct xenbus_dev_data *u = filp->private_data;
-       struct read_buffer *rb;
-       int i, ret;
-
-       mutex_lock(&u->reply_mutex);
-       while (list_empty(&u->read_buffers)) {
-               mutex_unlock(&u->reply_mutex);
-               ret = wait_event_interruptible(u->read_waitq,
-                                              !list_empty(&u->read_buffers));
-               if (ret)
-                       return ret;
-               mutex_lock(&u->reply_mutex);
-       }
-
-       rb = list_entry(u->read_buffers.next, struct read_buffer, list);
-       for (i = 0; i < len;) {
-               put_user(rb->msg[rb->cons], ubuf + i);
-               i++;
-               rb->cons++;
-               if (rb->cons == rb->len) {
-                       list_del(&rb->list);
-                       kfree(rb);
-                       if (list_empty(&u->read_buffers))
-                               break;
-                       rb = list_entry(u->read_buffers.next,
-                                       struct read_buffer, list);
-               }
-       }
-       mutex_unlock(&u->reply_mutex);
-
-       return i;
-}
-
-static void queue_reply(struct xenbus_dev_data *u,
-                       char *data, unsigned int len)
-{
-       struct read_buffer *rb;
-
-       if (len == 0)
-               return;
-
-       rb = kmalloc(sizeof(*rb) + len, GFP_KERNEL);
-       BUG_ON(rb == NULL);
-
-       rb->cons = 0;
-       rb->len = len;
-
-       memcpy(rb->msg, data, len);
-
-       list_add_tail(&rb->list, &u->read_buffers);
-
-       wake_up(&u->read_waitq);
-}
-
-struct watch_adapter
-{
-       struct list_head list;
-       struct xenbus_watch watch;
-       struct xenbus_dev_data *dev_data;
-       char *token;
-};
-
-static void free_watch_adapter (struct watch_adapter *watch)
-{
-       kfree(watch->watch.node);
-       kfree(watch->token);
-       kfree(watch);
-}
-
-static void watch_fired(struct xenbus_watch *watch,
-                       const char **vec,
-                       unsigned int len)
-{
-       struct watch_adapter *adap =
-            container_of(watch, struct watch_adapter, watch);
-       struct xsd_sockmsg hdr;
-       const char *path, *token;
-       int path_len, tok_len, body_len;
-
-       path = vec[XS_WATCH_PATH];
-       token = adap->token;
-
-       path_len = strlen(path) + 1;
-       tok_len = strlen(token) + 1;
-       body_len = path_len + tok_len;
-
-       hdr.type = XS_WATCH_EVENT;
-       hdr.len = body_len;
-
-       mutex_lock(&adap->dev_data->reply_mutex);
-       queue_reply(adap->dev_data, (char *)&hdr, sizeof(hdr));
-       queue_reply(adap->dev_data, (char *)path, path_len);
-       queue_reply(adap->dev_data, (char *)token, tok_len);
-       mutex_unlock(&adap->dev_data->reply_mutex);
-}
-
-static LIST_HEAD(watch_list);
-
-static ssize_t xenbus_dev_write(struct file *filp,
-                               const char __user *ubuf,
-                               size_t len, loff_t *ppos)
-{
-       struct xenbus_dev_data *u = filp->private_data;
-       struct xenbus_dev_transaction *trans = NULL;
-       uint32_t msg_type;
-       void *reply;
-       char *path, *token;
-       struct watch_adapter *watch, *tmp_watch;
-       int err, rc = len;
-
-       if ((len + u->len) > sizeof(u->u.buffer)) {
-               rc = -EINVAL;
-               goto out;
-       }
-
-       if (copy_from_user(u->u.buffer + u->len, ubuf, len) != 0) {
-               rc = -EFAULT;
-               goto out;
-       }
-
-       u->len += len;
-       if ((u->len < sizeof(u->u.msg)) ||
-           (u->len < (sizeof(u->u.msg) + u->u.msg.len)))
-               return rc;
-
-       msg_type = u->u.msg.type;
-
-       switch (msg_type) {
-       case XS_TRANSACTION_START:
-       case XS_TRANSACTION_END:
-       case XS_DIRECTORY:
-       case XS_READ:
-       case XS_GET_PERMS:
-       case XS_RELEASE:
-       case XS_GET_DOMAIN_PATH:
-       case XS_WRITE:
-       case XS_MKDIR:
-       case XS_RM:
-       case XS_SET_PERMS:
-               if (msg_type == XS_TRANSACTION_START) {
-                       trans = kmalloc(sizeof(*trans), GFP_KERNEL);
-                       if (!trans) {
-                               rc = -ENOMEM;
-                               goto out;
-                       }
-               }
-
-               reply = xenbus_dev_request_and_reply(&u->u.msg);
-               if (IS_ERR(reply)) {
-                       kfree(trans);
-                       rc = PTR_ERR(reply);
-                       goto out;
-               }
-
-               if (msg_type == XS_TRANSACTION_START) {
-                       trans->handle.id = simple_strtoul(reply, NULL, 0);
-                       list_add(&trans->list, &u->transactions);
-               } else if (msg_type == XS_TRANSACTION_END) {
-                       list_for_each_entry(trans, &u->transactions, list)
-                               if (trans->handle.id == u->u.msg.tx_id)
-                                       break;
-                       BUG_ON(&trans->list == &u->transactions);
-                       list_del(&trans->list);
-                       kfree(trans);
-               }
-               mutex_lock(&u->reply_mutex);
-               queue_reply(u, (char *)&u->u.msg, sizeof(u->u.msg));
-               queue_reply(u, (char *)reply, u->u.msg.len);
-               mutex_unlock(&u->reply_mutex);
-               kfree(reply);
-               break;
-
-       case XS_WATCH:
-       case XS_UNWATCH: {
-               static const char *XS_RESP = "OK";
-               struct xsd_sockmsg hdr;
-
-               path = u->u.buffer + sizeof(u->u.msg);
-               token = memchr(path, 0, u->u.msg.len);
-               if (token == NULL) {
-                       rc = -EILSEQ;
-                       goto out;
-               }
-               token++;
-
-               if (msg_type == XS_WATCH) {
-                       watch = kmalloc(sizeof(*watch), GFP_KERNEL);
-                       watch->watch.node = kmalloc(strlen(path)+1,
-                                                    GFP_KERNEL);
-                       strcpy((char *)watch->watch.node, path);
-                       watch->watch.callback = watch_fired;
-                       watch->token = kmalloc(strlen(token)+1, GFP_KERNEL);
-                       strcpy(watch->token, token);
-                       watch->dev_data = u;
-
-                       err = register_xenbus_watch(&watch->watch);
-                       if (err) {
-                               free_watch_adapter(watch);
-                               rc = err;
-                               goto out;
-                       }
-                       
-                       list_add(&watch->list, &u->watches);
-               } else {
-                       list_for_each_entry_safe(watch, tmp_watch,
-                                                 &u->watches, list) {
-                               if (!strcmp(watch->token, token) &&
-                                   !strcmp(watch->watch.node, path))
-                               {
-                                       unregister_xenbus_watch(&watch->watch);
-                                       list_del(&watch->list);
-                                       free_watch_adapter(watch);
-                                       break;
-                               }
-                       }
-               }
-
-               hdr.type = msg_type;
-               hdr.len = strlen(XS_RESP) + 1;
-               mutex_lock(&u->reply_mutex);
-               queue_reply(u, (char *)&hdr, sizeof(hdr));
-               queue_reply(u, (char *)XS_RESP, hdr.len);
-               mutex_unlock(&u->reply_mutex);
-               break;
-       }
-
-       default:
-               rc = -EINVAL;
-               break;
-       }
-
- out:
-       u->len = 0;
-       return rc;
-}
-
-static int xenbus_dev_open(struct inode *inode, struct file *filp)
-{
-       struct xenbus_dev_data *u;
-
-       if (xen_store_evtchn == 0)
-               return -ENOENT;
-
-       nonseekable_open(inode, filp);
-
-       u = kzalloc(sizeof(*u), GFP_KERNEL);
-       if (u == NULL)
-               return -ENOMEM;
-
-       INIT_LIST_HEAD(&u->transactions);
-       INIT_LIST_HEAD(&u->watches);
-       INIT_LIST_HEAD(&u->read_buffers);
-       init_waitqueue_head(&u->read_waitq);
-
-       mutex_init(&u->reply_mutex);
-
-       filp->private_data = u;
-
-       return 0;
-}
-
-static int xenbus_dev_release(struct inode *inode, struct file *filp)
-{
-       struct xenbus_dev_data *u = filp->private_data;
-       struct xenbus_dev_transaction *trans, *tmp;
-       struct watch_adapter *watch, *tmp_watch;
-
-       list_for_each_entry_safe(trans, tmp, &u->transactions, list) {
-               xenbus_transaction_end(trans->handle, 1);
-               list_del(&trans->list);
-               kfree(trans);
-       }
-
-       list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) {
-               unregister_xenbus_watch(&watch->watch);
-               list_del(&watch->list);
-               free_watch_adapter(watch);
-       }
-
-       kfree(u);
-
-       return 0;
-}
-
-static unsigned int xenbus_dev_poll(struct file *file, poll_table *wait)
-{
-       struct xenbus_dev_data *u = file->private_data;
-
-       poll_wait(file, &u->read_waitq, wait);
-       if (!list_empty(&u->read_buffers))
-               return POLLIN | POLLRDNORM;
-       return 0;
-}
-
-static const struct file_operations xenbus_dev_file_ops = {
-       .read = xenbus_dev_read,
-       .write = xenbus_dev_write,
-       .open = xenbus_dev_open,
-       .release = xenbus_dev_release,
-       .poll = xenbus_dev_poll,
-};
-
-int xenbus_dev_init(void)
-{
-       xenbus_dev_intf = create_xen_proc_entry("xenbus", 0400);
-       if (xenbus_dev_intf)
-               xenbus_dev_intf->proc_fops = &xenbus_dev_file_ops;
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
deleted file mode 100644 (file)
index c7f8c1d..0000000
+++ /dev/null
@@ -1,1087 +0,0 @@
-/******************************************************************************
- * Talks to Xen Store to figure out what devices we have.
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * Copyright (C) 2005 Mike Wray, Hewlett-Packard
- * Copyright (C) 2005, 2006 XenSource Ltd
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#define DPRINTK(fmt, args...)                          \
-       pr_debug("xenbus_probe (%s:%d) " fmt ".\n",     \
-                __FUNCTION__, __LINE__, ##args)
-
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/string.h>
-#include <linux/ctype.h>
-#include <linux/fcntl.h>
-#include <linux/mm.h>
-#include <linux/notifier.h>
-#include <linux/kthread.h>
-#include <linux/mutex.h>
-
-#include <asm/io.h>
-#include <asm/page.h>
-#include <asm/maddr.h>
-#include <asm/pgtable.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <xen/xen_proc.h>
-#include <xen/evtchn.h>
-#include <xen/features.h>
-#include <xen/hvm.h>
-
-#include "xenbus_comms.h"
-#include "xenbus_probe.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-int xen_store_evtchn;
-struct xenstore_domain_interface *xen_store_interface;
-static unsigned long xen_store_mfn;
-
-extern struct mutex xenwatch_mutex;
-
-static ATOMIC_NOTIFIER_HEAD(xenstore_chain);
-
-static void wait_for_devices(struct xenbus_driver *xendrv);
-
-static int xenbus_probe_frontend(const char *type, const char *name);
-
-static void xenbus_dev_shutdown(struct device *_dev);
-
-/* If something in array of ids matches this device, return it. */
-static const struct xenbus_device_id *
-match_device(const struct xenbus_device_id *arr, struct xenbus_device *dev)
-{
-       for (; *arr->devicetype != '\0'; arr++) {
-               if (!strcmp(arr->devicetype, dev->devicetype))
-                       return arr;
-       }
-       return NULL;
-}
-
-int xenbus_match(struct device *_dev, struct device_driver *_drv)
-{
-       struct xenbus_driver *drv = to_xenbus_driver(_drv);
-
-       if (!drv->ids)
-               return 0;
-
-       return match_device(drv->ids, to_xenbus_device(_dev)) != NULL;
-}
-
-/* device/<type>/<id> => <type>-<id> */
-static int frontend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
-{
-       nodename = strchr(nodename, '/');
-       if (!nodename || strlen(nodename + 1) >= BUS_ID_SIZE) {
-               printk(KERN_WARNING "XENBUS: bad frontend %s\n", nodename);
-               return -EINVAL;
-       }
-
-       strlcpy(bus_id, nodename + 1, BUS_ID_SIZE);
-       if (!strchr(bus_id, '/')) {
-               printk(KERN_WARNING "XENBUS: bus_id %s no slash\n", bus_id);
-               return -EINVAL;
-       }
-       *strchr(bus_id, '/') = '-';
-       return 0;
-}
-
-
-static void free_otherend_details(struct xenbus_device *dev)
-{
-       kfree(dev->otherend);
-       dev->otherend = NULL;
-}
-
-
-static void free_otherend_watch(struct xenbus_device *dev)
-{
-       if (dev->otherend_watch.node) {
-               unregister_xenbus_watch(&dev->otherend_watch);
-               kfree(dev->otherend_watch.node);
-               dev->otherend_watch.node = NULL;
-       }
-}
-
-
-int read_otherend_details(struct xenbus_device *xendev,
-                                char *id_node, char *path_node)
-{
-       int err = xenbus_gather(XBT_NIL, xendev->nodename,
-                               id_node, "%i", &xendev->otherend_id,
-                               path_node, NULL, &xendev->otherend,
-                               NULL);
-       if (err) {
-               xenbus_dev_fatal(xendev, err,
-                                "reading other end details from %s",
-                                xendev->nodename);
-               return err;
-       }
-       if (strlen(xendev->otherend) == 0 ||
-           !xenbus_exists(XBT_NIL, xendev->otherend, "")) {
-               xenbus_dev_fatal(xendev, -ENOENT,
-                                "unable to read other end from %s.  "
-                                "missing or inaccessible.",
-                                xendev->nodename);
-               free_otherend_details(xendev);
-               return -ENOENT;
-       }
-
-       return 0;
-}
-
-
-static int read_backend_details(struct xenbus_device *xendev)
-{
-       return read_otherend_details(xendev, "backend-id", "backend");
-}
-
-
-/* Bus type for frontend drivers. */
-static struct xen_bus_type xenbus_frontend = {
-       .root = "device",
-       .levels = 2,            /* device/type/<id> */
-       .get_bus_id = frontend_bus_id,
-       .probe = xenbus_probe_frontend,
-       .error = -ENODEV,
-       .bus = {
-               .name     = "xen",
-               .match    = xenbus_match,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-               .probe    = xenbus_dev_probe,
-               .remove   = xenbus_dev_remove,
-               .shutdown = xenbus_dev_shutdown,
-#endif
-       },
-       .dev = {
-               .bus_id = "xen",
-       },
-};
-
-static void otherend_changed(struct xenbus_watch *watch,
-                            const char **vec, unsigned int len)
-{
-       struct xenbus_device *dev =
-               container_of(watch, struct xenbus_device, otherend_watch);
-       struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
-       enum xenbus_state state;
-
-       /* Protect us against watches firing on old details when the otherend
-          details change, say immediately after a resume. */
-       if (!dev->otherend ||
-           strncmp(dev->otherend, vec[XS_WATCH_PATH],
-                   strlen(dev->otherend))) {
-               DPRINTK("Ignoring watch at %s", vec[XS_WATCH_PATH]);
-               return;
-       }
-
-       state = xenbus_read_driver_state(dev->otherend);
-
-       DPRINTK("state is %d (%s), %s, %s", state, xenbus_strstate(state),
-               dev->otherend_watch.node, vec[XS_WATCH_PATH]);
-
-       /*
-        * Ignore xenbus transitions during shutdown. This prevents us doing
-        * work that can fail e.g., when the rootfs is gone.
-        */
-       if (system_state > SYSTEM_RUNNING) {
-               struct xen_bus_type *bus = bus;
-               bus = container_of(dev->dev.bus, struct xen_bus_type, bus);
-               /* If we're frontend, drive the state machine to Closed. */
-               /* This should cause the backend to release our resources. */
-               if ((bus == &xenbus_frontend) && (state == XenbusStateClosing))
-                       xenbus_frontend_closed(dev);
-               return;
-       }
-
-       if (drv->otherend_changed)
-               drv->otherend_changed(dev, state);
-}
-
-
-static int talk_to_otherend(struct xenbus_device *dev)
-{
-       struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
-
-       free_otherend_watch(dev);
-       free_otherend_details(dev);
-
-       return drv->read_otherend_details(dev);
-}
-
-
-static int watch_otherend(struct xenbus_device *dev)
-{
-       return xenbus_watch_path2(dev, dev->otherend, "state",
-                                 &dev->otherend_watch, otherend_changed);
-}
-
-
-int xenbus_dev_probe(struct device *_dev)
-{
-       struct xenbus_device *dev = to_xenbus_device(_dev);
-       struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
-       const struct xenbus_device_id *id;
-       int err;
-
-       DPRINTK("%s", dev->nodename);
-
-       if (!drv->probe) {
-               err = -ENODEV;
-               goto fail;
-       }
-
-       id = match_device(drv->ids, dev);
-       if (!id) {
-               err = -ENODEV;
-               goto fail;
-       }
-
-       err = talk_to_otherend(dev);
-       if (err) {
-               printk(KERN_WARNING
-                      "xenbus_probe: talk_to_otherend on %s failed.\n",
-                      dev->nodename);
-               return err;
-       }
-
-       err = drv->probe(dev, id);
-       if (err)
-               goto fail;
-
-       err = watch_otherend(dev);
-       if (err) {
-               printk(KERN_WARNING
-                      "xenbus_probe: watch_otherend on %s failed.\n",
-                      dev->nodename);
-               return err;
-       }
-
-       return 0;
-fail:
-       xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename);
-       xenbus_switch_state(dev, XenbusStateClosed);
-       return -ENODEV;
-}
-
-int xenbus_dev_remove(struct device *_dev)
-{
-       struct xenbus_device *dev = to_xenbus_device(_dev);
-       struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
-
-       DPRINTK("%s", dev->nodename);
-
-       free_otherend_watch(dev);
-       free_otherend_details(dev);
-
-       if (drv->remove)
-               drv->remove(dev);
-
-       xenbus_switch_state(dev, XenbusStateClosed);
-       return 0;
-}
-
-static void xenbus_dev_shutdown(struct device *_dev)
-{
-       struct xenbus_device *dev = to_xenbus_device(_dev);
-       unsigned long timeout = 5*HZ;
-
-       DPRINTK("%s", dev->nodename);
-
-       get_device(&dev->dev);
-       if (dev->state != XenbusStateConnected) {
-               printk("%s: %s: %s != Connected, skipping\n", __FUNCTION__,
-                      dev->nodename, xenbus_strstate(dev->state));
-               goto out;
-       }
-       xenbus_switch_state(dev, XenbusStateClosing);
-       timeout = wait_for_completion_timeout(&dev->down, timeout);
-       if (!timeout)
-               printk("%s: %s timeout closing device\n", __FUNCTION__, dev->nodename);
- out:
-       put_device(&dev->dev);
-}
-
-int xenbus_register_driver_common(struct xenbus_driver *drv,
-                                 struct xen_bus_type *bus)
-{
-       int ret;
-
-       if (bus->error)
-               return bus->error;
-
-       drv->driver.name = drv->name;
-       drv->driver.bus = &bus->bus;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
-       drv->driver.owner = drv->owner;
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
-       drv->driver.probe = xenbus_dev_probe;
-       drv->driver.remove = xenbus_dev_remove;
-       drv->driver.shutdown = xenbus_dev_shutdown;
-#endif
-
-       mutex_lock(&xenwatch_mutex);
-       ret = driver_register(&drv->driver);
-       mutex_unlock(&xenwatch_mutex);
-       return ret;
-}
-
-int xenbus_register_frontend(struct xenbus_driver *drv)
-{
-       int ret;
-
-       drv->read_otherend_details = read_backend_details;
-
-       ret = xenbus_register_driver_common(drv, &xenbus_frontend);
-       if (ret)
-               return ret;
-
-       /* If this driver is loaded as a module wait for devices to attach. */
-       wait_for_devices(drv);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(xenbus_register_frontend);
-
-void xenbus_unregister_driver(struct xenbus_driver *drv)
-{
-       driver_unregister(&drv->driver);
-}
-EXPORT_SYMBOL_GPL(xenbus_unregister_driver);
-
-struct xb_find_info
-{
-       struct xenbus_device *dev;
-       const char *nodename;
-};
-
-static int cmp_dev(struct device *dev, void *data)
-{
-       struct xenbus_device *xendev = to_xenbus_device(dev);
-       struct xb_find_info *info = data;
-
-       if (!strcmp(xendev->nodename, info->nodename)) {
-               info->dev = xendev;
-               get_device(dev);
-               return 1;
-       }
-       return 0;
-}
-
-struct xenbus_device *xenbus_device_find(const char *nodename,
-                                        struct bus_type *bus)
-{
-       struct xb_find_info info = { .dev = NULL, .nodename = nodename };
-
-       bus_for_each_dev(bus, NULL, &info, cmp_dev);
-       return info.dev;
-}
-
-static int cleanup_dev(struct device *dev, void *data)
-{
-       struct xenbus_device *xendev = to_xenbus_device(dev);
-       struct xb_find_info *info = data;
-       int len = strlen(info->nodename);
-
-       DPRINTK("%s", info->nodename);
-
-       /* Match the info->nodename path, or any subdirectory of that path. */
-       if (strncmp(xendev->nodename, info->nodename, len))
-               return 0;
-
-       /* If the node name is longer, ensure it really is a subdirectory. */
-       if ((strlen(xendev->nodename) > len) && (xendev->nodename[len] != '/'))
-               return 0;
-
-       info->dev = xendev;
-       get_device(dev);
-       return 1;
-}
-
-static void xenbus_cleanup_devices(const char *path, struct bus_type *bus)
-{
-       struct xb_find_info info = { .nodename = path };
-
-       do {
-               info.dev = NULL;
-               bus_for_each_dev(bus, NULL, &info, cleanup_dev);
-               if (info.dev) {
-                       device_unregister(&info.dev->dev);
-                       put_device(&info.dev->dev);
-               }
-       } while (info.dev);
-}
-
-static void xenbus_dev_release(struct device *dev)
-{
-       if (dev)
-               kfree(to_xenbus_device(dev));
-}
-
-static ssize_t xendev_show_nodename(struct device *dev,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
-                                   struct device_attribute *attr,
-#endif
-                                   char *buf)
-{
-       return sprintf(buf, "%s\n", to_xenbus_device(dev)->nodename);
-}
-DEVICE_ATTR(nodename, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_nodename, NULL);
-
-static ssize_t xendev_show_devtype(struct device *dev,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
-                                  struct device_attribute *attr,
-#endif
-                                  char *buf)
-{
-       return sprintf(buf, "%s\n", to_xenbus_device(dev)->devicetype);
-}
-DEVICE_ATTR(devtype, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_devtype, NULL);
-
-
-int xenbus_probe_node(struct xen_bus_type *bus,
-                     const char *type,
-                     const char *nodename)
-{
-       int err;
-       struct xenbus_device *xendev;
-       size_t stringlen;
-       char *tmpstring;
-
-       enum xenbus_state state = xenbus_read_driver_state(nodename);
-
-       if (bus->error)
-               return bus->error;
-
-       if (state != XenbusStateInitialising) {
-               /* Device is not new, so ignore it.  This can happen if a
-                  device is going away after switching to Closed.  */
-               return 0;
-       }
-
-       stringlen = strlen(nodename) + 1 + strlen(type) + 1;
-       xendev = kzalloc(sizeof(*xendev) + stringlen, GFP_KERNEL);
-       if (!xendev)
-               return -ENOMEM;
-
-       xendev->state = XenbusStateInitialising;
-
-       /* Copy the strings into the extra space. */
-
-       tmpstring = (char *)(xendev + 1);
-       strcpy(tmpstring, nodename);
-       xendev->nodename = tmpstring;
-
-       tmpstring += strlen(tmpstring) + 1;
-       strcpy(tmpstring, type);
-       xendev->devicetype = tmpstring;
-       init_completion(&xendev->down);
-
-       xendev->dev.parent = &bus->dev;
-       xendev->dev.bus = &bus->bus;
-       xendev->dev.release = xenbus_dev_release;
-
-       err = bus->get_bus_id(xendev->dev.bus_id, xendev->nodename);
-       if (err)
-               goto fail;
-
-       /* Register with generic device framework. */
-       err = device_register(&xendev->dev);
-       if (err)
-               goto fail;
-
-       err = device_create_file(&xendev->dev, &dev_attr_nodename);
-       if (err)
-               goto unregister;
-       err = device_create_file(&xendev->dev, &dev_attr_devtype);
-       if (err)
-               goto unregister;
-
-       return 0;
-unregister:
-       device_remove_file(&xendev->dev, &dev_attr_nodename);
-       device_remove_file(&xendev->dev, &dev_attr_devtype);
-       device_unregister(&xendev->dev);
-fail:
-       kfree(xendev);
-       return err;
-}
-
-/* device/<typename>/<name> */
-static int xenbus_probe_frontend(const char *type, const char *name)
-{
-       char *nodename;
-       int err;
-
-       nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", xenbus_frontend.root, type, name);
-       if (!nodename)
-               return -ENOMEM;
-
-       DPRINTK("%s", nodename);
-
-       err = xenbus_probe_node(&xenbus_frontend, type, nodename);
-       kfree(nodename);
-       return err;
-}
-
-static int xenbus_probe_device_type(struct xen_bus_type *bus, const char *type)
-{
-       int err = 0;
-       char **dir;
-       unsigned int dir_n = 0;
-       int i;
-
-       dir = xenbus_directory(XBT_NIL, bus->root, type, &dir_n);
-       if (IS_ERR(dir))
-               return PTR_ERR(dir);
-
-       for (i = 0; i < dir_n; i++) {
-               err = bus->probe(type, dir[i]);
-               if (err)
-                       break;
-       }
-       kfree(dir);
-       return err;
-}
-
-int xenbus_probe_devices(struct xen_bus_type *bus)
-{
-       int err = 0;
-       char **dir;
-       unsigned int i, dir_n;
-
-       if (bus->error)
-               return bus->error;
-
-       dir = xenbus_directory(XBT_NIL, bus->root, "", &dir_n);
-       if (IS_ERR(dir))
-               return PTR_ERR(dir);
-
-       for (i = 0; i < dir_n; i++) {
-               err = xenbus_probe_device_type(bus, dir[i]);
-               if (err)
-                       break;
-       }
-       kfree(dir);
-       return err;
-}
-
-static unsigned int char_count(const char *str, char c)
-{
-       unsigned int i, ret = 0;
-
-       for (i = 0; str[i]; i++)
-               if (str[i] == c)
-                       ret++;
-       return ret;
-}
-
-static int strsep_len(const char *str, char c, unsigned int len)
-{
-       unsigned int i;
-
-       for (i = 0; str[i]; i++)
-               if (str[i] == c) {
-                       if (len == 0)
-                               return i;
-                       len--;
-               }
-       return (len == 0) ? i : -ERANGE;
-}
-
-void dev_changed(const char *node, struct xen_bus_type *bus)
-{
-       int exists, rootlen;
-       struct xenbus_device *dev;
-       char type[BUS_ID_SIZE];
-       const char *p, *root;
-
-       if (bus->error || char_count(node, '/') < 2)
-               return;
-
-       exists = xenbus_exists(XBT_NIL, node, "");
-       if (!exists) {
-               xenbus_cleanup_devices(node, &bus->bus);
-               return;
-       }
-
-       /* backend/<type>/... or device/<type>/... */
-       p = strchr(node, '/') + 1;
-       snprintf(type, BUS_ID_SIZE, "%.*s", (int)strcspn(p, "/"), p);
-       type[BUS_ID_SIZE-1] = '\0';
-
-       rootlen = strsep_len(node, '/', bus->levels);
-       if (rootlen < 0)
-               return;
-       root = kasprintf(GFP_KERNEL, "%.*s", rootlen, node);
-       if (!root)
-               return;
-
-       dev = xenbus_device_find(root, &bus->bus);
-       if (!dev)
-               xenbus_probe_node(bus, type, root);
-       else
-               put_device(&dev->dev);
-
-       kfree(root);
-}
-
-static void frontend_changed(struct xenbus_watch *watch,
-                            const char **vec, unsigned int len)
-{
-       DPRINTK("");
-
-       dev_changed(vec[XS_WATCH_PATH], &xenbus_frontend);
-}
-
-/* We watch for devices appearing and vanishing. */
-static struct xenbus_watch fe_watch = {
-       .node = "device",
-       .callback = frontend_changed,
-};
-
-static int suspend_dev(struct device *dev, void *data)
-{
-       int err = 0;
-       struct xenbus_driver *drv;
-       struct xenbus_device *xdev;
-
-       DPRINTK("");
-
-       if (dev->driver == NULL)
-               return 0;
-       drv = to_xenbus_driver(dev->driver);
-       xdev = container_of(dev, struct xenbus_device, dev);
-       if (drv->suspend)
-               err = drv->suspend(xdev);
-       if (err)
-               printk(KERN_WARNING
-                      "xenbus: suspend %s failed: %i\n", dev->bus_id, err);
-       return 0;
-}
-
-static int suspend_cancel_dev(struct device *dev, void *data)
-{
-       int err = 0;
-       struct xenbus_driver *drv;
-       struct xenbus_device *xdev;
-
-       DPRINTK("");
-
-       if (dev->driver == NULL)
-               return 0;
-       drv = to_xenbus_driver(dev->driver);
-       xdev = container_of(dev, struct xenbus_device, dev);
-       if (drv->suspend_cancel)
-               err = drv->suspend_cancel(xdev);
-       if (err)
-               printk(KERN_WARNING
-                      "xenbus: suspend_cancel %s failed: %i\n",
-                      dev->bus_id, err);
-       return 0;
-}
-
-static int resume_dev(struct device *dev, void *data)
-{
-       int err;
-       struct xenbus_driver *drv;
-       struct xenbus_device *xdev;
-
-       DPRINTK("");
-
-       if (dev->driver == NULL)
-               return 0;
-
-       drv = to_xenbus_driver(dev->driver);
-       xdev = container_of(dev, struct xenbus_device, dev);
-
-       err = talk_to_otherend(xdev);
-       if (err) {
-               printk(KERN_WARNING
-                      "xenbus: resume (talk_to_otherend) %s failed: %i\n",
-                      dev->bus_id, err);
-               return err;
-       }
-
-       xdev->state = XenbusStateInitialising;
-
-       if (drv->resume) {
-               err = drv->resume(xdev);
-               if (err) { 
-                       printk(KERN_WARNING
-                              "xenbus: resume %s failed: %i\n", 
-                              dev->bus_id, err);
-                       return err;
-               }
-       }
-
-       err = watch_otherend(xdev);
-       if (err) {
-               printk(KERN_WARNING
-                      "xenbus_probe: resume (watch_otherend) %s failed: "
-                      "%d.\n", dev->bus_id, err);
-               return err;
-       }
-
-       return 0;
-}
-
-void xenbus_suspend(void)
-{
-       DPRINTK("");
-
-       if (!xenbus_frontend.error)
-               bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, suspend_dev);
-       xenbus_backend_suspend(suspend_dev);
-       xs_suspend();
-}
-EXPORT_SYMBOL_GPL(xenbus_suspend);
-
-void xenbus_resume(void)
-{
-       xb_init_comms();
-       xs_resume();
-       if (!xenbus_frontend.error)
-               bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, resume_dev);
-       xenbus_backend_resume(resume_dev);
-}
-EXPORT_SYMBOL_GPL(xenbus_resume);
-
-void xenbus_suspend_cancel(void)
-{
-       xs_suspend_cancel();
-       if (!xenbus_frontend.error)
-               bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, suspend_cancel_dev);
-       xenbus_backend_resume(suspend_cancel_dev);
-}
-EXPORT_SYMBOL_GPL(xenbus_suspend_cancel);
-
-/* A flag to determine if xenstored is 'ready' (i.e. has started) */
-int xenstored_ready = 0;
-
-
-int register_xenstore_notifier(struct notifier_block *nb)
-{
-       int ret = 0;
-
-       if (xenstored_ready > 0)
-               ret = nb->notifier_call(nb, 0, NULL);
-       else
-               atomic_notifier_chain_register(&xenstore_chain, nb);
-
-       return ret;
-}
-EXPORT_SYMBOL_GPL(register_xenstore_notifier);
-
-void unregister_xenstore_notifier(struct notifier_block *nb)
-{
-       atomic_notifier_chain_unregister(&xenstore_chain, nb);
-}
-EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
-
-
-void xenbus_probe(void *unused)
-{
-       BUG_ON((xenstored_ready <= 0));
-
-       /* Enumerate devices in xenstore and watch for changes. */
-       xenbus_probe_devices(&xenbus_frontend);
-       register_xenbus_watch(&fe_watch);
-       xenbus_backend_probe_and_watch();
-
-       /* Notify others that xenstore is up */
-       atomic_notifier_call_chain(&xenstore_chain, 0, NULL);
-}
-
-
-#if defined(CONFIG_PROC_FS) && defined(CONFIG_XEN_PRIVILEGED_GUEST)
-static struct file_operations xsd_kva_fops;
-static struct proc_dir_entry *xsd_kva_intf;
-static struct proc_dir_entry *xsd_port_intf;
-
-static int xsd_kva_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       size_t size = vma->vm_end - vma->vm_start;
-
-       if ((size > PAGE_SIZE) || (vma->vm_pgoff != 0))
-               return -EINVAL;
-
-       if (remap_pfn_range(vma, vma->vm_start, mfn_to_pfn(xen_store_mfn),
-                           size, vma->vm_page_prot))
-               return -EAGAIN;
-
-       return 0;
-}
-
-static int xsd_kva_read(char *page, char **start, off_t off,
-                       int count, int *eof, void *data)
-{
-       int len;
-
-       len  = sprintf(page, "0x%p", xen_store_interface);
-       *eof = 1;
-       return len;
-}
-
-static int xsd_port_read(char *page, char **start, off_t off,
-                        int count, int *eof, void *data)
-{
-       int len;
-
-       len  = sprintf(page, "%d", xen_store_evtchn);
-       *eof = 1;
-       return len;
-}
-#endif
-
-static int xenbus_probe_init(void)
-{
-       int err = 0;
-       unsigned long page = 0;
-
-       DPRINTK("");
-
-       if (!is_running_on_xen())
-               return -ENODEV;
-
-       /* Register ourselves with the kernel bus subsystem */
-       xenbus_frontend.error = bus_register(&xenbus_frontend.bus);
-       if (xenbus_frontend.error)
-               printk(KERN_WARNING
-                      "XENBUS: Error registering frontend bus: %i\n",
-                      xenbus_frontend.error);
-       xenbus_backend_bus_register();
-
-       /*
-        * Domain0 doesn't have a store_evtchn or store_mfn yet.
-        */
-       if (is_initial_xendomain()) {
-               struct evtchn_alloc_unbound alloc_unbound;
-
-               /* Allocate page. */
-               page = get_zeroed_page(GFP_KERNEL);
-               if (!page)
-                       return -ENOMEM;
-
-               xen_store_mfn = xen_start_info->store_mfn =
-                       pfn_to_mfn(virt_to_phys((void *)page) >>
-                                  PAGE_SHIFT);
-
-               /* Next allocate a local port which xenstored can bind to */
-               alloc_unbound.dom        = DOMID_SELF;
-               alloc_unbound.remote_dom = 0;
-
-               err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-                                                 &alloc_unbound);
-               if (err == -ENOSYS)
-                       goto err;
-               BUG_ON(err);
-               xen_store_evtchn = xen_start_info->store_evtchn =
-                       alloc_unbound.port;
-
-#if defined(CONFIG_PROC_FS) && defined(CONFIG_XEN_PRIVILEGED_GUEST)
-               /* And finally publish the above info in /proc/xen */
-               xsd_kva_intf = create_xen_proc_entry("xsd_kva", 0600);
-               if (xsd_kva_intf) {
-                       memcpy(&xsd_kva_fops, xsd_kva_intf->proc_fops,
-                              sizeof(xsd_kva_fops));
-                       xsd_kva_fops.mmap = xsd_kva_mmap;
-                       xsd_kva_intf->proc_fops = &xsd_kva_fops;
-                       xsd_kva_intf->read_proc = xsd_kva_read;
-               }
-               xsd_port_intf = create_xen_proc_entry("xsd_port", 0400);
-               if (xsd_port_intf)
-                       xsd_port_intf->read_proc = xsd_port_read;
-#endif
-               xen_store_interface = mfn_to_virt(xen_store_mfn);
-       } else {
-               xenstored_ready = 1;
-#ifdef CONFIG_XEN
-               xen_store_evtchn = xen_start_info->store_evtchn;
-               xen_store_mfn = xen_start_info->store_mfn;
-               xen_store_interface = mfn_to_virt(xen_store_mfn);
-#else
-               xen_store_evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
-               xen_store_mfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
-               xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT,
-                                             PAGE_SIZE);
-#endif
-       }
-
-
-       xenbus_dev_init();
-
-       /* Initialize the interface to xenstore. */
-       err = xs_init();
-       if (err) {
-               printk(KERN_WARNING
-                      "XENBUS: Error initializing xenstore comms: %i\n", err);
-               goto err;
-       }
-
-       /* Register ourselves with the kernel device subsystem */
-       if (!xenbus_frontend.error) {
-               xenbus_frontend.error = device_register(&xenbus_frontend.dev);
-               if (xenbus_frontend.error) {
-                       bus_unregister(&xenbus_frontend.bus);
-                       printk(KERN_WARNING
-                              "XENBUS: Error registering frontend device: %i\n",
-                              xenbus_frontend.error);
-               }
-       }
-       xenbus_backend_device_register();
-
-       if (!is_initial_xendomain())
-               xenbus_probe(NULL);
-
-       return 0;
-
- err:
-       if (page)
-               free_page(page);
-
-       /*
-        * Do not unregister the xenbus front/backend buses here. The buses
-        * must exist because front/backend drivers will use them when they are
-        * registered.
-        */
-
-       return err;
-}
-
-#ifdef CONFIG_XEN
-postcore_initcall(xenbus_probe_init);
-MODULE_LICENSE("Dual BSD/GPL");
-#else
-int xenbus_init(void)
-{
-       return xenbus_probe_init();
-}
-#endif
-
-static int is_disconnected_device(struct device *dev, void *data)
-{
-       struct xenbus_device *xendev = to_xenbus_device(dev);
-       struct device_driver *drv = data;
-
-       /*
-        * A device with no driver will never connect. We care only about
-        * devices which should currently be in the process of connecting.
-        */
-       if (!dev->driver)
-               return 0;
-
-       /* Is this search limited to a particular driver? */
-       if (drv && (dev->driver != drv))
-               return 0;
-
-       return (xendev->state != XenbusStateConnected);
-}
-
-static int exists_disconnected_device(struct device_driver *drv)
-{
-       if (xenbus_frontend.error)
-               return xenbus_frontend.error;
-       return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
-                               is_disconnected_device);
-}
-
-static int print_device_status(struct device *dev, void *data)
-{
-       struct xenbus_device *xendev = to_xenbus_device(dev);
-       struct device_driver *drv = data;
-
-       /* Is this operation limited to a particular driver? */
-       if (drv && (dev->driver != drv))
-               return 0;
-
-       if (!dev->driver) {
-               /* Information only: is this too noisy? */
-               printk(KERN_INFO "XENBUS: Device with no driver: %s\n",
-                      xendev->nodename);
-       } else if (xendev->state != XenbusStateConnected) {
-               printk(KERN_WARNING "XENBUS: Timeout connecting "
-                      "to device: %s (state %d)\n",
-                      xendev->nodename, xendev->state);
-       }
-
-       return 0;
-}
-
-/* We only wait for device setup after most initcalls have run. */
-static int ready_to_wait_for_devices;
-
-/*
- * On a 10 second timeout, wait for all devices currently configured.  We need
- * to do this to guarantee that the filesystems and / or network devices
- * needed for boot are available, before we can allow the boot to proceed.
- *
- * This needs to be on a late_initcall, to happen after the frontend device
- * drivers have been initialised, but before the root fs is mounted.
- *
- * A possible improvement here would be to have the tools add a per-device
- * flag to the store entry, indicating whether it is needed at boot time.
- * This would allow people who knew what they were doing to accelerate their
- * boot slightly, but of course needs tools or manual intervention to set up
- * those flags correctly.
- */
-static void wait_for_devices(struct xenbus_driver *xendrv)
-{
-       unsigned long timeout = jiffies + 10*HZ;
-       struct device_driver *drv = xendrv ? &xendrv->driver : NULL;
-
-       if (!ready_to_wait_for_devices || !is_running_on_xen())
-               return;
-
-       while (exists_disconnected_device(drv)) {
-               if (time_after(jiffies, timeout))
-                       break;
-               schedule_timeout_interruptible(HZ/10);
-       }
-
-       bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
-                        print_device_status);
-}
-
-#ifndef MODULE
-static int __init boot_wait_for_devices(void)
-{
-       if (!xenbus_frontend.error) {
-               ready_to_wait_for_devices = 1;
-               wait_for_devices(NULL);
-       }
-       return 0;
-}
-
-late_initcall(boot_wait_for_devices);
-#endif
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.h b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.h
deleted file mode 100644 (file)
index 51c5330..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/******************************************************************************
- * xenbus_probe.h
- *
- * Talks to Xen Store to figure out what devices we have.
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * Copyright (C) 2005 XenSource Ltd.
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef _XENBUS_PROBE_H
-#define _XENBUS_PROBE_H
-
-#if defined(CONFIG_XEN_BACKEND) || defined(CONFIG_XEN_BACKEND_MODULE)
-extern void xenbus_backend_suspend(int (*fn)(struct device *, void *));
-extern void xenbus_backend_resume(int (*fn)(struct device *, void *));
-extern void xenbus_backend_probe_and_watch(void);
-extern void xenbus_backend_bus_register(void);
-extern void xenbus_backend_device_register(void);
-#else
-static inline void xenbus_backend_suspend(int (*fn)(struct device *, void *)) {}
-static inline void xenbus_backend_resume(int (*fn)(struct device *, void *)) {}
-static inline void xenbus_backend_probe_and_watch(void) {}
-static inline void xenbus_backend_bus_register(void) {}
-static inline void xenbus_backend_device_register(void) {}
-#endif
-
-struct xen_bus_type
-{
-       char *root;
-       int error;
-       unsigned int levels;
-       int (*get_bus_id)(char bus_id[BUS_ID_SIZE], const char *nodename);
-       int (*probe)(const char *type, const char *dir);
-       struct bus_type bus;
-       struct device dev;
-};
-
-extern int xenbus_match(struct device *_dev, struct device_driver *_drv);
-extern int xenbus_dev_probe(struct device *_dev);
-extern int xenbus_dev_remove(struct device *_dev);
-extern int xenbus_register_driver_common(struct xenbus_driver *drv,
-                                        struct xen_bus_type *bus);
-extern int xenbus_probe_node(struct xen_bus_type *bus,
-                            const char *type,
-                            const char *nodename);
-extern int xenbus_probe_devices(struct xen_bus_type *bus);
-
-extern void dev_changed(const char *node, struct xen_bus_type *bus);
-
-#endif
-
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe_backend.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe_backend.c
deleted file mode 100644 (file)
index e8007bd..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-/******************************************************************************
- * Talks to Xen Store to figure out what devices we have (backend half).
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * Copyright (C) 2005 Mike Wray, Hewlett-Packard
- * Copyright (C) 2005, 2006 XenSource Ltd
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#define DPRINTK(fmt, args...)                          \
-       pr_debug("xenbus_probe (%s:%d) " fmt ".\n",     \
-                __FUNCTION__, __LINE__, ##args)
-
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/string.h>
-#include <linux/ctype.h>
-#include <linux/fcntl.h>
-#include <linux/mm.h>
-#include <linux/notifier.h>
-#include <linux/kthread.h>
-
-#include <asm/io.h>
-#include <asm/page.h>
-#include <asm/maddr.h>
-#include <asm/pgtable.h>
-#include <asm/hypervisor.h>
-#include <xen/xenbus.h>
-#include <xen/xen_proc.h>
-#include <xen/evtchn.h>
-#include <xen/features.h>
-#include <xen/hvm.h>
-
-#include "xenbus_comms.h"
-#include "xenbus_probe.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-static int xenbus_uevent_backend(struct device *dev, char **envp,
-                                int num_envp, char *buffer, int buffer_size);
-static int xenbus_probe_backend(const char *type, const char *domid);
-
-extern int read_otherend_details(struct xenbus_device *xendev,
-                                char *id_node, char *path_node);
-
-static int read_frontend_details(struct xenbus_device *xendev)
-{
-       return read_otherend_details(xendev, "frontend-id", "frontend");
-}
-
-/* backend/<type>/<fe-uuid>/<id> => <type>-<fe-domid>-<id> */
-static int backend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
-{
-       int domid, err;
-       const char *devid, *type, *frontend;
-       unsigned int typelen;
-
-       type = strchr(nodename, '/');
-       if (!type)
-               return -EINVAL;
-       type++;
-       typelen = strcspn(type, "/");
-       if (!typelen || type[typelen] != '/')
-               return -EINVAL;
-
-       devid = strrchr(nodename, '/') + 1;
-
-       err = xenbus_gather(XBT_NIL, nodename, "frontend-id", "%i", &domid,
-                           "frontend", NULL, &frontend,
-                           NULL);
-       if (err)
-               return err;
-       if (strlen(frontend) == 0)
-               err = -ERANGE;
-       if (!err && !xenbus_exists(XBT_NIL, frontend, ""))
-               err = -ENOENT;
-       kfree(frontend);
-
-       if (err)
-               return err;
-
-       if (snprintf(bus_id, BUS_ID_SIZE,
-                    "%.*s-%i-%s", typelen, type, domid, devid) >= BUS_ID_SIZE)
-               return -ENOSPC;
-       return 0;
-}
-
-static struct xen_bus_type xenbus_backend = {
-       .root = "backend",
-       .levels = 3,            /* backend/type/<frontend>/<id> */
-       .get_bus_id = backend_bus_id,
-       .probe = xenbus_probe_backend,
-       .error = -ENODEV,
-       .bus = {
-               .name     = "xen-backend",
-               .match    = xenbus_match,
-               .probe    = xenbus_dev_probe,
-               .remove   = xenbus_dev_remove,
-//             .shutdown = xenbus_dev_shutdown,
-               .uevent   = xenbus_uevent_backend,
-       },
-       .dev = {
-               .bus_id = "xen-backend",
-       },
-};
-
-static int xenbus_uevent_backend(struct device *dev, char **envp,
-                                int num_envp, char *buffer, int buffer_size)
-{
-       struct xenbus_device *xdev;
-       struct xenbus_driver *drv;
-       int i = 0;
-       int length = 0;
-
-       DPRINTK("");
-
-       if (dev == NULL)
-               return -ENODEV;
-
-       xdev = to_xenbus_device(dev);
-       if (xdev == NULL)
-               return -ENODEV;
-
-       /* stuff we want to pass to /sbin/hotplug */
-       add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-                      "XENBUS_TYPE=%s", xdev->devicetype);
-
-       add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-                      "XENBUS_PATH=%s", xdev->nodename);
-
-       add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-                      "XENBUS_BASE_PATH=%s", xenbus_backend.root);
-
-       /* terminate, set to next free slot, shrink available space */
-       envp[i] = NULL;
-       envp = &envp[i];
-       num_envp -= i;
-       buffer = &buffer[length];
-       buffer_size -= length;
-
-       if (dev->driver) {
-               drv = to_xenbus_driver(dev->driver);
-               if (drv && drv->uevent)
-                       return drv->uevent(xdev, envp, num_envp, buffer,
-                                          buffer_size);
-       }
-
-       return 0;
-}
-
-int xenbus_register_backend(struct xenbus_driver *drv)
-{
-       drv->read_otherend_details = read_frontend_details;
-
-       return xenbus_register_driver_common(drv, &xenbus_backend);
-}
-EXPORT_SYMBOL_GPL(xenbus_register_backend);
-
-/* backend/<typename>/<frontend-uuid>/<name> */
-static int xenbus_probe_backend_unit(const char *dir,
-                                    const char *type,
-                                    const char *name)
-{
-       char *nodename;
-       int err;
-
-       nodename = kasprintf(GFP_KERNEL, "%s/%s", dir, name);
-       if (!nodename)
-               return -ENOMEM;
-
-       DPRINTK("%s\n", nodename);
-
-       err = xenbus_probe_node(&xenbus_backend, type, nodename);
-       kfree(nodename);
-       return err;
-}
-
-/* backend/<typename>/<frontend-domid> */
-static int xenbus_probe_backend(const char *type, const char *domid)
-{
-       char *nodename;
-       int err = 0;
-       char **dir;
-       unsigned int i, dir_n = 0;
-
-       DPRINTK("");
-
-       nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", xenbus_backend.root, type, domid);
-       if (!nodename)
-               return -ENOMEM;
-
-       dir = xenbus_directory(XBT_NIL, nodename, "", &dir_n);
-       if (IS_ERR(dir)) {
-               kfree(nodename);
-               return PTR_ERR(dir);
-       }
-
-       for (i = 0; i < dir_n; i++) {
-               err = xenbus_probe_backend_unit(nodename, type, dir[i]);
-               if (err)
-                       break;
-       }
-       kfree(dir);
-       kfree(nodename);
-       return err;
-}
-
-static void backend_changed(struct xenbus_watch *watch,
-                           const char **vec, unsigned int len)
-{
-       DPRINTK("");
-
-       dev_changed(vec[XS_WATCH_PATH], &xenbus_backend);
-}
-
-static struct xenbus_watch be_watch = {
-       .node = "backend",
-       .callback = backend_changed,
-};
-
-void xenbus_backend_suspend(int (*fn)(struct device *, void *))
-{
-       DPRINTK("");
-       if (!xenbus_backend.error)
-               bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, fn);
-}
-
-void xenbus_backend_resume(int (*fn)(struct device *, void *))
-{
-       DPRINTK("");
-       if (!xenbus_backend.error)
-               bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, fn);
-}
-
-void xenbus_backend_probe_and_watch(void)
-{
-       xenbus_probe_devices(&xenbus_backend);
-       register_xenbus_watch(&be_watch);
-}
-
-void xenbus_backend_bus_register(void)
-{
-       xenbus_backend.error = bus_register(&xenbus_backend.bus);
-       if (xenbus_backend.error)
-               printk(KERN_WARNING
-                      "XENBUS: Error registering backend bus: %i\n",
-                      xenbus_backend.error);
-}
-
-void xenbus_backend_device_register(void)
-{
-       if (xenbus_backend.error)
-               return;
-
-       xenbus_backend.error = device_register(&xenbus_backend.dev);
-       if (xenbus_backend.error) {
-               bus_unregister(&xenbus_backend.bus);
-               printk(KERN_WARNING
-                      "XENBUS: Error registering backend device: %i\n",
-                      xenbus_backend.error);
-       }
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c
deleted file mode 100644 (file)
index b1387e3..0000000
+++ /dev/null
@@ -1,880 +0,0 @@
-/******************************************************************************
- * xenbus_xs.c
- *
- * This is the kernel equivalent of the "xs" library.  We don't need everything
- * and we use xenbus_comms for communication.
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/unistd.h>
-#include <linux/errno.h>
-#include <linux/types.h>
-#include <linux/uio.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/fcntl.h>
-#include <linux/kthread.h>
-#include <linux/rwsem.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <xen/xenbus.h>
-#include "xenbus_comms.h"
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-struct xs_stored_msg {
-       struct list_head list;
-
-       struct xsd_sockmsg hdr;
-
-       union {
-               /* Queued replies. */
-               struct {
-                       char *body;
-               } reply;
-
-               /* Queued watch events. */
-               struct {
-                       struct xenbus_watch *handle;
-                       char **vec;
-                       unsigned int vec_size;
-               } watch;
-       } u;
-};
-
-struct xs_handle {
-       /* A list of replies. Currently only one will ever be outstanding. */
-       struct list_head reply_list;
-       spinlock_t reply_lock;
-       wait_queue_head_t reply_waitq;
-
-       /*
-        * Mutex ordering: transaction_mutex -> watch_mutex -> request_mutex.
-        * response_mutex is never taken simultaneously with the other three.
-        */
-
-       /* One request at a time. */
-       struct mutex request_mutex;
-
-       /* Protect xenbus reader thread against save/restore. */
-       struct mutex response_mutex;
-
-       /* Protect transactions against save/restore. */
-       struct rw_semaphore transaction_mutex;
-
-       /* Protect watch (de)register against save/restore. */
-       struct rw_semaphore watch_mutex;
-};
-
-static struct xs_handle xs_state;
-
-/* List of registered watches, and a lock to protect it. */
-static LIST_HEAD(watches);
-static DEFINE_SPINLOCK(watches_lock);
-
-/* List of pending watch callback events, and a lock to protect it. */
-static LIST_HEAD(watch_events);
-static DEFINE_SPINLOCK(watch_events_lock);
-
-/*
- * Details of the xenwatch callback kernel thread. The thread waits on the
- * watch_events_waitq for work to do (queued on watch_events list). When it
- * wakes up it acquires the xenwatch_mutex before reading the list and
- * carrying out work.
- */
-static pid_t xenwatch_pid;
-/* static */ DEFINE_MUTEX(xenwatch_mutex);
-static DECLARE_WAIT_QUEUE_HEAD(watch_events_waitq);
-
-static int get_error(const char *errorstring)
-{
-       unsigned int i;
-
-       for (i = 0; strcmp(errorstring, xsd_errors[i].errstring) != 0; i++) {
-               if (i == ARRAY_SIZE(xsd_errors) - 1) {
-                       printk(KERN_WARNING
-                              "XENBUS xen store gave: unknown error %s",
-                              errorstring);
-                       return EINVAL;
-               }
-       }
-       return xsd_errors[i].errnum;
-}
-
-static void *read_reply(enum xsd_sockmsg_type *type, unsigned int *len)
-{
-       struct xs_stored_msg *msg;
-       char *body;
-
-       spin_lock(&xs_state.reply_lock);
-
-       while (list_empty(&xs_state.reply_list)) {
-               spin_unlock(&xs_state.reply_lock);
-               /* XXX FIXME: Avoid synchronous wait for response here. */
-               wait_event(xs_state.reply_waitq,
-                          !list_empty(&xs_state.reply_list));
-               spin_lock(&xs_state.reply_lock);
-       }
-
-       msg = list_entry(xs_state.reply_list.next,
-                        struct xs_stored_msg, list);
-       list_del(&msg->list);
-
-       spin_unlock(&xs_state.reply_lock);
-
-       *type = msg->hdr.type;
-       if (len)
-               *len = msg->hdr.len;
-       body = msg->u.reply.body;
-
-       kfree(msg);
-
-       return body;
-}
-
-void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg)
-{
-       void *ret;
-       struct xsd_sockmsg req_msg = *msg;
-       int err;
-
-       if (req_msg.type == XS_TRANSACTION_START)
-               down_read(&xs_state.transaction_mutex);
-
-       mutex_lock(&xs_state.request_mutex);
-
-       err = xb_write(msg, sizeof(*msg) + msg->len);
-       if (err) {
-               msg->type = XS_ERROR;
-               ret = ERR_PTR(err);
-       } else
-               ret = read_reply(&msg->type, &msg->len);
-
-       mutex_unlock(&xs_state.request_mutex);
-
-       if ((req_msg.type == XS_TRANSACTION_END) ||
-           ((req_msg.type == XS_TRANSACTION_START) &&
-            (msg->type == XS_ERROR)))
-               up_read(&xs_state.transaction_mutex);
-
-       return ret;
-}
-
-/* Send message to xs, get kmalloc'ed reply.  ERR_PTR() on error. */
-static void *xs_talkv(struct xenbus_transaction t,
-                     enum xsd_sockmsg_type type,
-                     const struct kvec *iovec,
-                     unsigned int num_vecs,
-                     unsigned int *len)
-{
-       struct xsd_sockmsg msg;
-       void *ret = NULL;
-       unsigned int i;
-       int err;
-
-       msg.tx_id = t.id;
-       msg.req_id = 0;
-       msg.type = type;
-       msg.len = 0;
-       for (i = 0; i < num_vecs; i++)
-               msg.len += iovec[i].iov_len;
-
-       mutex_lock(&xs_state.request_mutex);
-
-       err = xb_write(&msg, sizeof(msg));
-       if (err) {
-               mutex_unlock(&xs_state.request_mutex);
-               return ERR_PTR(err);
-       }
-
-       for (i = 0; i < num_vecs; i++) {
-               err = xb_write(iovec[i].iov_base, iovec[i].iov_len);;
-               if (err) {
-                       mutex_unlock(&xs_state.request_mutex);
-                       return ERR_PTR(err);
-               }
-       }
-
-       ret = read_reply(&msg.type, len);
-
-       mutex_unlock(&xs_state.request_mutex);
-
-       if (IS_ERR(ret))
-               return ret;
-
-       if (msg.type == XS_ERROR) {
-               err = get_error(ret);
-               kfree(ret);
-               return ERR_PTR(-err);
-       }
-
-       if (msg.type != type) {
-               if (printk_ratelimit())
-                       printk(KERN_WARNING
-                              "XENBUS unexpected type [%d], expected [%d]\n",
-                              msg.type, type);
-               kfree(ret);
-               return ERR_PTR(-EINVAL);
-       }
-       return ret;
-}
-
-/* Simplified version of xs_talkv: single message. */
-static void *xs_single(struct xenbus_transaction t,
-                      enum xsd_sockmsg_type type,
-                      const char *string,
-                      unsigned int *len)
-{
-       struct kvec iovec;
-
-       iovec.iov_base = (void *)string;
-       iovec.iov_len = strlen(string) + 1;
-       return xs_talkv(t, type, &iovec, 1, len);
-}
-
-/* Many commands only need an ack, don't care what it says. */
-static int xs_error(char *reply)
-{
-       if (IS_ERR(reply))
-               return PTR_ERR(reply);
-       kfree(reply);
-       return 0;
-}
-
-static unsigned int count_strings(const char *strings, unsigned int len)
-{
-       unsigned int num;
-       const char *p;
-
-       for (p = strings, num = 0; p < strings + len; p += strlen(p) + 1)
-               num++;
-
-       return num;
-}
-
-/* Return the path to dir with /name appended. Buffer must be kfree()'ed. */
-static char *join(const char *dir, const char *name)
-{
-       char *buffer;
-
-       if (strlen(name) == 0)
-               buffer = kasprintf(GFP_KERNEL, "%s", dir);
-       else
-               buffer = kasprintf(GFP_KERNEL, "%s/%s", dir, name);
-       return (!buffer) ? ERR_PTR(-ENOMEM) : buffer;
-}
-
-static char **split(char *strings, unsigned int len, unsigned int *num)
-{
-       char *p, **ret;
-
-       /* Count the strings. */
-       *num = count_strings(strings, len);
-
-       /* Transfer to one big alloc for easy freeing. */
-       ret = kmalloc(*num * sizeof(char *) + len, GFP_KERNEL);
-       if (!ret) {
-               kfree(strings);
-               return ERR_PTR(-ENOMEM);
-       }
-       memcpy(&ret[*num], strings, len);
-       kfree(strings);
-
-       strings = (char *)&ret[*num];
-       for (p = strings, *num = 0; p < strings + len; p += strlen(p) + 1)
-               ret[(*num)++] = p;
-
-       return ret;
-}
-
-char **xenbus_directory(struct xenbus_transaction t,
-                       const char *dir, const char *node, unsigned int *num)
-{
-       char *strings, *path;
-       unsigned int len;
-
-       path = join(dir, node);
-       if (IS_ERR(path))
-               return (char **)path;
-
-       strings = xs_single(t, XS_DIRECTORY, path, &len);
-       kfree(path);
-       if (IS_ERR(strings))
-               return (char **)strings;
-
-       return split(strings, len, num);
-}
-EXPORT_SYMBOL_GPL(xenbus_directory);
-
-/* Check if a path exists. Return 1 if it does. */
-int xenbus_exists(struct xenbus_transaction t,
-                 const char *dir, const char *node)
-{
-       char **d;
-       int dir_n;
-
-       d = xenbus_directory(t, dir, node, &dir_n);
-       if (IS_ERR(d))
-               return 0;
-       kfree(d);
-       return 1;
-}
-EXPORT_SYMBOL_GPL(xenbus_exists);
-
-/* Get the value of a single file.
- * Returns a kmalloced value: call free() on it after use.
- * len indicates length in bytes.
- */
-void *xenbus_read(struct xenbus_transaction t,
-                 const char *dir, const char *node, unsigned int *len)
-{
-       char *path;
-       void *ret;
-
-       path = join(dir, node);
-       if (IS_ERR(path))
-               return (void *)path;
-
-       ret = xs_single(t, XS_READ, path, len);
-       kfree(path);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_read);
-
-/* Write the value of a single file.
- * Returns -err on failure.
- */
-int xenbus_write(struct xenbus_transaction t,
-                const char *dir, const char *node, const char *string)
-{
-       const char *path;
-       struct kvec iovec[2];
-       int ret;
-
-       path = join(dir, node);
-       if (IS_ERR(path))
-               return PTR_ERR(path);
-
-       iovec[0].iov_base = (void *)path;
-       iovec[0].iov_len = strlen(path) + 1;
-       iovec[1].iov_base = (void *)string;
-       iovec[1].iov_len = strlen(string);
-
-       ret = xs_error(xs_talkv(t, XS_WRITE, iovec, ARRAY_SIZE(iovec), NULL));
-       kfree(path);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_write);
-
-/* Create a new directory. */
-int xenbus_mkdir(struct xenbus_transaction t,
-                const char *dir, const char *node)
-{
-       char *path;
-       int ret;
-
-       path = join(dir, node);
-       if (IS_ERR(path))
-               return PTR_ERR(path);
-
-       ret = xs_error(xs_single(t, XS_MKDIR, path, NULL));
-       kfree(path);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_mkdir);
-
-/* Destroy a file or directory (directories must be empty). */
-int xenbus_rm(struct xenbus_transaction t, const char *dir, const char *node)
-{
-       char *path;
-       int ret;
-
-       path = join(dir, node);
-       if (IS_ERR(path))
-               return PTR_ERR(path);
-
-       ret = xs_error(xs_single(t, XS_RM, path, NULL));
-       kfree(path);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_rm);
-
-/* Start a transaction: changes by others will not be seen during this
- * transaction, and changes will not be visible to others until end.
- */
-int xenbus_transaction_start(struct xenbus_transaction *t)
-{
-       char *id_str;
-
-       down_read(&xs_state.transaction_mutex);
-
-       id_str = xs_single(XBT_NIL, XS_TRANSACTION_START, "", NULL);
-       if (IS_ERR(id_str)) {
-               up_read(&xs_state.transaction_mutex);
-               return PTR_ERR(id_str);
-       }
-
-       t->id = simple_strtoul(id_str, NULL, 0);
-       kfree(id_str);
-       return 0;
-}
-EXPORT_SYMBOL_GPL(xenbus_transaction_start);
-
-/* End a transaction.
- * If abandon is true, transaction is discarded instead of committed.
- */
-int xenbus_transaction_end(struct xenbus_transaction t, int abort)
-{
-       char abortstr[2];
-       int err;
-
-       if (abort)
-               strcpy(abortstr, "F");
-       else
-               strcpy(abortstr, "T");
-
-       err = xs_error(xs_single(t, XS_TRANSACTION_END, abortstr, NULL));
-
-       up_read(&xs_state.transaction_mutex);
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_transaction_end);
-
-/* Single read and scanf: returns -errno or num scanned. */
-int xenbus_scanf(struct xenbus_transaction t,
-                const char *dir, const char *node, const char *fmt, ...)
-{
-       va_list ap;
-       int ret;
-       char *val;
-
-       val = xenbus_read(t, dir, node, NULL);
-       if (IS_ERR(val))
-               return PTR_ERR(val);
-
-       va_start(ap, fmt);
-       ret = vsscanf(val, fmt, ap);
-       va_end(ap);
-       kfree(val);
-       /* Distinctive errno. */
-       if (ret == 0)
-               return -ERANGE;
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_scanf);
-
-/* Single printf and write: returns -errno or 0. */
-int xenbus_printf(struct xenbus_transaction t,
-                 const char *dir, const char *node, const char *fmt, ...)
-{
-       va_list ap;
-       int ret;
-#define PRINTF_BUFFER_SIZE 4096
-       char *printf_buffer;
-
-       printf_buffer = kmalloc(PRINTF_BUFFER_SIZE, GFP_KERNEL);
-       if (printf_buffer == NULL)
-               return -ENOMEM;
-
-       va_start(ap, fmt);
-       ret = vsnprintf(printf_buffer, PRINTF_BUFFER_SIZE, fmt, ap);
-       va_end(ap);
-
-       BUG_ON(ret > PRINTF_BUFFER_SIZE-1);
-       ret = xenbus_write(t, dir, node, printf_buffer);
-
-       kfree(printf_buffer);
-
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_printf);
-
-/* Takes tuples of names, scanf-style args, and void **, NULL terminated. */
-int xenbus_gather(struct xenbus_transaction t, const char *dir, ...)
-{
-       va_list ap;
-       const char *name;
-       int ret = 0;
-
-       va_start(ap, dir);
-       while (ret == 0 && (name = va_arg(ap, char *)) != NULL) {
-               const char *fmt = va_arg(ap, char *);
-               void *result = va_arg(ap, void *);
-               char *p;
-
-               p = xenbus_read(t, dir, name, NULL);
-               if (IS_ERR(p)) {
-                       ret = PTR_ERR(p);
-                       break;
-               }
-               if (fmt) {
-                       if (sscanf(p, fmt, result) == 0)
-                               ret = -EINVAL;
-                       kfree(p);
-               } else
-                       *(char **)result = p;
-       }
-       va_end(ap);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(xenbus_gather);
-
-static int xs_watch(const char *path, const char *token)
-{
-       struct kvec iov[2];
-
-       iov[0].iov_base = (void *)path;
-       iov[0].iov_len = strlen(path) + 1;
-       iov[1].iov_base = (void *)token;
-       iov[1].iov_len = strlen(token) + 1;
-
-       return xs_error(xs_talkv(XBT_NIL, XS_WATCH, iov,
-                                ARRAY_SIZE(iov), NULL));
-}
-
-static int xs_unwatch(const char *path, const char *token)
-{
-       struct kvec iov[2];
-
-       iov[0].iov_base = (char *)path;
-       iov[0].iov_len = strlen(path) + 1;
-       iov[1].iov_base = (char *)token;
-       iov[1].iov_len = strlen(token) + 1;
-
-       return xs_error(xs_talkv(XBT_NIL, XS_UNWATCH, iov,
-                                ARRAY_SIZE(iov), NULL));
-}
-
-static struct xenbus_watch *find_watch(const char *token)
-{
-       struct xenbus_watch *i, *cmp;
-
-       cmp = (void *)simple_strtoul(token, NULL, 16);
-
-       list_for_each_entry(i, &watches, list)
-               if (i == cmp)
-                       return i;
-
-       return NULL;
-}
-
-/* Register callback to watch this node. */
-int register_xenbus_watch(struct xenbus_watch *watch)
-{
-       /* Pointer in ascii is the token. */
-       char token[sizeof(watch) * 2 + 1];
-       int err;
-
-       sprintf(token, "%lX", (long)watch);
-
-       down_read(&xs_state.watch_mutex);
-
-       spin_lock(&watches_lock);
-       BUG_ON(find_watch(token));
-       list_add(&watch->list, &watches);
-       spin_unlock(&watches_lock);
-
-       err = xs_watch(watch->node, token);
-
-       /* Ignore errors due to multiple registration. */
-       if ((err != 0) && (err != -EEXIST)) {
-               spin_lock(&watches_lock);
-               list_del(&watch->list);
-               spin_unlock(&watches_lock);
-       }
-
-       up_read(&xs_state.watch_mutex);
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(register_xenbus_watch);
-
-void unregister_xenbus_watch(struct xenbus_watch *watch)
-{
-       struct xs_stored_msg *msg, *tmp;
-       char token[sizeof(watch) * 2 + 1];
-       int err;
-
-       sprintf(token, "%lX", (long)watch);
-
-       down_read(&xs_state.watch_mutex);
-
-       spin_lock(&watches_lock);
-       BUG_ON(!find_watch(token));
-       list_del(&watch->list);
-       spin_unlock(&watches_lock);
-
-       err = xs_unwatch(watch->node, token);
-       if (err)
-               printk(KERN_WARNING
-                      "XENBUS Failed to release watch %s: %i\n",
-                      watch->node, err);
-
-       up_read(&xs_state.watch_mutex);
-
-       /* Cancel pending watch events. */
-       spin_lock(&watch_events_lock);
-       list_for_each_entry_safe(msg, tmp, &watch_events, list) {
-               if (msg->u.watch.handle != watch)
-                       continue;
-               list_del(&msg->list);
-               kfree(msg->u.watch.vec);
-               kfree(msg);
-       }
-       spin_unlock(&watch_events_lock);
-
-       /* Flush any currently-executing callback, unless we are it. :-) */
-       if (current->pid != xenwatch_pid) {
-               mutex_lock(&xenwatch_mutex);
-               mutex_unlock(&xenwatch_mutex);
-       }
-}
-EXPORT_SYMBOL_GPL(unregister_xenbus_watch);
-
-void xs_suspend(void)
-{
-       down_write(&xs_state.transaction_mutex);
-       down_write(&xs_state.watch_mutex);
-       mutex_lock(&xs_state.request_mutex);
-       mutex_lock(&xs_state.response_mutex);
-}
-
-void xs_resume(void)
-{
-       struct xenbus_watch *watch;
-       char token[sizeof(watch) * 2 + 1];
-
-       mutex_unlock(&xs_state.response_mutex);
-       mutex_unlock(&xs_state.request_mutex);
-       up_write(&xs_state.transaction_mutex);
-
-       /* No need for watches_lock: the watch_mutex is sufficient. */
-       list_for_each_entry(watch, &watches, list) {
-               sprintf(token, "%lX", (long)watch);
-               xs_watch(watch->node, token);
-       }
-
-       up_write(&xs_state.watch_mutex);
-}
-
-void xs_suspend_cancel(void)
-{
-       mutex_unlock(&xs_state.response_mutex);
-       mutex_unlock(&xs_state.request_mutex);
-       up_write(&xs_state.watch_mutex);
-       up_write(&xs_state.transaction_mutex);
-}
-
-static int xenwatch_handle_callback(void *data)
-{
-       struct xs_stored_msg *msg = data;
-
-       msg->u.watch.handle->callback(msg->u.watch.handle,
-                                     (const char **)msg->u.watch.vec,
-                                     msg->u.watch.vec_size);
-
-       kfree(msg->u.watch.vec);
-       kfree(msg);
-
-       /* Kill this kthread if we were spawned just for this callback. */
-       if (current->pid != xenwatch_pid)
-               do_exit(0);
-
-       return 0;
-}
-
-static int xenwatch_thread(void *unused)
-{
-       struct list_head *ent;
-       struct xs_stored_msg *msg;
-
-       for (;;) {
-               wait_event_interruptible(watch_events_waitq,
-                                        !list_empty(&watch_events));
-
-               if (kthread_should_stop())
-                       break;
-
-               mutex_lock(&xenwatch_mutex);
-
-               spin_lock(&watch_events_lock);
-               ent = watch_events.next;
-               if (ent != &watch_events)
-                       list_del(ent);
-               spin_unlock(&watch_events_lock);
-
-               if (ent != &watch_events) {
-                       msg = list_entry(ent, struct xs_stored_msg, list);
-                       if (msg->u.watch.handle->flags & XBWF_new_thread)
-                               kthread_run(xenwatch_handle_callback,
-                                           msg, "xenwatch_cb");
-                       else
-                               xenwatch_handle_callback(msg);
-               }
-
-               mutex_unlock(&xenwatch_mutex);
-       }
-
-       return 0;
-}
-
-static int process_msg(void)
-{
-       struct xs_stored_msg *msg;
-       char *body;
-       int err;
-
-       /*
-        * We must disallow save/restore while reading a xenstore message.
-        * A partial read across s/r leaves us out of sync with xenstored.
-        */
-       for (;;) {
-               err = xb_wait_for_data_to_read();
-               if (err)
-                       return err;
-               mutex_lock(&xs_state.response_mutex);
-               if (xb_data_to_read())
-                       break;
-               /* We raced with save/restore: pending data 'disappeared'. */
-               mutex_unlock(&xs_state.response_mutex);
-       }
-
-
-       msg = kmalloc(sizeof(*msg), GFP_KERNEL);
-       if (msg == NULL) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       err = xb_read(&msg->hdr, sizeof(msg->hdr));
-       if (err) {
-               kfree(msg);
-               goto out;
-       }
-
-       body = kmalloc(msg->hdr.len + 1, GFP_KERNEL);
-       if (body == NULL) {
-               kfree(msg);
-               err = -ENOMEM;
-               goto out;
-       }
-
-       err = xb_read(body, msg->hdr.len);
-       if (err) {
-               kfree(body);
-               kfree(msg);
-               goto out;
-       }
-       body[msg->hdr.len] = '\0';
-
-       if (msg->hdr.type == XS_WATCH_EVENT) {
-               msg->u.watch.vec = split(body, msg->hdr.len,
-                                        &msg->u.watch.vec_size);
-               if (IS_ERR(msg->u.watch.vec)) {
-                       kfree(msg);
-                       err = PTR_ERR(msg->u.watch.vec);
-                       goto out;
-               }
-
-               spin_lock(&watches_lock);
-               msg->u.watch.handle = find_watch(
-                       msg->u.watch.vec[XS_WATCH_TOKEN]);
-               if (msg->u.watch.handle != NULL) {
-                       spin_lock(&watch_events_lock);
-                       list_add_tail(&msg->list, &watch_events);
-                       wake_up(&watch_events_waitq);
-                       spin_unlock(&watch_events_lock);
-               } else {
-                       kfree(msg->u.watch.vec);
-                       kfree(msg);
-               }
-               spin_unlock(&watches_lock);
-       } else {
-               msg->u.reply.body = body;
-               spin_lock(&xs_state.reply_lock);
-               list_add_tail(&msg->list, &xs_state.reply_list);
-               spin_unlock(&xs_state.reply_lock);
-               wake_up(&xs_state.reply_waitq);
-       }
-
- out:
-       mutex_unlock(&xs_state.response_mutex);
-       return err;
-}
-
-static int xenbus_thread(void *unused)
-{
-       int err;
-
-       for (;;) {
-               err = process_msg();
-               if (err)
-                       printk(KERN_WARNING "XENBUS error %d while reading "
-                              "message\n", err);
-               if (kthread_should_stop())
-                       break;
-       }
-
-       return 0;
-}
-
-int xs_init(void)
-{
-       int err;
-       struct task_struct *task;
-
-       INIT_LIST_HEAD(&xs_state.reply_list);
-       spin_lock_init(&xs_state.reply_lock);
-       init_waitqueue_head(&xs_state.reply_waitq);
-
-       mutex_init(&xs_state.request_mutex);
-       mutex_init(&xs_state.response_mutex);
-       init_rwsem(&xs_state.transaction_mutex);
-       init_rwsem(&xs_state.watch_mutex);
-
-       /* Initialize the shared memory rings to talk to xenstored */
-       err = xb_init_comms();
-       if (err)
-               return err;
-
-       task = kthread_run(xenwatch_thread, NULL, "xenwatch");
-       if (IS_ERR(task))
-               return PTR_ERR(task);
-       xenwatch_pid = task->pid;
-
-       task = kthread_run(xenbus_thread, NULL, "xenbus");
-       if (IS_ERR(task))
-               return PTR_ERR(task);
-
-       return 0;
-}
diff --git a/linux-2.6-xen-sparse/drivers/xen/xenoprof/xenoprofile.c b/linux-2.6-xen-sparse/drivers/xen/xenoprof/xenoprofile.c
deleted file mode 100644 (file)
index 382a50f..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-/**
- * @file xenoprofile.c
- *
- * @remark Copyright 2002 OProfile authors
- * @remark Read the file COPYING
- *
- * @author John Levon <levon@movementarian.org>
- *
- * Modified by Aravind Menon and Jose Renato Santos for Xen
- * These modifications are:
- * Copyright (C) 2005 Hewlett-Packard Co.
- *
- * Separated out arch-generic part
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- */
-
-#include <linux/init.h>
-#include <linux/notifier.h>
-#include <linux/smp.h>
-#include <linux/oprofile.h>
-#include <linux/sysdev.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/vmalloc.h>
-#include <asm/pgtable.h>
-#include <xen/evtchn.h>
-#include <xen/xenoprof.h>
-#include <xen/driver_util.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/xenoprof.h>
-#include "../../../drivers/oprofile/cpu_buffer.h"
-#include "../../../drivers/oprofile/event_buffer.h"
-
-#define MAX_XENOPROF_SAMPLES 16
-
-/* sample buffers shared with Xen */
-xenoprof_buf_t * xenoprof_buf[MAX_VIRT_CPUS];
-/* Shared buffer area */
-struct xenoprof_shared_buffer shared_buffer;
-
-/* Passive sample buffers shared with Xen */
-xenoprof_buf_t *p_xenoprof_buf[MAX_OPROF_DOMAINS][MAX_VIRT_CPUS];
-/* Passive shared buffer area */
-struct xenoprof_shared_buffer p_shared_buffer[MAX_OPROF_DOMAINS];
-
-static int xenoprof_start(void);
-static void xenoprof_stop(void);
-
-static int xenoprof_enabled = 0;
-static int xenoprof_is_primary = 0;
-static int active_defined;
-
-/* Number of buffers in shared area (one per VCPU) */
-int nbuf;
-/* Mappings of VIRQ_XENOPROF to irq number (per cpu) */
-int ovf_irq[NR_CPUS];
-/* cpu model type string - copied from Xen memory space on XENOPROF_init command */
-char cpu_type[XENOPROF_CPU_TYPE_SIZE];
-
-#ifdef CONFIG_PM
-
-static int xenoprof_suspend(struct sys_device * dev, pm_message_t state)
-{
-       if (xenoprof_enabled == 1)
-               xenoprof_stop();
-       return 0;
-}
-
-
-static int xenoprof_resume(struct sys_device * dev)
-{
-       if (xenoprof_enabled == 1)
-               xenoprof_start();
-       return 0;
-}
-
-
-static struct sysdev_class oprofile_sysclass = {
-       set_kset_name("oprofile"),
-       .resume         = xenoprof_resume,
-       .suspend        = xenoprof_suspend
-};
-
-
-static struct sys_device device_oprofile = {
-       .id     = 0,
-       .cls    = &oprofile_sysclass,
-};
-
-
-static int __init init_driverfs(void)
-{
-       int error;
-       if (!(error = sysdev_class_register(&oprofile_sysclass)))
-               error = sysdev_register(&device_oprofile);
-       return error;
-}
-
-
-static void exit_driverfs(void)
-{
-       sysdev_unregister(&device_oprofile);
-       sysdev_class_unregister(&oprofile_sysclass);
-}
-
-#else
-#define init_driverfs() do { } while (0)
-#define exit_driverfs() do { } while (0)
-#endif /* CONFIG_PM */
-
-unsigned long long oprofile_samples = 0;
-unsigned long long p_oprofile_samples = 0;
-
-unsigned int pdomains;
-struct xenoprof_passive passive_domains[MAX_OPROF_DOMAINS];
-
-static void xenoprof_add_pc(xenoprof_buf_t *buf, int is_passive)
-{
-       int head, tail, size;
-
-       head = buf->event_head;
-       tail = buf->event_tail;
-       size = buf->event_size;
-
-       if (tail > head) {
-               while (tail < size) {
-                       oprofile_add_pc(buf->event_log[tail].eip,
-                                       buf->event_log[tail].mode,
-                                       buf->event_log[tail].event);
-                       if (!is_passive)
-                               oprofile_samples++;
-                       else
-                               p_oprofile_samples++;
-                       tail++;
-               }
-               tail = 0;
-       }
-       while (tail < head) {
-               oprofile_add_pc(buf->event_log[tail].eip,
-                               buf->event_log[tail].mode,
-                               buf->event_log[tail].event);
-               if (!is_passive)
-                       oprofile_samples++;
-               else
-                       p_oprofile_samples++;
-               tail++;
-       }
-
-       buf->event_tail = tail;
-}
-
-static void xenoprof_handle_passive(void)
-{
-       int i, j;
-       int flag_domain, flag_switch = 0;
-       
-       for (i = 0; i < pdomains; i++) {
-               flag_domain = 0;
-               for (j = 0; j < passive_domains[i].nbuf; j++) {
-                       xenoprof_buf_t *buf = p_xenoprof_buf[i][j];
-                       if (buf->event_head == buf->event_tail)
-                               continue;
-                       if (!flag_domain) {
-                               if (!oprofile_add_domain_switch(passive_domains[i].
-                                                               domain_id))
-                                       goto done;
-                               flag_domain = 1;
-                       }
-                       xenoprof_add_pc(buf, 1);
-                       flag_switch = 1;
-               }
-       }
-done:
-       if (flag_switch)
-               oprofile_add_domain_switch(COORDINATOR_DOMAIN);
-}
-
-static irqreturn_t 
-xenoprof_ovf_interrupt(int irq, void * dev_id, struct pt_regs * regs)
-{
-       struct xenoprof_buf * buf;
-       int cpu;
-       static unsigned long flag;
-
-       cpu = smp_processor_id();
-       buf = xenoprof_buf[cpu];
-
-       xenoprof_add_pc(buf, 0);
-
-       if (xenoprof_is_primary && !test_and_set_bit(0, &flag)) {
-               xenoprof_handle_passive();
-               smp_mb__before_clear_bit();
-               clear_bit(0, &flag);
-       }
-
-       return IRQ_HANDLED;
-}
-
-
-static void unbind_virq(void)
-{
-       int i;
-
-       for_each_online_cpu(i) {
-               if (ovf_irq[i] >= 0) {
-                       unbind_from_irqhandler(ovf_irq[i], NULL);
-                       ovf_irq[i] = -1;
-               }
-       }
-}
-
-
-static int bind_virq(void)
-{
-       int i, result;
-
-       for_each_online_cpu(i) {
-               result = bind_virq_to_irqhandler(VIRQ_XENOPROF,
-                                                i,
-                                                xenoprof_ovf_interrupt,
-                                                SA_INTERRUPT,
-                                                "xenoprof",
-                                                NULL);
-
-               if (result < 0) {
-                       unbind_virq();
-                       return result;
-               }
-
-               ovf_irq[i] = result;
-       }
-               
-       return 0;
-}
-
-
-static void unmap_passive_list(void)
-{
-       int i;
-       for (i = 0; i < pdomains; i++)
-               xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
-       pdomains = 0;
-}
-
-
-static int map_xenoprof_buffer(int max_samples)
-{
-       struct xenoprof_get_buffer get_buffer;
-       struct xenoprof_buf *buf;
-       int ret, i;
-
-       if ( shared_buffer.buffer )
-               return 0;
-
-       get_buffer.max_samples = max_samples;
-       ret = xenoprof_arch_map_shared_buffer(&get_buffer, &shared_buffer);
-       if (ret)
-               return ret;
-       nbuf = get_buffer.nbuf;
-
-       for (i=0; i< nbuf; i++) {
-               buf = (struct xenoprof_buf*) 
-                       &shared_buffer.buffer[i * get_buffer.bufsize];
-               BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
-               xenoprof_buf[buf->vcpu_id] = buf;
-       }
-
-       return 0;
-}
-
-
-static int xenoprof_setup(void)
-{
-       int ret;
-
-       if ( (ret = map_xenoprof_buffer(MAX_XENOPROF_SAMPLES)) )
-               return ret;
-
-       if ( (ret = bind_virq()) )
-               return ret;
-
-       if (xenoprof_is_primary) {
-               /* Define dom0 as an active domain if not done yet */
-               if (!active_defined) {
-                       domid_t domid;
-                       ret = HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
-                       if (ret)
-                               goto err;
-                       domid = 0;
-                       ret = HYPERVISOR_xenoprof_op(XENOPROF_set_active, &domid);
-                       if (ret)
-                               goto err;
-                       active_defined = 1;
-               }
-
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_reserve_counters, NULL);
-               if (ret)
-                       goto err;
-               xenoprof_arch_counter();
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_setup_events, NULL);
-
-               if (ret)
-                       goto err;
-       }
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_enable_virq, NULL);
-       if (ret)
-               goto err;
-
-       xenoprof_enabled = 1;
-       return 0;
- err:
-       unbind_virq();
-       return ret;
-}
-
-
-static void xenoprof_shutdown(void)
-{
-       xenoprof_enabled = 0;
-
-       HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL);
-
-       if (xenoprof_is_primary) {
-               HYPERVISOR_xenoprof_op(XENOPROF_release_counters, NULL);
-               active_defined = 0;
-       }
-
-       unbind_virq();
-
-       xenoprof_arch_unmap_shared_buffer(&shared_buffer);
-       if (xenoprof_is_primary)
-               unmap_passive_list();
-}
-
-
-static int xenoprof_start(void)
-{
-       int ret = 0;
-
-       if (xenoprof_is_primary)
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_start, NULL);
-       if (!ret)
-               xenoprof_arch_start();
-       return ret;
-}
-
-
-static void xenoprof_stop(void)
-{
-       if (xenoprof_is_primary)
-               HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL);
-       xenoprof_arch_stop();
-}
-
-
-static int xenoprof_set_active(int * active_domains,
-                              unsigned int adomains)
-{
-       int ret = 0;
-       int i;
-       int set_dom0 = 0;
-       domid_t domid;
-
-       if (!xenoprof_is_primary)
-               return 0;
-
-       if (adomains > MAX_OPROF_DOMAINS)
-               return -E2BIG;
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
-       if (ret)
-               return ret;
-
-       for (i=0; i<adomains; i++) {
-               domid = active_domains[i];
-               if (domid != active_domains[i]) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_set_active, &domid);
-               if (ret)
-                       goto out;
-               if (active_domains[i] == 0)
-                       set_dom0 = 1;
-       }
-       /* dom0 must always be active but may not be in the list */ 
-       if (!set_dom0) {
-               domid = 0;
-               ret = HYPERVISOR_xenoprof_op(XENOPROF_set_active, &domid);
-       }
-
-out:
-       if (ret)
-               HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
-       active_defined = !ret;
-       return ret;
-}
-
-static int xenoprof_set_passive(int * p_domains,
-                                unsigned int pdoms)
-{
-       int ret;
-       int i, j;
-       struct xenoprof_buf *buf;
-
-       if (!xenoprof_is_primary)
-               return 0;
-
-       if (pdoms > MAX_OPROF_DOMAINS)
-               return -E2BIG;
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_reset_passive_list, NULL);
-       if (ret)
-               return ret;
-       unmap_passive_list();
-
-       for (i = 0; i < pdoms; i++) {
-               passive_domains[i].domain_id = p_domains[i];
-               passive_domains[i].max_samples = 2048;
-               ret = xenoprof_arch_set_passive(&passive_domains[i],
-                                               &p_shared_buffer[i]);
-               if (ret)
-                       goto out;
-               for (j = 0; j < passive_domains[i].nbuf; j++) {
-                       buf = (struct xenoprof_buf *)
-                               &p_shared_buffer[i].buffer[j * passive_domains[i].bufsize];
-                       BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
-                       p_xenoprof_buf[i][buf->vcpu_id] = buf;
-               }
-       }
-
-       pdomains = pdoms;
-       return 0;
-
-out:
-       for (j = 0; j < i; j++)
-               xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
-
-       return ret;
-}
-
-struct oprofile_operations xenoprof_ops = {
-#ifdef HAVE_XENOPROF_CREATE_FILES
-       .create_files   = xenoprof_create_files,
-#endif
-       .set_active     = xenoprof_set_active,
-       .set_passive    = xenoprof_set_passive,
-       .setup          = xenoprof_setup,
-       .shutdown       = xenoprof_shutdown,
-       .start          = xenoprof_start,
-       .stop           = xenoprof_stop
-};
-
-
-/* in order to get driverfs right */
-static int using_xenoprof;
-
-int __init xenoprofile_init(struct oprofile_operations * ops)
-{
-       struct xenoprof_init init;
-       int ret, i;
-
-       ret = HYPERVISOR_xenoprof_op(XENOPROF_init, &init);
-       if (!ret) {
-               xenoprof_arch_init_counter(&init);
-               xenoprof_is_primary = init.is_primary;
-
-               /*  cpu_type is detected by Xen */
-               cpu_type[XENOPROF_CPU_TYPE_SIZE-1] = 0;
-               strncpy(cpu_type, init.cpu_type, XENOPROF_CPU_TYPE_SIZE - 1);
-               xenoprof_ops.cpu_type = cpu_type;
-
-               init_driverfs();
-               using_xenoprof = 1;
-               *ops = xenoprof_ops;
-
-               for (i=0; i<NR_CPUS; i++)
-                       ovf_irq[i] = -1;
-
-               active_defined = 0;
-       }
-       printk(KERN_INFO "%s: ret %d, events %d, xenoprof_is_primary %d\n",
-              __func__, ret, init.num_events, xenoprof_is_primary);
-       return ret;
-}
-
-
-void xenoprofile_exit(void)
-{
-       if (using_xenoprof)
-               exit_driverfs();
-
-       xenoprof_arch_unmap_shared_buffer(&shared_buffer);
-       if (xenoprof_is_primary) {
-               unmap_passive_list();
-               HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL);
-        }
-}
diff --git a/linux-2.6-xen-sparse/fs/Kconfig b/linux-2.6-xen-sparse/fs/Kconfig
deleted file mode 100644 (file)
index c1fb758..0000000
+++ /dev/null
@@ -1,1936 +0,0 @@
-#
-# File system configuration
-#
-
-menu "File systems"
-
-config EXT2_FS
-       tristate "Second extended fs support"
-       help
-         Ext2 is a standard Linux file system for hard disks.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called ext2.  Be aware however that the file system
-         of your root partition (the one containing the directory /) cannot
-         be compiled as a module, and so this could be dangerous.
-
-         If unsure, say Y.
-
-config EXT2_FS_XATTR
-       bool "Ext2 extended attributes"
-       depends on EXT2_FS
-       help
-         Extended attributes are name:value pairs associated with inodes by
-         the kernel or by users (see the attr(5) manual page, or visit
-         <http://acl.bestbits.at/> for details).
-
-         If unsure, say N.
-
-config EXT2_FS_POSIX_ACL
-       bool "Ext2 POSIX Access Control Lists"
-       depends on EXT2_FS_XATTR
-       select FS_POSIX_ACL
-       help
-         Posix Access Control Lists (ACLs) support permissions for users and
-         groups beyond the owner/group/world scheme.
-
-         To learn more about Access Control Lists, visit the Posix ACLs for
-         Linux website <http://acl.bestbits.at/>.
-
-         If you don't know what Access Control Lists are, say N
-
-config EXT2_FS_SECURITY
-       bool "Ext2 Security Labels"
-       depends on EXT2_FS_XATTR
-       help
-         Security labels support alternative access control models
-         implemented by security modules like SELinux.  This option
-         enables an extended attribute handler for file security
-         labels in the ext2 filesystem.
-
-         If you are not using a security module that requires using
-         extended attributes for file security labels, say N.
-
-config EXT2_FS_XIP
-       bool "Ext2 execute in place support"
-       depends on EXT2_FS && MMU
-       help
-         Execute in place can be used on memory-backed block devices. If you
-         enable this option, you can select to mount block devices which are
-         capable of this feature without using the page cache.
-
-         If you do not use a block device that is capable of using this,
-         or if unsure, say N.
-
-config FS_XIP
-# execute in place
-       bool
-       depends on EXT2_FS_XIP
-       default y
-
-config EXT3_FS
-       tristate "Ext3 journalling file system support"
-       select JBD
-       help
-         This is the journaling version of the Second extended file system
-         (often called ext3), the de facto standard Linux file system
-         (method to organize files on a storage device) for hard disks.
-
-         The journaling code included in this driver means you do not have
-         to run e2fsck (file system checker) on your file systems after a
-         crash.  The journal keeps track of any changes that were being made
-         at the time the system crashed, and can ensure that your file system
-         is consistent without the need for a lengthy check.
-
-         Other than adding the journal to the file system, the on-disk format
-         of ext3 is identical to ext2.  It is possible to freely switch
-         between using the ext3 driver and the ext2 driver, as long as the
-         file system has been cleanly unmounted, or e2fsck is run on the file
-         system.
-
-         To add a journal on an existing ext2 file system or change the
-         behavior of ext3 file systems, you can use the tune2fs utility ("man
-         tune2fs").  To modify attributes of files and directories on ext3
-         file systems, use chattr ("man chattr").  You need to be using
-         e2fsprogs version 1.20 or later in order to create ext3 journals
-         (available at <http://sourceforge.net/projects/e2fsprogs/>).
-
-         To compile this file system support as a module, choose M here: the
-         module will be called ext3.  Be aware however that the file system
-         of your root partition (the one containing the directory /) cannot
-         be compiled as a module, and so this may be dangerous.
-
-config EXT3_FS_XATTR
-       bool "Ext3 extended attributes"
-       depends on EXT3_FS
-       default y
-       help
-         Extended attributes are name:value pairs associated with inodes by
-         the kernel or by users (see the attr(5) manual page, or visit
-         <http://acl.bestbits.at/> for details).
-
-         If unsure, say N.
-
-         You need this for POSIX ACL support on ext3.
-
-config EXT3_FS_POSIX_ACL
-       bool "Ext3 POSIX Access Control Lists"
-       depends on EXT3_FS_XATTR
-       select FS_POSIX_ACL
-       help
-         Posix Access Control Lists (ACLs) support permissions for users and
-         groups beyond the owner/group/world scheme.
-
-         To learn more about Access Control Lists, visit the Posix ACLs for
-         Linux website <http://acl.bestbits.at/>.
-
-         If you don't know what Access Control Lists are, say N
-
-config EXT3_FS_SECURITY
-       bool "Ext3 Security Labels"
-       depends on EXT3_FS_XATTR
-       help
-         Security labels support alternative access control models
-         implemented by security modules like SELinux.  This option
-         enables an extended attribute handler for file security
-         labels in the ext3 filesystem.
-
-         If you are not using a security module that requires using
-         extended attributes for file security labels, say N.
-
-config JBD
-       tristate
-       help
-         This is a generic journaling layer for block devices.  It is
-         currently used by the ext3 and OCFS2 file systems, but it could
-         also be used to add journal support to other file systems or block
-         devices such as RAID or LVM.
-
-         If you are using the ext3 or OCFS2 file systems, you need to
-         say Y here. If you are not using ext3 OCFS2 then you will probably
-         want to say N.
-
-         To compile this device as a module, choose M here: the module will be
-         called jbd.  If you are compiling ext3 or OCFS2 into the kernel,
-         you cannot compile this code as a module.
-
-config JBD_DEBUG
-       bool "JBD (ext3) debugging support"
-       depends on JBD
-       help
-         If you are using the ext3 journaled file system (or potentially any
-         other file system/device using JBD), this option allows you to
-         enable debugging output while the system is running, in order to
-         help track down any problems you are having.  By default the
-         debugging output will be turned off.
-
-         If you select Y here, then you will be able to turn on debugging
-         with "echo N > /proc/sys/fs/jbd-debug", where N is a number between
-         1 and 5, the higher the number, the more debugging output is
-         generated.  To turn debugging off again, do
-         "echo 0 > /proc/sys/fs/jbd-debug".
-
-config FS_MBCACHE
-# Meta block cache for Extended Attributes (ext2/ext3)
-       tristate
-       depends on EXT2_FS_XATTR || EXT3_FS_XATTR
-       default y if EXT2_FS=y || EXT3_FS=y
-       default m if EXT2_FS=m || EXT3_FS=m
-
-config REISERFS_FS
-       tristate "Reiserfs support"
-       help
-         Stores not just filenames but the files themselves in a balanced
-         tree.  Uses journaling.
-
-         Balanced trees are more efficient than traditional file system
-         architectural foundations.
-
-         In general, ReiserFS is as fast as ext2, but is very efficient with
-         large directories and small files.  Additional patches are needed
-         for NFS and quotas, please see <http://www.namesys.com/> for links.
-
-         It is more easily extended to have features currently found in
-         database and keyword search systems than block allocation based file
-         systems are.  The next version will be so extended, and will support
-         plugins consistent with our motto ``It takes more than a license to
-         make source code open.''
-
-         Read <http://www.namesys.com/> to learn more about reiserfs.
-
-         Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com.
-
-         If you like it, you can pay us to add new features to it that you
-         need, buy a support contract, or pay us to port it to another OS.
-
-config REISERFS_CHECK
-       bool "Enable reiserfs debug mode"
-       depends on REISERFS_FS
-       help
-         If you set this to Y, then ReiserFS will perform every check it can
-         possibly imagine of its internal consistency throughout its
-         operation.  It will also go substantially slower.  More than once we
-         have forgotten that this was on, and then gone despondent over the
-         latest benchmarks.:-) Use of this option allows our team to go all
-         out in checking for consistency when debugging without fear of its
-         effect on end users.  If you are on the verge of sending in a bug
-         report, say Y and you might get a useful error message.  Almost
-         everyone should say N.
-
-config REISERFS_PROC_INFO
-       bool "Stats in /proc/fs/reiserfs"
-       depends on REISERFS_FS
-       help
-         Create under /proc/fs/reiserfs a hierarchy of files, displaying
-         various ReiserFS statistics and internal data at the expense of
-         making your kernel or module slightly larger (+8 KB). This also
-         increases the amount of kernel memory required for each mount.
-         Almost everyone but ReiserFS developers and people fine-tuning
-         reiserfs or tracing problems should say N.
-
-config REISERFS_FS_XATTR
-       bool "ReiserFS extended attributes"
-       depends on REISERFS_FS
-       help
-         Extended attributes are name:value pairs associated with inodes by
-         the kernel or by users (see the attr(5) manual page, or visit
-         <http://acl.bestbits.at/> for details).
-
-         If unsure, say N.
-
-config REISERFS_FS_POSIX_ACL
-       bool "ReiserFS POSIX Access Control Lists"
-       depends on REISERFS_FS_XATTR
-       select FS_POSIX_ACL
-       help
-         Posix Access Control Lists (ACLs) support permissions for users and
-         groups beyond the owner/group/world scheme.
-
-         To learn more about Access Control Lists, visit the Posix ACLs for
-         Linux website <http://acl.bestbits.at/>.
-
-         If you don't know what Access Control Lists are, say N
-
-config REISERFS_FS_SECURITY
-       bool "ReiserFS Security Labels"
-       depends on REISERFS_FS_XATTR
-       help
-         Security labels support alternative access control models
-         implemented by security modules like SELinux.  This option
-         enables an extended attribute handler for file security
-         labels in the ReiserFS filesystem.
-
-         If you are not using a security module that requires using
-         extended attributes for file security labels, say N.
-
-config JFS_FS
-       tristate "JFS filesystem support"
-       select NLS
-       help
-         This is a port of IBM's Journaled Filesystem .  More information is
-         available in the file <file:Documentation/filesystems/jfs.txt>.
-
-         If you do not intend to use the JFS filesystem, say N.
-
-config JFS_POSIX_ACL
-       bool "JFS POSIX Access Control Lists"
-       depends on JFS_FS
-       select FS_POSIX_ACL
-       help
-         Posix Access Control Lists (ACLs) support permissions for users and
-         groups beyond the owner/group/world scheme.
-
-         To learn more about Access Control Lists, visit the Posix ACLs for
-         Linux website <http://acl.bestbits.at/>.
-
-         If you don't know what Access Control Lists are, say N
-
-config JFS_SECURITY
-       bool "JFS Security Labels"
-       depends on JFS_FS
-       help
-         Security labels support alternative access control models
-         implemented by security modules like SELinux.  This option
-         enables an extended attribute handler for file security
-         labels in the jfs filesystem.
-
-         If you are not using a security module that requires using
-         extended attributes for file security labels, say N.
-
-config JFS_DEBUG
-       bool "JFS debugging"
-       depends on JFS_FS
-       help
-         If you are experiencing any problems with the JFS filesystem, say
-         Y here.  This will result in additional debugging messages to be
-         written to the system log.  Under normal circumstances, this
-         results in very little overhead.
-
-config JFS_STATISTICS
-       bool "JFS statistics"
-       depends on JFS_FS
-       help
-         Enabling this option will cause statistics from the JFS file system
-         to be made available to the user in the /proc/fs/jfs/ directory.
-
-config FS_POSIX_ACL
-# Posix ACL utility routines (for now, only ext2/ext3/jfs/reiserfs)
-#
-# NOTE: you can implement Posix ACLs without these helpers (XFS does).
-#      Never use this symbol for ifdefs.
-#
-       bool
-       default n
-
-source "fs/xfs/Kconfig"
-
-config OCFS2_FS
-       tristate "OCFS2 file system support (EXPERIMENTAL)"
-       depends on NET && SYSFS && EXPERIMENTAL
-       select CONFIGFS_FS
-       select JBD
-       select CRC32
-       select INET
-       help
-         OCFS2 is a general purpose extent based shared disk cluster file
-         system with many similarities to ext3. It supports 64 bit inode
-         numbers, and has automatically extending metadata groups which may
-         also make it attractive for non-clustered use.
-
-         You'll want to install the ocfs2-tools package in order to at least
-         get "mount.ocfs2".
-
-         Project web page:    http://oss.oracle.com/projects/ocfs2
-         Tools web page:      http://oss.oracle.com/projects/ocfs2-tools
-         OCFS2 mailing lists: http://oss.oracle.com/projects/ocfs2/mailman/
-
-         Note: Features which OCFS2 does not support yet:
-                 - extended attributes
-                 - shared writeable mmap
-                 - loopback is supported, but data written will not
-                   be cluster coherent.
-                 - quotas
-                 - cluster aware flock
-                 - Directory change notification (F_NOTIFY)
-                 - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
-                 - POSIX ACLs
-                 - readpages / writepages (not user visible)
-
-config OCFS2_DEBUG_MASKLOG
-       bool "OCFS2 logging support"
-       depends on OCFS2_FS
-       default y
-       help
-         The ocfs2 filesystem has an extensive logging system.  The system
-         allows selection of events to log via files in /sys/o2cb/logmask/.
-         This option will enlarge your kernel, but it allows debugging of
-         ocfs2 filesystem issues.
-
-config MINIX_FS
-       tristate "Minix fs support"
-       help
-         Minix is a simple operating system used in many classes about OS's.
-         The minix file system (method to organize files on a hard disk
-         partition or a floppy disk) was the original file system for Linux,
-         but has been superseded by the second extended file system ext2fs.
-         You don't want to use the minix file system on your hard disk
-         because of certain built-in restrictions, but it is sometimes found
-         on older Linux floppy disks.  This option will enlarge your kernel
-         by about 28 KB. If unsure, say N.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called minix.  Note that the file system of your root
-         partition (the one containing the directory /) cannot be compiled as
-         a module.
-
-config ROMFS_FS
-       tristate "ROM file system support"
-       ---help---
-         This is a very small read-only file system mainly intended for
-         initial ram disks of installation disks, but it could be used for
-         other read-only media as well.  Read
-         <file:Documentation/filesystems/romfs.txt> for details.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called romfs.  Note that the file system of your
-         root partition (the one containing the directory /) cannot be a
-         module.
-
-         If you don't know whether you need it, then you don't need it:
-         answer N.
-
-config INOTIFY
-       bool "Inotify file change notification support"
-       default y
-       ---help---
-         Say Y here to enable inotify support.  Inotify is a file change
-         notification system and a replacement for dnotify.  Inotify fixes
-         numerous shortcomings in dnotify and introduces several new features
-         including multiple file events, one-shot support, and unmount
-         notification.
-
-         For more information, see Documentation/filesystems/inotify.txt
-
-         If unsure, say Y.
-
-config INOTIFY_USER
-       bool "Inotify support for userspace"
-       depends on INOTIFY
-       default y
-       ---help---
-         Say Y here to enable inotify support for userspace, including the
-         associated system calls.  Inotify allows monitoring of both files and
-         directories via a single open fd.  Events are read from the file
-         descriptor, which is also select()- and poll()-able.
-
-         For more information, see Documentation/filesystems/inotify.txt
-
-         If unsure, say Y.
-
-config QUOTA
-       bool "Quota support"
-       help
-         If you say Y here, you will be able to set per user limits for disk
-         usage (also called disk quotas). Currently, it works for the
-         ext2, ext3, and reiserfs file system. ext3 also supports journalled
-         quotas for which you don't need to run quotacheck(8) after an unclean
-         shutdown.
-         For further details, read the Quota mini-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>, or the documentation provided
-         with the quota tools. Probably the quota support is only useful for
-         multi user systems. If unsure, say N.
-
-config QFMT_V1
-       tristate "Old quota format support"
-       depends on QUOTA
-       help
-         This quota format was (is) used by kernels earlier than 2.4.22. If
-         you have quota working and you don't want to convert to new quota
-         format say Y here.
-
-config QFMT_V2
-       tristate "Quota format v2 support"
-       depends on QUOTA
-       help
-         This quota format allows using quotas with 32-bit UIDs/GIDs. If you
-         need this functionality say Y here.
-
-config QUOTACTL
-       bool
-       depends on XFS_QUOTA || QUOTA
-       default y
-
-config DNOTIFY
-       bool "Dnotify support" if EMBEDDED
-       default y
-       help
-         Dnotify is a directory-based per-fd file change notification system
-         that uses signals to communicate events to user-space.  There exist
-         superior alternatives, but some applications may still rely on
-         dnotify.
-
-         Because of this, if unsure, say Y.
-
-config AUTOFS_FS
-       tristate "Kernel automounter support"
-       help
-         The automounter is a tool to automatically mount remote file systems
-         on demand. This implementation is partially kernel-based to reduce
-         overhead in the already-mounted case; this is unlike the BSD
-         automounter (amd), which is a pure user space daemon.
-
-         To use the automounter you need the user-space tools from the autofs
-         package; you can find the location in <file:Documentation/Changes>.
-         You also want to answer Y to "NFS file system support", below.
-
-         If you want to use the newer version of the automounter with more
-         features, say N here and say Y to "Kernel automounter v4 support",
-         below.
-
-         To compile this support as a module, choose M here: the module will be
-         called autofs.
-
-         If you are not a part of a fairly large, distributed network, you
-         probably do not need an automounter, and can say N here.
-
-config AUTOFS4_FS
-       tristate "Kernel automounter version 4 support (also supports v3)"
-       help
-         The automounter is a tool to automatically mount remote file systems
-         on demand. This implementation is partially kernel-based to reduce
-         overhead in the already-mounted case; this is unlike the BSD
-         automounter (amd), which is a pure user space daemon.
-
-         To use the automounter you need the user-space tools from
-         <ftp://ftp.kernel.org/pub/linux/daemons/autofs/v4/>; you also
-         want to answer Y to "NFS file system support", below.
-
-         To compile this support as a module, choose M here: the module will be
-         called autofs4.  You will need to add "alias autofs autofs4" to your
-         modules configuration file.
-
-         If you are not a part of a fairly large, distributed network or
-         don't have a laptop which needs to dynamically reconfigure to the
-         local network, you probably do not need an automounter, and can say
-         N here.
-
-config FUSE_FS
-       tristate "Filesystem in Userspace support"
-       help
-         With FUSE it is possible to implement a fully functional filesystem
-         in a userspace program.
-
-         There's also companion library: libfuse.  This library along with
-         utilities is available from the FUSE homepage:
-         <http://fuse.sourceforge.net/>
-
-         See <file:Documentation/filesystems/fuse.txt> for more information.
-         See <file:Documentation/Changes> for needed library/utility version.
-
-         If you want to develop a userspace FS, or if you want to use
-         a filesystem based on FUSE, answer Y or M.
-
-menu "CD-ROM/DVD Filesystems"
-
-config ISO9660_FS
-       tristate "ISO 9660 CDROM file system support"
-       help
-         This is the standard file system used on CD-ROMs.  It was previously
-         known as "High Sierra File System" and is called "hsfs" on other
-         Unix systems.  The so-called Rock-Ridge extensions which allow for
-         long Unix filenames and symbolic links are also supported by this
-         driver.  If you have a CD-ROM drive and want to do more with it than
-         just listen to audio CDs and watch its LEDs, say Y (and read
-         <file:Documentation/filesystems/isofs.txt> and the CD-ROM-HOWTO,
-         available from <http://www.tldp.org/docs.html#howto>), thereby
-         enlarging your kernel by about 27 KB; otherwise say N.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called isofs.
-
-config JOLIET
-       bool "Microsoft Joliet CDROM extensions"
-       depends on ISO9660_FS
-       select NLS
-       help
-         Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
-         which allows for long filenames in unicode format (unicode is the
-         new 16 bit character code, successor to ASCII, which encodes the
-         characters of almost all languages of the world; see
-         <http://www.unicode.org/> for more information).  Say Y here if you
-         want to be able to read Joliet CD-ROMs under Linux.
-
-config ZISOFS
-       bool "Transparent decompression extension"
-       depends on ISO9660_FS
-       select ZLIB_INFLATE
-       help
-         This is a Linux-specific extension to RockRidge which lets you store
-         data in compressed form on a CD-ROM and have it transparently
-         decompressed when the CD-ROM is accessed.  See
-         <http://www.kernel.org/pub/linux/utils/fs/zisofs/> for the tools
-         necessary to create such a filesystem.  Say Y here if you want to be
-         able to read such compressed CD-ROMs.
-
-config ZISOFS_FS
-# for fs/nls/Config.in
-       tristate
-       depends on ZISOFS
-       default ISO9660_FS
-
-config UDF_FS
-       tristate "UDF file system support"
-       help
-         This is the new file system used on some CD-ROMs and DVDs. Say Y if
-         you intend to mount DVD discs or CDRW's written in packet mode, or
-         if written to by other UDF utilities, such as DirectCD.
-         Please read <file:Documentation/filesystems/udf.txt>.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called udf.
-
-         If unsure, say N.
-
-config UDF_NLS
-       bool
-       default y
-       depends on (UDF_FS=m && NLS) || (UDF_FS=y && NLS=y)
-
-endmenu
-
-menu "DOS/FAT/NT Filesystems"
-
-config FAT_FS
-       tristate
-       select NLS
-       help
-         If you want to use one of the FAT-based file systems (the MS-DOS and
-         VFAT (Windows 95) file systems), then you must say Y or M here
-         to include FAT support. You will then be able to mount partitions or
-         diskettes with FAT-based file systems and transparently access the
-         files on them, i.e. MSDOS files will look and behave just like all
-         other Unix files.
-
-         This FAT support is not a file system in itself, it only provides
-         the foundation for the other file systems. You will have to say Y or
-         M to at least one of "MSDOS fs support" or "VFAT fs support" in
-         order to make use of it.
-
-         Another way to read and write MSDOS floppies and hard drive
-         partitions from within Linux (but not transparently) is with the
-         mtools ("man mtools") program suite. You don't need to say Y here in
-         order to do that.
-
-         If you need to move large files on floppies between a DOS and a
-         Linux box, say Y here, mount the floppy under Linux with an MSDOS
-         file system and use GNU tar's M option. GNU tar is a program
-         available for Unix and DOS ("man tar" or "info tar").
-
-         It is now also becoming possible to read and write compressed FAT
-         file systems; read <file:Documentation/filesystems/fat_cvf.txt> for
-         details.
-
-         The FAT support will enlarge your kernel by about 37 KB. If unsure,
-         say Y.
-
-         To compile this as a module, choose M here: the module will be called
-         fat.  Note that if you compile the FAT support as a module, you
-         cannot compile any of the FAT-based file systems into the kernel
-         -- they will have to be modules as well.
-
-config MSDOS_FS
-       tristate "MSDOS fs support"
-       select FAT_FS
-       help
-         This allows you to mount MSDOS partitions of your hard drive (unless
-         they are compressed; to access compressed MSDOS partitions under
-         Linux, you can either use the DOS emulator DOSEMU, described in the
-         DOSEMU-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>, or try dmsdosfs in
-         <ftp://ibiblio.org/pub/Linux/system/filesystems/dosfs/>. If you
-         intend to use dosemu with a non-compressed MSDOS partition, say Y
-         here) and MSDOS floppies. This means that file access becomes
-         transparent, i.e. the MSDOS files look and behave just like all
-         other Unix files.
-
-         If you have Windows 95 or Windows NT installed on your MSDOS
-         partitions, you should use the VFAT file system (say Y to "VFAT fs
-         support" below), or you will not be able to see the long filenames
-         generated by Windows 95 / Windows NT.
-
-         This option will enlarge your kernel by about 7 KB. If unsure,
-         answer Y. This will only work if you said Y to "DOS FAT fs support"
-         as well. To compile this as a module, choose M here: the module will
-         be called msdos.
-
-config VFAT_FS
-       tristate "VFAT (Windows-95) fs support"
-       select FAT_FS
-       help
-         This option provides support for normal Windows file systems with
-         long filenames.  That includes non-compressed FAT-based file systems
-         used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
-         programs from the mtools package.
-
-         The VFAT support enlarges your kernel by about 10 KB and it only
-         works if you said Y to the "DOS FAT fs support" above.  Please read
-         the file <file:Documentation/filesystems/vfat.txt> for details.  If
-         unsure, say Y.
-
-         To compile this as a module, choose M here: the module will be called
-         vfat.
-
-config FAT_DEFAULT_CODEPAGE
-       int "Default codepage for FAT"
-       depends on MSDOS_FS || VFAT_FS
-       default 437
-       help
-         This option should be set to the codepage of your FAT filesystems.
-         It can be overridden with the "codepage" mount option.
-         See <file:Documentation/filesystems/vfat.txt> for more information.
-
-config FAT_DEFAULT_IOCHARSET
-       string "Default iocharset for FAT"
-       depends on VFAT_FS
-       default "iso8859-1"
-       help
-         Set this to the default input/output character set you'd
-         like FAT to use. It should probably match the character set
-         that most of your FAT filesystems use, and can be overridden
-         with the "iocharset" mount option for FAT filesystems.
-         Note that "utf8" is not recommended for FAT filesystems.
-         If unsure, you shouldn't set "utf8" here.
-         See <file:Documentation/filesystems/vfat.txt> for more information.
-
-config NTFS_FS
-       tristate "NTFS file system support"
-       select NLS
-       help
-         NTFS is the file system of Microsoft Windows NT, 2000, XP and 2003.
-
-         Saying Y or M here enables read support.  There is partial, but
-         safe, write support available.  For write support you must also
-         say Y to "NTFS write support" below.
-
-         There are also a number of user-space tools available, called
-         ntfsprogs.  These include ntfsundelete and ntfsresize, that work
-         without NTFS support enabled in the kernel.
-
-         This is a rewrite from scratch of Linux NTFS support and replaced
-         the old NTFS code starting with Linux 2.5.11.  A backport to
-         the Linux 2.4 kernel series is separately available as a patch
-         from the project web site.
-
-         For more information see <file:Documentation/filesystems/ntfs.txt>
-         and <http://linux-ntfs.sourceforge.net/>.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called ntfs.
-
-         If you are not using Windows NT, 2000, XP or 2003 in addition to
-         Linux on your computer it is safe to say N.
-
-config NTFS_DEBUG
-       bool "NTFS debugging support"
-       depends on NTFS_FS
-       help
-         If you are experiencing any problems with the NTFS file system, say
-         Y here.  This will result in additional consistency checks to be
-         performed by the driver as well as additional debugging messages to
-         be written to the system log.  Note that debugging messages are
-         disabled by default.  To enable them, supply the option debug_msgs=1
-         at the kernel command line when booting the kernel or as an option
-         to insmod when loading the ntfs module.  Once the driver is active,
-         you can enable debugging messages by doing (as root):
-         echo 1 > /proc/sys/fs/ntfs-debug
-         Replacing the "1" with "0" would disable debug messages.
-
-         If you leave debugging messages disabled, this results in little
-         overhead, but enabling debug messages results in very significant
-         slowdown of the system.
-
-         When reporting bugs, please try to have available a full dump of
-         debugging messages while the misbehaviour was occurring.
-
-config NTFS_RW
-       bool "NTFS write support"
-       depends on NTFS_FS
-       help
-         This enables the partial, but safe, write support in the NTFS driver.
-
-         The only supported operation is overwriting existing files, without
-         changing the file length.  No file or directory creation, deletion or
-         renaming is possible.  Note only non-resident files can be written to
-         so you may find that some very small files (<500 bytes or so) cannot
-         be written to.
-
-         While we cannot guarantee that it will not damage any data, we have
-         so far not received a single report where the driver would have
-         damaged someones data so we assume it is perfectly safe to use.
-
-         Note:  While write support is safe in this version (a rewrite from
-         scratch of the NTFS support), it should be noted that the old NTFS
-         write support, included in Linux 2.5.10 and before (since 1997),
-         is not safe.
-
-         This is currently useful with TopologiLinux.  TopologiLinux is run
-         on top of any DOS/Microsoft Windows system without partitioning your
-         hard disk.  Unlike other Linux distributions TopologiLinux does not
-         need its own partition.  For more information see
-         <http://topologi-linux.sourceforge.net/>
-
-         It is perfectly safe to say N here.
-
-endmenu
-
-menu "Pseudo filesystems"
-
-config PROC_FS
-       bool "/proc file system support" if EMBEDDED
-       default y
-       help
-         This is a virtual file system providing information about the status
-         of the system. "Virtual" means that it doesn't take up any space on
-         your hard disk: the files are created on the fly by the kernel when
-         you try to access them. Also, you cannot read the files with older
-         version of the program less: you need to use more or cat.
-
-         It's totally cool; for example, "cat /proc/interrupts" gives
-         information about what the different IRQs are used for at the moment
-         (there is a small number of Interrupt ReQuest lines in your computer
-         that are used by the attached devices to gain the CPU's attention --
-         often a source of trouble if two devices are mistakenly configured
-         to use the same IRQ). The program procinfo to display some
-         information about your system gathered from the /proc file system.
-
-         Before you can use the /proc file system, it has to be mounted,
-         meaning it has to be given a location in the directory hierarchy.
-         That location should be /proc. A command such as "mount -t proc proc
-         /proc" or the equivalent line in /etc/fstab does the job.
-
-         The /proc file system is explained in the file
-         <file:Documentation/filesystems/proc.txt> and on the proc(5) manpage
-         ("man 5 proc").
-
-         This option will enlarge your kernel by about 67 KB. Several
-         programs depend on this, so everyone should say Y here.
-
-config PROC_KCORE
-       bool "/proc/kcore support" if !ARM
-       depends on PROC_FS && MMU
-
-config PROC_VMCORE
-        bool "/proc/vmcore support (EXPERIMENTAL)"
-        depends on PROC_FS && EXPERIMENTAL && CRASH_DUMP
-       default y
-        help
-        Exports the dump image of crashed kernel in ELF format.
-
-config SYSFS
-       bool "sysfs file system support" if EMBEDDED
-       default y
-       help
-       The sysfs filesystem is a virtual filesystem that the kernel uses to
-       export internal kernel objects, their attributes, and their
-       relationships to one another.
-
-       Users can use sysfs to ascertain useful information about the running
-       kernel, such as the devices the kernel has discovered on each bus and
-       which driver each is bound to. sysfs can also be used to tune devices
-       and other kernel subsystems.
-
-       Some system agents rely on the information in sysfs to operate.
-       /sbin/hotplug uses device and object attributes in sysfs to assist in
-       delegating policy decisions, like persistantly naming devices.
-
-       sysfs is currently used by the block subsystem to mount the root
-       partition.  If sysfs is disabled you must specify the boot device on
-       the kernel boot command line via its major and minor numbers.  For
-       example, "root=03:01" for /dev/hda1.
-
-       Designers of embedded systems may wish to say N here to conserve space.
-
-config TMPFS
-       bool "Virtual memory file system support (former shm fs)"
-       help
-         Tmpfs is a file system which keeps all files in virtual memory.
-
-         Everything in tmpfs is temporary in the sense that no files will be
-         created on your hard drive. The files live in memory and swap
-         space. If you unmount a tmpfs instance, everything stored therein is
-         lost.
-
-         See <file:Documentation/filesystems/tmpfs.txt> for details.
-
-config HUGETLBFS
-       bool "HugeTLB file system support"
-       depends X86 || IA64 || PPC64 || SPARC64 || SUPERH || BROKEN
-       depends !XEN
-       help
-         hugetlbfs is a filesystem backing for HugeTLB pages, based on
-         ramfs. For architectures that support it, say Y here and read
-         <file:Documentation/vm/hugetlbpage.txt> for details.
-
-         If unsure, say N.
-
-config HUGETLB_PAGE
-       def_bool HUGETLBFS
-
-config RAMFS
-       bool
-       default y
-       ---help---
-         Ramfs is a file system which keeps all files in RAM. It allows
-         read and write access.
-
-         It is more of an programming example than a useable file system.  If
-         you need a file system which lives in RAM with limit checking use
-         tmpfs.
-
-         To compile this as a module, choose M here: the module will be called
-         ramfs.
-
-config CONFIGFS_FS
-       tristate "Userspace-driven configuration filesystem (EXPERIMENTAL)"
-       depends on SYSFS && EXPERIMENTAL
-       help
-         configfs is a ram-based filesystem that provides the converse
-         of sysfs's functionality. Where sysfs is a filesystem-based
-         view of kernel objects, configfs is a filesystem-based manager
-         of kernel objects, or config_items.
-
-         Both sysfs and configfs can and should exist together on the
-         same system. One is not a replacement for the other.
-
-endmenu
-
-menu "Miscellaneous filesystems"
-
-config ADFS_FS
-       tristate "ADFS file system support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       help
-         The Acorn Disc Filing System is the standard file system of the
-         RiscOS operating system which runs on Acorn's ARM-based Risc PC
-         systems and the Acorn Archimedes range of machines. If you say Y
-         here, Linux will be able to read from ADFS partitions on hard drives
-         and from ADFS-formatted floppy discs. If you also want to be able to
-         write to those devices, say Y to "ADFS write support" below.
-
-         The ADFS partition should be the first partition (i.e.,
-         /dev/[hs]d?1) on each of your drives. Please read the file
-         <file:Documentation/filesystems/adfs.txt> for further details.
-
-         To compile this code as a module, choose M here: the module will be
-         called adfs.
-
-         If unsure, say N.
-
-config ADFS_FS_RW
-       bool "ADFS write support (DANGEROUS)"
-       depends on ADFS_FS
-       help
-         If you say Y here, you will be able to write to ADFS partitions on
-         hard drives and ADFS-formatted floppy disks. This is experimental
-         codes, so if you're unsure, say N.
-
-config AFFS_FS
-       tristate "Amiga FFS file system support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       help
-         The Fast File System (FFS) is the common file system used on hard
-         disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
-         if you want to be able to read and write files from and to an Amiga
-         FFS partition on your hard drive.  Amiga floppies however cannot be
-         read with this driver due to an incompatibility of the floppy
-         controller used in an Amiga and the standard floppy controller in
-         PCs and workstations. Read <file:Documentation/filesystems/affs.txt>
-         and <file:fs/affs/Changes>.
-
-         With this driver you can also mount disk files used by Bernd
-         Schmidt's Un*X Amiga Emulator
-         (<http://www.freiburg.linux.de/~uae/>).
-         If you want to do this, you will also need to say Y or M to "Loop
-         device support", above.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called affs.  If unsure, say N.
-
-config HFS_FS
-       tristate "Apple Macintosh file system support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       select NLS
-       help
-         If you say Y here, you will be able to mount Macintosh-formatted
-         floppy disks and hard drive partitions with full read-write access.
-         Please read <file:fs/hfs/HFS.txt> to learn about the available mount
-         options.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called hfs.
-
-config HFSPLUS_FS
-       tristate "Apple Extended HFS file system support"
-       select NLS
-       select NLS_UTF8
-       help
-         If you say Y here, you will be able to mount extended format
-         Macintosh-formatted hard drive partitions with full read-write access.
-
-         This file system is often called HFS+ and was introduced with
-         MacOS 8. It includes all Mac specific filesystem data such as
-         data forks and creator codes, but it also has several UNIX
-         style features such as file ownership and permissions.
-
-config BEFS_FS
-       tristate "BeOS file system (BeFS) support (read only) (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       select NLS
-       help
-         The BeOS File System (BeFS) is the native file system of Be, Inc's
-         BeOS. Notable features include support for arbitrary attributes
-         on files and directories, and database-like indeces on selected
-         attributes. (Also note that this driver doesn't make those features
-         available at this time). It is a 64 bit filesystem, so it supports
-         extremly large volumes and files.
-
-         If you use this filesystem, you should also say Y to at least one
-         of the NLS (native language support) options below.
-
-         If you don't know what this is about, say N.
-
-         To compile this as a module, choose M here: the module will be
-         called befs.
-
-config BEFS_DEBUG
-       bool "Debug BeFS"
-       depends on BEFS_FS
-       help
-         If you say Y here, you can use the 'debug' mount option to enable
-         debugging output from the driver. 
-
-config BFS_FS
-       tristate "BFS file system support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       help
-         Boot File System (BFS) is a file system used under SCO UnixWare to
-         allow the bootloader access to the kernel image and other important
-         files during the boot process.  It is usually mounted under /stand
-         and corresponds to the slice marked as "STAND" in the UnixWare
-         partition.  You should say Y if you want to read or write the files
-         on your /stand slice from within Linux.  You then also need to say Y
-         to "UnixWare slices support", below.  More information about the BFS
-         file system is contained in the file
-         <file:Documentation/filesystems/bfs.txt>.
-
-         If you don't know what this is about, say N.
-
-         To compile this as a module, choose M here: the module will be called
-         bfs.  Note that the file system of your root partition (the one
-         containing the directory /) cannot be compiled as a module.
-
-
-
-config EFS_FS
-       tristate "EFS file system support (read only) (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       help
-         EFS is an older file system used for non-ISO9660 CD-ROMs and hard
-         disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
-         uses the XFS file system for hard disk partitions however).
-
-         This implementation only offers read-only access. If you don't know
-         what all this is about, it's safe to say N. For more information
-         about EFS see its home page at <http://aeschi.ch.eu.org/efs/>.
-
-         To compile the EFS file system support as a module, choose M here: the
-         module will be called efs.
-
-config JFFS_FS
-       tristate "Journalling Flash File System (JFFS) support"
-       depends on MTD
-       help
-         JFFS is the Journaling Flash File System developed by Axis
-         Communications in Sweden, aimed at providing a crash/powerdown-safe
-         file system for disk-less embedded devices. Further information is
-         available at (<http://developer.axis.com/software/jffs/>).
-
-config JFFS_FS_VERBOSE
-       int "JFFS debugging verbosity (0 = quiet, 3 = noisy)"
-       depends on JFFS_FS
-       default "0"
-       help
-         Determines the verbosity level of the JFFS debugging messages.
-
-config JFFS_PROC_FS
-       bool "JFFS stats available in /proc filesystem"
-       depends on JFFS_FS && PROC_FS
-       help
-         Enabling this option will cause statistics from mounted JFFS file systems
-         to be made available to the user in the /proc/fs/jffs/ directory.
-
-config JFFS2_FS
-       tristate "Journalling Flash File System v2 (JFFS2) support"
-       select CRC32
-       depends on MTD
-       help
-         JFFS2 is the second generation of the Journalling Flash File System
-         for use on diskless embedded devices. It provides improved wear
-         levelling, compression and support for hard links. You cannot use
-         this on normal block devices, only on 'MTD' devices.
-
-         Further information on the design and implementation of JFFS2 is
-         available at <http://sources.redhat.com/jffs2/>.
-
-config JFFS2_FS_DEBUG
-       int "JFFS2 debugging verbosity (0 = quiet, 2 = noisy)"
-       depends on JFFS2_FS
-       default "0"
-       help
-         This controls the amount of debugging messages produced by the JFFS2
-         code. Set it to zero for use in production systems. For evaluation,
-         testing and debugging, it's advisable to set it to one. This will
-         enable a few assertions and will print debugging messages at the
-         KERN_DEBUG loglevel, where they won't normally be visible. Level 2
-         is unlikely to be useful - it enables extra debugging in certain
-         areas which at one point needed debugging, but when the bugs were
-         located and fixed, the detailed messages were relegated to level 2.
-
-         If reporting bugs, please try to have available a full dump of the
-         messages at debug level 1 while the misbehaviour was occurring.
-
-config JFFS2_FS_WRITEBUFFER
-       bool "JFFS2 write-buffering support"
-       depends on JFFS2_FS
-       default y
-       help
-         This enables the write-buffering support in JFFS2.
-
-         This functionality is required to support JFFS2 on the following
-         types of flash devices:
-           - NAND flash
-           - NOR flash with transparent ECC
-           - DataFlash
-
-config JFFS2_SUMMARY
-       bool "JFFS2 summary support (EXPERIMENTAL)"
-       depends on JFFS2_FS && EXPERIMENTAL
-       default n
-       help
-         This feature makes it possible to use summary information
-         for faster filesystem mount.
-
-         The summary information can be inserted into a filesystem image
-         by the utility 'sumtool'.
-
-         If unsure, say 'N'.
-
-config JFFS2_FS_XATTR
-       bool "JFFS2 XATTR support (EXPERIMENTAL)"
-       depends on JFFS2_FS && EXPERIMENTAL
-       default n
-       help
-         Extended attributes are name:value pairs associated with inodes by
-         the kernel or by users (see the attr(5) manual page, or visit
-         <http://acl.bestbits.at/> for details).
-         
-         If unsure, say N.
-
-config JFFS2_FS_POSIX_ACL
-       bool "JFFS2 POSIX Access Control Lists"
-       depends on JFFS2_FS_XATTR
-       default y
-       select FS_POSIX_ACL
-       help
-         Posix Access Control Lists (ACLs) support permissions for users and
-         groups beyond the owner/group/world scheme.
-         
-         To learn more about Access Control Lists, visit the Posix ACLs for
-         Linux website <http://acl.bestbits.at/>.
-         
-         If you don't know what Access Control Lists are, say N
-
-config JFFS2_FS_SECURITY
-       bool "JFFS2 Security Labels"
-       depends on JFFS2_FS_XATTR
-       default y
-       help
-         Security labels support alternative access control models
-         implemented by security modules like SELinux.  This option
-         enables an extended attribute handler for file security
-         labels in the jffs2 filesystem.
-         
-         If you are not using a security module that requires using
-         extended attributes for file security labels, say N.
-
-config JFFS2_COMPRESSION_OPTIONS
-       bool "Advanced compression options for JFFS2"
-       depends on JFFS2_FS
-       default n
-       help
-         Enabling this option allows you to explicitly choose which
-         compression modules, if any, are enabled in JFFS2. Removing
-         compressors and mean you cannot read existing file systems,
-         and enabling experimental compressors can mean that you
-         write a file system which cannot be read by a standard kernel.
-
-         If unsure, you should _definitely_ say 'N'.
-
-config JFFS2_ZLIB
-       bool "JFFS2 ZLIB compression support" if JFFS2_COMPRESSION_OPTIONS
-       select ZLIB_INFLATE
-       select ZLIB_DEFLATE
-       depends on JFFS2_FS
-       default y
-        help
-          Zlib is designed to be a free, general-purpose, legally unencumbered,
-          lossless data-compression library for use on virtually any computer
-          hardware and operating system. See <http://www.gzip.org/zlib/> for
-          further information.
-
-          Say 'Y' if unsure.
-
-config JFFS2_RTIME
-       bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
-       depends on JFFS2_FS
-       default y
-        help
-          Rtime does manage to recompress already-compressed data. Say 'Y' if unsure.
-
-config JFFS2_RUBIN
-       bool "JFFS2 RUBIN compression support" if JFFS2_COMPRESSION_OPTIONS
-       depends on JFFS2_FS
-       default n
-        help
-          RUBINMIPS and DYNRUBIN compressors. Say 'N' if unsure.
-
-choice
-        prompt "JFFS2 default compression mode" if JFFS2_COMPRESSION_OPTIONS
-        default JFFS2_CMODE_PRIORITY
-        depends on JFFS2_FS
-        help
-          You can set here the default compression mode of JFFS2 from
-          the available compression modes. Don't touch if unsure.
-
-config JFFS2_CMODE_NONE
-        bool "no compression"
-        help
-          Uses no compression.
-
-config JFFS2_CMODE_PRIORITY
-        bool "priority"
-        help
-          Tries the compressors in a predefinied order and chooses the first
-          successful one.
-
-config JFFS2_CMODE_SIZE
-        bool "size (EXPERIMENTAL)"
-        help
-          Tries all compressors and chooses the one which has the smallest
-          result.
-
-endchoice
-
-config CRAMFS
-       tristate "Compressed ROM file system support (cramfs)"
-       select ZLIB_INFLATE
-       help
-         Saying Y here includes support for CramFs (Compressed ROM File
-         System).  CramFs is designed to be a simple, small, and compressed
-         file system for ROM based embedded systems.  CramFs is read-only,
-         limited to 256MB file systems (with 16MB files), and doesn't support
-         16/32 bits uid/gid, hard links and timestamps.
-
-         See <file:Documentation/filesystems/cramfs.txt> and
-         <file:fs/cramfs/README> for further information.
-
-         To compile this as a module, choose M here: the module will be called
-         cramfs.  Note that the root file system (the one containing the
-         directory /) cannot be compiled as a module.
-
-         If unsure, say N.
-
-config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       help
-         FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
-         file system format.  VERITAS VxFS(TM) is the standard file system
-         of SCO UnixWare (and possibly others) and optionally available
-         for Sunsoft Solaris, HP-UX and many other operating systems.
-         Currently only readonly access is supported.
-
-         NOTE: the file system type as used by mount(1), mount(2) and
-         fstab(5) is 'vxfs' as it describes the file system format, not
-         the actual driver.
-
-         To compile this as a module, choose M here: the module will be
-         called freevxfs.  If unsure, say N.
-
-
-config HPFS_FS
-       tristate "OS/2 HPFS file system support"
-       help
-         OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
-         is the file system used for organizing files on OS/2 hard disk
-         partitions. Say Y if you want to be able to read files from and
-         write files to an OS/2 HPFS partition on your hard drive. OS/2
-         floppies however are in regular MSDOS format, so you don't need this
-         option in order to be able to read them. Read
-         <file:Documentation/filesystems/hpfs.txt>.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called hpfs.  If unsure, say N.
-
-
-
-config QNX4FS_FS
-       tristate "QNX4 file system support (read only)"
-       help
-         This is the file system used by the real-time operating systems
-         QNX 4 and QNX 6 (the latter is also called QNX RTP).
-         Further information is available at <http://www.qnx.com/>.
-         Say Y if you intend to mount QNX hard disks or floppies.
-         Unless you say Y to "QNX4FS read-write support" below, you will
-         only be able to read these file systems.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called qnx4.
-
-         If you don't know whether you need it, then you don't need it:
-         answer N.
-
-config QNX4FS_RW
-       bool "QNX4FS write support (DANGEROUS)"
-       depends on QNX4FS_FS && EXPERIMENTAL && BROKEN
-       help
-         Say Y if you want to test write support for QNX4 file systems.
-
-         It's currently broken, so for now:
-         answer N.
-
-
-
-config SYSV_FS
-       tristate "System V/Xenix/V7/Coherent file system support"
-       help
-         SCO, Xenix and Coherent are commercial Unix systems for Intel
-         machines, and Version 7 was used on the DEC PDP-11. Saying Y
-         here would allow you to read from their floppies and hard disk
-         partitions.
-
-         If you have floppies or hard disk partitions like that, it is likely
-         that they contain binaries from those other Unix systems; in order
-         to run these binaries, you will want to install linux-abi which is a
-         a set of kernel modules that lets you run SCO, Xenix, Wyse,
-         UnixWare, Dell Unix and System V programs under Linux.  It is
-         available via FTP (user: ftp) from
-         <ftp://ftp.openlinux.org/pub/people/hch/linux-abi/>).
-         NOTE: that will work only for binaries from Intel-based systems;
-         PDP ones will have to wait until somebody ports Linux to -11 ;-)
-
-         If you only intend to mount files from some other Unix over the
-         network using NFS, you don't need the System V file system support
-         (but you need NFS file system support obviously).
-
-         Note that this option is generally not needed for floppies, since a
-         good portable way to transport files and directories between unixes
-         (and even other operating systems) is given by the tar program ("man
-         tar" or preferably "info tar").  Note also that this option has
-         nothing whatsoever to do with the option "System V IPC". Read about
-         the System V file system in
-         <file:Documentation/filesystems/sysv-fs.txt>.
-         Saying Y here will enlarge your kernel by about 27 KB.
-
-         To compile this as a module, choose M here: the module will be called
-         sysv.
-
-         If you haven't heard about all of this before, it's safe to say N.
-
-
-
-config UFS_FS
-       tristate "UFS file system support (read only)"
-       help
-         BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
-         OpenBSD and NeXTstep) use a file system called UFS. Some System V
-         Unixes can create and mount hard disk partitions and diskettes using
-         this file system as well. Saying Y here will allow you to read from
-         these partitions; if you also want to write to them, say Y to the
-         experimental "UFS file system write support", below. Please read the
-         file <file:Documentation/filesystems/ufs.txt> for more information.
-
-          The recently released UFS2 variant (used in FreeBSD 5.x) is
-          READ-ONLY supported.
-
-         If you only intend to mount files from some other Unix over the
-         network using NFS, you don't need the UFS file system support (but
-         you need NFS file system support obviously).
-
-         Note that this option is generally not needed for floppies, since a
-         good portable way to transport files and directories between unixes
-         (and even other operating systems) is given by the tar program ("man
-         tar" or preferably "info tar").
-
-         When accessing NeXTstep files, you may need to convert them from the
-         NeXT character set to the Latin1 character set; use the program
-         recode ("info recode") for this purpose.
-
-         To compile the UFS file system support as a module, choose M here: the
-         module will be called ufs.
-
-         If you haven't heard about all of this before, it's safe to say N.
-
-config UFS_FS_WRITE
-       bool "UFS file system write support (DANGEROUS)"
-       depends on UFS_FS && EXPERIMENTAL
-       help
-         Say Y here if you want to try writing to UFS partitions. This is
-         experimental, so you should back up your UFS partitions beforehand.
-
-config UFS_DEBUG
-       bool "UFS debugging"
-       depends on UFS_FS
-       help
-         If you are experiencing any problems with the UFS filesystem, say
-         Y here.  This will result in _many_ additional debugging messages to be
-         written to the system log.
-
-endmenu
-
-menu "Network File Systems"
-       depends on NET
-
-config NFS_FS
-       tristate "NFS file system support"
-       depends on INET
-       select LOCKD
-       select SUNRPC
-       select NFS_ACL_SUPPORT if NFS_V3_ACL
-       help
-         If you are connected to some other (usually local) Unix computer
-         (using SLIP, PLIP, PPP or Ethernet) and want to mount files residing
-         on that computer (the NFS server) using the Network File Sharing
-         protocol, say Y. "Mounting files" means that the client can access
-         the files with usual UNIX commands as if they were sitting on the
-         client's hard disk. For this to work, the server must run the
-         programs nfsd and mountd (but does not need to have NFS file system
-         support enabled in its kernel). NFS is explained in the Network
-         Administrator's Guide, available from
-         <http://www.tldp.org/docs.html#guide>, on its man page: "man
-         nfs", and in the NFS-HOWTO.
-
-         A superior but less widely used alternative to NFS is provided by
-         the Coda file system; see "Coda file system support" below.
-
-         If you say Y here, you should have said Y to TCP/IP networking also.
-         This option would enlarge your kernel by about 27 KB.
-
-         To compile this file system support as a module, choose M here: the
-         module will be called nfs.
-
-         If you are configuring a diskless machine which will mount its root
-         file system over NFS at boot time, say Y here and to "Kernel
-         level IP autoconfiguration" above and to "Root file system on NFS"
-         below. You cannot compile this driver as a module in this case.
-         There are two packages designed for booting diskless machines over
-         the net: netboot, available from
-         <http://ftp1.sourceforge.net/netboot/>, and Etherboot,
-         available from <http://ftp1.sourceforge.net/etherboot/>.
-
-         If you don't know what all this is about, say N.
-
-config NFS_V3
-       bool "Provide NFSv3 client support"
-       depends on NFS_FS
-       help
-         Say Y here if you want your NFS client to be able to speak version
-         3 of the NFS protocol.
-
-         If unsure, say Y.
-
-config NFS_V3_ACL
-       bool "Provide client support for the NFSv3 ACL protocol extension"
-       depends on NFS_V3
-       help
-         Implement the NFSv3 ACL protocol extension for manipulating POSIX
-         Access Control Lists.  The server should also be compiled with
-         the NFSv3 ACL protocol extension; see the CONFIG_NFSD_V3_ACL option.
-
-         If unsure, say N.
-
-config NFS_V4
-       bool "Provide NFSv4 client support (EXPERIMENTAL)"
-       depends on NFS_FS && EXPERIMENTAL
-       select RPCSEC_GSS_KRB5
-       help
-         Say Y here if you want your NFS client to be able to speak the newer
-         version 4 of the NFS protocol.
-
-         Note: Requires auxiliary userspace daemons which may be found on
-               http://www.citi.umich.edu/projects/nfsv4/
-
-         If unsure, say N.
-
-config NFS_DIRECTIO
-       bool "Allow direct I/O on NFS files (EXPERIMENTAL)"
-       depends on NFS_FS && EXPERIMENTAL
-       help
-         This option enables applications to perform uncached I/O on files
-         in NFS file systems using the O_DIRECT open() flag.  When O_DIRECT
-         is set for a file, its data is not cached in the system's page
-         cache.  Data is moved to and from user-level application buffers
-         directly.  Unlike local disk-based file systems, NFS O_DIRECT has
-         no alignment restrictions.
-
-         Unless your program is designed to use O_DIRECT properly, you are
-         much better off allowing the NFS client to manage data caching for
-         you.  Misusing O_DIRECT can cause poor server performance or network
-         storms.  This kernel build option defaults OFF to avoid exposing
-         system administrators unwittingly to a potentially hazardous
-         feature.
-
-         For more details on NFS O_DIRECT, see fs/nfs/direct.c.
-
-         If unsure, say N.  This reduces the size of the NFS client, and
-         causes open() to return EINVAL if a file residing in NFS is
-         opened with the O_DIRECT flag.
-
-config NFSD
-       tristate "NFS server support"
-       depends on INET
-       select LOCKD
-       select SUNRPC
-       select EXPORTFS
-       select NFSD_V2_ACL if NFSD_V3_ACL
-       select NFS_ACL_SUPPORT if NFSD_V2_ACL
-       select NFSD_TCP if NFSD_V4
-       select CRYPTO_MD5 if NFSD_V4
-       select CRYPTO if NFSD_V4
-       select FS_POSIX_ACL if NFSD_V4
-       help
-         If you want your Linux box to act as an NFS *server*, so that other
-         computers on your local network which support NFS can access certain
-         directories on your box transparently, you have two options: you can
-         use the self-contained user space program nfsd, in which case you
-         should say N here, or you can say Y and use the kernel based NFS
-         server. The advantage of the kernel based solution is that it is
-         faster.
-
-         In either case, you will need support software; the respective
-         locations are given in the file <file:Documentation/Changes> in the
-         NFS section.
-
-         If you say Y here, you will get support for version 2 of the NFS
-         protocol (NFSv2). If you also want NFSv3, say Y to the next question
-         as well.
-
-         Please read the NFS-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile the NFS server support as a module, choose M here: the
-         module will be called nfsd.  If unsure, say N.
-
-config NFSD_V2_ACL
-       bool
-       depends on NFSD
-
-config NFSD_V3
-       bool "Provide NFSv3 server support"
-       depends on NFSD
-       help
-         If you would like to include the NFSv3 server as well as the NFSv2
-         server, say Y here.  If unsure, say Y.
-
-config NFSD_V3_ACL
-       bool "Provide server support for the NFSv3 ACL protocol extension"
-       depends on NFSD_V3
-       help
-         Implement the NFSv3 ACL protocol extension for manipulating POSIX
-         Access Control Lists on exported file systems. NFS clients should
-         be compiled with the NFSv3 ACL protocol extension; see the
-         CONFIG_NFS_V3_ACL option.  If unsure, say N.
-
-config NFSD_V4
-       bool "Provide NFSv4 server support (EXPERIMENTAL)"
-       depends on NFSD_V3 && EXPERIMENTAL
-       help
-         If you would like to include the NFSv4 server as well as the NFSv2
-         and NFSv3 servers, say Y here.  This feature is experimental, and
-         should only be used if you are interested in helping to test NFSv4.
-         If unsure, say N.
-
-config NFSD_TCP
-       bool "Provide NFS server over TCP support"
-       depends on NFSD
-       default y
-       help
-         If you want your NFS server to support TCP connections, say Y here.
-         TCP connections usually perform better than the default UDP when
-         the network is lossy or congested.  If unsure, say Y.
-
-config ROOT_NFS
-       bool "Root file system on NFS"
-       depends on NFS_FS=y && IP_PNP
-       help
-         If you want your Linux box to mount its whole root file system (the
-         one containing the directory /) from some other computer over the
-         net via NFS (presumably because your box doesn't have a hard disk),
-         say Y. Read <file:Documentation/nfsroot.txt> for details. It is
-         likely that in this case, you also want to say Y to "Kernel level IP
-         autoconfiguration" so that your box can discover its network address
-         at boot time.
-
-         Most people say N here.
-
-config LOCKD
-       tristate
-
-config LOCKD_V4
-       bool
-       depends on NFSD_V3 || NFS_V3
-       default y
-
-config EXPORTFS
-       tristate
-
-config NFS_ACL_SUPPORT
-       tristate
-       select FS_POSIX_ACL
-
-config NFS_COMMON
-       bool
-       depends on NFSD || NFS_FS
-       default y
-
-config SUNRPC
-       tristate
-
-config SUNRPC_GSS
-       tristate
-
-config RPCSEC_GSS_KRB5
-       tristate "Secure RPC: Kerberos V mechanism (EXPERIMENTAL)"
-       depends on SUNRPC && EXPERIMENTAL
-       select SUNRPC_GSS
-       select CRYPTO
-       select CRYPTO_MD5
-       select CRYPTO_DES
-       help
-         Provides for secure RPC calls by means of a gss-api
-         mechanism based on Kerberos V5. This is required for
-         NFSv4.
-
-         Note: Requires an auxiliary userspace daemon which may be found on
-               http://www.citi.umich.edu/projects/nfsv4/
-
-         If unsure, say N.
-
-config RPCSEC_GSS_SPKM3
-       tristate "Secure RPC: SPKM3 mechanism (EXPERIMENTAL)"
-       depends on SUNRPC && EXPERIMENTAL
-       select SUNRPC_GSS
-       select CRYPTO
-       select CRYPTO_MD5
-       select CRYPTO_DES
-       select CRYPTO_CAST5
-       help
-         Provides for secure RPC calls by means of a gss-api
-         mechanism based on the SPKM3 public-key mechanism.
-
-         Note: Requires an auxiliary userspace daemon which may be found on
-               http://www.citi.umich.edu/projects/nfsv4/
-
-         If unsure, say N.
-
-config SMB_FS
-       tristate "SMB file system support (to mount Windows shares etc.)"
-       depends on INET
-       select NLS
-       help
-         SMB (Server Message Block) is the protocol Windows for Workgroups
-         (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
-         files and printers over local networks.  Saying Y here allows you to
-         mount their file systems (often called "shares" in this context) and
-         access them just like any other Unix directory.  Currently, this
-         works only if the Windows machines use TCP/IP as the underlying
-         transport protocol, and not NetBEUI.  For details, read
-         <file:Documentation/filesystems/smbfs.txt> and the SMB-HOWTO,
-         available from <http://www.tldp.org/docs.html#howto>.
-
-         Note: if you just want your box to act as an SMB *server* and make
-         files and printing services available to Windows clients (which need
-         to have a TCP/IP stack), you don't need to say Y here; you can use
-         the program SAMBA (available from <ftp://ftp.samba.org/pub/samba/>)
-         for that.
-
-         General information about how to connect Linux, Windows machines and
-         Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
-
-         To compile the SMB support as a module, choose M here: the module will
-         be called smbfs.  Most people say N, however.
-
-config SMB_NLS_DEFAULT
-       bool "Use a default NLS"
-       depends on SMB_FS
-       help
-         Enabling this will make smbfs use nls translations by default. You
-         need to specify the local charset (CONFIG_NLS_DEFAULT) in the nls
-         settings and you need to give the default nls for the SMB server as
-         CONFIG_SMB_NLS_REMOTE.
-
-         The nls settings can be changed at mount time, if your smbmount
-         supports that, using the codepage and iocharset parameters.
-
-         smbmount from samba 2.2.0 or later supports this.
-
-config SMB_NLS_REMOTE
-       string "Default Remote NLS Option"
-       depends on SMB_NLS_DEFAULT
-       default "cp437"
-       help
-         This setting allows you to specify a default value for which
-         codepage the server uses. If this field is left blank no
-         translations will be done by default. The local codepage/charset
-         default to CONFIG_NLS_DEFAULT.
-
-         The nls settings can be changed at mount time, if your smbmount
-         supports that, using the codepage and iocharset parameters.
-
-         smbmount from samba 2.2.0 or later supports this.
-
-config CIFS
-       tristate "CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)"
-       depends on INET
-       select NLS
-       help
-         This is the client VFS module for the Common Internet File System
-         (CIFS) protocol which is the successor to the Server Message Block 
-         (SMB) protocol, the native file sharing mechanism for most early
-         PC operating systems.  The CIFS protocol is fully supported by 
-         file servers such as Windows 2000 (including Windows 2003, NT 4  
-         and Windows XP) as well by Samba (which provides excellent CIFS
-         server support for Linux and many other operating systems). Limited
-         support for Windows ME and similar servers is provided as well. 
-         You must use the smbfs client filesystem to access older SMB servers
-         such as OS/2 and DOS.
-
-         The intent of the cifs module is to provide an advanced
-         network file system client for mounting to CIFS compliant servers, 
-         including support for dfs (hierarchical name space), secure per-user
-         session establishment, safe distributed caching (oplock), optional
-         packet signing, Unicode and other internationalization improvements, 
-         and optional Winbind (nsswitch) integration. You do not need to enable
-         cifs if running only a (Samba) server. It is possible to enable both
-         smbfs and cifs (e.g. if you are using CIFS for accessing Windows 2003
-         and Samba 3 servers, and smbfs for accessing old servers). If you need 
-         to mount to Samba or Windows from this machine, say Y.
-
-config CIFS_STATS
-        bool "CIFS statistics"
-        depends on CIFS
-        help
-          Enabling this option will cause statistics for each server share
-         mounted by the cifs client to be displayed in /proc/fs/cifs/Stats
-
-config CIFS_STATS2
-       bool "Extended statistics"
-       depends on CIFS_STATS
-       help
-         Enabling this option will allow more detailed statistics on SMB
-         request timing to be displayed in /proc/fs/cifs/DebugData and also
-         allow optional logging of slow responses to dmesg (depending on the
-         value of /proc/fs/cifs/cifsFYI, see fs/cifs/README for more details).
-         These additional statistics may have a minor effect on performance
-         and memory utilization.
-
-         Unless you are a developer or are doing network performance analysis
-         or tuning, say N.
-
-config CIFS_WEAK_PW_HASH
-       bool "Support legacy servers which use weaker LANMAN security"
-       depends on CIFS
-       help
-         Modern CIFS servers including Samba and most Windows versions
-         (since 1997) support stronger NTLM (and even NTLMv2 and Kerberos)
-         security mechanisms. These hash the password more securely
-         than the mechanisms used in the older LANMAN version of the
-          SMB protocol needed to establish sessions with old SMB servers.
-
-         Enabling this option allows the cifs module to mount to older
-         LANMAN based servers such as OS/2 and Windows 95, but such
-         mounts may be less secure than mounts using NTLM or more recent
-         security mechanisms if you are on a public network.  Unless you
-         have a need to access old SMB servers (and are on a private 
-         network) you probably want to say N.  Even if this support
-         is enabled in the kernel build, they will not be used
-         automatically. At runtime LANMAN mounts are disabled but
-         can be set to required (or optional) either in
-         /proc/fs/cifs (see fs/cifs/README for more detail) or via an
-         option on the mount command. This support is disabled by 
-         default in order to reduce the possibility of a downgrade
-         attack.
-         If unsure, say N.
-
-config CIFS_XATTR
-        bool "CIFS extended attributes"
-        depends on CIFS
-        help
-          Extended attributes are name:value pairs associated with inodes by
-          the kernel or by users (see the attr(5) manual page, or visit
-          <http://acl.bestbits.at/> for details).  CIFS maps the name of
-          extended attributes beginning with the user namespace prefix
-          to SMB/CIFS EAs. EAs are stored on Windows servers without the
-          user namespace prefix, but their names are seen by Linux cifs clients
-          prefaced by the user namespace prefix. The system namespace
-          (used by some filesystems to store ACLs) is not supported at
-          this time.
-
-          If unsure, say N.
-
-config CIFS_POSIX
-        bool "CIFS POSIX Extensions"
-        depends on CIFS_XATTR
-        help
-          Enabling this option will cause the cifs client to attempt to
-         negotiate a newer dialect with servers, such as Samba 3.0.5
-         or later, that optionally can handle more POSIX like (rather
-         than Windows like) file behavior.  It also enables
-         support for POSIX ACLs (getfacl and setfacl) to servers
-         (such as Samba 3.10 and later) which can negotiate
-         CIFS POSIX ACL support.  If unsure, say N.
-
-config CIFS_DEBUG2
-       bool "Enable additional CIFS debugging routines"
-       depends on CIFS
-       help
-          Enabling this option adds a few more debugging routines
-          to the cifs code which slightly increases the size of
-          the cifs module and can cause additional logging of debug
-          messages in some error paths, slowing performance. This
-          option can be turned off unless you are debugging
-          cifs problems.  If unsure, say N.
-          
-config CIFS_EXPERIMENTAL
-         bool "CIFS Experimental Features (EXPERIMENTAL)"
-         depends on CIFS && EXPERIMENTAL
-         help
-           Enables cifs features under testing. These features are
-           experimental and currently include support for writepages
-           (multipage writebehind performance improvements) and directory
-           change notification ie fcntl(F_DNOTIFY) as well as some security
-           improvements.  Some also depend on setting at runtime the
-           pseudo-file /proc/fs/cifs/Experimental (which is disabled by
-           default). See the file fs/cifs/README for more details.
-
-           If unsure, say N.
-
-config CIFS_UPCALL
-         bool "Kerberos/SPNEGO advanced session setup (EXPERIMENTAL)"
-         depends on CIFS_EXPERIMENTAL
-         select CONNECTOR
-         help
-           Enables an upcall mechanism for CIFS which will be used to contact
-           userspace helper utilities to provide SPNEGO packaged Kerberos
-           tickets which are needed to mount to certain secure servers
-           (for which more secure Kerberos authentication is required). If
-           unsure, say N.
-
-config NCP_FS
-       tristate "NCP file system support (to mount NetWare volumes)"
-       depends on IPX!=n || INET
-       help
-         NCP (NetWare Core Protocol) is a protocol that runs over IPX and is
-         used by Novell NetWare clients to talk to file servers.  It is to
-         IPX what NFS is to TCP/IP, if that helps.  Saying Y here allows you
-         to mount NetWare file server volumes and to access them just like
-         any other Unix directory.  For details, please read the file
-         <file:Documentation/filesystems/ncpfs.txt> in the kernel source and
-         the IPX-HOWTO from <http://www.tldp.org/docs.html#howto>.
-
-         You do not have to say Y here if you want your Linux box to act as a
-         file *server* for Novell NetWare clients.
-
-         General information about how to connect Linux, Windows machines and
-         Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
-
-         To compile this as a module, choose M here: the module will be called
-         ncpfs.  Say N unless you are connected to a Novell network.
-
-source "fs/ncpfs/Kconfig"
-
-config CODA_FS
-       tristate "Coda file system support (advanced network fs)"
-       depends on INET
-       help
-         Coda is an advanced network file system, similar to NFS in that it
-         enables you to mount file systems of a remote server and access them
-         with regular Unix commands as if they were sitting on your hard
-         disk.  Coda has several advantages over NFS: support for
-         disconnected operation (e.g. for laptops), read/write server
-         replication, security model for authentication and encryption,
-         persistent client caches and write back caching.
-
-         If you say Y here, your Linux box will be able to act as a Coda
-         *client*.  You will need user level code as well, both for the
-         client and server.  Servers are currently user level, i.e. they need
-         no kernel support.  Please read
-         <file:Documentation/filesystems/coda.txt> and check out the Coda
-         home page <http://www.coda.cs.cmu.edu/>.
-
-         To compile the coda client support as a module, choose M here: the
-         module will be called coda.
-
-config CODA_FS_OLD_API
-       bool "Use 96-bit Coda file identifiers"
-       depends on CODA_FS
-       help
-         A new kernel-userspace API had to be introduced for Coda v6.0
-         to support larger 128-bit file identifiers as needed by the
-         new realms implementation.
-
-         However this new API is not backward compatible with older
-         clients. If you really need to run the old Coda userspace
-         cache manager then say Y.
-         
-         For most cases you probably want to say N.
-
-config AFS_FS
-# for fs/nls/Config.in
-       tristate "Andrew File System support (AFS) (Experimental)"
-       depends on INET && EXPERIMENTAL
-       select RXRPC
-       help
-         If you say Y here, you will get an experimental Andrew File System
-         driver. It currently only supports unsecured read-only AFS access.
-
-         See <file:Documentation/filesystems/afs.txt> for more intormation.
-
-         If unsure, say N.
-
-config RXRPC
-       tristate
-
-config 9P_FS
-       tristate "Plan 9 Resource Sharing Support (9P2000) (Experimental)"
-       depends on INET && EXPERIMENTAL
-       help
-         If you say Y here, you will get experimental support for
-         Plan 9 resource sharing via the 9P2000 protocol.
-
-         See <http://v9fs.sf.net> for more information.
-
-         If unsure, say N.
-
-endmenu
-
-menu "Partition Types"
-
-source "fs/partitions/Kconfig"
-
-endmenu
-
-source "fs/nls/Kconfig"
-
-endmenu
-
diff --git a/linux-2.6-xen-sparse/include/asm-i386/apic.h b/linux-2.6-xen-sparse/include/asm-i386/apic.h
deleted file mode 100644 (file)
index 906dc53..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef __ASM_APIC_H
-#define __ASM_APIC_H
-
-#include <linux/pm.h>
-#include <asm/fixmap.h>
-#include <asm/apicdef.h>
-#include <asm/processor.h>
-#include <asm/system.h>
-
-#define Dprintk(x...)
-
-/*
- * Debugging macros
- */
-#define APIC_QUIET   0
-#define APIC_VERBOSE 1
-#define APIC_DEBUG   2
-
-extern int enable_local_apic;
-extern int apic_verbosity;
-
-static inline void lapic_disable(void)
-{
-       enable_local_apic = -1;
-       clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
-}
-
-static inline void lapic_enable(void)
-{
-       enable_local_apic = 1;
-}
-
-/*
- * Define the default level of output to be very little
- * This can be turned up by using apic=verbose for more
- * information and apic=debug for _lots_ of information.
- * apic_verbosity is defined in apic.c
- */
-#define apic_printk(v, s, a...) do {       \
-               if ((v) <= apic_verbosity) \
-                       printk(s, ##a);    \
-       } while (0)
-
-
-#ifdef CONFIG_X86_LOCAL_APIC
-
-/*
- * Basic functions accessing APICs.
- */
-
-static __inline void apic_write(unsigned long reg, unsigned long v)
-{
-       *((volatile unsigned long *)(APIC_BASE+reg)) = v;
-}
-
-static __inline void apic_write_atomic(unsigned long reg, unsigned long v)
-{
-       xchg((volatile unsigned long *)(APIC_BASE+reg), v);
-}
-
-static __inline unsigned long apic_read(unsigned long reg)
-{
-       return *((volatile unsigned long *)(APIC_BASE+reg));
-}
-
-static __inline__ void apic_wait_icr_idle(void)
-{
-       while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY )
-               cpu_relax();
-}
-
-int get_physical_broadcast(void);
-
-#ifdef CONFIG_X86_GOOD_APIC
-# define FORCE_READ_AROUND_WRITE 0
-# define apic_read_around(x)
-# define apic_write_around(x,y) apic_write((x),(y))
-#else
-# define FORCE_READ_AROUND_WRITE 1
-# define apic_read_around(x) apic_read(x)
-# define apic_write_around(x,y) apic_write_atomic((x),(y))
-#endif
-
-static inline void ack_APIC_irq(void)
-{
-       /*
-        * ack_APIC_irq() actually gets compiled as a single instruction:
-        * - a single rmw on Pentium/82489DX
-        * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
-        * ... yummie.
-        */
-
-       /* Docs say use 0 for future compatibility */
-       apic_write_around(APIC_EOI, 0);
-}
-
-extern void (*wait_timer_tick)(void);
-
-extern int get_maxlvt(void);
-extern void clear_local_APIC(void);
-extern void connect_bsp_APIC (void);
-extern void disconnect_bsp_APIC (int virt_wire_setup);
-extern void disable_local_APIC (void);
-extern void lapic_shutdown (void);
-extern int verify_local_APIC (void);
-extern void cache_APIC_registers (void);
-extern void sync_Arb_IDs (void);
-extern void init_bsp_APIC (void);
-extern void setup_local_APIC (void);
-extern void init_apic_mappings (void);
-extern void smp_local_timer_interrupt (struct pt_regs * regs);
-extern void setup_boot_APIC_clock (void);
-extern void setup_secondary_APIC_clock (void);
-extern int APIC_init_uniprocessor (void);
-extern void disable_APIC_timer(void);
-extern void enable_APIC_timer(void);
-
-extern void enable_NMI_through_LVT0 (void * dummy);
-
-extern int disable_timer_pin_1;
-
-#ifndef CONFIG_XEN
-void smp_send_timer_broadcast_ipi(struct pt_regs *regs);
-void switch_APIC_timer_to_ipi(void *cpumask);
-void switch_ipi_to_APIC_timer(void *cpumask);
-#define ARCH_APICTIMER_STOPS_ON_C3     1
-#endif
-
-extern int timer_over_8254;
-
-#else /* !CONFIG_X86_LOCAL_APIC */
-static inline void lapic_shutdown(void) { }
-
-#endif /* !CONFIG_X86_LOCAL_APIC */
-
-#endif /* __ASM_APIC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/kexec.h b/linux-2.6-xen-sparse/include/asm-i386/kexec.h
deleted file mode 100644 (file)
index abddf7b..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef _I386_KEXEC_H
-#define _I386_KEXEC_H
-
-#define PA_CONTROL_PAGE  0
-#define VA_CONTROL_PAGE  1
-#define PA_PGD           2
-#define VA_PGD           3
-#define PA_PTE_0         4
-#define VA_PTE_0         5
-#define PA_PTE_1         6
-#define VA_PTE_1         7
-#ifdef CONFIG_X86_PAE
-#define PA_PMD_0         8
-#define VA_PMD_0         9
-#define PA_PMD_1         10
-#define VA_PMD_1         11
-#define PAGES_NR         12
-#else
-#define PAGES_NR         8
-#endif
-
-#ifndef __ASSEMBLY__
-
-#include <asm/fixmap.h>
-#include <asm/ptrace.h>
-#include <asm/string.h>
-
-/*
- * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
- * I.e. Maximum page that is mapped directly into kernel memory,
- * and kmap is not required.
- *
- * Someone correct me if FIXADDR_START - PAGEOFFSET is not the correct
- * calculation for the amount of memory directly mappable into the
- * kernel memory space.
- */
-
-/* Maximum physical address we can use pages from */
-#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
-/* Maximum address we can reach in physical address mode */
-#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
-/* Maximum address we can use for the control code buffer */
-#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
-
-#define KEXEC_CONTROL_CODE_SIZE        4096
-
-/* The native architecture */
-#define KEXEC_ARCH KEXEC_ARCH_386
-
-/* We can also handle crash dumps from 64 bit kernel. */
-#define vmcore_elf_check_arch_cross(x) ((x)->e_machine == EM_X86_64)
-
-#define MAX_NOTE_BYTES 1024
-
-/* CPU does not save ss and esp on stack if execution is already
- * running in kernel mode at the time of NMI occurrence. This code
- * fixes it.
- */
-static inline void crash_fixup_ss_esp(struct pt_regs *newregs,
-                                       struct pt_regs *oldregs)
-{
-       memcpy(newregs, oldregs, sizeof(*newregs));
-       newregs->esp = (unsigned long)&(oldregs->esp);
-       __asm__ __volatile__(
-                       "xorl %%eax, %%eax\n\t"
-                       "movw %%ss, %%ax\n\t"
-                       :"=a"(newregs->xss));
-}
-
-/*
- * This function is responsible for capturing register states if coming
- * via panic otherwise just fix up the ss and esp if coming via kernel
- * mode exception.
- */
-static inline void crash_setup_regs(struct pt_regs *newregs,
-                                       struct pt_regs *oldregs)
-{
-       if (oldregs)
-               crash_fixup_ss_esp(newregs, oldregs);
-       else {
-               __asm__ __volatile__("movl %%ebx,%0" : "=m"(newregs->ebx));
-               __asm__ __volatile__("movl %%ecx,%0" : "=m"(newregs->ecx));
-               __asm__ __volatile__("movl %%edx,%0" : "=m"(newregs->edx));
-               __asm__ __volatile__("movl %%esi,%0" : "=m"(newregs->esi));
-               __asm__ __volatile__("movl %%edi,%0" : "=m"(newregs->edi));
-               __asm__ __volatile__("movl %%ebp,%0" : "=m"(newregs->ebp));
-               __asm__ __volatile__("movl %%eax,%0" : "=m"(newregs->eax));
-               __asm__ __volatile__("movl %%esp,%0" : "=m"(newregs->esp));
-               __asm__ __volatile__("movw %%ss, %%ax;" :"=a"(newregs->xss));
-               __asm__ __volatile__("movw %%cs, %%ax;" :"=a"(newregs->xcs));
-               __asm__ __volatile__("movw %%ds, %%ax;" :"=a"(newregs->xds));
-               __asm__ __volatile__("movw %%es, %%ax;" :"=a"(newregs->xes));
-               __asm__ __volatile__("pushfl; popl %0" :"=m"(newregs->eflags));
-
-               newregs->eip = (unsigned long)current_text_addr();
-       }
-}
-asmlinkage NORET_TYPE void
-relocate_kernel(unsigned long indirection_page,
-               unsigned long control_page,
-               unsigned long start_address,
-               unsigned int has_pae) ATTRIB_NORET;
-
-
-/* Under Xen we need to work with machine addresses. These macros give the
- * machine address of a certain page to the generic kexec code instead of 
- * the pseudo physical address which would be given by the default macros.
- */
-
-#ifdef CONFIG_XEN
-#define KEXEC_ARCH_HAS_PAGE_MACROS
-#define kexec_page_to_pfn(page)  pfn_to_mfn(page_to_pfn(page))
-#define kexec_pfn_to_page(pfn)   pfn_to_page(mfn_to_pfn(pfn))
-#define kexec_virt_to_phys(addr) virt_to_machine(addr)
-#define kexec_phys_to_virt(addr) phys_to_virt(machine_to_phys(addr))
-#endif
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _I386_KEXEC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-default/mach_traps.h b/linux-2.6-xen-sparse/include/asm-i386/mach-default/mach_traps.h
deleted file mode 100644 (file)
index 4e34a91..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  include/asm-i386/mach-default/mach_traps.h
- *
- *  Machine specific NMI handling for generic.
- *  Split out from traps.c by Osamu Tomita <tomita@cinet.co.jp>
- */
-#ifndef _MACH_TRAPS_H
-#define _MACH_TRAPS_H
-
-#include <asm/mc146818rtc.h>
-
-static inline void clear_mem_error(unsigned char reason)
-{
-       reason = (reason & 0xf) | 4;
-       outb(reason, 0x61);
-}
-
-static inline void clear_io_check_error(unsigned char reason)
-{
-       unsigned long i;
-
-       reason = (reason & 0xf) | 8;
-       outb(reason, 0x61);
-       i = 2000;
-       while (--i) udelay(1000);
-       reason &= ~8;
-       outb(reason, 0x61);
-}
-
-static inline unsigned char get_nmi_reason(void)
-{
-       return inb(0x61);
-}
-
-static inline void reassert_nmi(void)
-{
-       int old_reg = -1;
-
-       if (do_i_have_lock_cmos())
-               old_reg = current_lock_cmos_reg();
-       else
-               lock_cmos(0); /* register doesn't matter here */
-       outb(0x8f, 0x70);
-       inb(0x71);              /* dummy */
-       outb(0x0f, 0x70);
-       inb(0x71);              /* dummy */
-       if (old_reg >= 0)
-               outb(old_reg, 0x70);
-       else
-               unlock_cmos();
-}
-
-#endif /* !_MACH_TRAPS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/agp.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/agp.h
deleted file mode 100644 (file)
index 1389863..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef AGP_H
-#define AGP_H 1
-
-#include <asm/pgtable.h>
-#include <asm/cacheflush.h>
-#include <asm/system.h>
-
-/* 
- * Functions to keep the agpgart mappings coherent with the MMU.
- * The GART gives the CPU a physical alias of pages in memory. The alias region is
- * mapped uncacheable. Make sure there are no conflicting mappings
- * with different cachability attributes for the same page. This avoids
- * data corruption on some CPUs.
- */
-
-int map_page_into_agp(struct page *page);
-int unmap_page_from_agp(struct page *page);
-#define flush_agp_mappings() global_flush_tlb()
-
-/* Could use CLFLUSH here if the cpu supports it. But then it would
-   need to be called for each cacheline of the whole page so it may not be 
-   worth it. Would need a page for it. */
-#define flush_agp_cache() wbinvd()
-
-/* Convert a physical address to an address suitable for the GART. */
-#define phys_to_gart(x) phys_to_machine(x)
-#define gart_to_phys(x) machine_to_phys(x)
-
-/* GATT allocation. Returns/accepts GATT kernel virtual address. */
-#define alloc_gatt_pages(order)        ({                                          \
-       char *_t; dma_addr_t _d;                                            \
-       _t = dma_alloc_coherent(NULL,PAGE_SIZE<<(order),&_d,GFP_KERNEL);    \
-       _t; })
-#define free_gatt_pages(table, order)  \
-       dma_free_coherent(NULL,PAGE_SIZE<<(order),(table),virt_to_bus(table))
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/desc.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/desc.h
deleted file mode 100644 (file)
index 48d7566..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-#ifndef __ARCH_DESC_H
-#define __ARCH_DESC_H
-
-#include <asm/ldt.h>
-#include <asm/segment.h>
-
-#define CPU_16BIT_STACK_SIZE 1024
-
-#ifndef __ASSEMBLY__
-
-#include <linux/preempt.h>
-#include <linux/smp.h>
-
-#include <asm/mmu.h>
-
-extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
-
-DECLARE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
-
-struct Xgt_desc_struct {
-       unsigned short size;
-       unsigned long address __attribute__((packed));
-       unsigned short pad;
-} __attribute__ ((packed));
-
-extern struct Xgt_desc_struct idt_descr;
-DECLARE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
-
-
-static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
-{
-       return (struct desc_struct *)per_cpu(cpu_gdt_descr, cpu).address;
-}
-
-#define load_TR_desc() __asm__ __volatile__("ltr %w0"::"q" (GDT_ENTRY_TSS*8))
-#define load_LDT_desc() __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8))
-
-#define load_gdt(dtr) __asm__ __volatile("lgdt %0"::"m" (*dtr))
-#define load_idt(dtr) __asm__ __volatile("lidt %0"::"m" (*dtr))
-#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
-#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr" (ldt))
-
-#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
-#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
-#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
-#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
-
-/*
- * This is the ldt that every process will get unless we need
- * something other than this.
- */
-extern struct desc_struct default_ldt[];
-extern void set_intr_gate(unsigned int irq, void * addr);
-
-#define _set_tssldt_desc(n,addr,limit,type) \
-__asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
-       "movw %w1,2(%2)\n\t" \
-       "rorl $16,%1\n\t" \
-       "movb %b1,4(%2)\n\t" \
-       "movb %4,5(%2)\n\t" \
-       "movb $0,6(%2)\n\t" \
-       "movb %h1,7(%2)\n\t" \
-       "rorl $16,%1" \
-       : "=m"(*(n)) : "q" (addr), "r"(n), "ir"(limit), "i"(type))
-
-#ifndef CONFIG_X86_NO_TSS
-static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
-{
-       _set_tssldt_desc(&get_cpu_gdt_table(cpu)[entry], (int)addr,
-               offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);
-}
-
-#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)
-#endif
-
-static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size)
-{
-       _set_tssldt_desc(&get_cpu_gdt_table(cpu)[GDT_ENTRY_LDT], (int)addr, ((size << 3)-1), 0x82);
-}
-
-#define LDT_entry_a(info) \
-       ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
-
-#define LDT_entry_b(info) \
-       (((info)->base_addr & 0xff000000) | \
-       (((info)->base_addr & 0x00ff0000) >> 16) | \
-       ((info)->limit & 0xf0000) | \
-       (((info)->read_exec_only ^ 1) << 9) | \
-       ((info)->contents << 10) | \
-       (((info)->seg_not_present ^ 1) << 15) | \
-       ((info)->seg_32bit << 22) | \
-       ((info)->limit_in_pages << 23) | \
-       ((info)->useable << 20) | \
-       0x7000)
-
-#define LDT_empty(info) (\
-       (info)->base_addr       == 0    && \
-       (info)->limit           == 0    && \
-       (info)->contents        == 0    && \
-       (info)->read_exec_only  == 1    && \
-       (info)->seg_32bit       == 0    && \
-       (info)->limit_in_pages  == 0    && \
-       (info)->seg_not_present == 1    && \
-       (info)->useable         == 0    )
-
-extern int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b);
-
-#if TLS_SIZE != 24
-# error update this code.
-#endif
-
-static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
-{
-#define C(i) HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i]), *(u64 *)&t->tls_array[i])
-       C(0); C(1); C(2);
-#undef C
-}
-
-static inline void clear_LDT(void)
-{
-       int cpu = get_cpu();
-
-       /*
-        * NB. We load the default_ldt for lcall7/27 handling on demand, as
-        * it slows down context switching. Noone uses it anyway.
-        */
-       cpu = cpu;              /* XXX avoid compiler warning */
-       xen_set_ldt(0UL, 0);
-       put_cpu();
-}
-
-/*
- * load one particular LDT into the current CPU
- */
-static inline void load_LDT_nolock(mm_context_t *pc, int cpu)
-{
-       void *segments = pc->ldt;
-       int count = pc->size;
-
-       if (likely(!count))
-               segments = NULL;
-
-       xen_set_ldt((unsigned long)segments, count);
-}
-
-static inline void load_LDT(mm_context_t *pc)
-{
-       int cpu = get_cpu();
-       load_LDT_nolock(pc, cpu);
-       put_cpu();
-}
-
-static inline unsigned long get_desc_base(unsigned long *desc)
-{
-       unsigned long base;
-       base = ((desc[0] >> 16)  & 0x0000ffff) |
-               ((desc[1] << 16) & 0x00ff0000) |
-               (desc[1] & 0xff000000);
-       return base;
-}
-
-#endif /* !__ASSEMBLY__ */
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/dma-mapping.h
deleted file mode 100644 (file)
index 39a9ce0..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef _ASM_I386_DMA_MAPPING_H
-#define _ASM_I386_DMA_MAPPING_H
-
-/*
- * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
- * documentation.
- */
-
-#include <linux/mm.h>
-#include <asm/cache.h>
-#include <asm/io.h>
-#include <asm/scatterlist.h>
-#include <asm/swiotlb.h>
-
-static inline int
-address_needs_mapping(struct device *hwdev, dma_addr_t addr)
-{
-       dma_addr_t mask = 0xffffffff;
-       /* If the device has a mask, use it, otherwise default to 32 bits */
-       if (hwdev && hwdev->dma_mask)
-               mask = *hwdev->dma_mask;
-       return (addr & ~mask) != 0;
-}
-
-static inline int
-range_straddles_page_boundary(void *p, size_t size)
-{
-       extern unsigned long *contiguous_bitmap;
-       return (((((unsigned long)p & ~PAGE_MASK) + size) > PAGE_SIZE) &&
-               !test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap));
-}
-
-#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
-#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
-
-void *dma_alloc_coherent(struct device *dev, size_t size,
-                          dma_addr_t *dma_handle, gfp_t flag);
-
-void dma_free_coherent(struct device *dev, size_t size,
-                        void *vaddr, dma_addr_t dma_handle);
-
-extern dma_addr_t
-dma_map_single(struct device *dev, void *ptr, size_t size,
-              enum dma_data_direction direction);
-
-extern void
-dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction);
-
-extern int dma_map_sg(struct device *hwdev, struct scatterlist *sg,
-                     int nents, enum dma_data_direction direction);
-extern void dma_unmap_sg(struct device *hwdev, struct scatterlist *sg,
-                        int nents, enum dma_data_direction direction);
-
-#ifdef CONFIG_HIGHMEM
-extern dma_addr_t
-dma_map_page(struct device *dev, struct page *page, unsigned long offset,
-            size_t size, enum dma_data_direction direction);
-
-extern void
-dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction);
-#else
-#define dma_map_page(dev, page, offset, size, dir) \
-       dma_map_single(dev, page_address(page) + (offset), (size), (dir))
-#define dma_unmap_page dma_unmap_single
-#endif
-
-extern void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-                       enum dma_data_direction direction);
-
-extern void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-                           enum dma_data_direction direction);
-
-static inline void
-dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                             unsigned long offset, size_t size,
-                             enum dma_data_direction direction)
-{
-       dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction);
-}
-
-static inline void
-dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                                unsigned long offset, size_t size,
-                                enum dma_data_direction direction)
-{
-       dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                   enum dma_data_direction direction)
-{
-       if (swiotlb)
-               swiotlb_sync_sg_for_cpu(dev,sg,nelems,direction);
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                   enum dma_data_direction direction)
-{
-       if (swiotlb)
-               swiotlb_sync_sg_for_device(dev,sg,nelems,direction);
-       flush_write_buffers();
-}
-
-extern int
-dma_mapping_error(dma_addr_t dma_addr);
-
-extern int
-dma_supported(struct device *dev, u64 mask);
-
-static inline int
-dma_set_mask(struct device *dev, u64 mask)
-{
-       if(!dev->dma_mask || !dma_supported(dev, mask))
-               return -EIO;
-
-       *dev->dma_mask = mask;
-
-       return 0;
-}
-
-static inline int
-dma_get_cache_alignment(void)
-{
-       /* no easy way to get cache size on all x86, so return the
-        * maximum possible, to be safe */
-       return (1 << INTERNODE_CACHE_SHIFT);
-}
-
-#define dma_is_consistent(d)   (1)
-
-static inline void
-dma_cache_sync(void *vaddr, size_t size,
-              enum dma_data_direction direction)
-{
-       flush_write_buffers();
-}
-
-#define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
-extern int
-dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
-                           dma_addr_t device_addr, size_t size, int flags);
-
-extern void
-dma_release_declared_memory(struct device *dev);
-
-extern void *
-dma_mark_declared_memory_occupied(struct device *dev,
-                                 dma_addr_t device_addr, size_t size);
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/fixmap.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/fixmap.h
deleted file mode 100644 (file)
index 235d3ca..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * fixmap.h: compile-time virtual memory allocation
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1998 Ingo Molnar
- *
- * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- */
-
-#ifndef _ASM_FIXMAP_H
-#define _ASM_FIXMAP_H
-
-
-/* used by vmalloc.c, vsyscall.lds.S.
- *
- * Leave one empty page between vmalloc'ed areas and
- * the start of the fixmap.
- */
-extern unsigned long __FIXADDR_TOP;
-
-#ifndef __ASSEMBLY__
-#include <linux/kernel.h>
-#include <asm/acpi.h>
-#include <asm/apicdef.h>
-#include <asm/page.h>
-#ifdef CONFIG_HIGHMEM
-#include <linux/threads.h>
-#include <asm/kmap_types.h>
-#endif
-
-/*
- * Here we define all the compile-time 'special' virtual
- * addresses. The point is to have a constant address at
- * compile time, but to set the physical address only
- * in the boot process. We allocate these special addresses
- * from the end of virtual memory (0xfffff000) backwards.
- * Also this lets us do fail-safe vmalloc(), we
- * can guarantee that these special addresses and
- * vmalloc()-ed addresses never overlap.
- *
- * these 'compile-time allocated' memory buffers are
- * fixed-size 4k pages. (or larger if used with an increment
- * highger than 1) use fixmap_set(idx,phys) to associate
- * physical memory with fixmap indices.
- *
- * TLB entries of such buffers will not be flushed across
- * task switches.
- */
-enum fixed_addresses {
-       FIX_HOLE,
-       FIX_VDSO,
-#ifdef CONFIG_X86_LOCAL_APIC
-       FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
-#endif
-#ifdef CONFIG_X86_IO_APIC
-       FIX_IO_APIC_BASE_0,
-       FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
-#endif
-#ifdef CONFIG_X86_VISWS_APIC
-       FIX_CO_CPU,     /* Cobalt timer */
-       FIX_CO_APIC,    /* Cobalt APIC Redirection Table */ 
-       FIX_LI_PCIA,    /* Lithium PCI Bridge A */
-       FIX_LI_PCIB,    /* Lithium PCI Bridge B */
-#endif
-#ifdef CONFIG_X86_F00F_BUG
-       FIX_F00F_IDT,   /* Virtual mapping for IDT */
-#endif
-#ifdef CONFIG_X86_CYCLONE_TIMER
-       FIX_CYCLONE_TIMER, /*cyclone timer register*/
-#endif 
-#ifdef CONFIG_HIGHMEM
-       FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
-       FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
-#endif
-#ifdef CONFIG_ACPI
-       FIX_ACPI_BEGIN,
-       FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-#endif
-#ifdef CONFIG_PCI_MMCONFIG
-       FIX_PCIE_MCFG,
-#endif
-       FIX_SHARED_INFO,
-#define NR_FIX_ISAMAPS 256
-       FIX_ISAMAP_END,
-       FIX_ISAMAP_BEGIN = FIX_ISAMAP_END + NR_FIX_ISAMAPS - 1,
-       __end_of_permanent_fixed_addresses,
-       /* temporary boot-time mappings, used before ioremap() is functional */
-#define NR_FIX_BTMAPS  16
-       FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
-       FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
-       FIX_WP_TEST,
-       __end_of_fixed_addresses
-};
-
-extern void set_fixaddr_top(unsigned long top);
-
-extern void __set_fixmap(enum fixed_addresses idx,
-                                       maddr_t phys, pgprot_t flags);
-
-#define set_fixmap(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL)
-/*
- * Some hardware wants to get fixmapped without caching.
- */
-#define set_fixmap_nocache(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-
-#define clear_fixmap(idx) \
-               __set_fixmap(idx, 0, __pgprot(0))
-
-#define FIXADDR_TOP    ((unsigned long)__FIXADDR_TOP)
-
-#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
-#define __FIXADDR_BOOT_SIZE    (__end_of_fixed_addresses << PAGE_SHIFT)
-#define FIXADDR_START          (FIXADDR_TOP - __FIXADDR_SIZE)
-#define FIXADDR_BOOT_START     (FIXADDR_TOP - __FIXADDR_BOOT_SIZE)
-
-#define __fix_to_virt(x)       (FIXADDR_TOP - ((x) << PAGE_SHIFT))
-#define __virt_to_fix(x)       ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
-
-extern void __this_fixmap_does_not_exist(void);
-
-/*
- * 'index to address' translation. If anyone tries to use the idx
- * directly without tranlation, we catch the bug with a NULL-deference
- * kernel oops. Illegal ranges of incoming indices are caught too.
- */
-static __always_inline unsigned long fix_to_virt(const unsigned int idx)
-{
-       /*
-        * this branch gets completely eliminated after inlining,
-        * except when someone tries to use fixaddr indices in an
-        * illegal way. (such as mixing up address types or using
-        * out-of-range indices).
-        *
-        * If it doesn't get removed, the linker will complain
-        * loudly with a reasonably clear error message..
-        */
-       if (idx >= __end_of_fixed_addresses)
-               __this_fixmap_does_not_exist();
-
-        return __fix_to_virt(idx);
-}
-
-static inline unsigned long virt_to_fix(const unsigned long vaddr)
-{
-       BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
-       return __virt_to_fix(vaddr);
-}
-
-#endif /* !__ASSEMBLY__ */
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/floppy.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/floppy.h
deleted file mode 100644 (file)
index 1396559..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Architecture specific parts of the Floppy driver
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1995
- *
- * Modifications for Xen are Copyright (c) 2004, Keir Fraser.
- */
-#ifndef __ASM_XEN_I386_FLOPPY_H
-#define __ASM_XEN_I386_FLOPPY_H
-
-#include <linux/vmalloc.h>
-
-/* XEN: Hit DMA paths on the head. This trick from asm-m68k/floppy.h. */
-#include <asm/dma.h>
-#undef MAX_DMA_ADDRESS
-#define MAX_DMA_ADDRESS 0
-#define CROSS_64KB(a,s) (0)
-
-#define fd_inb(port)                   inb_p(port)
-#define fd_outb(value,port)            outb_p(value,port)
-
-#define fd_request_dma()        (0)
-#define fd_free_dma()           ((void)0)
-#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
-#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
-#define fd_free_irq()          free_irq(FLOPPY_IRQ, NULL)
-#define fd_get_dma_residue()    (virtual_dma_count + virtual_dma_residue)
-#define fd_dma_setup(addr, size, mode, io) vdma_dma_setup(addr, size, mode, io)
-/*
- * Do not use vmalloc/vfree: floppy_release_irq_and_dma() gets called from
- * softirq context via motor_off_callback. A generic bug we happen to trigger.
- */
-#define fd_dma_mem_alloc(size) __get_free_pages(GFP_KERNEL, get_order(size))
-#define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
-
-static int virtual_dma_count;
-static int virtual_dma_residue;
-static char *virtual_dma_addr;
-static int virtual_dma_mode;
-static int doing_pdma;
-
-static irqreturn_t floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
-{
-       register unsigned char st;
-       register int lcount;
-       register char *lptr;
-
-       if (!doing_pdma)
-               return floppy_interrupt(irq, dev_id, regs);
-
-       st = 1;
-       for(lcount=virtual_dma_count, lptr=virtual_dma_addr; 
-           lcount; lcount--, lptr++) {
-               st=inb(virtual_dma_port+4) & 0xa0 ;
-               if(st != 0xa0) 
-                       break;
-               if(virtual_dma_mode)
-                       outb_p(*lptr, virtual_dma_port+5);
-               else
-                       *lptr = inb_p(virtual_dma_port+5);
-       }
-       virtual_dma_count = lcount;
-       virtual_dma_addr = lptr;
-       st = inb(virtual_dma_port+4);
-
-       if(st == 0x20)
-               return IRQ_HANDLED;
-       if(!(st & 0x20)) {
-               virtual_dma_residue += virtual_dma_count;
-               virtual_dma_count=0;
-               doing_pdma = 0;
-               floppy_interrupt(irq, dev_id, regs);
-               return IRQ_HANDLED;
-       }
-       return IRQ_HANDLED;
-}
-
-static void fd_disable_dma(void)
-{
-       doing_pdma = 0;
-       virtual_dma_residue += virtual_dma_count;
-       virtual_dma_count=0;
-}
-
-static int fd_request_irq(void)
-{
-       return request_irq(FLOPPY_IRQ, floppy_hardint,
-                          IRQF_DISABLED, "floppy", NULL);
-}
-
-static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
-{
-       doing_pdma = 1;
-       virtual_dma_port = io;
-       virtual_dma_mode = (mode  == DMA_MODE_WRITE);
-       virtual_dma_addr = addr;
-       virtual_dma_count = size;
-       virtual_dma_residue = 0;
-       return 0;
-}
-
-/* XEN: This trick to force 'virtual DMA' is from include/asm-m68k/floppy.h. */
-#define FDC1 xen_floppy_init()
-static int FDC2 = -1;
-
-static int xen_floppy_init(void)
-{
-       use_virtual_dma = 1;
-       can_use_virtual_dma = 1;
-       return 0x3f0;
-}
-
-/*
- * Floppy types are stored in the rtc's CMOS RAM and so rtc_lock
- * is needed to prevent corrupted CMOS RAM in case "insmod floppy"
- * coincides with another rtc CMOS user.               Paul G.
- */
-#define FLOPPY0_TYPE   ({                              \
-       unsigned long flags;                            \
-       unsigned char val;                              \
-       spin_lock_irqsave(&rtc_lock, flags);            \
-       val = (CMOS_READ(0x10) >> 4) & 15;              \
-       spin_unlock_irqrestore(&rtc_lock, flags);       \
-       val;                                            \
-})
-
-#define FLOPPY1_TYPE   ({                              \
-       unsigned long flags;                            \
-       unsigned char val;                              \
-       spin_lock_irqsave(&rtc_lock, flags);            \
-       val = CMOS_READ(0x10) & 15;                     \
-       spin_unlock_irqrestore(&rtc_lock, flags);       \
-       val;                                            \
-})
-
-#define N_FDC 2
-#define N_DRIVE 8
-
-#define FLOPPY_MOTOR_MASK 0xf0
-
-#define EXTRA_FLOPPY_PARAMS
-
-#endif /* __ASM_XEN_I386_FLOPPY_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/highmem.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/highmem.h
deleted file mode 100644 (file)
index d379186..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * highmem.h: virtual kernel memory mappings for high memory
- *
- * Used in CONFIG_HIGHMEM systems for memory pages which
- * are not addressable by direct kernel virtual addresses.
- *
- * Copyright (C) 1999 Gerhard Wichert, Siemens AG
- *                   Gerhard.Wichert@pdb.siemens.de
- *
- *
- * Redesigned the x86 32-bit VM architecture to deal with 
- * up to 16 Terabyte physical memory. With current x86 CPUs
- * we now support up to 64 Gigabytes physical RAM.
- *
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#ifndef _ASM_HIGHMEM_H
-#define _ASM_HIGHMEM_H
-
-#ifdef __KERNEL__
-
-#include <linux/interrupt.h>
-#include <linux/threads.h>
-#include <asm/kmap_types.h>
-#include <asm/tlbflush.h>
-
-/* declarations for highmem.c */
-extern unsigned long highstart_pfn, highend_pfn;
-
-extern pte_t *kmap_pte;
-extern pgprot_t kmap_prot;
-extern pte_t *pkmap_page_table;
-
-/*
- * Right now we initialize only a single pte table. It can be extended
- * easily, subsequent pte tables have to be allocated in one physical
- * chunk of RAM.
- */
-#ifdef CONFIG_X86_PAE
-#define LAST_PKMAP 512
-#else
-#define LAST_PKMAP 1024
-#endif
-/*
- * Ordering is:
- *
- * FIXADDR_TOP
- *                     fixed_addresses
- * FIXADDR_START
- *                     temp fixed addresses
- * FIXADDR_BOOT_START
- *                     Persistent kmap area
- * PKMAP_BASE
- * VMALLOC_END
- *                     Vmalloc area
- * VMALLOC_START
- * high_memory
- */
-#define PKMAP_BASE ( (FIXADDR_BOOT_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK )
-#define LAST_PKMAP_MASK (LAST_PKMAP-1)
-#define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
-#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-
-extern void * FASTCALL(kmap_high(struct page *page));
-extern void FASTCALL(kunmap_high(struct page *page));
-
-void *kmap(struct page *page);
-void kunmap(struct page *page);
-void *kmap_atomic(struct page *page, enum km_type type);
-void *kmap_atomic_pte(struct page *page, enum km_type type);
-void kunmap_atomic(void *kvaddr, enum km_type type);
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
-struct page *kmap_atomic_to_page(void *ptr);
-
-#define flush_cache_kmaps()    do { } while (0)
-
-#endif /* __KERNEL__ */
-
-#endif /* _ASM_HIGHMEM_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hw_irq.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hw_irq.h
deleted file mode 100644 (file)
index 87e5a35..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _ASM_HW_IRQ_H
-#define _ASM_HW_IRQ_H
-
-/*
- *     linux/include/asm/hw_irq.h
- *
- *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
- *
- *     moved some of the old arch/i386/kernel/irq.h to here. VY
- *
- *     IRQ/IPI changes taken from work by Thomas Radke
- *     <tomsoft@informatik.tu-chemnitz.de>
- */
-
-#include <linux/profile.h>
-#include <asm/atomic.h>
-#include <asm/irq.h>
-#include <asm/sections.h>
-
-struct hw_interrupt_type;
-
-#define NMI_VECTOR             0x02
-
-/*
- * Various low-level irq details needed by irq.c, process.c,
- * time.c, io_apic.c and smp.c
- *
- * Interrupt entry/exit code at both C and assembly level
- */
-
-extern u8 irq_vector[NR_IRQ_VECTORS];
-#define IO_APIC_VECTOR(irq)    (irq_vector[irq])
-#define AUTO_ASSIGN            -1
-
-extern void (*interrupt[NR_IRQS])(void);
-
-#ifdef CONFIG_SMP
-fastcall void reschedule_interrupt(void);
-fastcall void invalidate_interrupt(void);
-fastcall void call_function_interrupt(void);
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC
-fastcall void apic_timer_interrupt(void);
-fastcall void error_interrupt(void);
-fastcall void spurious_interrupt(void);
-fastcall void thermal_interrupt(struct pt_regs *);
-#define platform_legacy_irq(irq)       ((irq) < 16)
-#endif
-
-void disable_8259A_irq(unsigned int irq);
-void enable_8259A_irq(unsigned int irq);
-int i8259A_irq_pending(unsigned int irq);
-void make_8259A_irq(unsigned int irq);
-void init_8259A(int aeoi);
-void FASTCALL(send_IPI_self(int vector));
-void init_VISWS_APIC_irqs(void);
-void setup_IO_APIC(void);
-void disable_IO_APIC(void);
-void print_IO_APIC(void);
-int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
-void send_IPI(int dest, int vector);
-void setup_ioapic_dest(void);
-
-extern unsigned long io_apic_irqs;
-
-extern atomic_t irq_err_count;
-extern atomic_t irq_mis_count;
-
-#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
-
-#endif /* _ASM_HW_IRQ_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h
deleted file mode 100644 (file)
index 2526d20..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/******************************************************************************
- * hypercall.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERCALL_H__
-#define __HYPERCALL_H__
-
-#include <linux/string.h> /* memcpy() */
-
-#ifndef __HYPERVISOR_H__
-# error "please don't include this file directly"
-#endif
-
-#define __STR(x) #x
-#define STR(x) __STR(x)
-
-#ifdef CONFIG_XEN
-#define HYPERCALL_STR(name)                                    \
-       "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
-#else
-#define HYPERCALL_STR(name)                                    \
-       "mov hypercall_stubs,%%eax; "                           \
-       "add $("STR(__HYPERVISOR_##name)" * 32),%%eax; "        \
-       "call *%%eax"
-#endif
-
-#define _hypercall0(type, name)                        \
-({                                             \
-       long __res;                             \
-       asm volatile (                          \
-               HYPERCALL_STR(name)             \
-               : "=a" (__res)                  \
-               :                               \
-               : "memory" );                   \
-       (type)__res;                            \
-})
-
-#define _hypercall1(type, name, a1)                            \
-({                                                             \
-       long __res, __ign1;                                     \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=b" (__ign1)                   \
-               : "1" ((long)(a1))                              \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall2(type, name, a1, a2)                                \
-({                                                             \
-       long __res, __ign1, __ign2;                             \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=b" (__ign1), "=c" (__ign2)    \
-               : "1" ((long)(a1)), "2" ((long)(a2))            \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall3(type, name, a1, a2, a3)                    \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3;                     \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-               "=d" (__ign3)                                   \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3))                                \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall4(type, name, a1, a2, a3, a4)                        \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3, __ign4;             \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-               "=d" (__ign3), "=S" (__ign4)                    \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3)), "4" ((long)(a4))              \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall5(type, name, a1, a2, a3, a4, a5)            \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3, __ign4, __ign5;     \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-               "=d" (__ign3), "=S" (__ign4), "=D" (__ign5)     \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3)), "4" ((long)(a4)),             \
-               "5" ((long)(a5))                                \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-static inline int
-HYPERVISOR_set_trap_table(
-       trap_info_t *table)
-{
-       return _hypercall1(int, set_trap_table, table);
-}
-
-static inline int
-HYPERVISOR_mmu_update(
-       mmu_update_t *req, int count, int *success_count, domid_t domid)
-{
-       return _hypercall4(int, mmu_update, req, count, success_count, domid);
-}
-
-static inline int
-HYPERVISOR_mmuext_op(
-       struct mmuext_op *op, int count, int *success_count, domid_t domid)
-{
-       return _hypercall4(int, mmuext_op, op, count, success_count, domid);
-}
-
-static inline int
-HYPERVISOR_set_gdt(
-       unsigned long *frame_list, int entries)
-{
-       return _hypercall2(int, set_gdt, frame_list, entries);
-}
-
-static inline int
-HYPERVISOR_stack_switch(
-       unsigned long ss, unsigned long esp)
-{
-       return _hypercall2(int, stack_switch, ss, esp);
-}
-
-static inline int
-HYPERVISOR_set_callbacks(
-       unsigned long event_selector, unsigned long event_address,
-       unsigned long failsafe_selector, unsigned long failsafe_address)
-{
-       return _hypercall4(int, set_callbacks,
-                          event_selector, event_address,
-                          failsafe_selector, failsafe_address);
-}
-
-static inline int
-HYPERVISOR_fpu_taskswitch(
-       int set)
-{
-       return _hypercall1(int, fpu_taskswitch, set);
-}
-
-static inline int
-HYPERVISOR_sched_op_compat(
-       int cmd, unsigned long arg)
-{
-       return _hypercall2(int, sched_op_compat, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_sched_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, sched_op, cmd, arg);
-}
-
-static inline long
-HYPERVISOR_set_timer_op(
-       u64 timeout)
-{
-       unsigned long timeout_hi = (unsigned long)(timeout>>32);
-       unsigned long timeout_lo = (unsigned long)timeout;
-       return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
-}
-
-static inline int
-HYPERVISOR_platform_op(
-       struct xen_platform_op *platform_op)
-{
-       platform_op->interface_version = XENPF_INTERFACE_VERSION;
-       return _hypercall1(int, platform_op, platform_op);
-}
-
-static inline int
-HYPERVISOR_set_debugreg(
-       int reg, unsigned long value)
-{
-       return _hypercall2(int, set_debugreg, reg, value);
-}
-
-static inline unsigned long
-HYPERVISOR_get_debugreg(
-       int reg)
-{
-       return _hypercall1(unsigned long, get_debugreg, reg);
-}
-
-static inline int
-HYPERVISOR_update_descriptor(
-       u64 ma, u64 desc)
-{
-       return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
-}
-
-static inline int
-HYPERVISOR_memory_op(
-       unsigned int cmd, void *arg)
-{
-       return _hypercall2(int, memory_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_multicall(
-       multicall_entry_t *call_list, int nr_calls)
-{
-       return _hypercall2(int, multicall, call_list, nr_calls);
-}
-
-static inline int
-HYPERVISOR_update_va_mapping(
-       unsigned long va, pte_t new_val, unsigned long flags)
-{
-       unsigned long pte_hi = 0;
-#ifdef CONFIG_X86_PAE
-       pte_hi = new_val.pte_high;
-#endif
-       return _hypercall4(int, update_va_mapping, va,
-                          new_val.pte_low, pte_hi, flags);
-}
-
-static inline int
-HYPERVISOR_event_channel_op(
-       int cmd, void *arg)
-{
-       int rc = _hypercall2(int, event_channel_op, cmd, arg);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               struct evtchn_op op;
-               op.cmd = cmd;
-               memcpy(&op.u, arg, sizeof(op.u));
-               rc = _hypercall1(int, event_channel_op_compat, &op);
-               memcpy(arg, &op.u, sizeof(op.u));
-       }
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_acm_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, acm_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_xen_version(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, xen_version, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_console_io(
-       int cmd, int count, char *str)
-{
-       return _hypercall3(int, console_io, cmd, count, str);
-}
-
-static inline int
-HYPERVISOR_physdev_op(
-       int cmd, void *arg)
-{
-       int rc = _hypercall2(int, physdev_op, cmd, arg);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               struct physdev_op op;
-               op.cmd = cmd;
-               memcpy(&op.u, arg, sizeof(op.u));
-               rc = _hypercall1(int, physdev_op_compat, &op);
-               memcpy(arg, &op.u, sizeof(op.u));
-       }
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_grant_table_op(
-       unsigned int cmd, void *uop, unsigned int count)
-{
-       return _hypercall3(int, grant_table_op, cmd, uop, count);
-}
-
-static inline int
-HYPERVISOR_update_va_mapping_otherdomain(
-       unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
-{
-       unsigned long pte_hi = 0;
-#ifdef CONFIG_X86_PAE
-       pte_hi = new_val.pte_high;
-#endif
-       return _hypercall5(int, update_va_mapping_otherdomain, va,
-                          new_val.pte_low, pte_hi, flags, domid);
-}
-
-static inline int
-HYPERVISOR_vm_assist(
-       unsigned int cmd, unsigned int type)
-{
-       return _hypercall2(int, vm_assist, cmd, type);
-}
-
-static inline int
-HYPERVISOR_vcpu_op(
-       int cmd, int vcpuid, void *extra_args)
-{
-       return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
-}
-
-static inline int
-HYPERVISOR_suspend(
-       unsigned long srec)
-{
-       struct sched_shutdown sched_shutdown = {
-               .reason = SHUTDOWN_suspend
-       };
-
-       int rc = _hypercall3(int, sched_op, SCHEDOP_shutdown,
-                            &sched_shutdown, srec);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = _hypercall3(int, sched_op_compat, SCHEDOP_shutdown,
-                                SHUTDOWN_suspend, srec);
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_nmi_op(
-       unsigned long op, void *arg)
-{
-       return _hypercall2(int, nmi_op, op, arg);
-}
-
-static inline unsigned long
-HYPERVISOR_hvm_op(
-    int op, void *arg)
-{
-    return _hypercall2(unsigned long, hvm_op, op, arg);
-}
-
-static inline int
-HYPERVISOR_callback_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, callback_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_xenoprof_op(
-       int op, void *arg)
-{
-       return _hypercall2(int, xenoprof_op, op, arg);
-}
-
-static inline int
-HYPERVISOR_kexec_op(
-       unsigned long op, void *args)
-{
-       return _hypercall2(int, kexec_op, op, args);
-}
-
-
-
-#endif /* __HYPERCALL_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
deleted file mode 100644 (file)
index e65d81a..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-/******************************************************************************
- * hypervisor.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERVISOR_H__
-#define __HYPERVISOR_H__
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/version.h>
-#include <linux/errno.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/sched.h>
-#include <xen/interface/nmi.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#if defined(__i386__)
-#  ifdef CONFIG_X86_PAE
-#   include <asm-generic/pgtable-nopud.h>
-#  else
-#   include <asm-generic/pgtable-nopmd.h>
-#  endif
-#endif
-
-extern shared_info_t *HYPERVISOR_shared_info;
-
-#define vcpu_info(cpu) (HYPERVISOR_shared_info->vcpu_info + (cpu))
-#ifdef CONFIG_SMP
-#define current_vcpu_info() vcpu_info(smp_processor_id())
-#else
-#define current_vcpu_info() vcpu_info(0)
-#endif
-
-#ifdef CONFIG_X86_32
-extern unsigned long hypervisor_virt_start;
-#endif
-
-/* arch/xen/i386/kernel/setup.c */
-extern start_info_t *xen_start_info;
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
-#else
-#define is_initial_xendomain() 0
-#endif
-
-/* arch/xen/kernel/evtchn.c */
-/* Force a proper event-channel callback from Xen. */
-void force_evtchn_callback(void);
-
-/* arch/xen/kernel/process.c */
-void xen_cpu_idle (void);
-
-/* arch/xen/i386/kernel/hypervisor.c */
-void do_hypervisor_callback(struct pt_regs *regs);
-
-/* arch/xen/i386/mm/hypervisor.c */
-/*
- * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
- * be MACHINE addresses.
- */
-
-void xen_pt_switch(unsigned long ptr);
-void xen_new_user_pt(unsigned long ptr); /* x86_64 only */
-void xen_load_gs(unsigned int selector); /* x86_64 only */
-void xen_tlb_flush(void);
-void xen_invlpg(unsigned long ptr);
-
-void xen_l1_entry_update(pte_t *ptr, pte_t val);
-void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
-void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */
-void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */
-void xen_pgd_pin(unsigned long ptr);
-void xen_pgd_unpin(unsigned long ptr);
-
-void xen_set_ldt(unsigned long ptr, unsigned long bytes);
-
-#ifdef CONFIG_SMP
-#include <linux/cpumask.h>
-void xen_tlb_flush_all(void);
-void xen_invlpg_all(unsigned long ptr);
-void xen_tlb_flush_mask(cpumask_t *mask);
-void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr);
-#endif
-
-/* Returns zero on success else negative errno. */
-int xen_create_contiguous_region(
-    unsigned long vstart, unsigned int order, unsigned int address_bits);
-void xen_destroy_contiguous_region(
-    unsigned long vstart, unsigned int order);
-
-/* Turn jiffies into Xen system time. */
-u64 jiffies_to_st(unsigned long jiffies);
-
-#ifdef CONFIG_XEN_SCRUB_PAGES
-#define scrub_pages(_p,_n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT)
-#else
-#define scrub_pages(_p,_n) ((void)0)
-#endif
-
-#include <xen/hypercall.h>
-
-#if defined(CONFIG_X86_64)
-#define MULTI_UVMFLAGS_INDEX 2
-#define MULTI_UVMDOMID_INDEX 3
-#else
-#define MULTI_UVMFLAGS_INDEX 3
-#define MULTI_UVMDOMID_INDEX 4
-#endif
-
-#define is_running_on_xen() 1
-
-static inline int
-HYPERVISOR_yield(
-       void)
-{
-       int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_block(
-       void)
-{
-       int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_shutdown(
-       unsigned int reason)
-{
-       struct sched_shutdown sched_shutdown = {
-               .reason = reason
-       };
-
-       int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_poll(
-       evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
-{
-       int rc;
-       struct sched_poll sched_poll = {
-               .nr_ports = nr_ports,
-               .timeout = jiffies_to_st(timeout)
-       };
-       set_xen_guest_handle(sched_poll.ports, ports);
-
-       rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
-#endif
-
-       return rc;
-}
-
-static inline void
-MULTI_update_va_mapping(
-    multicall_entry_t *mcl, unsigned long va,
-    pte_t new_val, unsigned long flags)
-{
-    mcl->op = __HYPERVISOR_update_va_mapping;
-    mcl->args[0] = va;
-#if defined(CONFIG_X86_64)
-    mcl->args[1] = new_val.pte;
-#elif defined(CONFIG_X86_PAE)
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = new_val.pte_high;
-#else
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = 0;
-#endif
-    mcl->args[MULTI_UVMFLAGS_INDEX] = flags;
-}
-
-static inline void
-MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
-                    void *uop, unsigned int count)
-{
-    mcl->op = __HYPERVISOR_grant_table_op;
-    mcl->args[0] = cmd;
-    mcl->args[1] = (unsigned long)uop;
-    mcl->args[2] = count;
-}
-
-static inline void
-MULTI_update_va_mapping_otherdomain(
-    multicall_entry_t *mcl, unsigned long va,
-    pte_t new_val, unsigned long flags, domid_t domid)
-{
-    mcl->op = __HYPERVISOR_update_va_mapping_otherdomain;
-    mcl->args[0] = va;
-#if defined(CONFIG_X86_64)
-    mcl->args[1] = new_val.pte;
-#elif defined(CONFIG_X86_PAE)
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = new_val.pte_high;
-#else
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = 0;
-#endif
-    mcl->args[MULTI_UVMFLAGS_INDEX] = flags;
-    mcl->args[MULTI_UVMDOMID_INDEX] = domid;
-}
-
-#endif /* __HYPERVISOR_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h
deleted file mode 100644 (file)
index d6e8298..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-#ifndef _ASM_IO_H
-#define _ASM_IO_H
-
-#include <linux/string.h>
-#include <linux/compiler.h>
-
-/*
- * This file contains the definitions for the x86 IO instructions
- * inb/inw/inl/outb/outw/outl and the "string versions" of the same
- * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
- * versions of the single-IO instructions (inb_p/inw_p/..).
- *
- * This file is not meant to be obfuscating: it's just complicated
- * to (a) handle it all in a way that makes gcc able to optimize it
- * as well as possible and (b) trying to avoid writing the same thing
- * over and over again with slight variations and possibly making a
- * mistake somewhere.
- */
-
-/*
- * Thanks to James van Artsdalen for a better timing-fix than
- * the two short jumps: using outb's to a nonexistent port seems
- * to guarantee better timings even on fast machines.
- *
- * On the other hand, I'd like to be sure of a non-existent port:
- * I feel a bit unsafe about using 0x80 (should be safe, though)
- *
- *             Linus
- */
-
- /*
-  *  Bit simplified and optimized by Jan Hubicka
-  *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999.
-  *
-  *  isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added,
-  *  isa_read[wl] and isa_write[wl] fixed
-  *  - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
-  */
-
-#define IO_SPACE_LIMIT 0xffff
-
-#define XQUAD_PORTIO_BASE 0xfe400000
-#define XQUAD_PORTIO_QUAD 0x40000  /* 256k per quad. */
-
-#ifdef __KERNEL__
-
-#include <asm-generic/iomap.h>
-
-#include <linux/vmalloc.h>
-#include <asm/fixmap.h>
-
-/*
- * Convert a physical pointer to a virtual kernel pointer for /dev/mem
- * access
- */
-#define xlate_dev_mem_ptr(p, sz)       ioremap(p, sz)
-#define xlate_dev_mem_ptr_unmap(p)     iounmap(p)
-
-/*
- * Convert a virtual cached pointer to an uncached pointer
- */
-#define xlate_dev_kmem_ptr(p)  p
-
-/**
- *     virt_to_phys    -       map virtual addresses to physical
- *     @address: address to remap
- *
- *     The returned physical address is the physical (CPU) mapping for
- *     the memory address given. It is only valid to use this function on
- *     addresses directly mapped or allocated via kmalloc. 
- *
- *     This function does not give bus mappings for DMA transfers. In
- *     almost all conceivable cases a device driver should not be using
- *     this function
- */
-static inline unsigned long virt_to_phys(volatile void * address)
-{
-       return __pa(address);
-}
-
-/**
- *     phys_to_virt    -       map physical address to virtual
- *     @address: address to remap
- *
- *     The returned virtual address is a current CPU mapping for
- *     the memory address given. It is only valid to use this function on
- *     addresses that have a kernel mapping
- *
- *     This function does not handle bus mappings for DMA transfers. In
- *     almost all conceivable cases a device driver should not be using
- *     this function
- */
-
-static inline void * phys_to_virt(unsigned long address)
-{
-       return __va(address);
-}
-
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-#define page_to_phys(page)      (phys_to_machine(page_to_pseudophys(page)))
-#define page_to_bus(page)       (phys_to_machine(page_to_pseudophys(page)))
-
-#define bio_to_pseudophys(bio)  (page_to_pseudophys(bio_page((bio))) + \
-                                 (unsigned long) bio_offset((bio)))
-#define bvec_to_pseudophys(bv)  (page_to_pseudophys((bv)->bv_page) + \
-                                 (unsigned long) (bv)->bv_offset)
-
-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2)      \
-       (((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) && \
-        ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) == \
-         bvec_to_pseudophys((vec2))))
-
-extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
-
-/**
- * ioremap     -   map bus memory into CPU space
- * @offset:    bus address of the memory
- * @size:      size of the resource to map
- *
- * ioremap performs a platform specific sequence of operations to
- * make bus memory CPU accessible via the readb/readw/readl/writeb/
- * writew/writel functions and the other mmio helpers. The returned
- * address is not guaranteed to be usable directly as a virtual
- * address. 
- */
-
-static inline void __iomem * ioremap(unsigned long offset, unsigned long size)
-{
-       return __ioremap(offset, size, 0);
-}
-
-extern void __iomem * ioremap_nocache(unsigned long offset, unsigned long size);
-extern void iounmap(volatile void __iomem *addr);
-
-/*
- * bt_ioremap() and bt_iounmap() are for temporary early boot-time
- * mappings, before the real ioremap() is functional.
- * A boot-time mapping is currently limited to at most 16 pages.
- */
-extern void *bt_ioremap(unsigned long offset, unsigned long size);
-extern void bt_iounmap(void *addr, unsigned long size);
-
-/* Use early IO mappings for DMI because it's initialized early */
-#define dmi_ioremap bt_ioremap
-#define dmi_iounmap bt_iounmap
-#define dmi_alloc alloc_bootmem
-
-/*
- * ISA I/O bus memory addresses are 1:1 with the physical address.
- */
-#define isa_virt_to_bus(_x) isa_virt_to_bus_is_UNSUPPORTED->x
-#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->x
-#define isa_bus_to_virt(_x) (void *)(__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x))
-
-/*
- * However PCI ones are not necessarily 1:1 and therefore these interfaces
- * are forbidden in portable PCI drivers.
- *
- * Allow them on x86 for legacy drivers, though.
- */
-#define virt_to_bus(_x) phys_to_machine(__pa(_x))
-#define bus_to_virt(_x) __va(machine_to_phys(_x))
-
-/*
- * readX/writeX() are used to access memory mapped devices. On some
- * architectures the memory mapped IO stuff needs to be accessed
- * differently. On the x86 architecture, we just read/write the
- * memory location directly.
- */
-
-static inline unsigned char readb(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned char __force *) addr;
-}
-static inline unsigned short readw(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned short __force *) addr;
-}
-static inline unsigned int readl(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned int __force *) addr;
-}
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-#define __raw_readb readb
-#define __raw_readw readw
-#define __raw_readl readl
-
-static inline void writeb(unsigned char b, volatile void __iomem *addr)
-{
-       *(volatile unsigned char __force *) addr = b;
-}
-static inline void writew(unsigned short b, volatile void __iomem *addr)
-{
-       *(volatile unsigned short __force *) addr = b;
-}
-static inline void writel(unsigned int b, volatile void __iomem *addr)
-{
-       *(volatile unsigned int __force *) addr = b;
-}
-#define __raw_writeb writeb
-#define __raw_writew writew
-#define __raw_writel writel
-
-#define mmiowb()
-
-static inline void memset_io(volatile void __iomem *addr, unsigned char val, int count)
-{
-       memset((void __force *) addr, val, count);
-}
-static inline void memcpy_fromio(void *dst, const volatile void __iomem *src, int count)
-{
-       __memcpy(dst, (void __force *) src, count);
-}
-static inline void memcpy_toio(volatile void __iomem *dst, const void *src, int count)
-{
-       __memcpy((void __force *) dst, src, count);
-}
-
-/*
- * ISA space is 'always mapped' on a typical x86 system, no need to
- * explicitly ioremap() it. The fact that the ISA IO space is mapped
- * to PAGE_OFFSET is pure coincidence - it does not mean ISA values
- * are physical addresses. The following constant pointer can be
- * used as the IO-area pointer (it can be iounmapped as well, so the
- * analogy with PCI is quite large):
- */
-#define __ISA_IO_base ((char __iomem *)(fix_to_virt(FIX_ISAMAP_BEGIN)))
-
-/*
- * Again, i386 does not require mem IO specific function.
- */
-
-#define eth_io_copy_and_sum(a,b,c,d)           eth_copy_and_sum((a),(void __force *)(b),(c),(d))
-
-/**
- *     check_signature         -       find BIOS signatures
- *     @io_addr: mmio address to check 
- *     @signature:  signature block
- *     @length: length of signature
- *
- *     Perform a signature comparison with the mmio address io_addr. This
- *     address should have been obtained by ioremap.
- *     Returns 1 on a match.
- */
-static inline int check_signature(volatile void __iomem * io_addr,
-       const unsigned char *signature, int length)
-{
-       int retval = 0;
-       do {
-               if (readb(io_addr) != *signature)
-                       goto out;
-               io_addr++;
-               signature++;
-               length--;
-       } while (length);
-       retval = 1;
-out:
-       return retval;
-}
-
-/*
- *     Cache management
- *
- *     This needed for two cases
- *     1. Out of order aware processors
- *     2. Accidentally out of order processors (PPro errata #51)
- */
-#if defined(CONFIG_X86_OOSTORE) || defined(CONFIG_X86_PPRO_FENCE)
-
-static inline void flush_write_buffers(void)
-{
-       __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory");
-}
-
-#define dma_cache_inv(_start,_size)            flush_write_buffers()
-#define dma_cache_wback(_start,_size)          flush_write_buffers()
-#define dma_cache_wback_inv(_start,_size)      flush_write_buffers()
-
-#else
-
-/* Nothing to do */
-
-#define dma_cache_inv(_start,_size)            do { } while (0)
-#define dma_cache_wback(_start,_size)          do { } while (0)
-#define dma_cache_wback_inv(_start,_size)      do { } while (0)
-#define flush_write_buffers()
-
-#endif
-
-#endif /* __KERNEL__ */
-
-#ifdef SLOW_IO_BY_JUMPING
-#define __SLOW_DOWN_IO "jmp 1f; 1: jmp 1f; 1:"
-#else
-#define __SLOW_DOWN_IO "outb %%al,$0x80;"
-#endif
-
-static inline void slow_down_io(void) {
-       __asm__ __volatile__(
-               __SLOW_DOWN_IO
-#ifdef REALLY_SLOW_IO
-               __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO
-#endif
-               : : );
-}
-
-#ifdef CONFIG_X86_NUMAQ
-extern void *xquad_portio;    /* Where the IO area was mapped */
-#define XQUAD_PORT_ADDR(port, quad) (xquad_portio + (XQUAD_PORTIO_QUAD*quad) + port)
-#define __BUILDIO(bwl,bw,type) \
-static inline void out##bwl##_quad(unsigned type value, int port, int quad) { \
-       if (xquad_portio) \
-               write##bwl(value, XQUAD_PORT_ADDR(port, quad)); \
-       else \
-               out##bwl##_local(value, port); \
-} \
-static inline void out##bwl(unsigned type value, int port) { \
-       out##bwl##_quad(value, port, 0); \
-} \
-static inline unsigned type in##bwl##_quad(int port, int quad) { \
-       if (xquad_portio) \
-               return read##bwl(XQUAD_PORT_ADDR(port, quad)); \
-       else \
-               return in##bwl##_local(port); \
-} \
-static inline unsigned type in##bwl(int port) { \
-       return in##bwl##_quad(port, 0); \
-}
-#else
-#define __BUILDIO(bwl,bw,type) \
-static inline void out##bwl(unsigned type value, int port) { \
-       out##bwl##_local(value, port); \
-} \
-static inline unsigned type in##bwl(int port) { \
-       return in##bwl##_local(port); \
-}
-#endif
-
-
-#define BUILDIO(bwl,bw,type) \
-static inline void out##bwl##_local(unsigned type value, int port) { \
-       __asm__ __volatile__("out" #bwl " %" #bw "0, %w1" : : "a"(value), "Nd"(port)); \
-} \
-static inline unsigned type in##bwl##_local(int port) { \
-       unsigned type value; \
-       __asm__ __volatile__("in" #bwl " %w1, %" #bw "0" : "=a"(value) : "Nd"(port)); \
-       return value; \
-} \
-static inline void out##bwl##_local_p(unsigned type value, int port) { \
-       out##bwl##_local(value, port); \
-       slow_down_io(); \
-} \
-static inline unsigned type in##bwl##_local_p(int port) { \
-       unsigned type value = in##bwl##_local(port); \
-       slow_down_io(); \
-       return value; \
-} \
-__BUILDIO(bwl,bw,type) \
-static inline void out##bwl##_p(unsigned type value, int port) { \
-       out##bwl(value, port); \
-       slow_down_io(); \
-} \
-static inline unsigned type in##bwl##_p(int port) { \
-       unsigned type value = in##bwl(port); \
-       slow_down_io(); \
-       return value; \
-} \
-static inline void outs##bwl(int port, const void *addr, unsigned long count) { \
-       __asm__ __volatile__("rep; outs" #bwl : "+S"(addr), "+c"(count) : "d"(port)); \
-} \
-static inline void ins##bwl(int port, void *addr, unsigned long count) { \
-       __asm__ __volatile__("rep; ins" #bwl : "+D"(addr), "+c"(count) : "d"(port)); \
-}
-
-BUILDIO(b,b,char)
-BUILDIO(w,w,short)
-BUILDIO(l,,int)
-
-/* We will be supplying our own /dev/mem implementation */
-#define ARCH_HAS_DEV_MEM
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/irqflags.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/irqflags.h
deleted file mode 100644 (file)
index 2a71405..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * include/asm-i386/irqflags.h
- *
- * IRQ flags handling
- *
- * This file gets included from lowlevel asm headers too, to provide
- * wrapped versions of the local_irq_*() APIs, based on the
- * raw_local_irq_*() functions from the lowlevel headers.
- */
-#ifndef _ASM_IRQFLAGS_H
-#define _ASM_IRQFLAGS_H
-
-#ifndef __ASSEMBLY__
-
-/* 
- * The use of 'barrier' in the following reflects their use as local-lock
- * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
- * critical operations are executed. All critical operations must complete
- * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also
- * includes these barriers, for example.
- */
-
-#define __raw_local_save_flags() (current_vcpu_info()->evtchn_upcall_mask)
-
-#define raw_local_save_flags(flags) \
-               do { (flags) = __raw_local_save_flags(); } while (0)
-
-#define raw_local_irq_restore(x)                                       \
-do {                                                                   \
-       vcpu_info_t *_vcpu;                                             \
-       barrier();                                                      \
-       _vcpu = current_vcpu_info();                                    \
-       if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                   \
-               barrier(); /* unmask then check (avoid races) */        \
-               if (unlikely(_vcpu->evtchn_upcall_pending))             \
-                       force_evtchn_callback();                        \
-       }                                                               \
-} while (0)
-
-#define raw_local_irq_disable()                                                \
-do {                                                                   \
-       current_vcpu_info()->evtchn_upcall_mask = 1;                    \
-       barrier();                                                      \
-} while (0)
-
-#define raw_local_irq_enable()                                         \
-do {                                                                   \
-       vcpu_info_t *_vcpu;                                             \
-       barrier();                                                      \
-       _vcpu = current_vcpu_info();                                    \
-       _vcpu->evtchn_upcall_mask = 0;                                  \
-       barrier(); /* unmask then check (avoid races) */                \
-       if (unlikely(_vcpu->evtchn_upcall_pending))                     \
-               force_evtchn_callback();                                \
-} while (0)
-
-/*
- * Used in the idle loop; sti takes one instruction cycle
- * to complete:
- */
-void raw_safe_halt(void);
-
-/*
- * Used when interrupts are already enabled or to
- * shutdown the processor:
- */
-void halt(void);
-
-static inline int raw_irqs_disabled_flags(unsigned long flags)
-{
-       return (flags != 0);
-}
-
-#define raw_irqs_disabled()                                            \
-({                                                                     \
-       unsigned long flags = __raw_local_save_flags();                 \
-                                                                       \
-       raw_irqs_disabled_flags(flags);                                 \
-})
-
-/*
- * For spinlocks, etc:
- */
-#define __raw_local_irq_save()                                         \
-({                                                                     \
-       unsigned long flags = __raw_local_save_flags();                 \
-                                                                       \
-       raw_local_irq_disable();                                        \
-                                                                       \
-       flags;                                                          \
-})
-
-#define raw_local_irq_save(flags) \
-               do { (flags) = __raw_local_irq_save(); } while (0)
-
-#endif /* __ASSEMBLY__ */
-
-/*
- * Do the CPU's IRQ-state tracing from assembly code. We call a
- * C function, so save all the C-clobbered registers:
- */
-#ifdef CONFIG_TRACE_IRQFLAGS
-
-# define TRACE_IRQS_ON                         \
-       pushl %eax;                             \
-       pushl %ecx;                             \
-       pushl %edx;                             \
-       call trace_hardirqs_on;                 \
-       popl %edx;                              \
-       popl %ecx;                              \
-       popl %eax;
-
-# define TRACE_IRQS_OFF                                \
-       pushl %eax;                             \
-       pushl %ecx;                             \
-       pushl %edx;                             \
-       call trace_hardirqs_off;                \
-       popl %edx;                              \
-       popl %ecx;                              \
-       popl %eax;
-
-#else
-# define TRACE_IRQS_ON
-# define TRACE_IRQS_OFF
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h
deleted file mode 100644 (file)
index 4ded6ed..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef _I386_MADDR_H
-#define _I386_MADDR_H
-
-#include <xen/features.h>
-#include <xen/interface/xen.h>
-
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY      (~0UL)
-#define FOREIGN_FRAME_BIT      (1UL<<31)
-#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
-
-/* Definitions for machine and pseudophysical addresses. */
-#ifdef CONFIG_X86_PAE
-typedef unsigned long long paddr_t;
-typedef unsigned long long maddr_t;
-#else
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-#endif
-
-#ifdef CONFIG_XEN
-
-extern unsigned long *phys_to_machine_mapping;
-extern unsigned long  max_mapnr;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int   machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return pfn;
-       BUG_ON(max_mapnr && pfn >= max_mapnr);
-       return phys_to_machine_mapping[pfn] & ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return 1;
-       BUG_ON(max_mapnr && pfn >= max_mapnr);
-       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
-       unsigned long pfn;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return mfn;
-
-       if (unlikely((mfn >> machine_to_phys_order) != 0))
-               return max_mapnr;
-
-       /* The array access can fail (e.g., device space beyond end of RAM). */
-       asm (
-               "1:     movl %1,%0\n"
-               "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:     movl %2,%0\n"
-               "       jmp  2b\n"
-               ".previous\n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 4\n"
-               "       .long 1b,3b\n"
-               ".previous"
-               : "=r" (pfn)
-               : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) );
-
-       return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- *  1. If the MFN is an I/O page then Xen will set the m2p entry
- *     to be outside our maximum possible pseudophys range.
- *  2. If the MFN belongs to a different domain then we will certainly
- *     not have MFN in our p2m table. Conversely, if the page is ours,
- *     then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- *      require. In all the cases we care about, the FOREIGN_FRAME bit is
- *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
-       unsigned long pfn = mfn_to_pfn(mfn);
-       if ((pfn < max_mapnr)
-           && !xen_feature(XENFEAT_auto_translated_physmap)
-           && (phys_to_machine_mapping[pfn] != mfn))
-               return max_mapnr; /* force !pfn_valid() */
-       return pfn;
-}
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-       BUG_ON(max_mapnr && pfn >= max_mapnr);
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-               return;
-       }
-       phys_to_machine_mapping[pfn] = mfn;
-}
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
-       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-       return machine;
-}
-
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
-       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-       return phys;
-}
-
-#ifdef CONFIG_X86_PAE
-static inline paddr_t pte_phys_to_machine(paddr_t phys)
-{
-       /*
-        * In PAE mode, the NX bit needs to be dealt with in the value
-        * passed to pfn_to_mfn(). On x86_64, we need to mask it off,
-        * but for i386 the conversion to ulong for the argument will
-        * clip it off.
-        */
-       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PHYSICAL_PAGE_MASK);
-       return machine;
-}
-
-static inline paddr_t pte_machine_to_phys(maddr_t machine)
-{
-       /*
-        * In PAE mode, the NX bit needs to be dealt with in the value
-        * passed to mfn_to_pfn(). On x86_64, we need to mask it off,
-        * but for i386 the conversion to ulong for the argument will
-        * clip it off.
-        */
-       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PHYSICAL_PAGE_MASK);
-       return phys;
-}
-#endif
-
-#ifdef CONFIG_X86_PAE
-static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
-{
-       pte_t pte;
-
-       pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \
-                                       (pgprot_val(pgprot) >> 32);
-       pte.pte_high &= (__supported_pte_mask >> 32);
-       pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \
-                                                       __supported_pte_mask;
-       return pte;
-}
-#else
-#define pfn_pte_ma(pfn, prot)  __pte_ma(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-#endif
-
-#define __pte_ma(x)    ((pte_t) { (x) } )
-
-#else /* !CONFIG_XEN */
-
-#define pfn_to_mfn(pfn) (pfn)
-#define mfn_to_pfn(mfn) (mfn)
-#define mfn_to_local_pfn(mfn) (mfn)
-#define set_phys_to_machine(pfn, mfn) ((void)0)
-#define phys_to_machine_mapping_valid(pfn) (1)
-#define phys_to_machine(phys) ((maddr_t)(phys))
-#define machine_to_phys(mach) ((paddr_t)(mach))
-#define pfn_pte_ma(pfn, prot) pfn_pte(pfn, prot)
-#define __pte_ma(x) __pte(x)
-
-#endif /* !CONFIG_XEN */
-
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
-#endif /* _I386_MADDR_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu.h
deleted file mode 100644 (file)
index 4d7bcb7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __i386_MMU_H
-#define __i386_MMU_H
-
-#include <asm/semaphore.h>
-/*
- * The i386 doesn't have a mmu context, but
- * we put the segment information here.
- *
- * cpu_vm_mask is used to optimize ldt flushing.
- */
-typedef struct { 
-       int size;
-       struct semaphore sem;
-       void *ldt;
-       void *vdso;
-#ifdef CONFIG_XEN
-       int has_foreign_mappings;
-#endif
-} mm_context_t;
-
-/* mm/memory.c:exit_mmap hook */
-extern void _arch_exit_mmap(struct mm_struct *mm);
-#define arch_exit_mmap(_mm) _arch_exit_mmap(_mm)
-
-/* kernel/fork.c:dup_mmap hook */
-extern void _arch_dup_mmap(struct mm_struct *mm);
-#define arch_dup_mmap(mm, oldmm) ((void)(oldmm), _arch_dup_mmap(mm))
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu_context.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu_context.h
deleted file mode 100644 (file)
index d3b50f7..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#ifndef __I386_SCHED_H
-#define __I386_SCHED_H
-
-#include <asm/desc.h>
-#include <asm/atomic.h>
-#include <asm/pgalloc.h>
-#include <asm/tlbflush.h>
-
-/*
- * Used for LDT copy/destruction.
- */
-int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
-void destroy_context(struct mm_struct *mm);
-
-
-static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-{
-#if 0 /* XEN: no lazy tlb */
-       unsigned cpu = smp_processor_id();
-       if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK)
-               per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_LAZY;
-#endif
-}
-
-#define prepare_arch_switch(next)      __prepare_arch_switch()
-
-static inline void __prepare_arch_switch(void)
-{
-       /*
-        * Save away %fs and %gs. No need to save %es and %ds, as those
-        * are always kernel segments while inside the kernel. Must
-        * happen before reload of cr3/ldt (i.e., not in __switch_to).
-        */
-       asm volatile ( "mov %%fs,%0 ; mov %%gs,%1"
-               : "=m" (current->thread.fs),
-                 "=m" (current->thread.gs));
-       asm volatile ( "movl %0,%%fs ; movl %0,%%gs"
-               : : "r" (0) );
-}
-
-extern void mm_pin(struct mm_struct *mm);
-extern void mm_unpin(struct mm_struct *mm);
-void mm_pin_all(void);
-
-static inline void switch_mm(struct mm_struct *prev,
-                            struct mm_struct *next,
-                            struct task_struct *tsk)
-{
-       int cpu = smp_processor_id();
-       struct mmuext_op _op[2], *op = _op;
-
-       if (likely(prev != next)) {
-               BUG_ON(!xen_feature(XENFEAT_writable_page_tables) &&
-                      !test_bit(PG_pinned, &virt_to_page(next->pgd)->flags));
-
-               /* stop flush ipis for the previous mm */
-               cpu_clear(cpu, prev->cpu_vm_mask);
-#if 0 /* XEN: no lazy tlb */
-               per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK;
-               per_cpu(cpu_tlbstate, cpu).active_mm = next;
-#endif
-               cpu_set(cpu, next->cpu_vm_mask);
-
-               /* Re-load page tables: load_cr3(next->pgd) */
-               op->cmd = MMUEXT_NEW_BASEPTR;
-               op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
-               op++;
-
-               /*
-                * load the LDT, if the LDT is different:
-                */
-               if (unlikely(prev->context.ldt != next->context.ldt)) {
-                       /* load_LDT_nolock(&next->context, cpu) */
-                       op->cmd = MMUEXT_SET_LDT;
-                       op->arg1.linear_addr = (unsigned long)next->context.ldt;
-                       op->arg2.nr_ents     = next->context.size;
-                       op++;
-               }
-
-               BUG_ON(HYPERVISOR_mmuext_op(_op, op-_op, NULL, DOMID_SELF));
-       }
-#if 0 /* XEN: no lazy tlb */
-       else {
-               per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK;
-               BUG_ON(per_cpu(cpu_tlbstate, cpu).active_mm != next);
-
-               if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
-                       /* We were in lazy tlb mode and leave_mm disabled 
-                        * tlb flush IPI delivery. We must reload %cr3.
-                        */
-                       load_cr3(next->pgd);
-                       load_LDT_nolock(&next->context, cpu);
-               }
-       }
-#endif
-}
-
-#define deactivate_mm(tsk, mm) \
-       asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0))
-
-static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
-{
-       if (!test_bit(PG_pinned, &virt_to_page(next->pgd)->flags))
-               mm_pin(next);
-       switch_mm(prev, next, NULL);
-}
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h
deleted file mode 100644 (file)
index f009117..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-#ifndef _I386_PAGE_H
-#define _I386_PAGE_H
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT     12
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#define PAGE_MASK      (~(PAGE_SIZE-1))
-
-#ifdef CONFIG_X86_PAE
-#define __PHYSICAL_MASK_SHIFT  40
-#define __PHYSICAL_MASK                ((1ULL << __PHYSICAL_MASK_SHIFT) - 1)
-#define PHYSICAL_PAGE_MASK     (~((1ULL << PAGE_SHIFT) - 1) & __PHYSICAL_MASK)
-#else
-#define __PHYSICAL_MASK_SHIFT  32
-#define __PHYSICAL_MASK                (~0UL)
-#define PHYSICAL_PAGE_MASK     (PAGE_MASK & __PHYSICAL_MASK)
-#endif
-
-#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
-#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
-
-#ifdef __KERNEL__
-
-/*
- * Need to repeat this here in order to not include pgtable.h (which in turn
- * depends on definitions made here), but to be able to use the symbolic
- * below. The preprocessor will warn if the two definitions aren't identical.
- */
-#define _PAGE_PRESENT  0x001
-
-#ifndef __ASSEMBLY__
-
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <asm/bug.h>
-#include <xen/interface/xen.h>
-#include <xen/features.h>
-
-#define arch_free_page(_page,_order)           \
-({     int foreign = PageForeign(_page);       \
-       if (foreign)                            \
-               PageForeignDestructor(_page);   \
-       foreign;                                \
-})
-#define HAVE_ARCH_FREE_PAGE
-
-#ifdef CONFIG_X86_USE_3DNOW
-
-#include <asm/mmx.h>
-
-#define clear_page(page)       mmx_clear_page((void *)(page))
-#define copy_page(to,from)     mmx_copy_page(to,from)
-
-#else
-
-#define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr)
-#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-/*
- *     On older X86 processors it's not a win to use MMX here it seems.
- *     Maybe the K6-III ?
- */
-#define clear_page(page)       memset((void *)(page), 0, PAGE_SIZE)
-#define copy_page(to,from)     memcpy((void *)(to), (void *)(from), PAGE_SIZE)
-
-#endif
-
-#define clear_user_page(page, vaddr, pg)       clear_page(page)
-#define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
-
-/*
- * These are used to make use of C type-checking..
- */
-extern int nx_enabled;
-#ifdef CONFIG_X86_PAE
-extern unsigned long long __supported_pte_mask;
-typedef struct { unsigned long pte_low, pte_high; } pte_t;
-typedef struct { unsigned long long pmd; } pmd_t;
-typedef struct { unsigned long long pgd; } pgd_t;
-typedef struct { unsigned long long pgprot; } pgprot_t;
-#define pgprot_val(x)  ((x).pgprot)
-#include <asm/maddr.h>
-#define __pte(x) ({ unsigned long long _x = (x);        \
-    if (_x & _PAGE_PRESENT) _x = pte_phys_to_machine(_x);   \
-    ((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); })
-#define __pgd(x) ({ unsigned long long _x = (x); \
-    (pgd_t) {((_x) & _PAGE_PRESENT) ? pte_phys_to_machine(_x) : (_x)}; })
-#define __pmd(x) ({ unsigned long long _x = (x); \
-    (pmd_t) {((_x) & _PAGE_PRESENT) ? pte_phys_to_machine(_x) : (_x)}; })
-static inline unsigned long long __pte_val(pte_t x)
-{
-       return ((unsigned long long)x.pte_high << 32) | x.pte_low;
-}
-static inline unsigned long long pte_val(pte_t x)
-{
-       unsigned long long ret = __pte_val(x);
-       if (x.pte_low & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-       return ret;
-}
-#define __pmd_val(x) ((x).pmd)
-static inline unsigned long long pmd_val(pmd_t x)
-{
-       unsigned long long ret = __pmd_val(x);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret) ret = pte_machine_to_phys(ret) | _PAGE_PRESENT;
-#else
-       if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-#endif
-       return ret;
-}
-#define __pud_val(x) __pgd_val((x).pgd)
-#define __pgd_val(x) ((x).pgd)
-static inline unsigned long long pgd_val(pgd_t x)
-{
-       unsigned long long ret = __pgd_val(x);
-       if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-       return ret;
-}
-#define HPAGE_SHIFT    21
-#else
-typedef struct { unsigned long pte_low; } pte_t;
-typedef struct { unsigned long pgd; } pgd_t;
-typedef struct { unsigned long pgprot; } pgprot_t;
-#define pgprot_val(x)  ((x).pgprot)
-#include <asm/maddr.h>
-#define boot_pte_t pte_t /* or would you rather have a typedef */
-#define __pte_val(x) ((x).pte_low)
-#define pte_val(x) (__pte_val(x) & _PAGE_PRESENT ? \
-                    machine_to_phys(__pte_val(x)) : \
-                    __pte_val(x))
-#define __pte(x) ({ unsigned long _x = (x); \
-    (pte_t) {((_x) & _PAGE_PRESENT) ? phys_to_machine(_x) : (_x)}; })
-#define __pmd_val(x) __pud_val((x).pud)
-#define __pud_val(x) __pgd_val((x).pgd)
-#define __pgd(x) ({ unsigned long _x = (x); \
-    (pgd_t) {((_x) & _PAGE_PRESENT) ? phys_to_machine(_x) : (_x)}; })
-#define __pgd_val(x) ((x).pgd)
-static inline unsigned long pgd_val(pgd_t x)
-{
-       unsigned long ret = __pgd_val(x);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret) ret = machine_to_phys(ret) | _PAGE_PRESENT;
-#else
-       if (ret & _PAGE_PRESENT) ret = machine_to_phys(ret);
-#endif
-       return ret;
-}
-#define HPAGE_SHIFT    22
-#endif
-#define PTE_MASK       PHYSICAL_PAGE_MASK
-
-#ifdef CONFIG_HUGETLB_PAGE
-#define HPAGE_SIZE     ((1UL) << HPAGE_SHIFT)
-#define HPAGE_MASK     (~(HPAGE_SIZE - 1))
-#define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
-#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
-#endif
-
-#define __pgprot(x)    ((pgprot_t) { (x) } )
-
-#endif /* !__ASSEMBLY__ */
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-/*
- * This handles the memory map.. We could make this a config
- * option, but too many people screw it up, and too few need
- * it.
- *
- * A __PAGE_OFFSET of 0xC0000000 means that the kernel has
- * a virtual address space of one gigabyte, which limits the
- * amount of physical memory you can use to about 950MB. 
- *
- * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
- * and CONFIG_HIGHMEM64G options in the kernel configuration.
- */
-
-#ifndef __ASSEMBLY__
-
-struct vm_area_struct;
-
-/*
- * This much address space is reserved for vmalloc() and iomap()
- * as well as fixmap mappings.
- */
-extern unsigned int __VMALLOC_RESERVE;
-
-extern int sysctl_legacy_va_layout;
-
-extern int page_is_ram(unsigned long pagenr);
-
-#endif /* __ASSEMBLY__ */
-
-#ifdef __ASSEMBLY__
-#define __PAGE_OFFSET          CONFIG_PAGE_OFFSET
-#define __PHYSICAL_START       CONFIG_PHYSICAL_START
-#else
-#define __PAGE_OFFSET          ((unsigned long)CONFIG_PAGE_OFFSET)
-#define __PHYSICAL_START       ((unsigned long)CONFIG_PHYSICAL_START)
-#endif
-#define __KERNEL_START         (__PAGE_OFFSET + __PHYSICAL_START)
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-#undef LOAD_OFFSET
-#define LOAD_OFFSET            0
-#endif
-
-#define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
-#define VMALLOC_RESERVE                ((unsigned long)__VMALLOC_RESERVE)
-#define MAXMEM                 (__FIXADDR_TOP-__PAGE_OFFSET-__VMALLOC_RESERVE)
-#define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
-#define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)         ((pfn) < max_mapnr)
-#endif /* CONFIG_FLATMEM */
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-
-#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-
-#define VM_DATA_DEFAULT_FLAGS \
-       (VM_READ | VM_WRITE | \
-       ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
-                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
-
-#define __HAVE_ARCH_GATE_AREA 1
-#endif /* __KERNEL__ */
-
-#endif /* _I386_PAGE_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/param.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/param.h
deleted file mode 100644 (file)
index 745dc5b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _ASMi386_PARAM_H
-#define _ASMi386_PARAM_H
-
-#ifdef __KERNEL__
-# define HZ            CONFIG_HZ       /* Internal kernel timer frequency */
-# define USER_HZ       100             /* .. some user interfaces are in "ticks" */
-# define CLOCKS_PER_SEC                (USER_HZ)       /* like times() */
-#endif
-
-#ifndef HZ
-#define HZ 100
-#endif
-
-#define EXEC_PAGESIZE  4096
-
-#ifndef NOGROUP
-#define NOGROUP                (-1)
-#endif
-
-#define MAXHOSTNAMELEN 64      /* max length of hostname */
-#define COMMAND_LINE_SIZE 256
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h
deleted file mode 100644 (file)
index 14c1d27..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-#ifndef __i386_PCI_H
-#define __i386_PCI_H
-
-
-#ifdef __KERNEL__
-#include <linux/mm.h>          /* for struct page */
-
-/* Can be used to override the logic in pci_scan_bus for skipping
-   already-configured bus numbers - to be used for buggy BIOSes
-   or architectures with incomplete PCI setup by the loader */
-
-#ifdef CONFIG_PCI
-extern unsigned int pcibios_assign_all_busses(void);
-#else
-#define pcibios_assign_all_busses()    0
-#endif
-#define pcibios_scan_all_fns(a, b)     0
-
-extern unsigned long pci_mem_start;
-#define PCIBIOS_MIN_IO         0x1000
-#define PCIBIOS_MIN_MEM                (pci_mem_start)
-
-#define PCIBIOS_MIN_CARDBUS_IO 0x4000
-
-void pcibios_config_init(void);
-struct pci_bus * pcibios_scan_root(int bus);
-
-void pcibios_set_master(struct pci_dev *dev);
-void pcibios_penalize_isa_irq(int irq, int active);
-struct irq_routing_table *pcibios_get_irq_routing_table(void);
-int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
-
-/* Dynamic DMA mapping stuff.
- * i386 has everything mapped statically.
- */
-
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <asm/scatterlist.h>
-#include <linux/string.h>
-#include <asm/io.h>
-
-struct pci_dev;
-
-#ifdef CONFIG_SWIOTLB
-
-
-/* On Xen we use SWIOTLB instead of blk-specific bounce buffers. */
-#define PCI_DMA_BUS_IS_PHYS    (0)
-
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
-       dma_addr_t ADDR_NAME;
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
-       __u32 LEN_NAME;
-#define pci_unmap_addr(PTR, ADDR_NAME)                 \
-       ((PTR)->ADDR_NAME)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
-       (((PTR)->ADDR_NAME) = (VAL))
-#define pci_unmap_len(PTR, LEN_NAME)                   \
-       ((PTR)->LEN_NAME)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
-       (((PTR)->LEN_NAME) = (VAL))
-
-#else
-
-/* The PCI address space does equal the physical memory
- * address space.  The networking and block device layers use
- * this boolean for bounce buffer decisions.
- */
-#define PCI_DMA_BUS_IS_PHYS    (1)
-
-/* pci_unmap_{page,single} is a nop so... */
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-#define pci_unmap_addr(PTR, ADDR_NAME)         (0)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)        do { } while (0)
-#define pci_unmap_len(PTR, LEN_NAME)           (0)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)  do { } while (0)
-
-#endif
-
-/* This is always fine. */
-#define pci_dac_dma_supported(pci_dev, mask)   (1)
-
-static inline dma64_addr_t
-pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction)
-{
-       return ((dma64_addr_t) page_to_phys(page) +
-               (dma64_addr_t) offset);
-}
-
-static inline struct page *
-pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
-{
-       return pfn_to_page(dma_addr >> PAGE_SHIFT);
-}
-
-static inline unsigned long
-pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr)
-{
-       return (dma_addr & ~PAGE_MASK);
-}
-
-static inline void
-pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-{
-}
-
-static inline void
-pci_dac_dma_sync_single_for_device(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-{
-       flush_write_buffers();
-}
-
-#define HAVE_PCI_MMAP
-extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
-                              enum pci_mmap_state mmap_state, int write_combine);
-
-
-static inline void pcibios_add_platform_entries(struct pci_dev *dev)
-{
-}
-
-#ifdef CONFIG_PCI
-static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-                                       enum pci_dma_burst_strategy *strat,
-                                       unsigned long *strategy_parameter)
-{
-       *strat = PCI_DMA_BURST_INFINITY;
-       *strategy_parameter = ~0UL;
-}
-#endif
-
-#endif /* __KERNEL__ */
-
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-#include <xen/pcifront.h>
-#endif /* CONFIG_XEN_PCIDEV_FRONTEND */
-
-/* implement the pci_ DMA API in terms of the generic device dma_ one */
-#include <asm-generic/pci-dma-compat.h>
-
-/* generic pci stuff */
-#include <asm-generic/pci.h>
-
-#endif /* __i386_PCI_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgalloc.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgalloc.h
deleted file mode 100644 (file)
index ad7f5c4..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef _I386_PGALLOC_H
-#define _I386_PGALLOC_H
-
-#include <asm/fixmap.h>
-#include <linux/threads.h>
-#include <linux/mm.h>          /* for struct page */
-#include <asm/io.h>            /* for phys_to_virt and page_to_pseudophys */
-
-#define pmd_populate_kernel(mm, pmd, pte) \
-               set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
-
-#define pmd_populate(mm, pmd, pte)                                     \
-do {                                                                   \
-       unsigned long pfn = page_to_pfn(pte);                           \
-       if (test_bit(PG_pinned, &virt_to_page((mm)->pgd)->flags)) {     \
-               if (!PageHighMem(pte))                                  \
-                       BUG_ON(HYPERVISOR_update_va_mapping(            \
-                         (unsigned long)__va(pfn << PAGE_SHIFT),       \
-                         pfn_pte(pfn, PAGE_KERNEL_RO), 0));            \
-               else if (!test_and_set_bit(PG_pinned, &pte->flags))     \
-                       kmap_flush_unused();                            \
-               set_pmd(pmd,                                            \
-                       __pmd(_PAGE_TABLE + ((paddr_t)pfn << PAGE_SHIFT))); \
-       } else                                                  \
-               *(pmd) = __pmd(_PAGE_TABLE + ((paddr_t)pfn << PAGE_SHIFT)); \
-} while (0)
-
-/*
- * Allocate and free page tables.
- */
-extern pgd_t *pgd_alloc(struct mm_struct *);
-extern void pgd_free(pgd_t *pgd);
-
-extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
-extern struct page *pte_alloc_one(struct mm_struct *, unsigned long);
-
-static inline void pte_free_kernel(pte_t *pte)
-{
-       free_page((unsigned long)pte);
-       make_lowmem_page_writable(pte, XENFEAT_writable_page_tables);
-}
-
-extern void pte_free(struct page *pte);
-
-#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
-
-#ifdef CONFIG_X86_PAE
-/*
- * In the PAE case we free the pmds as part of the pgd.
- */
-#define pmd_alloc_one(mm, addr)                ({ BUG(); ((pmd_t *)2); })
-#define pmd_free(x)                    do { } while (0)
-#define __pmd_free_tlb(tlb,x)          do { } while (0)
-#define pud_populate(mm, pmd, pte)     BUG()
-#endif
-
-#define check_pgt_cache()      do { } while (0)
-
-#endif /* _I386_PGALLOC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h
deleted file mode 100644 (file)
index bd6346f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef _I386_PGTABLE_2LEVEL_DEFS_H
-#define _I386_PGTABLE_2LEVEL_DEFS_H
-
-#define HAVE_SHARED_KERNEL_PMD 0
-
-/*
- * traditional i386 two-level paging structure:
- */
-
-#define PGDIR_SHIFT    22
-#define PTRS_PER_PGD   1024
-
-/*
- * the i386 is two-level, so we don't really have any
- * PMD directory physically.
- */
-
-#define PTRS_PER_PTE   1024
-
-#endif /* _I386_PGTABLE_2LEVEL_DEFS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
deleted file mode 100644 (file)
index 28ce247..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef _I386_PGTABLE_2LEVEL_H
-#define _I386_PGTABLE_2LEVEL_H
-
-#include <asm-generic/pgtable-nopmd.h>
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %08lx (pfn %05lx).\n", __FILE__, __LINE__, \
-              __pte_val(e), pte_pfn(e))
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %08lx (pfn %05lx).\n", __FILE__, __LINE__, \
-              __pgd_val(e), pgd_val(e) >> PAGE_SHIFT)
-
-/*
- * Certain architectures need to do special things when PTEs
- * within a page table are directly modified.  Thus, the following
- * hook is made available.
- */
-#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
-
-#define set_pte_at(_mm,addr,ptep,pteval) do {                          \
-       if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-           HYPERVISOR_update_va_mapping((addr), (pteval), 0))          \
-               set_pte((ptep), (pteval));                              \
-} while (0)
-
-#define set_pte_at_sync(_mm,addr,ptep,pteval) do {                     \
-       if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-           HYPERVISOR_update_va_mapping((addr), (pteval), UVMF_INVLPG)) { \
-               set_pte((ptep), (pteval));                              \
-               xen_invlpg((addr));                                     \
-       }                                                               \
-} while (0)
-
-#define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
-
-#define set_pmd(pmdptr, pmdval) xen_l2_entry_update((pmdptr), (pmdval))
-
-#define pte_clear(mm,addr,xp)  do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
-#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
-
-#define pte_none(x) (!(x).pte_low)
-
-static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-       if (!pte_none(pte)) {
-               if (mm != &init_mm)
-                       pte = __pte_ma(xchg(&ptep->pte_low, 0));
-               else
-                       HYPERVISOR_update_va_mapping(addr, __pte(0), 0);
-       }
-       return pte;
-}
-
-#define ptep_clear_flush(vma, addr, ptep)                      \
-({                                                             \
-       pte_t *__ptep = (ptep);                                 \
-       pte_t __res = *__ptep;                                  \
-       if (!pte_none(__res) &&                                 \
-           ((vma)->vm_mm != current->mm ||                     \
-            HYPERVISOR_update_va_mapping(addr, __pte(0),       \
-                       (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-                               UVMF_INVLPG|UVMF_MULTI))) {     \
-               __ptep->pte_low = 0;                            \
-               flush_tlb_page(vma, addr);                      \
-       }                                                       \
-       __res;                                                  \
-})
-
-#define pte_same(a, b)         ((a).pte_low == (b).pte_low)
-
-#define __pte_mfn(_pte) ((_pte).pte_low >> PAGE_SHIFT)
-#define pte_mfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
-       __pte_mfn(_pte) : pfn_to_mfn(__pte_mfn(_pte)))
-#define pte_pfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
-       mfn_to_local_pfn(__pte_mfn(_pte)) : __pte_mfn(_pte))
-
-#define pte_page(_pte) pfn_to_page(pte_pfn(_pte))
-
-#define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-#define pfn_pmd(pfn, prot)     __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-
-/*
- * All present user pages are user-executable:
- */
-static inline int pte_exec(pte_t pte)
-{
-       return pte_user(pte);
-}
-
-/*
- * All present pages are kernel-executable:
- */
-static inline int pte_exec_kernel(pte_t pte)
-{
-       return 1;
-}
-
-/*
- * Bits 0, 6 and 7 are taken, split up the 29 bits of offset
- * into this range:
- */
-#define PTE_FILE_MAX_BITS      29
-
-#define pte_to_pgoff(pte) \
-       ((((pte).pte_low >> 1) & 0x1f ) + (((pte).pte_low >> 8) << 5 ))
-
-#define pgoff_to_pte(off) \
-       ((pte_t) { (((off) & 0x1f) << 1) + (((off) >> 5) << 8) + _PAGE_FILE })
-
-/* Encode and de-code a swap entry */
-#define __swp_type(x)                  (((x).val >> 1) & 0x1f)
-#define __swp_offset(x)                        ((x).val >> 8)
-#define __swp_entry(type, offset)      ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
-#define __pte_to_swp_entry(pte)                ((swp_entry_t) { (pte).pte_low })
-#define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
-
-void vmalloc_sync_all(void);
-
-#endif /* _I386_PGTABLE_2LEVEL_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h
deleted file mode 100644 (file)
index 148c8d9..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _I386_PGTABLE_3LEVEL_DEFS_H
-#define _I386_PGTABLE_3LEVEL_DEFS_H
-
-#define HAVE_SHARED_KERNEL_PMD 0
-
-/*
- * PGDIR_SHIFT determines what a top-level page table entry can map
- */
-#define PGDIR_SHIFT    30
-#define PTRS_PER_PGD   4
-
-/*
- * PMD_SHIFT determines the size of the area a middle-level
- * page table can map
- */
-#define PMD_SHIFT      21
-#define PTRS_PER_PMD   512
-
-/*
- * entries per page directory level
- */
-#define PTRS_PER_PTE   512
-
-#endif /* _I386_PGTABLE_3LEVEL_DEFS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
deleted file mode 100644 (file)
index 645afb6..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-#ifndef _I386_PGTABLE_3LEVEL_H
-#define _I386_PGTABLE_3LEVEL_H
-
-#include <asm-generic/pgtable-nopud.h>
-
-/*
- * Intel Physical Address Extension (PAE) Mode - three-level page
- * tables on PPro+ CPUs.
- *
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %p(%016Lx pfn %08lx).\n", __FILE__, __LINE__, \
-              &(e), __pte_val(e), pte_pfn(e))
-#define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
-              &(e), __pmd_val(e), (pmd_val(e) & PTE_MASK) >> PAGE_SHIFT)
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
-              &(e), __pgd_val(e), (pgd_val(e) & PTE_MASK) >> PAGE_SHIFT)
-
-#define pud_none(pud)                          0
-#define pud_bad(pud)                           0
-#define pud_present(pud)                       1
-
-/*
- * Is the pte executable?
- */
-static inline int pte_x(pte_t pte)
-{
-       return !(__pte_val(pte) & _PAGE_NX);
-}
-
-/*
- * All present user-pages with !NX bit are user-executable:
- */
-static inline int pte_exec(pte_t pte)
-{
-       return pte_user(pte) && pte_x(pte);
-}
-/*
- * All present pages with !NX bit are kernel-executable:
- */
-static inline int pte_exec_kernel(pte_t pte)
-{
-       return pte_x(pte);
-}
-
-/* Rules for using set_pte: the pte being assigned *must* be
- * either not present or in a state where the hardware will
- * not attempt to update the pte.  In places where this is
- * not possible, use pte_get_and_clear to obtain the old pte
- * value and then use set_pte to update it.  -ben
- */
-#define __HAVE_ARCH_SET_PTE_ATOMIC
-
-static inline void set_pte(pte_t *ptep, pte_t pte)
-{
-       ptep->pte_high = pte.pte_high;
-       smp_wmb();
-       ptep->pte_low = pte.pte_low;
-}
-#define set_pte_atomic(pteptr,pteval) \
-               set_64bit((unsigned long long *)(pteptr),__pte_val(pteval))
-
-#define set_pte_at(_mm,addr,ptep,pteval) do {                          \
-       if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-           HYPERVISOR_update_va_mapping((addr), (pteval), 0))          \
-               set_pte((ptep), (pteval));                              \
-} while (0)
-
-#define set_pte_at_sync(_mm,addr,ptep,pteval) do {                     \
-       if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-           HYPERVISOR_update_va_mapping((addr), (pteval), UVMF_INVLPG)) { \
-               set_pte((ptep), (pteval));                              \
-               xen_invlpg((addr));                                     \
-       }                                                               \
-} while (0)
-
-#define set_pmd(pmdptr,pmdval)                         \
-               xen_l2_entry_update((pmdptr), (pmdval))
-#define set_pud(pudptr,pudval) \
-               xen_l3_entry_update((pudptr), (pudval))
-
-/*
- * Pentium-II erratum A13: in PAE mode we explicitly have to flush
- * the TLB via cr3 if the top-level pgd is changed...
- * We do not let the generic code free and clear pgd entries due to
- * this erratum.
- */
-static inline void pud_clear (pud_t * pud) { }
-
-#define pud_page(pud) \
-((struct page *) __va(pud_val(pud) & PAGE_MASK))
-
-#define pud_page_kernel(pud) \
-((unsigned long) __va(pud_val(pud) & PAGE_MASK))
-
-
-/* Find an entry in the second-level page table.. */
-#define pmd_offset(pud, address) ((pmd_t *) pud_page(*(pud)) + \
-                       pmd_index(address))
-
-static inline int pte_none(pte_t pte)
-{
-       return !(pte.pte_low | pte.pte_high);
-}
-
-/*
- * For PTEs and PDEs, we must clear the P-bit first when clearing a page table
- * entry, so clear the bottom half first and enforce ordering with a compiler
- * barrier.
- */
-static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       if ((mm != current->mm && mm != &init_mm)
-           || HYPERVISOR_update_va_mapping(addr, __pte(0), 0)) {
-               ptep->pte_low = 0;
-               smp_wmb();
-               ptep->pte_high = 0;
-       }
-}
-
-#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
-
-static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-       if (!pte_none(pte)) {
-               if (mm != &init_mm) {
-                       uint64_t val = __pte_val(pte);
-                       if (__cmpxchg64(ptep, val, 0) != val) {
-                               /* xchg acts as a barrier before the setting of the high bits */
-                               pte.pte_low = xchg(&ptep->pte_low, 0);
-                               pte.pte_high = ptep->pte_high;
-                               ptep->pte_high = 0;
-                       }
-               } else
-                       HYPERVISOR_update_va_mapping(addr, __pte(0), 0);
-       }
-       return pte;
-}
-
-#define ptep_clear_flush(vma, addr, ptep)                      \
-({                                                             \
-       pte_t *__ptep = (ptep);                                 \
-       pte_t __res = *__ptep;                                  \
-       if (!pte_none(__res) &&                                 \
-           ((vma)->vm_mm != current->mm ||                     \
-            HYPERVISOR_update_va_mapping(addr, __pte(0),       \
-                       (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-                               UVMF_INVLPG|UVMF_MULTI))) {     \
-               __ptep->pte_low = 0;                            \
-               smp_wmb();                                      \
-               __ptep->pte_high = 0;                           \
-               flush_tlb_page(vma, addr);                      \
-       }                                                       \
-       __res;                                                  \
-})
-
-static inline int pte_same(pte_t a, pte_t b)
-{
-       return a.pte_low == b.pte_low && a.pte_high == b.pte_high;
-}
-
-#define pte_page(x)    pfn_to_page(pte_pfn(x))
-
-#define __pte_mfn(_pte) (((_pte).pte_low >> PAGE_SHIFT) | \
-                        ((_pte).pte_high << (32-PAGE_SHIFT)))
-#define pte_mfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
-       __pte_mfn(_pte) : pfn_to_mfn(__pte_mfn(_pte)))
-#define pte_pfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
-       mfn_to_local_pfn(__pte_mfn(_pte)) : __pte_mfn(_pte))
-
-extern unsigned long long __supported_pte_mask;
-
-static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
-{
-       return __pte((((unsigned long long)page_nr << PAGE_SHIFT) |
-                       pgprot_val(pgprot)) & __supported_pte_mask);
-}
-
-static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
-{
-       return __pmd((((unsigned long long)page_nr << PAGE_SHIFT) |
-                       pgprot_val(pgprot)) & __supported_pte_mask);
-}
-
-/*
- * Bits 0, 6 and 7 are taken in the low part of the pte,
- * put the 32 bits of offset into the high part.
- */
-#define pte_to_pgoff(pte) ((pte).pte_high)
-#define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
-#define PTE_FILE_MAX_BITS       32
-
-/* Encode and de-code a swap entry */
-#define __swp_type(x)                  (((x).val) & 0x1f)
-#define __swp_offset(x)                        ((x).val >> 5)
-#define __swp_entry(type, offset)      ((swp_entry_t){(type) | (offset) << 5})
-#define __pte_to_swp_entry(pte)                ((swp_entry_t){ (pte).pte_high })
-#define __swp_entry_to_pte(x)          ((pte_t){ 0, (x).val })
-
-#define __pmd_free_tlb(tlb, x)         do { } while (0)
-
-void vmalloc_sync_all(void);
-
-#endif /* _I386_PGTABLE_3LEVEL_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h
deleted file mode 100644 (file)
index a6defb4..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-#ifndef _I386_PGTABLE_H
-#define _I386_PGTABLE_H
-
-#include <asm/hypervisor.h>
-
-/*
- * The Linux memory management assumes a three-level page table setup. On
- * the i386, we use that, but "fold" the mid level into the top-level page
- * table, so that we physically have the same two-level page table as the
- * i386 mmu expects.
- *
- * This file contains the functions and defines necessary to modify and use
- * the i386 page table tree.
- */
-#ifndef __ASSEMBLY__
-#include <asm/processor.h>
-#include <asm/fixmap.h>
-#include <linux/threads.h>
-
-#ifndef _I386_BITOPS_H
-#include <asm/bitops.h>
-#endif
-
-#include <linux/slab.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-
-/* Is this pagetable pinned? */
-#define PG_pinned      PG_arch_1
-
-struct mm_struct;
-struct vm_area_struct;
-
-/*
- * ZERO_PAGE is a global shared page that is always zero: used
- * for zero-mapped memory areas etc..
- */
-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-extern unsigned long empty_zero_page[1024];
-extern pgd_t *swapper_pg_dir;
-extern kmem_cache_t *pgd_cache;
-extern kmem_cache_t *pmd_cache;
-extern spinlock_t pgd_lock;
-extern struct page *pgd_list;
-
-void pmd_ctor(void *, kmem_cache_t *, unsigned long);
-void pgd_ctor(void *, kmem_cache_t *, unsigned long);
-void pgd_dtor(void *, kmem_cache_t *, unsigned long);
-void pgtable_cache_init(void);
-void paging_init(void);
-
-/*
- * The Linux x86 paging architecture is 'compile-time dual-mode', it
- * implements both the traditional 2-level x86 page tables and the
- * newer 3-level PAE-mode page tables.
- */
-#ifdef CONFIG_X86_PAE
-# include <asm/pgtable-3level-defs.h>
-# define PMD_SIZE      (1UL << PMD_SHIFT)
-# define PMD_MASK      (~(PMD_SIZE-1))
-#else
-# include <asm/pgtable-2level-defs.h>
-#endif
-
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-#define USER_PTRS_PER_PGD      (TASK_SIZE/PGDIR_SIZE)
-#define FIRST_USER_ADDRESS     0
-
-#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
-#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
-
-#define TWOLEVEL_PGDIR_SHIFT   22
-#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT)
-#define BOOT_KERNEL_PGD_PTRS (1024-BOOT_USER_PGD_PTRS)
-
-/* Just any arbitrary offset to the start of the vmalloc VM area: the
- * current 8MB value just means that there will be a 8MB "hole" after the
- * physical memory until the kernel virtual memory starts.  That means that
- * any out-of-bounds memory accesses will hopefully be caught.
- * The vmalloc() routines leaves a hole of 4kB between each vmalloced
- * area for the same reason. ;)
- */
-#define VMALLOC_OFFSET (8*1024*1024)
-#define VMALLOC_START  (((unsigned long) high_memory + vmalloc_earlyreserve + \
-                       2*VMALLOC_OFFSET-1) & ~(VMALLOC_OFFSET-1))
-#ifdef CONFIG_HIGHMEM
-# define VMALLOC_END   (PKMAP_BASE-2*PAGE_SIZE)
-#else
-# define VMALLOC_END   (FIXADDR_START-2*PAGE_SIZE)
-#endif
-
-/*
- * _PAGE_PSE set in the page directory entry just means that
- * the page directory entry points directly to a 4MB-aligned block of
- * memory. 
- */
-#define _PAGE_BIT_PRESENT      0
-#define _PAGE_BIT_RW           1
-#define _PAGE_BIT_USER         2
-#define _PAGE_BIT_PWT          3
-#define _PAGE_BIT_PCD          4
-#define _PAGE_BIT_ACCESSED     5
-#define _PAGE_BIT_DIRTY                6
-#define _PAGE_BIT_PSE          7       /* 4 MB (or 2MB) page, Pentium+, if present.. */
-#define _PAGE_BIT_GLOBAL       8       /* Global TLB entry PPro+ */
-#define _PAGE_BIT_UNUSED1      9       /* available for programmer */
-#define _PAGE_BIT_UNUSED2      10
-#define _PAGE_BIT_UNUSED3      11
-#define _PAGE_BIT_NX           63
-
-#define _PAGE_PRESENT  0x001
-#define _PAGE_RW       0x002
-#define _PAGE_USER     0x004
-#define _PAGE_PWT      0x008
-#define _PAGE_PCD      0x010
-#define _PAGE_ACCESSED 0x020
-#define _PAGE_DIRTY    0x040
-#define _PAGE_PSE      0x080   /* 4 MB (or 2MB) page, Pentium+, if present.. */
-#define _PAGE_GLOBAL   0x100   /* Global TLB entry PPro+ */
-#define _PAGE_UNUSED1  0x200   /* available for programmer */
-#define _PAGE_UNUSED2  0x400
-#define _PAGE_UNUSED3  0x800
-
-/* If _PAGE_PRESENT is clear, we use these: */
-#define _PAGE_FILE     0x040   /* nonlinear file mapping, saved PTE; unset:swap */
-#define _PAGE_PROTNONE 0x080   /* if the user mapped it with PROT_NONE;
-                                  pte_present gives true */
-#ifdef CONFIG_X86_PAE
-#define _PAGE_NX       (1ULL<<_PAGE_BIT_NX)
-#else
-#define _PAGE_NX       0
-#endif
-
-#define _PAGE_TABLE    (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-#define _KERNPG_TABLE  (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
-#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
-
-#define PAGE_NONE \
-       __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-#define PAGE_SHARED \
-       __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-
-#define PAGE_SHARED_EXEC \
-       __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_COPY_NOEXEC \
-       __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-#define PAGE_COPY_EXEC \
-       __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_COPY \
-       PAGE_COPY_NOEXEC
-#define PAGE_READONLY \
-       __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-#define PAGE_READONLY_EXEC \
-       __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-
-#define _PAGE_KERNEL \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
-#define _PAGE_KERNEL_EXEC \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
-
-extern unsigned long long __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
-#define __PAGE_KERNEL_RO               (__PAGE_KERNEL & ~_PAGE_RW)
-#define __PAGE_KERNEL_NOCACHE          (__PAGE_KERNEL | _PAGE_PCD)
-#define __PAGE_KERNEL_LARGE            (__PAGE_KERNEL | _PAGE_PSE)
-#define __PAGE_KERNEL_LARGE_EXEC       (__PAGE_KERNEL_EXEC | _PAGE_PSE)
-
-#define PAGE_KERNEL            __pgprot(__PAGE_KERNEL)
-#define PAGE_KERNEL_RO         __pgprot(__PAGE_KERNEL_RO)
-#define PAGE_KERNEL_EXEC       __pgprot(__PAGE_KERNEL_EXEC)
-#define PAGE_KERNEL_NOCACHE    __pgprot(__PAGE_KERNEL_NOCACHE)
-#define PAGE_KERNEL_LARGE      __pgprot(__PAGE_KERNEL_LARGE)
-#define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC)
-
-/*
- * The i386 can't do page protection for execute, and considers that
- * the same are read. Also, write permissions imply read permissions.
- * This is the closest we can get..
- */
-#define __P000 PAGE_NONE
-#define __P001 PAGE_READONLY
-#define __P010 PAGE_COPY
-#define __P011 PAGE_COPY
-#define __P100 PAGE_READONLY_EXEC
-#define __P101 PAGE_READONLY_EXEC
-#define __P110 PAGE_COPY_EXEC
-#define __P111 PAGE_COPY_EXEC
-
-#define __S000 PAGE_NONE
-#define __S001 PAGE_READONLY
-#define __S010 PAGE_SHARED
-#define __S011 PAGE_SHARED
-#define __S100 PAGE_READONLY_EXEC
-#define __S101 PAGE_READONLY_EXEC
-#define __S110 PAGE_SHARED_EXEC
-#define __S111 PAGE_SHARED_EXEC
-
-/*
- * Define this if things work differently on an i386 and an i486:
- * it will (on an i486) warn about kernel memory accesses that are
- * done without a 'access_ok(VERIFY_WRITE,..)'
- */
-#undef TEST_ACCESS_OK
-
-/* The boot page tables (all created as a single array) */
-extern unsigned long pg0[];
-
-#define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
-
-/* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
-#define pmd_none(x)    (!(unsigned long)__pmd_val(x))
-#if CONFIG_XEN_COMPAT <= 0x030002
-/* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
-   can temporarily clear it. */
-#define pmd_present(x) (__pmd_val(x))
-#define pmd_bad(x)     ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER & ~_PAGE_PRESENT)) != (_KERNPG_TABLE & ~_PAGE_PRESENT))
-#else
-#define pmd_present(x) (__pmd_val(x) & _PAGE_PRESENT)
-#define pmd_bad(x)     ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-#endif
-
-
-#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-
-/*
- * The following only work if pte_present() is true.
- * Undefined behaviour if not..
- */
-static inline int pte_user(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
-static inline int pte_read(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
-static inline int pte_dirty(pte_t pte)         { return (pte).pte_low & _PAGE_DIRTY; }
-static inline int pte_young(pte_t pte)         { return (pte).pte_low & _PAGE_ACCESSED; }
-static inline int pte_write(pte_t pte)         { return (pte).pte_low & _PAGE_RW; }
-static inline int pte_huge(pte_t pte)          { return (pte).pte_low & _PAGE_PSE; }
-
-/*
- * The following only works if pte_present() is not true.
- */
-static inline int pte_file(pte_t pte)          { return (pte).pte_low & _PAGE_FILE; }
-
-static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte_low &= ~_PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkold(pte_t pte)       { (pte).pte_low &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_RW; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte_low |= _PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte_low |= _PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte_low |= _PAGE_RW; return pte; }
-static inline pte_t pte_mkhuge(pte_t pte)      { (pte).pte_low |= _PAGE_PSE; return pte; }
-
-#ifdef CONFIG_X86_PAE
-# include <asm/pgtable-3level.h>
-#else
-# include <asm/pgtable-2level.h>
-#endif
-
-#define ptep_test_and_clear_dirty(vma, addr, ptep)                     \
-({                                                                     \
-       pte_t __pte = *(ptep);                                          \
-       int __ret = pte_dirty(__pte);                                   \
-       if (__ret) {                                                    \
-               __pte = pte_mkclean(__pte);                             \
-               if ((vma)->vm_mm != current->mm ||                      \
-                   HYPERVISOR_update_va_mapping(addr, __pte, 0))       \
-                       (ptep)->pte_low = __pte.pte_low;                \
-       }                                                               \
-       __ret;                                                          \
-})
-
-#define ptep_test_and_clear_young(vma, addr, ptep)                     \
-({                                                                     \
-       pte_t __pte = *(ptep);                                          \
-       int __ret = pte_young(__pte);                                   \
-       if (__ret)                                                      \
-               __pte = pte_mkold(__pte);                               \
-               if ((vma)->vm_mm != current->mm ||                      \
-                   HYPERVISOR_update_va_mapping(addr, __pte, 0))       \
-                       (ptep)->pte_low = __pte.pte_low;                \
-       __ret;                                                          \
-})
-
-#define ptep_get_and_clear_full(mm, addr, ptep, full)                  \
-       ((full) ? ({                                                    \
-               pte_t __res = *(ptep);                                  \
-               if (test_bit(PG_pinned, &virt_to_page((mm)->pgd)->flags)) \
-                       xen_l1_entry_update(ptep, __pte(0));            \
-               else                                                    \
-                       *(ptep) = __pte(0);                             \
-               __res;                                                  \
-        }) :                                                           \
-        ptep_get_and_clear(mm, addr, ptep))
-
-static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-       if (pte_write(pte))
-               set_pte_at(mm, addr, ptep, pte_wrprotect(pte));
-}
-
-/*
- * clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
- *
- *  dst - pointer to pgd range anwhere on a pgd page
- *  src - ""
- *  count - the number of pgds to copy.
- *
- * dst and src can be on the same page, but the range must not overlap,
- * and must not cross a page boundary.
- */
-static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)
-{
-       memcpy(dst, src, count * sizeof(pgd_t));
-}
-
-/*
- * Macro to mark a page protection value as "uncacheable".  On processors which do not support
- * it, this is a no-op.
- */
-#define pgprot_noncached(prot) ((boot_cpu_data.x86 > 3)                                          \
-                                ? (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT)) : (prot))
-
-/*
- * Conversion functions: convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- */
-
-#define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
-
-static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-{
-       /*
-        * Since this might change the present bit (which controls whether
-        * a pte_t object has undergone p2m translation), we must use
-        * pte_val() on the input pte and __pte() for the return value.
-        */
-       paddr_t pteval = pte_val(pte);
-
-       pteval &= _PAGE_CHG_MASK;
-       pteval |= pgprot_val(newprot);
-#ifdef CONFIG_X86_PAE
-       pteval &= __supported_pte_mask;
-#endif
-       return __pte(pteval);
-}
-
-#define pmd_large(pmd) \
-((__pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
-
-/*
- * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
- *
- * this macro returns the index of the entry in the pgd page which would
- * control the given virtual address
- */
-#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-#define pgd_index_k(addr) pgd_index(addr)
-
-/*
- * pgd_offset() returns a (pgd_t *)
- * pgd_index() is used get the offset into the pgd page's array of pgd_t's;
- */
-#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
-
-/*
- * a shortcut which implies the use of the kernel's pgd, instead
- * of a process's
- */
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-
-/*
- * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD]
- *
- * this macro returns the index of the entry in the pmd page which would
- * control the given virtual address
- */
-#define pmd_index(address) \
-               (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-
-/*
- * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
- *
- * this macro returns the index of the entry in the pte page which would
- * control the given virtual address
- */
-#define pte_index(address) \
-               (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-#define pte_offset_kernel(dir, address) \
-       ((pte_t *) pmd_page_kernel(*(dir)) +  pte_index(address))
-
-#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-
-#define pmd_page_kernel(pmd) \
-               ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
-
-/*
- * Helper function that returns the kernel pagetable entry controlling
- * the virtual address 'address'. NULL means no pagetable entry present.
- * NOTE: the return type is pte_t but if the pmd is PSE then we return it
- * as a pte too.
- */
-extern pte_t *lookup_address(unsigned long address);
-
-/*
- * Make a given kernel text page executable/non-executable.
- * Returns the previous executability setting of that page (which
- * is used to restore the previous state). Used by the SMP bootup code.
- * NOTE: this is an __init function for security reasons.
- */
-#ifdef CONFIG_X86_PAE
- extern int set_kernel_exec(unsigned long vaddr, int enable);
-#else
- static inline int set_kernel_exec(unsigned long vaddr, int enable) { return 0;}
-#endif
-
-extern void noexec_setup(const char *str);
-
-#if defined(CONFIG_HIGHPTE)
-#define pte_offset_map(dir, address) \
-       ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE0) + \
-        pte_index(address))
-#define pte_offset_map_nested(dir, address) \
-       ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE1) + \
-        pte_index(address))
-#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
-#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
-#else
-#define pte_offset_map(dir, address) \
-       ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
-#define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
-#endif
-
-#define __HAVE_ARCH_PTEP_ESTABLISH
-#define ptep_establish(vma, address, ptep, pteval)                     \
-       do {                                                            \
-               if ( likely((vma)->vm_mm == current->mm) ) {            \
-                       BUG_ON(HYPERVISOR_update_va_mapping(address,    \
-                               pteval,                                 \
-                               (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-                                       UVMF_INVLPG|UVMF_MULTI));       \
-               } else {                                                \
-                       xen_l1_entry_update(ptep, pteval);              \
-                       flush_tlb_page(vma, address);                   \
-               }                                                       \
-       } while (0)
-
-/*
- * The i386 doesn't have any external MMU info: the kernel page
- * tables contain all the necessary information.
- *
- * Also, we only update the dirty/accessed state if we set
- * the dirty bit by hand in the kernel, since the hardware
- * will do the accessed bit for us, and we don't want to
- * race with other CPU's that might be updating the dirty
- * bit at the same time.
- */
-#define update_mmu_cache(vma,address,pte) do { } while (0)
-#define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
-#define ptep_set_access_flags(vma, address, ptep, entry, dirty)                \
-       do {                                                            \
-               if (dirty)                                              \
-                       ptep_establish(vma, address, ptep, entry);      \
-       } while (0)
-
-#include <xen/features.h>
-void make_lowmem_page_readonly(void *va, unsigned int feature);
-void make_lowmem_page_writable(void *va, unsigned int feature);
-void make_page_readonly(void *va, unsigned int feature);
-void make_page_writable(void *va, unsigned int feature);
-void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
-void make_pages_writable(void *va, unsigned int nr, unsigned int feature);
-
-#define virt_to_ptep(__va)                                             \
-({                                                                     \
-       pgd_t *__pgd = pgd_offset_k((unsigned long)(__va));             \
-       pud_t *__pud = pud_offset(__pgd, (unsigned long)(__va));        \
-       pmd_t *__pmd = pmd_offset(__pud, (unsigned long)(__va));        \
-       pte_offset_kernel(__pmd, (unsigned long)(__va));                \
-})
-
-#define arbitrary_virt_to_machine(__va)                                        \
-({                                                                     \
-       maddr_t m = (maddr_t)pte_mfn(*virt_to_ptep(__va)) << PAGE_SHIFT;\
-       m | ((unsigned long)(__va) & (PAGE_SIZE-1));                    \
-})
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef CONFIG_FLATMEM
-#define kern_addr_valid(addr)  (1)
-#endif /* CONFIG_FLATMEM */
-
-int direct_remap_pfn_range(struct vm_area_struct *vma,
-                           unsigned long address, 
-                           unsigned long mfn,
-                           unsigned long size, 
-                           pgprot_t prot,
-                           domid_t  domid);
-int direct_kernel_remap_pfn_range(unsigned long address, 
-                                 unsigned long mfn,
-                                 unsigned long size, 
-                                 pgprot_t prot,
-                                 domid_t  domid);
-int create_lookup_pte_addr(struct mm_struct *mm,
-                           unsigned long address,
-                           uint64_t *ptep);
-int touch_pte_range(struct mm_struct *mm,
-                    unsigned long address,
-                    unsigned long size);
-
-#define io_remap_pfn_range(vma,from,pfn,size,prot) \
-direct_remap_pfn_range(vma,from,pfn,size,prot,DOMID_IO)
-
-#define MK_IOSPACE_PFN(space, pfn)     (pfn)
-#define GET_IOSPACE(pfn)               0
-#define GET_PFN(pfn)                   (pfn)
-
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
-#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
-#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-#define __HAVE_ARCH_PTE_SAME
-#include <asm-generic/pgtable.h>
-
-#endif /* _I386_PGTABLE_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/processor.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/processor.h
deleted file mode 100644 (file)
index 9f401c5..0000000
+++ /dev/null
@@ -1,741 +0,0 @@
-/*
- * include/asm-i386/processor.h
- *
- * Copyright (C) 1994 Linus Torvalds
- */
-
-#ifndef __ASM_I386_PROCESSOR_H
-#define __ASM_I386_PROCESSOR_H
-
-#include <asm/vm86.h>
-#include <asm/math_emu.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/types.h>
-#include <asm/sigcontext.h>
-#include <asm/cpufeature.h>
-#include <asm/msr.h>
-#include <asm/system.h>
-#include <linux/cache.h>
-#include <linux/threads.h>
-#include <asm/percpu.h>
-#include <linux/cpumask.h>
-#include <xen/interface/physdev.h>
-
-/* flag for disabling the tsc */
-extern int tsc_disable;
-
-struct desc_struct {
-       unsigned long a,b;
-};
-
-#define desc_empty(desc) \
-               (!((desc)->a | (desc)->b))
-
-#define desc_equal(desc1, desc2) \
-               (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
-/*
- * Default implementation of macro that returns current
- * instruction pointer ("program counter").
- */
-#define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; })
-
-/*
- *  CPU type and hardware bug flags. Kept separately for each CPU.
- *  Members of this structure are referenced in head.S, so think twice
- *  before touching them. [mj]
- */
-
-struct cpuinfo_x86 {
-       __u8    x86;            /* CPU family */
-       __u8    x86_vendor;     /* CPU vendor */
-       __u8    x86_model;
-       __u8    x86_mask;
-       char    wp_works_ok;    /* It doesn't on 386's */
-       char    hlt_works_ok;   /* Problems on some 486Dx4's and old 386's */
-       char    hard_math;
-       char    rfu;
-               int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
-       unsigned long   x86_capability[NCAPINTS];
-       char    x86_vendor_id[16];
-       char    x86_model_id[64];
-       int     x86_cache_size;  /* in KB - valid for CPUS which support this
-                                   call  */
-       int     x86_cache_alignment;    /* In bytes */
-       char    fdiv_bug;
-       char    f00f_bug;
-       char    coma_bug;
-       char    pad0;
-       int     x86_power;
-       unsigned long loops_per_jiffy;
-#ifdef CONFIG_SMP
-       cpumask_t llc_shared_map;       /* cpus sharing the last level cache */
-#endif
-       unsigned char x86_max_cores;    /* cpuid returned max cores value */
-       unsigned char apicid;
-#ifdef CONFIG_SMP
-       unsigned char booted_cores;     /* number of cores as seen by OS */
-       __u8 phys_proc_id;              /* Physical processor id. */
-       __u8 cpu_core_id;               /* Core id */
-#endif
-} __attribute__((__aligned__(SMP_CACHE_BYTES)));
-
-#define X86_VENDOR_INTEL 0
-#define X86_VENDOR_CYRIX 1
-#define X86_VENDOR_AMD 2
-#define X86_VENDOR_UMC 3
-#define X86_VENDOR_NEXGEN 4
-#define X86_VENDOR_CENTAUR 5
-#define X86_VENDOR_RISE 6
-#define X86_VENDOR_TRANSMETA 7
-#define X86_VENDOR_NSC 8
-#define X86_VENDOR_NUM 9
-#define X86_VENDOR_UNKNOWN 0xff
-
-/*
- * capabilities of CPUs
- */
-
-extern struct cpuinfo_x86 boot_cpu_data;
-extern struct cpuinfo_x86 new_cpu_data;
-#ifndef CONFIG_X86_NO_TSS
-extern struct tss_struct doublefault_tss;
-DECLARE_PER_CPU(struct tss_struct, init_tss);
-#endif
-
-#ifdef CONFIG_SMP
-extern struct cpuinfo_x86 cpu_data[];
-#define current_cpu_data cpu_data[smp_processor_id()]
-#else
-#define cpu_data (&boot_cpu_data)
-#define current_cpu_data boot_cpu_data
-#endif
-
-extern int cpu_llc_id[NR_CPUS];
-extern char ignore_fpu_irq;
-
-extern void identify_cpu(struct cpuinfo_x86 *);
-extern void print_cpu_info(struct cpuinfo_x86 *);
-extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
-extern unsigned short num_cache_leaves;
-
-#ifdef CONFIG_X86_HT
-extern void detect_ht(struct cpuinfo_x86 *c);
-#else
-static inline void detect_ht(struct cpuinfo_x86 *c) {}
-#endif
-
-/*
- * EFLAGS bits
- */
-#define X86_EFLAGS_CF  0x00000001 /* Carry Flag */
-#define X86_EFLAGS_PF  0x00000004 /* Parity Flag */
-#define X86_EFLAGS_AF  0x00000010 /* Auxillary carry Flag */
-#define X86_EFLAGS_ZF  0x00000040 /* Zero Flag */
-#define X86_EFLAGS_SF  0x00000080 /* Sign Flag */
-#define X86_EFLAGS_TF  0x00000100 /* Trap Flag */
-#define X86_EFLAGS_IF  0x00000200 /* Interrupt Flag */
-#define X86_EFLAGS_DF  0x00000400 /* Direction Flag */
-#define X86_EFLAGS_OF  0x00000800 /* Overflow Flag */
-#define X86_EFLAGS_IOPL        0x00003000 /* IOPL mask */
-#define X86_EFLAGS_NT  0x00004000 /* Nested Task */
-#define X86_EFLAGS_RF  0x00010000 /* Resume Flag */
-#define X86_EFLAGS_VM  0x00020000 /* Virtual Mode */
-#define X86_EFLAGS_AC  0x00040000 /* Alignment Check */
-#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
-#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
-#define X86_EFLAGS_ID  0x00200000 /* CPUID detection flag */
-
-/*
- * Generic CPUID function
- * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
- * resulting in stale register contents being returned.
- */
-static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
-{
-       __asm__(XEN_CPUID
-               : "=a" (*eax),
-                 "=b" (*ebx),
-                 "=c" (*ecx),
-                 "=d" (*edx)
-               : "0" (op), "c"(0));
-}
-
-/* Some CPUID calls want 'count' to be placed in ecx */
-static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
-               int *edx)
-{
-       __asm__(XEN_CPUID
-               : "=a" (*eax),
-                 "=b" (*ebx),
-                 "=c" (*ecx),
-                 "=d" (*edx)
-               : "0" (op), "c" (count));
-}
-
-/*
- * CPUID functions returning a single datum
- */
-static inline unsigned int cpuid_eax(unsigned int op)
-{
-       unsigned int eax;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax)
-               : "0" (op)
-               : "bx", "cx", "dx");
-       return eax;
-}
-static inline unsigned int cpuid_ebx(unsigned int op)
-{
-       unsigned int eax, ebx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=b" (ebx)
-               : "0" (op)
-               : "cx", "dx" );
-       return ebx;
-}
-static inline unsigned int cpuid_ecx(unsigned int op)
-{
-       unsigned int eax, ecx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=c" (ecx)
-               : "0" (op)
-               : "bx", "dx" );
-       return ecx;
-}
-static inline unsigned int cpuid_edx(unsigned int op)
-{
-       unsigned int eax, edx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=d" (edx)
-               : "0" (op)
-               : "bx", "cx");
-       return edx;
-}
-
-#define load_cr3(pgdir) write_cr3(__pa(pgdir))
-
-/*
- * Intel CPU features in CR4
- */
-#define X86_CR4_VME            0x0001  /* enable vm86 extensions */
-#define X86_CR4_PVI            0x0002  /* virtual interrupts flag enable */
-#define X86_CR4_TSD            0x0004  /* disable time stamp at ipl 3 */
-#define X86_CR4_DE             0x0008  /* enable debugging extensions */
-#define X86_CR4_PSE            0x0010  /* enable page size extensions */
-#define X86_CR4_PAE            0x0020  /* enable physical address extensions */
-#define X86_CR4_MCE            0x0040  /* Machine check enable */
-#define X86_CR4_PGE            0x0080  /* enable global pages */
-#define X86_CR4_PCE            0x0100  /* enable performance counters at ipl 3 */
-#define X86_CR4_OSFXSR         0x0200  /* enable fast FPU save and restore */
-#define X86_CR4_OSXMMEXCPT     0x0400  /* enable unmasked SSE exceptions */
-
-/*
- * Save the cr4 feature set we're using (ie
- * Pentium 4MB enable and PPro Global page
- * enable), so that any CPU's that boot up
- * after us can get the correct flags.
- */
-extern unsigned long mmu_cr4_features;
-
-static inline void set_in_cr4 (unsigned long mask)
-{
-       unsigned cr4;
-       mmu_cr4_features |= mask;
-       cr4 = read_cr4();
-       cr4 |= mask;
-       write_cr4(cr4);
-}
-
-static inline void clear_in_cr4 (unsigned long mask)
-{
-       unsigned cr4;
-       mmu_cr4_features &= ~mask;
-       cr4 = read_cr4();
-       cr4 &= ~mask;
-       write_cr4(cr4);
-}
-
-/*
- *      NSC/Cyrix CPU configuration register indexes
- */
-
-#define CX86_PCR0 0x20
-#define CX86_GCR  0xb8
-#define CX86_CCR0 0xc0
-#define CX86_CCR1 0xc1
-#define CX86_CCR2 0xc2
-#define CX86_CCR3 0xc3
-#define CX86_CCR4 0xe8
-#define CX86_CCR5 0xe9
-#define CX86_CCR6 0xea
-#define CX86_CCR7 0xeb
-#define CX86_PCR1 0xf0
-#define CX86_DIR0 0xfe
-#define CX86_DIR1 0xff
-#define CX86_ARR_BASE 0xc4
-#define CX86_RCR_BASE 0xdc
-
-/*
- *      NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
-       outb((reg), 0x22); \
-       outb((data), 0x23); \
-} while (0)
-
-/* Stop speculative execution */
-static inline void sync_core(void)
-{
-       int tmp;
-       asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
-}
-
-static inline void __monitor(const void *eax, unsigned long ecx,
-               unsigned long edx)
-{
-       /* "monitor %eax,%ecx,%edx;" */
-       asm volatile(
-               ".byte 0x0f,0x01,0xc8;"
-               : :"a" (eax), "c" (ecx), "d"(edx));
-}
-
-static inline void __mwait(unsigned long eax, unsigned long ecx)
-{
-       /* "mwait %eax,%ecx;" */
-       asm volatile(
-               ".byte 0x0f,0x01,0xc9;"
-               : :"a" (eax), "c" (ecx));
-}
-
-/* from system description table in BIOS.  Mostly for MCA use, but
-others may find it useful. */
-extern unsigned int machine_id;
-extern unsigned int machine_submodel_id;
-extern unsigned int BIOS_revision;
-extern unsigned int mca_pentium_flag;
-
-/* Boot loader type from the setup header */
-extern int bootloader_type;
-
-/*
- * User space process size: 3GB (default).
- */
-#define TASK_SIZE      (PAGE_OFFSET)
-
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE     (PAGE_ALIGN(TASK_SIZE / 3))
-
-#define HAVE_ARCH_PICK_MMAP_LAYOUT
-
-/*
- * Size of io_bitmap.
- */
-#define IO_BITMAP_BITS  65536
-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
-#ifndef CONFIG_X86_NO_TSS
-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
-#endif
-#define INVALID_IO_BITMAP_OFFSET 0x8000
-#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
-
-struct i387_fsave_struct {
-       long    cwd;
-       long    swd;
-       long    twd;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-       long    status;         /* software status information */
-};
-
-struct i387_fxsave_struct {
-       unsigned short  cwd;
-       unsigned short  swd;
-       unsigned short  twd;
-       unsigned short  fop;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    mxcsr;
-       long    mxcsr_mask;
-       long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-       long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
-       long    padding[56];
-} __attribute__ ((aligned (16)));
-
-struct i387_soft_struct {
-       long    cwd;
-       long    swd;
-       long    twd;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-       unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
-       struct info     *info;
-       unsigned long   entry_eip;
-};
-
-union i387_union {
-       struct i387_fsave_struct        fsave;
-       struct i387_fxsave_struct       fxsave;
-       struct i387_soft_struct soft;
-};
-
-typedef struct {
-       unsigned long seg;
-} mm_segment_t;
-
-struct thread_struct;
-
-#ifndef CONFIG_X86_NO_TSS
-struct tss_struct {
-       unsigned short  back_link,__blh;
-       unsigned long   esp0;
-       unsigned short  ss0,__ss0h;
-       unsigned long   esp1;
-       unsigned short  ss1,__ss1h;     /* ss1 is used to cache MSR_IA32_SYSENTER_CS */
-       unsigned long   esp2;
-       unsigned short  ss2,__ss2h;
-       unsigned long   __cr3;
-       unsigned long   eip;
-       unsigned long   eflags;
-       unsigned long   eax,ecx,edx,ebx;
-       unsigned long   esp;
-       unsigned long   ebp;
-       unsigned long   esi;
-       unsigned long   edi;
-       unsigned short  es, __esh;
-       unsigned short  cs, __csh;
-       unsigned short  ss, __ssh;
-       unsigned short  ds, __dsh;
-       unsigned short  fs, __fsh;
-       unsigned short  gs, __gsh;
-       unsigned short  ldt, __ldth;
-       unsigned short  trace, io_bitmap_base;
-       /*
-        * The extra 1 is there because the CPU will access an
-        * additional byte beyond the end of the IO permission
-        * bitmap. The extra byte must be all 1 bits, and must
-        * be within the limit.
-        */
-       unsigned long   io_bitmap[IO_BITMAP_LONGS + 1];
-       /*
-        * Cache the current maximum and the last task that used the bitmap:
-        */
-       unsigned long io_bitmap_max;
-       struct thread_struct *io_bitmap_owner;
-       /*
-        * pads the TSS to be cacheline-aligned (size is 0x100)
-        */
-       unsigned long __cacheline_filler[35];
-       /*
-        * .. and then another 0x100 bytes for emergency kernel stack
-        */
-       unsigned long stack[64];
-} __attribute__((packed));
-#endif
-
-#define ARCH_MIN_TASKALIGN     16
-
-struct thread_struct {
-/* cached TLS descriptors. */
-       struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
-       unsigned long   esp0;
-       unsigned long   sysenter_cs;
-       unsigned long   eip;
-       unsigned long   esp;
-       unsigned long   fs;
-       unsigned long   gs;
-/* Hardware debugging registers */
-       unsigned long   debugreg[8];  /* %%db0-7 debug registers */
-/* fault info */
-       unsigned long   cr2, trap_no, error_code;
-/* floating point info */
-       union i387_union        i387;
-/* virtual 86 mode info */
-       struct vm86_struct __user * vm86_info;
-       unsigned long           screen_bitmap;
-       unsigned long           v86flags, v86mask, saved_esp0;
-       unsigned int            saved_fs, saved_gs;
-/* IO permissions */
-       unsigned long   *io_bitmap_ptr;
-       unsigned long   iopl;
-/* max allowed port in the bitmap, in bytes: */
-       unsigned long   io_bitmap_max;
-};
-
-#define INIT_THREAD  {                                                 \
-       .vm86_info = NULL,                                              \
-       .sysenter_cs = __KERNEL_CS,                                     \
-       .io_bitmap_ptr = NULL,                                          \
-}
-
-#ifndef CONFIG_X86_NO_TSS
-/*
- * Note that the .io_bitmap member must be extra-big. This is because
- * the CPU will access an additional byte beyond the end of the IO
- * permission bitmap. The extra byte must be all 1 bits, and must
- * be within the limit.
- */
-#define INIT_TSS  {                                                    \
-       .esp0           = sizeof(init_stack) + (long)&init_stack,       \
-       .ss0            = __KERNEL_DS,                                  \
-       .ss1            = __KERNEL_CS,                                  \
-       .io_bitmap_base = INVALID_IO_BITMAP_OFFSET,                     \
-       .io_bitmap      = { [ 0 ... IO_BITMAP_LONGS] = ~0 },            \
-}
-
-static inline void __load_esp0(struct tss_struct *tss, struct thread_struct *thread)
-{
-       tss->esp0 = thread->esp0;
-       /* This can only happen when SEP is enabled, no need to test "SEP"arately */
-       if (unlikely(tss->ss1 != thread->sysenter_cs)) {
-               tss->ss1 = thread->sysenter_cs;
-               wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
-       }
-}
-#define load_esp0(tss, thread) \
-       __load_esp0(tss, thread)
-#else
-#define load_esp0(tss, thread) \
-       HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)
-#endif
-
-#define start_thread(regs, new_eip, new_esp) do {              \
-       __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
-       set_fs(USER_DS);                                        \
-       regs->xds = __USER_DS;                                  \
-       regs->xes = __USER_DS;                                  \
-       regs->xss = __USER_DS;                                  \
-       regs->xcs = __USER_CS;                                  \
-       regs->eip = new_eip;                                    \
-       regs->esp = new_esp;                                    \
-} while (0)
-
-/*
- * These special macros can be used to get or set a debugging register
- */
-#define get_debugreg(var, register)                            \
-               (var) = HYPERVISOR_get_debugreg((register))
-#define set_debugreg(value, register)                  \
-               HYPERVISOR_set_debugreg((register), (value))
-
-/*
- * Set IOPL bits in EFLAGS from given mask
- */
-static inline void set_iopl_mask(unsigned mask)
-{
-       struct physdev_set_iopl set_iopl;
-
-       /* Force the change at ring 0. */
-       set_iopl.iopl = (mask == 0) ? 1 : (mask >> 12) & 3;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
-}
-
-/* Forward declaration, a strange C thing */
-struct task_struct;
-struct mm_struct;
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-
-/* Prepare to copy thread state - unlazy all lazy status */
-extern void prepare_to_copy(struct task_struct *tsk);
-
-/*
- * create a kernel thread without removing it from tasklists
- */
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
-extern unsigned long thread_saved_pc(struct task_struct *tsk);
-void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack);
-
-unsigned long get_wchan(struct task_struct *p);
-
-#define THREAD_SIZE_LONGS      (THREAD_SIZE/sizeof(unsigned long))
-#define KSTK_TOP(info)                                                 \
-({                                                                     \
-       unsigned long *__ptr = (unsigned long *)(info);                 \
-       (unsigned long)(&__ptr[THREAD_SIZE_LONGS]);                     \
-})
-
-/*
- * The below -8 is to reserve 8 bytes on top of the ring0 stack.
- * This is necessary to guarantee that the entire "struct pt_regs"
- * is accessable even if the CPU haven't stored the SS/ESP registers
- * on the stack (interrupt gate does not save these registers
- * when switching to the same priv ring).
- * Therefore beware: accessing the xss/esp fields of the
- * "struct pt_regs" is possible, but they may contain the
- * completely wrong values.
- */
-#define task_pt_regs(task)                                             \
-({                                                                     \
-       struct pt_regs *__regs__;                                       \
-       __regs__ = (struct pt_regs *)(KSTK_TOP(task_stack_page(task))-8); \
-       __regs__ - 1;                                                   \
-})
-
-#define KSTK_EIP(task) (task_pt_regs(task)->eip)
-#define KSTK_ESP(task) (task_pt_regs(task)->esp)
-
-
-struct microcode_header {
-       unsigned int hdrver;
-       unsigned int rev;
-       unsigned int date;
-       unsigned int sig;
-       unsigned int cksum;
-       unsigned int ldrver;
-       unsigned int pf;
-       unsigned int datasize;
-       unsigned int totalsize;
-       unsigned int reserved[3];
-};
-
-struct microcode {
-       struct microcode_header hdr;
-       unsigned int bits[0];
-};
-
-typedef struct microcode microcode_t;
-typedef struct microcode_header microcode_header_t;
-
-/* microcode format is extended from prescott processors */
-struct extended_signature {
-       unsigned int sig;
-       unsigned int pf;
-       unsigned int cksum;
-};
-
-struct extended_sigtable {
-       unsigned int count;
-       unsigned int cksum;
-       unsigned int reserved[3];
-       struct extended_signature sigs[0];
-};
-
-/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
-static inline void rep_nop(void)
-{
-       __asm__ __volatile__("rep;nop": : :"memory");
-}
-
-#define cpu_relax()    rep_nop()
-
-/* generic versions from gas */
-#define GENERIC_NOP1   ".byte 0x90\n"
-#define GENERIC_NOP2           ".byte 0x89,0xf6\n"
-#define GENERIC_NOP3        ".byte 0x8d,0x76,0x00\n"
-#define GENERIC_NOP4        ".byte 0x8d,0x74,0x26,0x00\n"
-#define GENERIC_NOP5        GENERIC_NOP1 GENERIC_NOP4
-#define GENERIC_NOP6   ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n"
-#define GENERIC_NOP7   ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n"
-#define GENERIC_NOP8   GENERIC_NOP1 GENERIC_NOP7
-
-/* Opteron nops */
-#define K8_NOP1 GENERIC_NOP1
-#define K8_NOP2        ".byte 0x66,0x90\n" 
-#define K8_NOP3        ".byte 0x66,0x66,0x90\n" 
-#define K8_NOP4        ".byte 0x66,0x66,0x66,0x90\n" 
-#define K8_NOP5        K8_NOP3 K8_NOP2 
-#define K8_NOP6        K8_NOP3 K8_NOP3
-#define K8_NOP7        K8_NOP4 K8_NOP3
-#define K8_NOP8        K8_NOP4 K8_NOP4
-
-/* K7 nops */
-/* uses eax dependencies (arbitary choice) */
-#define K7_NOP1  GENERIC_NOP1
-#define K7_NOP2        ".byte 0x8b,0xc0\n" 
-#define K7_NOP3        ".byte 0x8d,0x04,0x20\n"
-#define K7_NOP4        ".byte 0x8d,0x44,0x20,0x00\n"
-#define K7_NOP5        K7_NOP4 ASM_NOP1
-#define K7_NOP6        ".byte 0x8d,0x80,0,0,0,0\n"
-#define K7_NOP7        ".byte 0x8D,0x04,0x05,0,0,0,0\n"
-#define K7_NOP8        K7_NOP7 ASM_NOP1
-
-#ifdef CONFIG_MK8
-#define ASM_NOP1 K8_NOP1
-#define ASM_NOP2 K8_NOP2
-#define ASM_NOP3 K8_NOP3
-#define ASM_NOP4 K8_NOP4
-#define ASM_NOP5 K8_NOP5
-#define ASM_NOP6 K8_NOP6
-#define ASM_NOP7 K8_NOP7
-#define ASM_NOP8 K8_NOP8
-#elif defined(CONFIG_MK7)
-#define ASM_NOP1 K7_NOP1
-#define ASM_NOP2 K7_NOP2
-#define ASM_NOP3 K7_NOP3
-#define ASM_NOP4 K7_NOP4
-#define ASM_NOP5 K7_NOP5
-#define ASM_NOP6 K7_NOP6
-#define ASM_NOP7 K7_NOP7
-#define ASM_NOP8 K7_NOP8
-#else
-#define ASM_NOP1 GENERIC_NOP1
-#define ASM_NOP2 GENERIC_NOP2
-#define ASM_NOP3 GENERIC_NOP3
-#define ASM_NOP4 GENERIC_NOP4
-#define ASM_NOP5 GENERIC_NOP5
-#define ASM_NOP6 GENERIC_NOP6
-#define ASM_NOP7 GENERIC_NOP7
-#define ASM_NOP8 GENERIC_NOP8
-#endif
-
-#define ASM_NOP_MAX 8
-
-/* Prefetch instructions for Pentium III and AMD Athlon */
-/* It's not worth to care about 3dnow! prefetches for the K6
-   because they are microcoded there and very slow.
-   However we don't do prefetches for pre XP Athlons currently
-   That should be fixed. */
-#define ARCH_HAS_PREFETCH
-static inline void prefetch(const void *x)
-{
-       alternative_input(ASM_NOP4,
-                         "prefetchnta (%1)",
-                         X86_FEATURE_XMM,
-                         "r" (x));
-}
-
-#define ARCH_HAS_PREFETCH
-#define ARCH_HAS_PREFETCHW
-#define ARCH_HAS_SPINLOCK_PREFETCH
-
-/* 3dnow! prefetch to get an exclusive cache line. Useful for 
-   spinlocks to avoid one state transition in the cache coherency protocol. */
-static inline void prefetchw(const void *x)
-{
-       alternative_input(ASM_NOP4,
-                         "prefetchw (%1)",
-                         X86_FEATURE_3DNOW,
-                         "r" (x));
-}
-#define spin_lock_prefetch(x)  prefetchw(x)
-
-extern void select_idle_routine(const struct cpuinfo_x86 *c);
-
-#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
-
-extern unsigned long boot_option_idle_override;
-extern void enable_sep_cpu(void);
-extern int sysenter_setup(void);
-
-#endif /* __ASM_I386_PROCESSOR_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/ptrace.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/ptrace.h
deleted file mode 100644 (file)
index 8b95045..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef _I386_PTRACE_H
-#define _I386_PTRACE_H
-
-#define EBX 0
-#define ECX 1
-#define EDX 2
-#define ESI 3
-#define EDI 4
-#define EBP 5
-#define EAX 6
-#define DS 7
-#define ES 8
-#define FS 9
-#define GS 10
-#define ORIG_EAX 11
-#define EIP 12
-#define CS  13
-#define EFL 14
-#define UESP 15
-#define SS   16
-#define FRAME_SIZE 17
-
-/* this struct defines the way the registers are stored on the 
-   stack during a system call. */
-
-struct pt_regs {
-       long ebx;
-       long ecx;
-       long edx;
-       long esi;
-       long edi;
-       long ebp;
-       long eax;
-       int  xds;
-       int  xes;
-       long orig_eax;
-       long eip;
-       int  xcs;
-       long eflags;
-       long esp;
-       int  xss;
-};
-
-/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
-#define PTRACE_GETREGS            12
-#define PTRACE_SETREGS            13
-#define PTRACE_GETFPREGS          14
-#define PTRACE_SETFPREGS          15
-#define PTRACE_GETFPXREGS         18
-#define PTRACE_SETFPXREGS         19
-
-#define PTRACE_OLDSETOPTIONS         21
-
-#define PTRACE_GET_THREAD_AREA    25
-#define PTRACE_SET_THREAD_AREA    26
-
-#define PTRACE_SYSEMU            31
-#define PTRACE_SYSEMU_SINGLESTEP  32
-
-#ifdef __KERNEL__
-
-#include <asm/vm86.h>
-
-struct task_struct;
-extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
-
-/*
- * user_mode_vm(regs) determines whether a register set came from user mode.
- * This is true if V8086 mode was enabled OR if the register set was from
- * protected mode with RPL-3 CS value.  This tricky test checks that with
- * one comparison.  Many places in the kernel can bypass this full check
- * if they have already ruled out V8086 mode, so user_mode(regs) can be used.
- */
-static inline int user_mode(struct pt_regs *regs)
-{
-       return (regs->xcs & 2) != 0;
-}
-static inline int user_mode_vm(struct pt_regs *regs)
-{
-       return ((regs->xcs & 2) | (regs->eflags & VM_MASK)) != 0;
-}
-#define instruction_pointer(regs) ((regs)->eip)
-#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
-extern unsigned long profile_pc(struct pt_regs *regs);
-#else
-#define profile_pc(regs) instruction_pointer(regs)
-#endif
-#endif /* __KERNEL__ */
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/scatterlist.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/scatterlist.h
deleted file mode 100644 (file)
index bec2ff3..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef _I386_SCATTERLIST_H
-#define _I386_SCATTERLIST_H
-
-struct scatterlist {
-    struct page                *page;
-    unsigned int       offset;
-    unsigned int       length;
-    dma_addr_t         dma_address;
-    unsigned int       dma_length;
-};
-
-/* These macros should be used after a pci_map_sg call has been done
- * to get bus addresses of each of the SG entries and their lengths.
- * You should only work with the number of sg entries pci_map_sg
- * returns.
- */
-#define sg_dma_address(sg)     ((sg)->dma_address)
-#define sg_dma_len(sg)         ((sg)->dma_length)
-
-#define ISA_DMA_THRESHOLD (0x00ffffff)
-
-#endif /* !(_I386_SCATTERLIST_H) */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h
deleted file mode 100644 (file)
index f9a75b3..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef _ASM_SEGMENT_H
-#define _ASM_SEGMENT_H
-
-/*
- * The layout of the per-CPU GDT under Linux:
- *
- *   0 - null
- *   1 - reserved
- *   2 - reserved
- *   3 - reserved
- *
- *   4 - unused                        <==== new cacheline
- *   5 - unused
- *
- *  ------- start of TLS (Thread-Local Storage) segments:
- *
- *   6 - TLS segment #1                        [ glibc's TLS segment ]
- *   7 - TLS segment #2                        [ Wine's %fs Win32 segment ]
- *   8 - TLS segment #3
- *   9 - reserved
- *  10 - reserved
- *  11 - reserved
- *
- *  ------- start of kernel segments:
- *
- *  12 - kernel code segment           <==== new cacheline
- *  13 - kernel data segment
- *  14 - default user CS
- *  15 - default user DS
- *  16 - TSS
- *  17 - LDT
- *  18 - PNPBIOS support (16->32 gate)
- *  19 - PNPBIOS support
- *  20 - PNPBIOS support
- *  21 - PNPBIOS support
- *  22 - PNPBIOS support
- *  23 - APM BIOS support
- *  24 - APM BIOS support
- *  25 - APM BIOS support 
- *
- *  26 - ESPFIX small SS
- *  27 - unused
- *  28 - unused
- *  29 - unused
- *  30 - unused
- *  31 - TSS for double fault handler
- */
-#define GDT_ENTRY_TLS_ENTRIES  3
-#define GDT_ENTRY_TLS_MIN      6
-#define GDT_ENTRY_TLS_MAX      (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
-
-#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
-
-#define GDT_ENTRY_DEFAULT_USER_CS      14
-#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS * 8 + 3)
-
-#define GDT_ENTRY_DEFAULT_USER_DS      15
-#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3)
-
-#define GDT_ENTRY_KERNEL_BASE  12
-
-#define GDT_ENTRY_KERNEL_CS            (GDT_ENTRY_KERNEL_BASE + 0)
-#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)
-#define GET_KERNEL_CS() (__KERNEL_CS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) )
-
-#define GDT_ENTRY_KERNEL_DS            (GDT_ENTRY_KERNEL_BASE + 1)
-#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)
-#define GET_KERNEL_DS() (__KERNEL_DS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) )
-
-#define GDT_ENTRY_TSS                  (GDT_ENTRY_KERNEL_BASE + 4)
-#define GDT_ENTRY_LDT                  (GDT_ENTRY_KERNEL_BASE + 5)
-
-#define GDT_ENTRY_PNPBIOS_BASE         (GDT_ENTRY_KERNEL_BASE + 6)
-#define GDT_ENTRY_APMBIOS_BASE         (GDT_ENTRY_KERNEL_BASE + 11)
-
-#define GDT_ENTRY_ESPFIX_SS            (GDT_ENTRY_KERNEL_BASE + 14)
-#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)
-
-#define GDT_ENTRY_DOUBLEFAULT_TSS      31
-
-/*
- * The GDT has 32 entries
- */
-#define GDT_ENTRIES 32
-
-#define GDT_SIZE (GDT_ENTRIES * 8)
-
-/* Simple and small GDT entries for booting only */
-
-#define GDT_ENTRY_BOOT_CS              2
-#define __BOOT_CS      (GDT_ENTRY_BOOT_CS * 8)
-
-#define GDT_ENTRY_BOOT_DS              (GDT_ENTRY_BOOT_CS + 1)
-#define __BOOT_DS      (GDT_ENTRY_BOOT_DS * 8)
-
-/* The PnP BIOS entries in the GDT */
-#define GDT_ENTRY_PNPBIOS_CS32         (GDT_ENTRY_PNPBIOS_BASE + 0)
-#define GDT_ENTRY_PNPBIOS_CS16         (GDT_ENTRY_PNPBIOS_BASE + 1)
-#define GDT_ENTRY_PNPBIOS_DS           (GDT_ENTRY_PNPBIOS_BASE + 2)
-#define GDT_ENTRY_PNPBIOS_TS1          (GDT_ENTRY_PNPBIOS_BASE + 3)
-#define GDT_ENTRY_PNPBIOS_TS2          (GDT_ENTRY_PNPBIOS_BASE + 4)
-
-/* The PnP BIOS selectors */
-#define PNP_CS32   (GDT_ENTRY_PNPBIOS_CS32 * 8)        /* segment for calling fn */
-#define PNP_CS16   (GDT_ENTRY_PNPBIOS_CS16 * 8)        /* code segment for BIOS */
-#define PNP_DS     (GDT_ENTRY_PNPBIOS_DS * 8)  /* data segment for BIOS */
-#define PNP_TS1    (GDT_ENTRY_PNPBIOS_TS1 * 8) /* transfer data segment */
-#define PNP_TS2    (GDT_ENTRY_PNPBIOS_TS2 * 8) /* another data segment */
-
-/*
- * The interrupt descriptor table has room for 256 idt's,
- * the global descriptor table is dependent on the number
- * of tasks we can have..
- */
-#define IDT_ENTRIES 256
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/setup.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/setup.h
deleted file mode 100644 (file)
index c729454..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *     Just a place holder. We don't want to have to test x86 before
- *     we include stuff
- */
-
-#ifndef _i386_SETUP_H
-#define _i386_SETUP_H
-
-#ifdef __KERNEL__
-#include <linux/pfn.h>
-
-/*
- * Reserved space for vmalloc and iomap - defined in asm/page.h
- */
-#define MAXMEM_PFN     PFN_DOWN(MAXMEM)
-#define MAX_NONPAE_PFN (1 << 20)
-#endif
-
-#define PARAM_SIZE 4096
-#define COMMAND_LINE_SIZE 256
-
-#define OLD_CL_MAGIC_ADDR      0x90020
-#define OLD_CL_MAGIC           0xA33F
-#define OLD_CL_BASE_ADDR       0x90000
-#define OLD_CL_OFFSET          0x90022
-#define NEW_CL_POINTER         0x228   /* Relative to real mode data */
-
-#ifndef __ASSEMBLY__
-/*
- * This is set up by the setup-routine at boot-time
- */
-extern unsigned char boot_params[PARAM_SIZE];
-
-#define PARAM  (boot_params)
-#define SCREEN_INFO (*(struct screen_info *) (PARAM+0))
-#define EXT_MEM_K (*(unsigned short *) (PARAM+2))
-#define ALT_MEM_K (*(unsigned long *) (PARAM+0x1e0))
-#define E820_MAP_NR (*(char*) (PARAM+E820NR))
-#define E820_MAP    ((struct e820entry *) (PARAM+E820MAP))
-#define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40))
-#define IST_INFO   (*(struct ist_info *) (PARAM+0x60))
-#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
-#define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
-#define EFI_SYSTAB ((efi_system_table_t *) *((unsigned long *)(PARAM+0x1c4)))
-#define EFI_MEMDESC_SIZE (*((unsigned long *) (PARAM+0x1c8)))
-#define EFI_MEMDESC_VERSION (*((unsigned long *) (PARAM+0x1cc)))
-#define EFI_MEMMAP ((void *) *((unsigned long *)(PARAM+0x1d0)))
-#define EFI_MEMMAP_SIZE (*((unsigned long *) (PARAM+0x1d4)))
-#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
-#define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
-#define VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA))
-#define ORIG_ROOT_DEV (*(unsigned short *) (PARAM+0x1FC))
-#define AUX_DEVICE_INFO (*(unsigned char *) (PARAM+0x1FF))
-#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
-#define KERNEL_START (*(unsigned long *) (PARAM+0x214))
-#define INITRD_START (__pa(xen_start_info->mod_start))
-#define INITRD_SIZE (xen_start_info->mod_len)
-#define EDID_INFO   (*(struct edid_info *) (PARAM+0x440))
-#define EDD_NR     (*(unsigned char *) (PARAM+EDDNR))
-#define EDD_MBR_SIG_NR (*(unsigned char *) (PARAM+EDD_MBR_SIG_NR_BUF))
-#define EDD_MBR_SIGNATURE ((unsigned int *) (PARAM+EDD_MBR_SIG_BUF))
-#define EDD_BUF     ((struct edd_info *) (PARAM+EDDBUF))
-
-/*
- * Do NOT EVER look at the BIOS memory size location.
- * It does not work on many machines.
- */
-#define LOWMEMSIZE()   (0x9f000)
-
-struct e820entry;
-
-char * __init machine_specific_memory_setup(void);
-
-int __init copy_e820_map(struct e820entry * biosmap, int nr_map);
-int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map);
-void __init add_memory_region(unsigned long long start,
-                             unsigned long long size, int type);
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _i386_SETUP_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/smp.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/smp.h
deleted file mode 100644 (file)
index 9b59e50..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef __ASM_SMP_H
-#define __ASM_SMP_H
-
-/*
- * We need the APIC definitions automatically as part of 'smp.h'
- */
-#ifndef __ASSEMBLY__
-#include <linux/kernel.h>
-#include <linux/threads.h>
-#include <linux/cpumask.h>
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#ifndef __ASSEMBLY__
-#include <asm/fixmap.h>
-#include <asm/bitops.h>
-#include <asm/mpspec.h>
-#ifdef CONFIG_X86_IO_APIC
-#include <asm/io_apic.h>
-#endif
-#include <asm/apic.h>
-#endif
-#endif
-
-#define BAD_APICID 0xFFu
-#ifdef CONFIG_SMP
-#ifndef __ASSEMBLY__
-
-/*
- * Private routines/data
- */
-extern void smp_alloc_memory(void);
-extern int pic_mode;
-extern int smp_num_siblings;
-extern cpumask_t cpu_sibling_map[];
-extern cpumask_t cpu_core_map[];
-
-extern void (*mtrr_hook) (void);
-extern void zap_low_mappings (void);
-extern void lock_ipi_call_lock(void);
-extern void unlock_ipi_call_lock(void);
-
-#define MAX_APICID 256
-extern u8 x86_cpu_to_apicid[];
-
-#define cpu_physical_id(cpu)   x86_cpu_to_apicid[cpu]
-
-#ifdef CONFIG_HOTPLUG_CPU
-extern void cpu_exit_clear(void);
-extern void cpu_uninit(void);
-#endif
-
-/*
- * This function is needed by all SMP systems. It must _always_ be valid
- * from the initial startup. We map APIC_BASE very early in page_setup(),
- * so this is correct in the x86 case.
- */
-#define raw_smp_processor_id() (current_thread_info()->cpu)
-
-extern cpumask_t cpu_possible_map;
-#define cpu_callin_map cpu_possible_map
-
-/* We don't mark CPUs online until __cpu_up(), so we need another measure */
-static inline int num_booting_cpus(void)
-{
-       return cpus_weight(cpu_possible_map);
-}
-
-#ifdef CONFIG_X86_LOCAL_APIC
-
-#ifdef APIC_DEFINITION
-extern int hard_smp_processor_id(void);
-#else
-#include <mach_apicdef.h>
-static inline int hard_smp_processor_id(void)
-{
-       /* we don't want to mark this access volatile - bad code generation */
-       return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID));
-}
-#endif
-
-static __inline int logical_smp_processor_id(void)
-{
-       /* we don't want to mark this access volatile - bad code generation */
-       return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
-}
-
-#endif
-
-extern int __cpu_disable(void);
-extern void __cpu_die(unsigned int cpu);
-extern void prefill_possible_map(void);
-#endif /* !__ASSEMBLY__ */
-
-#else /* CONFIG_SMP */
-
-#define cpu_physical_id(cpu)           boot_cpu_physical_apicid
-
-#define NO_PROC_ID             0xFF            /* No processor magic marker */
-
-#endif
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/spinlock.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/spinlock.h
deleted file mode 100644 (file)
index d05f078..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-#ifndef __ASM_SPINLOCK_H
-#define __ASM_SPINLOCK_H
-
-#include <asm/atomic.h>
-#include <asm/rwlock.h>
-#include <asm/page.h>
-#include <linux/compiler.h>
-
-/*
- * Your basic SMP spinlocks, allowing only a single CPU anywhere
- *
- * Simple spin lock operations.  There are two variants, one clears IRQ's
- * on the local processor, one does not.
- *
- * We make no fairness assumptions. They have a cost.
- *
- * (the type definitions are in asm/spinlock_types.h)
- */
-
-#define __raw_spin_is_locked(x) \
-               (*(volatile signed char *)(&(x)->slock) <= 0)
-
-#define __raw_spin_lock_string \
-       "\n1:\t" \
-       LOCK_PREFIX " ; decb %0\n\t" \
-       "jns 3f\n" \
-       "2:\t" \
-       "rep;nop\n\t" \
-       "cmpb $0,%0\n\t" \
-       "jle 2b\n\t" \
-       "jmp 1b\n" \
-       "3:\n\t"
-
-/*
- * NOTE: there's an irqs-on section here, which normally would have to be
- * irq-traced, but on CONFIG_TRACE_IRQFLAGS we never use
- * __raw_spin_lock_string_flags().
- */
-#define __raw_spin_lock_string_flags \
-       "\n1:\t" \
-       LOCK_PREFIX " ; decb %0\n\t" \
-       "jns 5f\n" \
-       "2:\t" \
-       "testl $0x200, %1\n\t" \
-       "jz 4f\n\t" \
-       "#sti\n" \
-       "3:\t" \
-       "rep;nop\n\t" \
-       "cmpb $0, %0\n\t" \
-       "jle 3b\n\t" \
-       "#cli\n\t" \
-       "jmp 1b\n" \
-       "4:\t" \
-       "rep;nop\n\t" \
-       "cmpb $0, %0\n\t" \
-       "jg 1b\n\t" \
-       "jmp 4b\n" \
-       "5:\n\t"
-
-static inline void __raw_spin_lock(raw_spinlock_t *lock)
-{
-       asm(__raw_spin_lock_string : "+m" (lock->slock) : : "memory");
-}
-
-/*
- * It is easier for the lock validator if interrupts are not re-enabled
- * in the middle of a lock-acquire. This is a performance feature anyway
- * so we turn it off:
- */
-#ifndef CONFIG_PROVE_LOCKING
-static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
-{
-       asm(__raw_spin_lock_string_flags : "+m" (lock->slock) : "r" (flags) : "memory");
-}
-#endif
-
-static inline int __raw_spin_trylock(raw_spinlock_t *lock)
-{
-       char oldval;
-       __asm__ __volatile__(
-               "xchgb %b0,%1"
-               :"=q" (oldval), "+m" (lock->slock)
-               :"0" (0) : "memory");
-       return oldval > 0;
-}
-
-/*
- * __raw_spin_unlock based on writing $1 to the low byte.
- * This method works. Despite all the confusion.
- * (except on PPro SMP or if we are using OOSTORE, so we use xchgb there)
- * (PPro errata 66, 92)
- */
-
-#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE)
-
-#define __raw_spin_unlock_string \
-       "movb $1,%0" \
-               :"+m" (lock->slock) : : "memory"
-
-
-static inline void __raw_spin_unlock(raw_spinlock_t *lock)
-{
-       __asm__ __volatile__(
-               __raw_spin_unlock_string
-       );
-}
-
-#else
-
-#define __raw_spin_unlock_string \
-       "xchgb %b0, %1" \
-               :"=q" (oldval), "+m" (lock->slock) \
-               :"0" (oldval) : "memory"
-
-static inline void __raw_spin_unlock(raw_spinlock_t *lock)
-{
-       char oldval = 1;
-
-       __asm__ __volatile__(
-               __raw_spin_unlock_string
-       );
-}
-
-#endif
-
-#define __raw_spin_unlock_wait(lock) \
-       do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
-
-/*
- * Read-write spinlocks, allowing multiple readers
- * but only one writer.
- *
- * NOTE! it is quite common to have readers in interrupts
- * but no interrupt writers. For those circumstances we
- * can "mix" irq-safe locks - any writer needs to get a
- * irq-safe write-lock, but readers can get non-irqsafe
- * read-locks.
- *
- * On x86, we implement read-write locks as a 32-bit counter
- * with the high bit (sign) being the "contended" bit.
- *
- * The inline assembly is non-obvious. Think about it.
- *
- * Changed to use the same technique as rw semaphores.  See
- * semaphore.h for details.  -ben
- *
- * the helpers are in arch/i386/kernel/semaphore.c
- */
-
-/**
- * read_can_lock - would read_trylock() succeed?
- * @lock: the rwlock in question.
- */
-#define __raw_read_can_lock(x)         ((int)(x)->lock > 0)
-
-/**
- * write_can_lock - would write_trylock() succeed?
- * @lock: the rwlock in question.
- */
-#define __raw_write_can_lock(x)                ((x)->lock == RW_LOCK_BIAS)
-
-static inline void __raw_read_lock(raw_rwlock_t *rw)
-{
-       __build_read_lock(rw, "__read_lock_failed");
-}
-
-static inline void __raw_write_lock(raw_rwlock_t *rw)
-{
-       __build_write_lock(rw, "__write_lock_failed");
-}
-
-static inline int __raw_read_trylock(raw_rwlock_t *lock)
-{
-       atomic_t *count = (atomic_t *)lock;
-       atomic_dec(count);
-       if (atomic_read(count) >= 0)
-               return 1;
-       atomic_inc(count);
-       return 0;
-}
-
-static inline int __raw_write_trylock(raw_rwlock_t *lock)
-{
-       atomic_t *count = (atomic_t *)lock;
-       if (atomic_sub_and_test(RW_LOCK_BIAS, count))
-               return 1;
-       atomic_add(RW_LOCK_BIAS, count);
-       return 0;
-}
-
-static inline void __raw_read_unlock(raw_rwlock_t *rw)
-{
-       asm volatile(LOCK_PREFIX "incl %0" :"+m" (rw->lock) : : "memory");
-}
-
-static inline void __raw_write_unlock(raw_rwlock_t *rw)
-{
-       asm volatile(LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ", %0"
-                                : "+m" (rw->lock) : : "memory");
-}
-
-#endif /* __ASM_SPINLOCK_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h
deleted file mode 100644 (file)
index 0a287ef..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _ASM_SWIOTLB_H
-#define _ASM_SWIOTLB_H 1
-
-/* SWIOTLB interface */
-
-extern dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, size_t size,
-                                     int dir);
-extern void swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr,
-                                 size_t size, int dir);
-extern void swiotlb_sync_single_for_cpu(struct device *hwdev,
-                                        dma_addr_t dev_addr,
-                                        size_t size, int dir);
-extern void swiotlb_sync_single_for_device(struct device *hwdev,
-                                           dma_addr_t dev_addr,
-                                           size_t size, int dir);
-extern void swiotlb_sync_sg_for_cpu(struct device *hwdev,
-                                    struct scatterlist *sg, int nelems,
-                                    int dir);
-extern void swiotlb_sync_sg_for_device(struct device *hwdev,
-                                       struct scatterlist *sg, int nelems,
-                                       int dir);
-extern int swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg,
-                     int nents, int direction);
-extern void swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg,
-                        int nents, int direction);
-extern int swiotlb_dma_mapping_error(dma_addr_t dma_addr);
-#ifdef CONFIG_HIGHMEM
-extern dma_addr_t swiotlb_map_page(struct device *hwdev, struct page *page,
-                                   unsigned long offset, size_t size,
-                                   enum dma_data_direction direction);
-extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
-                               size_t size, enum dma_data_direction direction);
-#endif
-extern int swiotlb_dma_supported(struct device *hwdev, u64 mask);
-extern void swiotlb_init(void);
-
-#ifdef CONFIG_SWIOTLB
-extern int swiotlb;
-#else
-#define swiotlb 0
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/synch_bitops.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/synch_bitops.h
deleted file mode 100644 (file)
index f2e5f85..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-#ifndef __XEN_SYNCH_BITOPS_H__
-#define __XEN_SYNCH_BITOPS_H__
-
-/*
- * Copyright 1992, Linus Torvalds.
- * Heavily modified to provide guaranteed strong synchronisation
- * when communicating with Xen or other guest OSes running on other CPUs.
- */
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-#define ADDR (*(volatile long *) addr)
-
-static __inline__ void synch_set_bit(int nr, volatile void * addr)
-{
-    __asm__ __volatile__ ( 
-        "lock btsl %1,%0"
-        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-}
-
-static __inline__ void synch_clear_bit(int nr, volatile void * addr)
-{
-    __asm__ __volatile__ (
-        "lock btrl %1,%0"
-        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-}
-
-static __inline__ void synch_change_bit(int nr, volatile void * addr)
-{
-    __asm__ __volatile__ (
-        "lock btcl %1,%0"
-        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-}
-
-static __inline__ int synch_test_and_set_bit(int nr, volatile void * addr)
-{
-    int oldbit;
-    __asm__ __volatile__ (
-        "lock btsl %2,%1\n\tsbbl %0,%0"
-        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-    return oldbit;
-}
-
-static __inline__ int synch_test_and_clear_bit(int nr, volatile void * addr)
-{
-    int oldbit;
-    __asm__ __volatile__ (
-        "lock btrl %2,%1\n\tsbbl %0,%0"
-        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-    return oldbit;
-}
-
-static __inline__ int synch_test_and_change_bit(int nr, volatile void * addr)
-{
-    int oldbit;
-
-    __asm__ __volatile__ (
-        "lock btcl %2,%1\n\tsbbl %0,%0"
-        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-    return oldbit;
-}
-
-struct __synch_xchg_dummy { unsigned long a[100]; };
-#define __synch_xg(x) ((struct __synch_xchg_dummy *)(x))
-
-#define synch_cmpxchg(ptr, old, new) \
-((__typeof__(*(ptr)))__synch_cmpxchg((ptr),\
-                                     (unsigned long)(old), \
-                                     (unsigned long)(new), \
-                                     sizeof(*(ptr))))
-
-static inline unsigned long __synch_cmpxchg(volatile void *ptr,
-                                           unsigned long old,
-                                           unsigned long new, int size)
-{
-       unsigned long prev;
-       switch (size) {
-       case 1:
-               __asm__ __volatile__("lock; cmpxchgb %b1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__synch_xg(ptr)),
-                                      "0"(old)
-                                    : "memory");
-               return prev;
-       case 2:
-               __asm__ __volatile__("lock; cmpxchgw %w1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__synch_xg(ptr)),
-                                      "0"(old)
-                                    : "memory");
-               return prev;
-#ifdef CONFIG_X86_64
-       case 4:
-               __asm__ __volatile__("lock; cmpxchgl %k1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__synch_xg(ptr)),
-                                      "0"(old)
-                                    : "memory");
-               return prev;
-       case 8:
-               __asm__ __volatile__("lock; cmpxchgq %1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__synch_xg(ptr)),
-                                      "0"(old)
-                                    : "memory");
-               return prev;
-#else
-       case 4:
-               __asm__ __volatile__("lock; cmpxchgl %1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__synch_xg(ptr)),
-                                      "0"(old)
-                                    : "memory");
-               return prev;
-#endif
-       }
-       return old;
-}
-
-static __always_inline int synch_const_test_bit(int nr,
-                                               const volatile void * addr)
-{
-    return ((1UL << (nr & 31)) & 
-            (((const volatile unsigned int *) addr)[nr >> 5])) != 0;
-}
-
-static __inline__ int synch_var_test_bit(int nr, volatile void * addr)
-{
-    int oldbit;
-    __asm__ __volatile__ (
-        "btl %2,%1\n\tsbbl %0,%0"
-        : "=r" (oldbit) : "m" (ADDR), "Ir" (nr) );
-    return oldbit;
-}
-
-#define synch_test_bit(nr,addr) \
-(__builtin_constant_p(nr) ? \
- synch_const_test_bit((nr),(addr)) : \
- synch_var_test_bit((nr),(addr)))
-
-#define synch_cmpxchg_subword synch_cmpxchg
-
-#endif /* __XEN_SYNCH_BITOPS_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h
deleted file mode 100644 (file)
index 37e8a5c..0000000
+++ /dev/null
@@ -1,488 +0,0 @@
-#ifndef __ASM_SYSTEM_H
-#define __ASM_SYSTEM_H
-
-#include <linux/kernel.h>
-#include <asm/segment.h>
-#include <asm/cpufeature.h>
-#include <linux/bitops.h> /* for LOCK_PREFIX */
-#include <asm/synch_bitops.h>
-#include <asm/hypervisor.h>
-
-#ifdef __KERNEL__
-
-struct task_struct;    /* one of the stranger aspects of C forward declarations.. */
-extern struct task_struct * FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next));
-
-/*
- * Saving eflags is important. It switches not only IOPL between tasks,
- * it also protects other tasks from NT leaking through sysenter etc.
- */
-#define switch_to(prev,next,last) do {                                 \
-       unsigned long esi,edi;                                          \
-       asm volatile("pushfl\n\t"               /* Save flags */        \
-                    "pushl %%ebp\n\t"                                  \
-                    "movl %%esp,%0\n\t"        /* save ESP */          \
-                    "movl %5,%%esp\n\t"        /* restore ESP */       \
-                    "movl $1f,%1\n\t"          /* save EIP */          \
-                    "pushl %6\n\t"             /* restore EIP */       \
-                    "jmp __switch_to\n"                                \
-                    "1:\t"                                             \
-                    "popl %%ebp\n\t"                                   \
-                    "popfl"                                            \
-                    :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
-                     "=a" (last),"=S" (esi),"=D" (edi)                 \
-                    :"m" (next->thread.esp),"m" (next->thread.eip),    \
-                     "2" (prev), "d" (next));                          \
-} while (0)
-
-#define _set_base(addr,base) do { unsigned long __pr; \
-__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-       "rorl $16,%%edx\n\t" \
-       "movb %%dl,%2\n\t" \
-       "movb %%dh,%3" \
-       :"=&d" (__pr) \
-       :"m" (*((addr)+2)), \
-        "m" (*((addr)+4)), \
-        "m" (*((addr)+7)), \
-         "0" (base) \
-        ); } while(0)
-
-#define _set_limit(addr,limit) do { unsigned long __lr; \
-__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-       "rorl $16,%%edx\n\t" \
-       "movb %2,%%dh\n\t" \
-       "andb $0xf0,%%dh\n\t" \
-       "orb %%dh,%%dl\n\t" \
-       "movb %%dl,%2" \
-       :"=&d" (__lr) \
-       :"m" (*(addr)), \
-        "m" (*((addr)+6)), \
-        "0" (limit) \
-        ); } while(0)
-
-#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , (base) )
-#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , ((limit)-1) )
-
-/*
- * Load a segment. Fall back on loading the zero
- * segment if something goes wrong..
- */
-#define loadsegment(seg,value)                 \
-       asm volatile("\n"                       \
-               "1:\t"                          \
-               "mov %0,%%" #seg "\n"           \
-               "2:\n"                          \
-               ".section .fixup,\"ax\"\n"      \
-               "3:\t"                          \
-               "pushl $0\n\t"                  \
-               "popl %%" #seg "\n\t"           \
-               "jmp 2b\n"                      \
-               ".previous\n"                   \
-               ".section __ex_table,\"a\"\n\t" \
-               ".align 4\n\t"                  \
-               ".long 1b,3b\n"                 \
-               ".previous"                     \
-               : :"rm" (value))
-
-/*
- * Save a segment register away
- */
-#define savesegment(seg, value) \
-       asm volatile("mov %%" #seg ",%0":"=rm" (value))
-
-#define read_cr0() ({ \
-       unsigned int __dummy; \
-       __asm__ __volatile__( \
-               "movl %%cr0,%0\n\t" \
-               :"=r" (__dummy)); \
-       __dummy; \
-})
-#define write_cr0(x) \
-       __asm__ __volatile__("movl %0,%%cr0": :"r" (x))
-
-#define read_cr2() (current_vcpu_info()->arch.cr2)
-#define write_cr2(x) \
-       __asm__ __volatile__("movl %0,%%cr2": :"r" (x))
-
-#define read_cr3() ({ \
-       unsigned int __dummy; \
-       __asm__ ( \
-               "movl %%cr3,%0\n\t" \
-               :"=r" (__dummy)); \
-       __dummy = xen_cr3_to_pfn(__dummy); \
-       mfn_to_pfn(__dummy) << PAGE_SHIFT; \
-})
-#define write_cr3(x) ({                                                \
-       unsigned int __dummy = pfn_to_mfn((x) >> PAGE_SHIFT);   \
-       __dummy = xen_pfn_to_cr3(__dummy);                      \
-       __asm__ __volatile__("movl %0,%%cr3": :"r" (__dummy));  \
-})
-#define read_cr4() ({ \
-       unsigned int __dummy; \
-       __asm__( \
-               "movl %%cr4,%0\n\t" \
-               :"=r" (__dummy)); \
-       __dummy; \
-})
-#define read_cr4_safe() ({                           \
-       unsigned int __dummy;                         \
-       /* This could fault if %cr4 does not exist */ \
-       __asm__("1: movl %%cr4, %0              \n"   \
-               "2:                             \n"   \
-               ".section __ex_table,\"a\"      \n"   \
-               ".long 1b,2b                    \n"   \
-               ".previous                      \n"   \
-               : "=r" (__dummy): "0" (0));           \
-       __dummy;                                      \
-})
-
-#define write_cr4(x) \
-       __asm__ __volatile__("movl %0,%%cr4": :"r" (x))
-
-/*
- * Clear and set 'TS' bit respectively
- */
-#define clts() (HYPERVISOR_fpu_taskswitch(0))
-#define stts() (HYPERVISOR_fpu_taskswitch(1))
-
-#endif /* __KERNEL__ */
-
-#define wbinvd() \
-       __asm__ __volatile__ ("wbinvd": : :"memory")
-
-static inline unsigned long get_limit(unsigned long segment)
-{
-       unsigned long __limit;
-       __asm__("lsll %1,%0"
-               :"=r" (__limit):"r" (segment));
-       return __limit+1;
-}
-
-#define nop() __asm__ __volatile__ ("nop")
-
-#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-
-#define tas(ptr) (xchg((ptr),1))
-
-struct __xchg_dummy { unsigned long a[100]; };
-#define __xg(x) ((struct __xchg_dummy *)(x))
-
-
-#ifdef CONFIG_X86_CMPXCHG64
-
-/*
- * The semantics of XCHGCMP8B are a bit strange, this is why
- * there is a loop and the loading of %%eax and %%edx has to
- * be inside. This inlines well in most cases, the cached
- * cost is around ~38 cycles. (in the future we might want
- * to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
- * might have an implicit FPU-save as a cost, so it's not
- * clear which path to go.)
- *
- * cmpxchg8b must be used with the lock prefix here to allow
- * the instruction to be executed atomically, see page 3-102
- * of the instruction set reference 24319102.pdf. We need
- * the reader side to see the coherent 64bit value.
- */
-static inline void __set_64bit (unsigned long long * ptr,
-               unsigned int low, unsigned int high)
-{
-       __asm__ __volatile__ (
-               "\n1:\t"
-               "movl (%0), %%eax\n\t"
-               "movl 4(%0), %%edx\n\t"
-               "lock cmpxchg8b (%0)\n\t"
-               "jnz 1b"
-               : /* no outputs */
-               :       "D"(ptr),
-                       "b"(low),
-                       "c"(high)
-               :       "ax","dx","memory");
-}
-
-static inline void __set_64bit_constant (unsigned long long *ptr,
-                                                unsigned long long value)
-{
-       __set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
-}
-#define ll_low(x)      *(((unsigned int*)&(x))+0)
-#define ll_high(x)     *(((unsigned int*)&(x))+1)
-
-static inline void __set_64bit_var (unsigned long long *ptr,
-                        unsigned long long value)
-{
-       __set_64bit(ptr,ll_low(value), ll_high(value));
-}
-
-#define set_64bit(ptr,value) \
-(__builtin_constant_p(value) ? \
- __set_64bit_constant(ptr, value) : \
- __set_64bit_var(ptr, value) )
-
-#define _set_64bit(ptr,value) \
-(__builtin_constant_p(value) ? \
- __set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
- __set_64bit(ptr, ll_low(value), ll_high(value)) )
-
-#endif
-
-/*
- * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
- * Note 2: xchg has side effect, so that attribute volatile is necessary,
- *       but generally the primitive is invalid, *ptr is output argument. --ANK
- */
-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-{
-       switch (size) {
-               case 1:
-                       __asm__ __volatile__("xchgb %b0,%1"
-                               :"=q" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 2:
-                       __asm__ __volatile__("xchgw %w0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 4:
-                       __asm__ __volatile__("xchgl %0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-       }
-       return x;
-}
-
-/*
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- */
-
-#ifdef CONFIG_X86_CMPXCHG
-#define __HAVE_ARCH_CMPXCHG 1
-#define cmpxchg(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-                                       (unsigned long)(n),sizeof(*(ptr))))
-#endif
-
-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-                                     unsigned long new, int size)
-{
-       unsigned long prev;
-       switch (size) {
-       case 1:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 2:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 4:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       }
-       return old;
-}
-
-#ifndef CONFIG_X86_CMPXCHG
-/*
- * Building a kernel capable running on 80386. It may be necessary to
- * simulate the cmpxchg on the 80386 CPU. For that purpose we define
- * a function for each of the sizes we support.
- */
-
-extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8);
-extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16);
-extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32);
-
-static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old,
-                                     unsigned long new, int size)
-{
-       switch (size) {
-       case 1:
-               return cmpxchg_386_u8(ptr, old, new);
-       case 2:
-               return cmpxchg_386_u16(ptr, old, new);
-       case 4:
-               return cmpxchg_386_u32(ptr, old, new);
-       }
-       return old;
-}
-
-#define cmpxchg(ptr,o,n)                                               \
-({                                                                     \
-       __typeof__(*(ptr)) __ret;                                       \
-       if (likely(boot_cpu_data.x86 > 3))                              \
-               __ret = __cmpxchg((ptr), (unsigned long)(o),            \
-                                       (unsigned long)(n), sizeof(*(ptr))); \
-       else                                                            \
-               __ret = cmpxchg_386((ptr), (unsigned long)(o),          \
-                                       (unsigned long)(n), sizeof(*(ptr))); \
-       __ret;                                                          \
-})
-#endif
-
-#ifdef CONFIG_X86_CMPXCHG64
-
-static inline unsigned long long __cmpxchg64(volatile void *ptr, unsigned long long old,
-                                     unsigned long long new)
-{
-       unsigned long long prev;
-       __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
-                            : "=A"(prev)
-                            : "b"((unsigned long)new),
-                              "c"((unsigned long)(new >> 32)),
-                              "m"(*__xg(ptr)),
-                              "0"(old)
-                            : "memory");
-       return prev;
-}
-
-#define cmpxchg64(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg64((ptr),(unsigned long long)(o),\
-                                       (unsigned long long)(n)))
-
-#endif
-    
-/*
- * Force strict CPU ordering.
- * And yes, this is required on UP too when we're talking
- * to devices.
- *
- * For now, "wmb()" doesn't actually do anything, as all
- * Intel CPU's follow what Intel calls a *Processor Order*,
- * in which all writes are seen in the program order even
- * outside the CPU.
- *
- * I expect future Intel CPU's to have a weaker ordering,
- * but I'd also expect them to finally get their act together
- * and add some real memory barriers if so.
- *
- * Some non intel clones support out of order store. wmb() ceases to be a
- * nop for these.
- */
-
-/* 
- * Actually only lfence would be needed for mb() because all stores done 
- * by the kernel should be already ordered. But keep a full barrier for now. 
- */
-
-#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
-#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
-
-/**
- * read_barrier_depends - Flush all pending reads that subsequents reads
- * depend on.
- *
- * No data-dependent reads from memory-like regions are ever reordered
- * over this barrier.  All reads preceding this primitive are guaranteed
- * to access memory (but not necessarily other CPUs' caches) before any
- * reads following this primitive that depend on the data return by
- * any of the preceding reads.  This primitive is much lighter weight than
- * rmb() on most CPUs, and is never heavier weight than is
- * rmb().
- *
- * These ordering constraints are respected by both the local CPU
- * and the compiler.
- *
- * Ordering is not guaranteed by anything other than these primitives,
- * not even by data dependencies.  See the documentation for
- * memory_barrier() for examples and URLs to more information.
- *
- * For example, the following code would force ordering (the initial
- * value of "a" is zero, "b" is one, and "p" is "&a"):
- *
- * <programlisting>
- *     CPU 0                           CPU 1
- *
- *     b = 2;
- *     memory_barrier();
- *     p = &b;                         q = p;
- *                                     read_barrier_depends();
- *                                     d = *q;
- * </programlisting>
- *
- * because the read of "*q" depends on the read of "p" and these
- * two reads are separated by a read_barrier_depends().  However,
- * the following code, with the same initial values for "a" and "b":
- *
- * <programlisting>
- *     CPU 0                           CPU 1
- *
- *     a = 2;
- *     memory_barrier();
- *     b = 3;                          y = b;
- *                                     read_barrier_depends();
- *                                     x = a;
- * </programlisting>
- *
- * does not enforce ordering, since there is no data dependency between
- * the read of "a" and the read of "b".  Therefore, on some CPUs, such
- * as Alpha, "y" could be set to 3 and "x" to 0.  Use rmb()
- * in cases like this where there are no data dependencies.
- **/
-
-#define read_barrier_depends() do { } while(0)
-
-#ifdef CONFIG_X86_OOSTORE
-/* Actually there are no OOO store capable CPUs for now that do SSE, 
-   but make it already an possibility. */
-#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
-#else
-#define wmb()  __asm__ __volatile__ ("": : :"memory")
-#endif
-
-#ifdef CONFIG_SMP
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      wmb()
-#define smp_read_barrier_depends()     read_barrier_depends()
-#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-#else
-#define smp_mb()       barrier()
-#define smp_rmb()      barrier()
-#define smp_wmb()      barrier()
-#define smp_read_barrier_depends()     do { } while(0)
-#define set_mb(var, value) do { var = value; barrier(); } while (0)
-#endif
-
-#include <linux/irqflags.h>
-
-/*
- * disable hlt during certain critical i/o operations
- */
-#define HAVE_DISABLE_HLT
-void disable_hlt(void);
-void enable_hlt(void);
-
-extern int es7000_plat;
-void cpu_idle_wait(void);
-
-/*
- * On SMP systems, when the scheduler does migration-cost autodetection,
- * it needs a way to flush as much of the CPU's caches as possible:
- */
-static inline void sched_cacheflush(void)
-{
-       wbinvd();
-}
-
-extern unsigned long arch_align_stack(unsigned long sp);
-extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
-
-void default_idle(void);
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/tlbflush.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/tlbflush.h
deleted file mode 100644 (file)
index 259f0be..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef _I386_TLBFLUSH_H
-#define _I386_TLBFLUSH_H
-
-#include <linux/mm.h>
-#include <asm/processor.h>
-
-#define __flush_tlb() xen_tlb_flush()
-#define __flush_tlb_global() xen_tlb_flush()
-#define __flush_tlb_all() xen_tlb_flush()
-
-extern unsigned long pgkern_mask;
-
-#define cpu_has_invlpg (boot_cpu_data.x86 > 3)
-
-#define __flush_tlb_single(addr) xen_invlpg(addr)
-
-#define __flush_tlb_one(addr) __flush_tlb_single(addr)
-
-/*
- * TLB flushing:
- *
- *  - flush_tlb() flushes the current mm struct TLBs
- *  - flush_tlb_all() flushes all processes TLBs
- *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
- *  - flush_tlb_page(vma, vmaddr) flushes one page
- *  - flush_tlb_range(vma, start, end) flushes a range of pages
- *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
- *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
- *
- * ..but the i386 has somewhat limited tlb flushing capabilities,
- * and page-granular flushes are available only on i486 and up.
- */
-
-#ifndef CONFIG_SMP
-
-#define flush_tlb() __flush_tlb()
-#define flush_tlb_all() __flush_tlb_all()
-#define local_flush_tlb() __flush_tlb()
-
-static inline void flush_tlb_mm(struct mm_struct *mm)
-{
-       if (mm == current->active_mm)
-               __flush_tlb();
-}
-
-static inline void flush_tlb_page(struct vm_area_struct *vma,
-       unsigned long addr)
-{
-       if (vma->vm_mm == current->active_mm)
-               __flush_tlb_one(addr);
-}
-
-static inline void flush_tlb_range(struct vm_area_struct *vma,
-       unsigned long start, unsigned long end)
-{
-       if (vma->vm_mm == current->active_mm)
-               __flush_tlb();
-}
-
-#else
-
-#include <asm/smp.h>
-
-#define local_flush_tlb() \
-       __flush_tlb()
-
-extern void flush_tlb_all(void);
-extern void flush_tlb_current_task(void);
-extern void flush_tlb_mm(struct mm_struct *);
-extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-
-#define flush_tlb()    flush_tlb_current_task()
-
-static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
-{
-       flush_tlb_mm(vma->vm_mm);
-}
-
-#define TLBSTATE_OK    1
-#define TLBSTATE_LAZY  2
-
-struct tlb_state
-{
-       struct mm_struct *active_mm;
-       int state;
-       char __cacheline_padding[L1_CACHE_BYTES-8];
-};
-DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate);
-
-
-#endif
-
-#define flush_tlb_kernel_range(start, end) flush_tlb_all()
-
-static inline void flush_tlb_pgtables(struct mm_struct *mm,
-                                     unsigned long start, unsigned long end)
-{
-       /* i386 does not keep any page table caches in TLB */
-}
-
-#endif /* _I386_TLBFLUSH_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/vga.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/vga.h
deleted file mode 100644 (file)
index ffec7fa..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *     Access to VGA videoram
- *
- *     (c) 1998 Martin Mares <mj@ucw.cz>
- */
-
-#ifndef _LINUX_ASM_VGA_H_
-#define _LINUX_ASM_VGA_H_
-
-/*
- *     On the PC, we can just recalculate addresses and then
- *     access the videoram directly without any black magic.
- */
-
-#define VGA_MAP_MEM(x,s) (unsigned long)isa_bus_to_virt(x)
-
-#define vga_readb(x) (*(x))
-#define vga_writeb(x,y) (*(y) = (x))
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/xenoprof.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/xenoprof.h
deleted file mode 100644 (file)
index 2733e00..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/******************************************************************************
- * asm-i386/mach-xen/asm/xenoprof.h
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-#ifndef __ASM_XENOPROF_H__
-#define __ASM_XENOPROF_H__
-#ifdef CONFIG_XEN
-
-struct super_block;
-struct dentry;
-int xenoprof_create_files(struct super_block * sb, struct dentry * root);
-#define HAVE_XENOPROF_CREATE_FILES
-
-struct xenoprof_init;
-void xenoprof_arch_init_counter(struct xenoprof_init *init);
-void xenoprof_arch_counter(void);
-void xenoprof_arch_start(void);
-void xenoprof_arch_stop(void);
-
-struct xenoprof_arch_shared_buffer {
-       /* nothing */
-};
-struct xenoprof_shared_buffer;
-void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf);
-struct xenoprof_get_buffer;
-int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer, struct xenoprof_shared_buffer* sbuf);
-struct xenoprof_passive;
-int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain, struct xenoprof_shared_buffer* sbuf);
-
-#endif /* CONFIG_XEN */
-#endif /* __ASM_XENOPROF_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/irq_vectors.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/irq_vectors.h
deleted file mode 100644 (file)
index 49e5ac0..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * This file should contain #defines for all of the interrupt vector
- * numbers used by this architecture.
- *
- * In addition, there are some standard defines:
- *
- *     FIRST_EXTERNAL_VECTOR:
- *             The first free place for external interrupts
- *
- *     SYSCALL_VECTOR:
- *             The IRQ vector a syscall makes the user to kernel transition
- *             under.
- *
- *     TIMER_IRQ:
- *             The IRQ number the timer interrupt comes in at.
- *
- *     NR_IRQS:
- *             The total number of interrupt vectors (including all the
- *             architecture specific interrupts) needed.
- *
- */                    
-#ifndef _ASM_IRQ_VECTORS_H
-#define _ASM_IRQ_VECTORS_H
-
-/*
- * IDT vectors usable for external interrupt sources start
- * at 0x20:
- */
-#define FIRST_EXTERNAL_VECTOR  0x20
-
-#define SYSCALL_VECTOR         0x80
-
-/*
- * Vectors 0x20-0x2f are used for ISA interrupts.
- */
-
-#if 0
-/*
- * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
- *
- *  some of the following vectors are 'rare', they are merged
- *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
- *  TLB, reschedule and local APIC vectors are performance-critical.
- *
- *  Vectors 0xf0-0xfa are free (reserved for future Linux use).
- */
-#define SPURIOUS_APIC_VECTOR   0xff
-#define ERROR_APIC_VECTOR      0xfe
-#define INVALIDATE_TLB_VECTOR  0xfd
-#define RESCHEDULE_VECTOR      0xfc
-#define CALL_FUNCTION_VECTOR   0xfb
-
-#define THERMAL_APIC_VECTOR    0xf0
-/*
- * Local APIC timer IRQ vector is on a different priority level,
- * to work around the 'lost local interrupt if more than 2 IRQ
- * sources per level' errata.
- */
-#define LOCAL_TIMER_VECTOR     0xef
-#endif
-
-#define SPURIOUS_APIC_VECTOR   0xff
-#define ERROR_APIC_VECTOR      0xfe
-
-/*
- * First APIC vector available to drivers: (vectors 0x30-0xee)
- * we start at 0x31 to spread out vectors evenly between priority
- * levels. (0x80 is the syscall vector)
- */
-#define FIRST_DEVICE_VECTOR    0x31
-#define FIRST_SYSTEM_VECTOR    0xef
-
-/*
- * 16 8259A IRQ's, 208 potential APIC interrupt sources.
- * Right now the APIC is mostly only used for SMP.
- * 256 vectors is an architectural limit. (we can have
- * more than 256 devices theoretically, but they will
- * have to use shared interrupts)
- * Since vectors 0x00-0x1f are used/reserved for the CPU,
- * the usable vector space is 0x20-0xff (224 vectors)
- */
-
-#define RESCHEDULE_VECTOR      0
-#define CALL_FUNCTION_VECTOR   1
-#define NR_IPIS                        2
-
-/*
- * The maximum number of vectors supported by i386 processors
- * is limited to 256. For processors other than i386, NR_VECTORS
- * should be changed accordingly.
- */
-#define NR_VECTORS 256
-
-#define FPU_IRQ                        13
-
-#define        FIRST_VM86_IRQ          3
-#define LAST_VM86_IRQ          15
-#define invalid_vm86_irq(irq)  ((irq) < 3 || (irq) > 15)
-
-/*
- * The flat IRQ space is divided into two regions:
- *  1. A one-to-one mapping of real physical IRQs. This space is only used
- *     if we have physical device-access privilege. This region is at the 
- *     start of the IRQ space so that existing device drivers do not need
- *     to be modified to translate physical IRQ numbers into our IRQ space.
- *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
- *     are bound using the provided bind/unbind functions.
- */
-
-#define PIRQ_BASE              0
-#define NR_PIRQS               256
-
-#define DYNIRQ_BASE            (PIRQ_BASE + NR_PIRQS)
-#define NR_DYNIRQS             256
-
-#define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
-#define NR_IRQ_VECTORS         NR_IRQS
-
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
-#endif /* _ASM_IRQ_VECTORS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/mach_traps.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/mach_traps.h
deleted file mode 100644 (file)
index 8daed2c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  include/asm-xen/asm-i386/mach-xen/mach_traps.h
- *
- *  Machine specific NMI handling for Xen
- */
-#ifndef _MACH_TRAPS_H
-#define _MACH_TRAPS_H
-
-#include <linux/bitops.h>
-#include <xen/interface/nmi.h>
-
-static inline void clear_mem_error(unsigned char reason) {}
-static inline void clear_io_check_error(unsigned char reason) {}
-
-static inline unsigned char get_nmi_reason(void)
-{
-       shared_info_t *s = HYPERVISOR_shared_info;
-       unsigned char reason = 0;
-
-       /* construct a value which looks like it came from
-        * port 0x61.
-        */
-       if (test_bit(_XEN_NMIREASON_io_error, &s->arch.nmi_reason))
-               reason |= 0x40;
-       if (test_bit(_XEN_NMIREASON_parity_error, &s->arch.nmi_reason))
-               reason |= 0x80;
-
-        return reason;
-}
-
-static inline void reassert_nmi(void) {}
-
-#endif /* !_MACH_TRAPS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch.h
deleted file mode 100644 (file)
index ad19957..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Hook to call BIOS initialisation function */
-
-#define ARCH_SETUP machine_specific_arch_setup();
-
-void __init machine_specific_arch_setup(void);
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/agp.h b/linux-2.6-xen-sparse/include/asm-ia64/agp.h
deleted file mode 100644 (file)
index e0bf8a4..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef _ASM_IA64_AGP_H
-#define _ASM_IA64_AGP_H
-
-/*
- * IA-64 specific AGP definitions.
- *
- * Copyright (C) 2002-2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-/*
- * To avoid memory-attribute aliasing issues, we require that the AGPGART engine operate
- * in coherent mode, which lets us map the AGP memory as normal (write-back) memory
- * (unlike x86, where it gets mapped "write-coalescing").
- */
-#define map_page_into_agp(page)                /* nothing */
-#define unmap_page_from_agp(page)      /* nothing */
-#define flush_agp_mappings()           /* nothing */
-#define flush_agp_cache()              mb()
-
-/* Convert a physical address to an address suitable for the GART. */
-#ifndef CONFIG_XEN
-#define phys_to_gart(x) (x)
-#define gart_to_phys(x) (x)
-#else
-#define phys_to_gart(x) phys_to_machine_for_dma(x)
-#define gart_to_phys(x) machine_to_phys_for_dma(x)
-#endif
-
-/* GATT allocation. Returns/accepts GATT kernel virtual address. */
-#ifndef CONFIG_XEN
-#define alloc_gatt_pages(order)                \
-       ((char *)__get_free_pages(GFP_KERNEL, (order)))
-#define free_gatt_pages(table, order)  \
-       free_pages((unsigned long)(table), (order))
-#else
-#include <asm/hypervisor.h>
-static inline char*
-alloc_gatt_pages(unsigned int order)
-{
-       unsigned long error;
-       unsigned long ret = __get_free_pages(GFP_KERNEL, (order));
-       if (ret == 0) {
-               goto out;
-       }
-       error = xen_create_contiguous_region(ret, order, 0);
-       if (error) {
-               free_pages(ret, order);
-               ret = 0;
-       }
-out:
-       return (char*)ret;
-}
-static inline void
-free_gatt_pages(void* table, unsigned int order)
-{
-       xen_destroy_contiguous_region((unsigned long)table, order);
-       free_pages((unsigned long)table, order);
-}
-#endif /* CONFIG_XEN */
-
-#endif /* _ASM_IA64_AGP_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h b/linux-2.6-xen-sparse/include/asm-ia64/dma-mapping.h
deleted file mode 100644 (file)
index 509110f..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef _ASM_IA64_DMA_MAPPING_H
-#define _ASM_IA64_DMA_MAPPING_H
-
-/*
- * Copyright (C) 2003-2004 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-#include <asm/machvec.h>
-#ifdef CONFIG_XEN
-/* Needed for arch/i386/kernel/swiotlb.c and arch/i386/kernel/pci-dma-xen.c */
-#include <asm/hypervisor.h>
-/* Needed for arch/i386/kernel/swiotlb.c */
-#include <asm/swiotlb.h>
-#endif
-
-#define dma_alloc_coherent     platform_dma_alloc_coherent
-#define dma_alloc_noncoherent  platform_dma_alloc_coherent     /* coherent mem. is cheap */
-#define dma_free_coherent      platform_dma_free_coherent
-#define dma_free_noncoherent   platform_dma_free_coherent
-#define dma_map_single         platform_dma_map_single
-#define dma_map_sg             platform_dma_map_sg
-#define dma_unmap_single       platform_dma_unmap_single
-#define dma_unmap_sg           platform_dma_unmap_sg
-#define dma_sync_single_for_cpu        platform_dma_sync_single_for_cpu
-#define dma_sync_sg_for_cpu    platform_dma_sync_sg_for_cpu
-#define dma_sync_single_for_device platform_dma_sync_single_for_device
-#define dma_sync_sg_for_device platform_dma_sync_sg_for_device
-#define dma_mapping_error      platform_dma_mapping_error
-#define dma_map_page(dev, pg, off, size, dir)                          \
-       dma_map_single(dev, page_address(pg) + (off), (size), (dir))
-#define dma_unmap_page(dev, dma_addr, size, dir)                       \
-       dma_unmap_single(dev, dma_addr, size, dir)
-
-/*
- * Rest of this file is part of the "Advanced DMA API".  Use at your own risk.
- * See Documentation/DMA-API.txt for details.
- */
-
-#define dma_sync_single_range_for_cpu(dev, dma_handle, offset, size, dir)      \
-       dma_sync_single_for_cpu(dev, dma_handle, size, dir)
-#define dma_sync_single_range_for_device(dev, dma_handle, offset, size, dir)   \
-       dma_sync_single_for_device(dev, dma_handle, size, dir)
-
-#define dma_supported          platform_dma_supported
-
-static inline int
-dma_set_mask (struct device *dev, u64 mask)
-{
-       if (!dev->dma_mask || !dma_supported(dev, mask))
-               return -EIO;
-       *dev->dma_mask = mask;
-       return 0;
-}
-
-extern int dma_get_cache_alignment(void);
-
-static inline void
-dma_cache_sync (void *vaddr, size_t size, enum dma_data_direction dir)
-{
-       /*
-        * IA-64 is cache-coherent, so this is mostly a no-op.  However, we do need to
-        * ensure that dma_cache_sync() enforces order, hence the mb().
-        */
-       mb();
-}
-
-#define dma_is_consistent(dma_handle)  (1)     /* all we do is coherent memory... */
-
-#ifdef CONFIG_XEN
-static inline int
-range_straddles_page_boundary(void *p, size_t size)
-{
-       extern unsigned long *contiguous_bitmap;
-
-       if (!is_running_on_xen())
-               return 0;
-
-       return (((((unsigned long)p & ~PAGE_MASK) + size) > PAGE_SIZE) &&
-               !test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap));
-}
-#else
-#define range_straddles_page_boundary(addr, size)      (0)
-#endif
-
-#endif /* _ASM_IA64_DMA_MAPPING_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/gcc_intrin.h b/linux-2.6-xen-sparse/include/asm-ia64/gcc_intrin.h
deleted file mode 100644 (file)
index b23a280..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-#ifndef _ASM_IA64_GCC_INTRIN_H
-#define _ASM_IA64_GCC_INTRIN_H
-/*
- *
- * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
- * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
- */
-
-#include <linux/compiler.h>
-
-/* define this macro to get some asm stmts included in 'c' files */
-#define ASM_SUPPORTED
-
-/* Optimization barrier */
-/* The "volatile" is due to gcc bugs */
-#define ia64_barrier() asm volatile ("":::"memory")
-
-#define ia64_stop()    asm volatile (";;"::)
-
-#define ia64_invala_gr(regnum) asm volatile ("invala.e r%0" :: "i"(regnum))
-
-#define ia64_invala_fr(regnum) asm volatile ("invala.e f%0" :: "i"(regnum))
-
-extern void ia64_bad_param_for_setreg (void);
-extern void ia64_bad_param_for_getreg (void);
-
-register unsigned long ia64_r13 asm ("r13") __attribute_used__;
-
-#define __ia64_setreg(regnum, val)                                             \
-({                                                                             \
-       switch (regnum) {                                                       \
-           case _IA64_REG_PSR_L:                                               \
-                   asm volatile ("mov psr.l=%0" :: "r"(val) : "memory");       \
-                   break;                                                      \
-           case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:                          \
-                   asm volatile ("mov ar%0=%1" ::                              \
-                                         "i" (regnum - _IA64_REG_AR_KR0),      \
-                                         "r"(val): "memory");                  \
-                   break;                                                      \
-           case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:                        \
-                   asm volatile ("mov cr%0=%1" ::                              \
-                                         "i" (regnum - _IA64_REG_CR_DCR),      \
-                                         "r"(val): "memory" );                 \
-                   break;                                                      \
-           case _IA64_REG_SP:                                                  \
-                   asm volatile ("mov r12=%0" ::                               \
-                                         "r"(val): "memory");                  \
-                   break;                                                      \
-           case _IA64_REG_GP:                                                  \
-                   asm volatile ("mov gp=%0" :: "r"(val) : "memory");          \
-               break;                                                          \
-           default:                                                            \
-                   ia64_bad_param_for_setreg();                                \
-                   break;                                                      \
-       }                                                                       \
-})
-
-#define __ia64_getreg(regnum)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-                                                                               \
-       switch (regnum) {                                                       \
-       case _IA64_REG_GP:                                                      \
-               asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));              \
-               break;                                                          \
-       case _IA64_REG_IP:                                                      \
-               asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));              \
-               break;                                                          \
-       case _IA64_REG_PSR:                                                     \
-               asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));             \
-               break;                                                          \
-       case _IA64_REG_TP:      /* for current() */                             \
-               ia64_intri_res = ia64_r13;                                      \
-               break;                                                          \
-       case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:                              \
-               asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)             \
-                                     : "i"(regnum - _IA64_REG_AR_KR0));        \
-               break;                                                          \
-       case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:                            \
-               asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)             \
-                                     : "i" (regnum - _IA64_REG_CR_DCR));       \
-               break;                                                          \
-       case _IA64_REG_SP:                                                      \
-               asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));             \
-               break;                                                          \
-       default:                                                                \
-               ia64_bad_param_for_getreg();                                    \
-               break;                                                          \
-       }                                                                       \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_hint_pause 0
-
-#define __ia64_hint(mode)                                              \
-({                                                             \
-       switch (mode) {                                         \
-       case ia64_hint_pause:                                   \
-               asm volatile ("hint @pause" ::: "memory");      \
-               break;                                          \
-       }                                                       \
-})
-
-
-/* Integer values for mux1 instruction */
-#define ia64_mux1_brcst 0
-#define ia64_mux1_mix   8
-#define ia64_mux1_shuf  9
-#define ia64_mux1_alt  10
-#define ia64_mux1_rev  11
-
-#define ia64_mux1(x, mode)                                                     \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-                                                                               \
-       switch (mode) {                                                         \
-       case ia64_mux1_brcst:                                                   \
-               asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x));    \
-               break;                                                          \
-       case ia64_mux1_mix:                                                     \
-               asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x));      \
-               break;                                                          \
-       case ia64_mux1_shuf:                                                    \
-               asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x));     \
-               break;                                                          \
-       case ia64_mux1_alt:                                                     \
-               asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x));      \
-               break;                                                          \
-       case ia64_mux1_rev:                                                     \
-               asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x));      \
-               break;                                                          \
-       }                                                                       \
-       ia64_intri_res;                                                         \
-})
-
-#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-# define ia64_popcnt(x)                __builtin_popcountl(x)
-#else
-# define ia64_popcnt(x)                                                \
-  ({                                                           \
-       __u64 ia64_intri_res;                                   \
-       asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \
-                                                               \
-       ia64_intri_res;                                         \
-  })
-#endif
-
-#define ia64_getf_exp(x)                                       \
-({                                                             \
-       long ia64_intri_res;                                    \
-                                                               \
-       asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x)); \
-                                                               \
-       ia64_intri_res;                                         \
-})
-
-#define ia64_shrp(a, b, count)                                                         \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count));   \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_ldfs(regnum, x)                                   \
-({                                                             \
-       register double __f__ asm ("f"#regnum);                 \
-       asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x));     \
-})
-
-#define ia64_ldfd(regnum, x)                                   \
-({                                                             \
-       register double __f__ asm ("f"#regnum);                 \
-       asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x));     \
-})
-
-#define ia64_ldfe(regnum, x)                                   \
-({                                                             \
-       register double __f__ asm ("f"#regnum);                 \
-       asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x));     \
-})
-
-#define ia64_ldf8(regnum, x)                                   \
-({                                                             \
-       register double __f__ asm ("f"#regnum);                 \
-       asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x));     \
-})
-
-#define ia64_ldf_fill(regnum, x)                               \
-({                                                             \
-       register double __f__ asm ("f"#regnum);                 \
-       asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x)); \
-})
-
-#define ia64_stfs(x, regnum)                                           \
-({                                                                     \
-       register double __f__ asm ("f"#regnum);                         \
-       asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
-})
-
-#define ia64_stfd(x, regnum)                                           \
-({                                                                     \
-       register double __f__ asm ("f"#regnum);                         \
-       asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
-})
-
-#define ia64_stfe(x, regnum)                                           \
-({                                                                     \
-       register double __f__ asm ("f"#regnum);                         \
-       asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
-})
-
-#define ia64_stf8(x, regnum)                                           \
-({                                                                     \
-       register double __f__ asm ("f"#regnum);                         \
-       asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
-})
-
-#define ia64_stf_spill(x, regnum)                                              \
-({                                                                             \
-       register double __f__ asm ("f"#regnum);                                 \
-       asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory");    \
-})
-
-#define ia64_fetchadd4_acq(p, inc)                                             \
-({                                                                             \
-                                                                               \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("fetchadd4.acq %0=[%1],%2"                                \
-                               : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
-                               : "memory");                                    \
-                                                                               \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_fetchadd4_rel(p, inc)                                             \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("fetchadd4.rel %0=[%1],%2"                                \
-                               : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
-                               : "memory");                                    \
-                                                                               \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_fetchadd8_acq(p, inc)                                             \
-({                                                                             \
-                                                                               \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("fetchadd8.acq %0=[%1],%2"                                \
-                               : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
-                               : "memory");                                    \
-                                                                               \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_fetchadd8_rel(p, inc)                                             \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("fetchadd8.rel %0=[%1],%2"                                \
-                               : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
-                               : "memory");                                    \
-                                                                               \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_xchg1(ptr,x)                                                      \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("xchg1 %0=[%1],%2"                                        \
-                     : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory"); \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_xchg2(ptr,x)                                              \
-({                                                                     \
-       __u64 ia64_intri_res;                                           \
-       asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res)        \
-                     : "r" (ptr), "r" (x) : "memory");                 \
-       ia64_intri_res;                                                 \
-})
-
-#define ia64_xchg4(ptr,x)                                              \
-({                                                                     \
-       __u64 ia64_intri_res;                                           \
-       asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res)        \
-                     : "r" (ptr), "r" (x) : "memory");                 \
-       ia64_intri_res;                                                 \
-})
-
-#define ia64_xchg8(ptr,x)                                              \
-({                                                                     \
-       __u64 ia64_intri_res;                                           \
-       asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res)        \
-                     : "r" (ptr), "r" (x) : "memory");                 \
-       ia64_intri_res;                                                 \
-})
-
-#define ia64_cmpxchg1_acq(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg1_rel(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg2_acq(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg2_rel(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-                                                                                       \
-       asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg4_acq(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg4_rel(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg8_acq(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-       asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_cmpxchg8_rel(ptr, new, old)                                               \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
-                                                                                       \
-       asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":                                 \
-                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
-       ia64_intri_res;                                                                 \
-})
-
-#define ia64_mf()      asm volatile ("mf" ::: "memory")
-#define ia64_mfa()     asm volatile ("mf.a" ::: "memory")
-
-#define ia64_invala() asm volatile ("invala" ::: "memory")
-
-#define __ia64_thash(addr)                                                     \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr));       \
-       ia64_intri_res;                                                         \
-})
-
-#define ia64_srlz_i()  asm volatile (";; srlz.i ;;" ::: "memory")
-#define ia64_srlz_d()  asm volatile (";; srlz.d" ::: "memory");
-
-#ifdef HAVE_SERIALIZE_DIRECTIVE
-# define ia64_dv_serialize_data()              asm volatile (".serialize.data");
-# define ia64_dv_serialize_instruction()       asm volatile (".serialize.instruction");
-#else
-# define ia64_dv_serialize_data()
-# define ia64_dv_serialize_instruction()
-#endif
-
-#define ia64_nop(x)    asm volatile ("nop %0"::"i"(x));
-
-#define __ia64_itci(addr)      asm volatile ("itc.i %0;;" :: "r"(addr) : "memory")
-
-#define __ia64_itcd(addr)      asm volatile ("itc.d %0;;" :: "r"(addr) : "memory")
-
-
-#define __ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1"                      \
-                                            :: "r"(trnum), "r"(addr) : "memory")
-
-#define __ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1"                      \
-                                            :: "r"(trnum), "r"(addr) : "memory")
-
-#define __ia64_tpa(addr)                                                       \
-({                                                                             \
-       __u64 ia64_pa;                                                          \
-       asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory");    \
-       ia64_pa;                                                                \
-})
-
-#define __ia64_set_dbr(index, val)                                             \
-       asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory")
-
-#define __ia64_set_ibr(index, val)                                             \
-       asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory")
-
-#define __ia64_set_pkr(index, val)                                             \
-       asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory")
-
-#define __ia64_set_pmc(index, val)                                             \
-       asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory")
-
-#define __ia64_set_pmd(index, val)                                             \
-       asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory")
-
-#define __ia64_set_rr(index, val)                                                      \
-       asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
-
-#define __ia64_get_cpuid(index)                                                                \
-({                                                                                     \
-       __u64 ia64_intri_res;                                                           \
-       asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index));        \
-       ia64_intri_res;                                                                 \
-})
-
-#define __ia64_get_dbr(index)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
-       ia64_intri_res;                                                         \
-})
-
-#define __ia64_get_ibr(index)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
-       ia64_intri_res;                                                         \
-})
-
-#define __ia64_get_pkr(index)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
-       ia64_intri_res;                                                         \
-})
-
-#define __ia64_get_pmc(index)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
-       ia64_intri_res;                                                         \
-})
-
-
-#define __ia64_get_pmd(index)                                                  \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
-       ia64_intri_res;                                                         \
-})
-
-#define __ia64_get_rr(index)                                                   \
-({                                                                             \
-       __u64 ia64_intri_res;                                                   \
-       asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index));    \
-       ia64_intri_res;                                                         \
-})
-
-#define __ia64_fc(addr)        asm volatile ("fc %0" :: "r"(addr) : "memory")
-
-
-#define ia64_sync_i()  asm volatile (";; sync.i" ::: "memory")
-
-#define __ia64_ssm(mask)       asm volatile ("ssm %0":: "i"((mask)) : "memory")
-#define __ia64_rsm(mask)       asm volatile ("rsm %0":: "i"((mask)) : "memory")
-#define ia64_sum(mask) asm volatile ("sum %0":: "i"((mask)) : "memory")
-#define ia64_rum(mask) asm volatile ("rum %0":: "i"((mask)) : "memory")
-
-#define __ia64_ptce(addr)      asm volatile ("ptc.e %0" :: "r"(addr))
-
-#define __ia64_ptcga(addr, size)                                                       \
-do {                                                                           \
-       asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory");       \
-       ia64_dv_serialize_data();                                               \
-} while (0)
-
-#define __ia64_ptcl(addr, size)                                                        \
-do {                                                                           \
-       asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory");        \
-       ia64_dv_serialize_data();                                               \
-} while (0)
-
-#define __ia64_ptri(addr, size)                                                \
-       asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory")
-
-#define __ia64_ptrd(addr, size)                                                \
-       asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory")
-
-/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */
-
-#define ia64_lfhint_none   0
-#define ia64_lfhint_nt1    1
-#define ia64_lfhint_nt2    2
-#define ia64_lfhint_nta    3
-
-#define ia64_lfetch(lfhint, y)                                 \
-({                                                             \
-        switch (lfhint) {                                      \
-        case ia64_lfhint_none:                                 \
-                asm volatile ("lfetch [%0]" : : "r"(y));       \
-                break;                                         \
-        case ia64_lfhint_nt1:                                  \
-                asm volatile ("lfetch.nt1 [%0]" : : "r"(y));   \
-                break;                                         \
-        case ia64_lfhint_nt2:                                  \
-                asm volatile ("lfetch.nt2 [%0]" : : "r"(y));   \
-                break;                                         \
-        case ia64_lfhint_nta:                                  \
-                asm volatile ("lfetch.nta [%0]" : : "r"(y));   \
-                break;                                         \
-        }                                                      \
-})
-
-#define ia64_lfetch_excl(lfhint, y)                                    \
-({                                                                     \
-        switch (lfhint) {                                              \
-        case ia64_lfhint_none:                                         \
-                asm volatile ("lfetch.excl [%0]" :: "r"(y));           \
-                break;                                                 \
-        case ia64_lfhint_nt1:                                          \
-                asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y));       \
-                break;                                                 \
-        case ia64_lfhint_nt2:                                          \
-                asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y));       \
-                break;                                                 \
-        case ia64_lfhint_nta:                                          \
-                asm volatile ("lfetch.excl.nta [%0]" :: "r"(y));       \
-                break;                                                 \
-        }                                                              \
-})
-
-#define ia64_lfetch_fault(lfhint, y)                                   \
-({                                                                     \
-        switch (lfhint) {                                              \
-        case ia64_lfhint_none:                                         \
-                asm volatile ("lfetch.fault [%0]" : : "r"(y));         \
-                break;                                                 \
-        case ia64_lfhint_nt1:                                          \
-                asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y));     \
-                break;                                                 \
-        case ia64_lfhint_nt2:                                          \
-                asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y));     \
-                break;                                                 \
-        case ia64_lfhint_nta:                                          \
-                asm volatile ("lfetch.fault.nta [%0]" : : "r"(y));     \
-                break;                                                 \
-        }                                                              \
-})
-
-#define ia64_lfetch_fault_excl(lfhint, y)                              \
-({                                                                     \
-        switch (lfhint) {                                              \
-        case ia64_lfhint_none:                                         \
-                asm volatile ("lfetch.fault.excl [%0]" :: "r"(y));     \
-                break;                                                 \
-        case ia64_lfhint_nt1:                                          \
-                asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y)); \
-                break;                                                 \
-        case ia64_lfhint_nt2:                                          \
-                asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y)); \
-                break;                                                 \
-        case ia64_lfhint_nta:                                          \
-                asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y)); \
-                break;                                                 \
-        }                                                              \
-})
-
-#define __ia64_intrin_local_irq_restore(x)                     \
-do {                                                           \
-       asm volatile (";;   cmp.ne p6,p7=%0,r0;;"               \
-                     "(p6) ssm psr.i;"                         \
-                     "(p7) rsm psr.i;;"                        \
-                     "(p6) srlz.d"                             \
-                     :: "r"((x)) : "p6", "p7", "memory");      \
-} while (0)
-
-#define __ia64_get_psr_i()     (__ia64_getreg(_IA64_REG_PSR) & 0x4000UL)
-
-#endif /* _ASM_IA64_GCC_INTRIN_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h b/linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h
deleted file mode 100644 (file)
index 922184d..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef _ASM_IA64_HW_IRQ_H
-#define _ASM_IA64_HW_IRQ_H
-
-/*
- * Copyright (C) 2001-2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/profile.h>
-
-#include <asm/machvec.h>
-#include <asm/ptrace.h>
-#include <asm/smp.h>
-
-#ifndef CONFIG_XEN
-typedef u8 ia64_vector;
-#else
-typedef u16 ia64_vector;
-#endif
-
-/*
- * 0 special
- *
- * 1,3-14 are reserved from firmware
- *
- * 16-255 (vectored external interrupts) are available
- *
- * 15 spurious interrupt (see IVR)
- *
- * 16 lowest priority, 255 highest priority
- *
- * 15 classes of 16 interrupts each.
- */
-#define IA64_MIN_VECTORED_IRQ           16
-#define IA64_MAX_VECTORED_IRQ          255
-#define IA64_NUM_VECTORS               256
-
-#define AUTO_ASSIGN                    -1
-
-#define IA64_SPURIOUS_INT_VECTOR       0x0f
-
-/*
- * Vectors 0x10-0x1f are used for low priority interrupts, e.g. CMCI.
- */
-#define IA64_CPEP_VECTOR               0x1c    /* corrected platform error polling vector */
-#define IA64_CMCP_VECTOR               0x1d    /* corrected machine-check polling vector */
-#define IA64_CPE_VECTOR                        0x1e    /* corrected platform error interrupt vector */
-#define IA64_CMC_VECTOR                        0x1f    /* corrected machine-check interrupt vector */
-/*
- * Vectors 0x20-0x2f are reserved for legacy ISA IRQs.
- * Use vectors 0x30-0xe7 as the default device vector range for ia64.
- * Platforms may choose to reduce this range in platform_irq_setup, but the
- * platform range must fall within
- *     [IA64_DEF_FIRST_DEVICE_VECTOR..IA64_DEF_LAST_DEVICE_VECTOR]
- */
-extern int ia64_first_device_vector;
-extern int ia64_last_device_vector;
-
-#define IA64_DEF_FIRST_DEVICE_VECTOR   0x30
-#define IA64_DEF_LAST_DEVICE_VECTOR    0xe7
-#define IA64_FIRST_DEVICE_VECTOR       ia64_first_device_vector
-#define IA64_LAST_DEVICE_VECTOR                ia64_last_device_vector
-#define IA64_MAX_DEVICE_VECTORS                (IA64_DEF_LAST_DEVICE_VECTOR - IA64_DEF_FIRST_DEVICE_VECTOR + 1)
-#define IA64_NUM_DEVICE_VECTORS                (IA64_LAST_DEVICE_VECTOR - IA64_FIRST_DEVICE_VECTOR + 1)
-
-#define IA64_MCA_RENDEZ_VECTOR         0xe8    /* MCA rendez interrupt */
-#define IA64_PERFMON_VECTOR            0xee    /* performanc monitor interrupt vector */
-#define IA64_TIMER_VECTOR              0xef    /* use highest-prio group 15 interrupt for timer */
-#define        IA64_MCA_WAKEUP_VECTOR          0xf0    /* MCA wakeup (must be >MCA_RENDEZ_VECTOR) */
-#define IA64_IPI_RESCHEDULE            0xfd    /* SMP reschedule */
-#define IA64_IPI_VECTOR                        0xfe    /* inter-processor interrupt vector */
-
-/* Used for encoding redirected irqs */
-
-#define IA64_IRQ_REDIRECTED            (1 << 31)
-
-/* IA64 inter-cpu interrupt related definitions */
-
-#define IA64_IPI_DEFAULT_BASE_ADDR     0xfee00000
-
-/* Delivery modes for inter-cpu interrupts */
-enum {
-        IA64_IPI_DM_INT =       0x0,    /* pend an external interrupt */
-        IA64_IPI_DM_PMI =       0x2,    /* pend a PMI */
-        IA64_IPI_DM_NMI =       0x4,    /* pend an NMI (vector 2) */
-        IA64_IPI_DM_INIT =      0x5,    /* pend an INIT interrupt */
-        IA64_IPI_DM_EXTINT =    0x7,    /* pend an 8259-compatible interrupt. */
-};
-
-extern __u8 isa_irq_to_vector_map[16];
-#define isa_irq_to_vector(x)   isa_irq_to_vector_map[(x)]
-
-extern struct hw_interrupt_type irq_type_ia64_lsapic;  /* CPU-internal interrupt controller */
-
-extern int assign_irq_vector (int irq);        /* allocate a free vector */
-extern void free_irq_vector (int vector);
-extern int reserve_irq_vector (int vector);
-extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
-extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);
-
-static inline void ia64_resend_irq(unsigned int vector)
-{
-#ifdef CONFIG_XEN
-       extern int resend_irq_on_evtchn(unsigned int i);
-       if (is_running_on_xen())
-               resend_irq_on_evtchn(vector);
-       else
-#endif /* CONFIG_XEN */
-       platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0);
-}
-
-/*
- * Default implementations for the irq-descriptor API:
- */
-
-extern irq_desc_t irq_desc[NR_IRQS];
-
-#ifndef CONFIG_IA64_GENERIC
-static inline unsigned int
-__ia64_local_vector_to_irq (ia64_vector vec)
-{
-       return (unsigned int) vec;
-}
-#endif
-
-/*
- * Next follows the irq descriptor interface.  On IA-64, each CPU supports 256 interrupt
- * vectors.  On smaller systems, there is a one-to-one correspondence between interrupt
- * vectors and the Linux irq numbers.  However, larger systems may have multiple interrupt
- * domains meaning that the translation from vector number to irq number depends on the
- * interrupt domain that a CPU belongs to.  This API abstracts such platform-dependent
- * differences and provides a uniform means to translate between vector and irq numbers
- * and to obtain the irq descriptor for a given irq number.
- */
-
-/* Extract the IA-64 vector that corresponds to IRQ.  */
-static inline ia64_vector
-irq_to_vector (int irq)
-{
-       return (ia64_vector) irq;
-}
-
-/*
- * Convert the local IA-64 vector to the corresponding irq number.  This translation is
- * done in the context of the interrupt domain that the currently executing CPU belongs
- * to.
- */
-static inline unsigned int
-local_vector_to_irq (ia64_vector vec)
-{
-       return platform_local_vector_to_irq(vec);
-}
-
-#endif /* _ASM_IA64_HW_IRQ_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h
deleted file mode 100644 (file)
index b8f393a..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-/******************************************************************************
- * hypercall.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERCALL_H__
-#define __HYPERCALL_H__
-
-#ifndef __HYPERVISOR_H__
-# error "please don't include this file directly"
-#endif
-
-#include <asm/xen/xcom_hcall.h>
-struct xencomm_handle;
-extern unsigned long __hypercall(unsigned long a1, unsigned long a2,
-                                 unsigned long a3, unsigned long a4,
-                                 unsigned long a5, unsigned long cmd);
-
-/*
- * Assembler stubs for hyper-calls.
- */
-
-#define _hypercall0(type, name)                                        \
-({                                                             \
-       long __res;                                             \
-       __res=__hypercall(0, 0, 0, 0, 0, __HYPERVISOR_##name);  \
-       (type)__res;                                            \
-})
-
-#define _hypercall1(type, name, a1)                            \
-({                                                             \
-       long __res;                                             \
-       __res = __hypercall((unsigned long)a1,                  \
-                            0, 0, 0, 0, __HYPERVISOR_##name);  \
-       (type)__res;                                            \
-})
-
-#define _hypercall2(type, name, a1, a2)                                \
-({                                                             \
-       long __res;                                             \
-       __res = __hypercall((unsigned long)a1,                  \
-                           (unsigned long)a2,                  \
-                           0, 0, 0, __HYPERVISOR_##name);      \
-       (type)__res;                                            \
-})
-
-#define _hypercall3(type, name, a1, a2, a3)                    \
-({                                                             \
-       long __res;                                             \
-       __res = __hypercall((unsigned long)a1,                  \
-                           (unsigned long)a2,                  \
-                           (unsigned long)a3,                  \
-                           0, 0, __HYPERVISOR_##name);         \
-       (type)__res;                                            \
-})
-
-#define _hypercall4(type, name, a1, a2, a3, a4)                        \
-({                                                             \
-       long __res;                                             \
-       __res = __hypercall((unsigned long)a1,                  \
-                           (unsigned long)a2,                  \
-                           (unsigned long)a3,                  \
-                           (unsigned long)a4,                  \
-                           0, __HYPERVISOR_##name);            \
-       (type)__res;                                            \
-})
-
-#define _hypercall5(type, name, a1, a2, a3, a4, a5)            \
-({                                                             \
-       long __res;                                             \
-       __res = __hypercall((unsigned long)a1,                  \
-                           (unsigned long)a2,                  \
-                           (unsigned long)a3,                  \
-                           (unsigned long)a4,                  \
-                           (unsigned long)a5,                  \
-                           __HYPERVISOR_##name);               \
-       (type)__res;                                            \
-})
-
-
-static inline int
-xencomm_arch_hypercall_sched_op(int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, sched_op, cmd, arg);
-}
-
-static inline long
-HYPERVISOR_set_timer_op(u64 timeout)
-{
-       unsigned long timeout_hi = (unsigned long)(timeout >> 32);
-       unsigned long timeout_lo = (unsigned long)timeout;
-       return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
-}
-
-static inline int
-xencomm_arch_hypercall_platform_op(struct xencomm_handle *op)
-{
-       return _hypercall1(int, platform_op, op);
-}
-
-static inline int
-xencomm_arch_hypercall_sysctl(struct xencomm_handle *op)
-{
-       return _hypercall1(int, sysctl, op);
-}
-
-static inline int
-xencomm_arch_hypercall_domctl(struct xencomm_handle *op)
-{
-       return _hypercall1(int, domctl, op);
-}
-
-static inline int
-xencomm_arch_hypercall_multicall(struct xencomm_handle *call_list,
-                                int nr_calls)
-{
-       return _hypercall2(int, multicall, call_list, nr_calls);
-}
-
-static inline int
-xencomm_arch_hypercall_memory_op(unsigned int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, memory_op, cmd, arg);
-}
-
-static inline int
-xencomm_arch_hypercall_event_channel_op(int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, event_channel_op, cmd, arg);
-}
-
-static inline int
-xencomm_arch_hypercall_acm_op(unsigned int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, acm_op, cmd, arg);
-}
-
-static inline int
-xencomm_arch_hypercall_xen_version(int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, xen_version, cmd, arg);
-}
-
-static inline int
-xencomm_arch_hypercall_console_io(int cmd, int count,
-                                  struct xencomm_handle *str)
-{
-       return _hypercall3(int, console_io, cmd, count, str);
-}
-
-static inline int
-xencomm_arch_hypercall_physdev_op(int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, physdev_op, cmd, arg);
-}
-
-static inline int
-xencomm_arch_hypercall_grant_table_op(unsigned int cmd,
-                                      struct xencomm_handle *uop,
-                                      unsigned int count)
-{
-       return _hypercall3(int, grant_table_op, cmd, uop, count);
-}
-
-int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
-
-extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg);
-
-static inline int
-xencomm_arch_hypercall_callback_op(int cmd, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, callback_op, cmd, arg);
-}
-
-static inline unsigned long
-xencomm_arch_hypercall_hvm_op(int cmd, void *arg)
-{
-       return _hypercall2(unsigned long, hvm_op, cmd, arg);
-}
-
-static inline long
-xencomm_arch_hypercall_vcpu_op(int cmd, int cpu, void *arg)
-{
-       return _hypercall3(long, vcpu_op, cmd, cpu, arg);
-}
-
-static inline int
-HYPERVISOR_physdev_op(int cmd, void *arg)
-{
-       switch (cmd) {
-       case PHYSDEVOP_eoi:
-               return _hypercall1(int, ia64_fast_eoi,
-                                  ((struct physdev_eoi *)arg)->irq);
-       default:
-               return xencomm_hypercall_physdev_op(cmd, arg);
-       }
-}
-
-static inline int
-xencomm_arch_hypercall_xenoprof_op(int op, struct xencomm_handle *arg)
-{
-       return _hypercall2(int, xenoprof_op, op, arg);
-}
-
-extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
-static inline void exit_idle(void) {}
-#define do_IRQ(irq, regs) ({                   \
-       irq_enter();                            \
-       __do_IRQ((irq), (regs));                \
-       irq_exit();                             \
-})
-
-#include <linux/err.h>
-#ifdef CONFIG_XEN
-#include <asm/xen/privop.h>
-#endif /* CONFIG_XEN */
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
-
-static inline unsigned long
-__HYPERVISOR_ioremap(unsigned long ioaddr, unsigned long size)
-{
-       return _hypercall3(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_ioremap, ioaddr, size);
-}
-
-static inline unsigned long
-HYPERVISOR_ioremap(unsigned long ioaddr, unsigned long size)
-{
-       unsigned long ret = ioaddr;
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_ioremap(ioaddr, size);
-               if (unlikely(ret == -ENOSYS))
-                       panic("hypercall %s failed with %ld. "
-                             "Please check Xen and Linux config mismatch\n",
-                             __func__, -ret);
-               else if (unlikely(IS_ERR_VALUE(ret)))
-                       ret = ioaddr;
-       }
-       return ret;
-}
-
-static inline unsigned long
-__HYPERVISOR_phystomach(unsigned long gpfn)
-{
-       return _hypercall2(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_phystomach, gpfn);
-}
-
-static inline unsigned long
-HYPERVISOR_phystomach(unsigned long gpfn)
-{
-       unsigned long ret = gpfn;
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_phystomach(gpfn);
-       }
-       return ret;
-}
-
-static inline unsigned long
-__HYPERVISOR_machtophys(unsigned long mfn)
-{
-       return _hypercall2(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_machtophys, mfn);
-}
-
-static inline unsigned long
-HYPERVISOR_machtophys(unsigned long mfn)
-{
-       unsigned long ret = mfn;
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_machtophys(mfn);
-       }
-       return ret;
-}
-
-static inline unsigned long
-__HYPERVISOR_zap_physmap(unsigned long gpfn, unsigned int extent_order)
-{
-       return _hypercall3(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_zap_physmap, gpfn, extent_order);
-}
-
-static inline unsigned long
-HYPERVISOR_zap_physmap(unsigned long gpfn, unsigned int extent_order)
-{
-       unsigned long ret = 0;
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_zap_physmap(gpfn, extent_order);
-       }
-       return ret;
-}
-
-static inline unsigned long
-__HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
-                        unsigned long flags, domid_t domid)
-{
-       return _hypercall5(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_add_physmap, gpfn, mfn, flags, domid);
-}
-
-static inline unsigned long
-HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
-                      unsigned long flags, domid_t domid)
-{
-       unsigned long ret = 0;
-       BUG_ON(!is_running_on_xen());//XXX
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_add_physmap(gpfn, mfn, flags, domid);
-       }
-       return ret;
-}
-
-static inline unsigned long
-__HYPERVISOR_add_physmap_with_gmfn(unsigned long gpfn, unsigned long gmfn,
-                                   unsigned long flags, domid_t domid)
-{
-       return _hypercall5(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_add_physmap_with_gmfn,
-                          gpfn, gmfn, flags, domid);
-}
-
-static inline unsigned long
-HYPERVISOR_add_physmap_with_gmfn(unsigned long gpfn, unsigned long gmfn,
-                                unsigned long flags, domid_t domid)
-{
-       unsigned long ret = 0;
-       BUG_ON(!is_running_on_xen());//XXX
-       if (is_running_on_xen()) {
-               ret = __HYPERVISOR_add_physmap_with_gmfn(gpfn, gmfn,
-                                                        flags, domid);
-       }
-       return ret;
-}
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
-static inline unsigned long
-HYPERVISOR_expose_p2m(unsigned long conv_start_gpfn,
-                      unsigned long assign_start_gpfn,
-                      unsigned long expose_size, unsigned long granule_pfn)
-{
-       return _hypercall5(unsigned long, ia64_dom0vp_op,
-                          IA64_DOM0VP_expose_p2m, conv_start_gpfn,
-                          assign_start_gpfn, expose_size, granule_pfn);
-}
-#endif
-
-static inline int
-xencomm_arch_hypercall_perfmon_op(unsigned long cmd,
-                                  struct xencomm_handle *arg,
-                                  unsigned long count)
-{
-       return _hypercall4(int, ia64_dom0vp_op,
-                          IA64_DOM0VP_perfmon, cmd, arg, count);
-}
-
-// for balloon driver
-#define HYPERVISOR_update_va_mapping(va, new_val, flags) (0)
-
-/* Use xencomm to do hypercalls.  */
-#ifdef MODULE
-#define HYPERVISOR_sched_op xencomm_mini_hypercall_sched_op
-#define HYPERVISOR_event_channel_op xencomm_mini_hypercall_event_channel_op
-#define HYPERVISOR_callback_op xencomm_mini_hypercall_callback_op
-#define HYPERVISOR_multicall xencomm_mini_hypercall_multicall
-#define HYPERVISOR_xen_version xencomm_mini_hypercall_xen_version
-#define HYPERVISOR_console_io xencomm_mini_hypercall_console_io
-#define HYPERVISOR_hvm_op xencomm_mini_hypercall_hvm_op
-#define HYPERVISOR_memory_op xencomm_mini_hypercall_memory_op
-#define HYPERVISOR_xenoprof_op xencomm_mini_hypercall_xenoprof_op
-#define HYPERVISOR_perfmon_op xencomm_mini_hypercall_perfmon_op
-#else
-#define HYPERVISOR_sched_op xencomm_hypercall_sched_op
-#define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
-#define HYPERVISOR_callback_op xencomm_hypercall_callback_op
-#define HYPERVISOR_multicall xencomm_hypercall_multicall
-#define HYPERVISOR_xen_version xencomm_hypercall_xen_version
-#define HYPERVISOR_console_io xencomm_hypercall_console_io
-#define HYPERVISOR_hvm_op xencomm_hypercall_hvm_op
-#define HYPERVISOR_memory_op xencomm_hypercall_memory_op
-#define HYPERVISOR_xenoprof_op xencomm_hypercall_xenoprof_op
-#define HYPERVISOR_perfmon_op xencomm_hypercall_perfmon_op
-#endif
-
-#define HYPERVISOR_suspend xencomm_hypercall_suspend
-#define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op
-
-#endif /* __HYPERCALL_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
deleted file mode 100644 (file)
index aeee02c..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/******************************************************************************
- * hypervisor.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERVISOR_H__
-#define __HYPERVISOR_H__
-
-#ifdef CONFIG_XEN
-extern int running_on_xen;
-#define is_running_on_xen()                    (running_on_xen)
-#else /* CONFIG_XEN */
-# ifdef CONFIG_VMX_GUEST
-#  define is_running_on_xen()                  (1)
-# else /* CONFIG_VMX_GUEST */
-#  define is_running_on_xen()                  (0)
-#  define HYPERVISOR_ioremap(offset, size)     (offset)
-# endif /* CONFIG_VMX_GUEST */
-#endif /* CONFIG_XEN */
-
-#if defined(CONFIG_XEN) || defined(CONFIG_VMX_GUEST)
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/version.h>
-#include <linux/errno.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/sched.h>
-#include <xen/hypercall.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-
-extern shared_info_t *HYPERVISOR_shared_info;
-extern start_info_t *xen_start_info;
-
-void force_evtchn_callback(void);
-
-/* Turn jiffies into Xen system time. XXX Implement me. */
-#define jiffies_to_st(j)       0
-
-static inline int
-HYPERVISOR_yield(
-       void)
-{
-       int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_block(
-       void)
-{
-       int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_shutdown(
-       unsigned int reason)
-{
-       struct sched_shutdown sched_shutdown = {
-               .reason = reason
-       };
-
-       int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_poll(
-       evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
-{
-       struct sched_poll sched_poll = {
-               .nr_ports = nr_ports,
-               .timeout = jiffies_to_st(timeout)
-       };
-
-       int rc;
-
-       set_xen_guest_handle(sched_poll.ports, ports);
-       rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
-
-       return rc;
-}
-
-#ifndef CONFIG_VMX_GUEST
-// for drivers/xen/privcmd/privcmd.c
-#define machine_to_phys_mapping 0
-struct vm_area_struct;
-int direct_remap_pfn_range(struct vm_area_struct *vma,
-                          unsigned long address,
-                          unsigned long mfn,
-                          unsigned long size,
-                          pgprot_t prot,
-                          domid_t  domid);
-struct file;
-int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
-int privcmd_mmap(struct file * file, struct vm_area_struct * vma);
-#define HAVE_ARCH_PRIVCMD_MMAP
-
-// for drivers/xen/balloon/balloon.c
-#ifdef CONFIG_XEN_SCRUB_PAGES
-#define scrub_pages(_p,_n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT)
-#else
-#define scrub_pages(_p,_n) ((void)0)
-#endif
-#define        pte_mfn(_x)     pte_pfn(_x)
-#define phys_to_machine_mapping_valid(_x)      (1)
-
-#endif /* !CONFIG_VMX_GUEST */
-
-#define __pte_ma(_x)   ((pte_t) {(_x)})        /* unmodified use */
-#define pfn_pte_ma(_x,_y)      __pte_ma(0)     /* unmodified use */
-
-#ifndef CONFIG_VMX_GUEST
-int __xen_create_contiguous_region(unsigned long vstart, unsigned int order, unsigned int address_bits);
-static inline int
-xen_create_contiguous_region(unsigned long vstart,
-                             unsigned int order, unsigned int address_bits)
-{
-       int ret = 0;
-       if (is_running_on_xen()) {
-               ret = __xen_create_contiguous_region(vstart, order,
-                                                    address_bits);
-       }
-       return ret;
-}
-
-void __xen_destroy_contiguous_region(unsigned long vstart, unsigned int order);
-static inline void
-xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
-{
-       if (is_running_on_xen())
-               __xen_destroy_contiguous_region(vstart, order);
-}
-
-/* For drivers/xen/core/machine_reboot.c */
-#define HAVE_XEN_POST_SUSPEND
-void xen_post_suspend(int suspend_cancelled);
-#endif /* !CONFIG_VMX_GUEST */
-
-// for netfront.c, netback.c
-#define MULTI_UVMFLAGS_INDEX 0 //XXX any value
-
-static inline void
-MULTI_update_va_mapping(
-       multicall_entry_t *mcl, unsigned long va,
-       pte_t new_val, unsigned long flags)
-{
-       mcl->op = __HYPERVISOR_update_va_mapping;
-       mcl->result = 0;
-}
-
-static inline void
-MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
-       void *uop, unsigned int count)
-{
-       mcl->op = __HYPERVISOR_grant_table_op;
-       mcl->args[0] = cmd;
-       mcl->args[1] = (unsigned long)uop;
-       mcl->args[2] = count;
-}
-
-/*
- * for blktap.c
- * int create_lookup_pte_addr(struct mm_struct *mm, 
- *                            unsigned long address,
- *                            uint64_t *ptep);
- */
-#define create_lookup_pte_addr(mm, address, ptep)                      \
-       ({                                                              \
-               printk(KERN_EMERG                                       \
-                      "%s:%d "                                         \
-                      "create_lookup_pte_addr() isn't supported.\n",   \
-                      __func__, __LINE__);                             \
-               BUG();                                                  \
-               (-ENOSYS);                                              \
-       })
-
-// for debug
-asmlinkage int xprintk(const char *fmt, ...);
-#define xprintd(fmt, ...)      xprintk("%s:%d " fmt, __func__, __LINE__, \
-                                       ##__VA_ARGS__)
-
-#endif /* CONFIG_XEN || CONFIG_VMX_GUEST */
-
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-#define is_initial_xendomain()                                         \
-       (is_running_on_xen() ? xen_start_info->flags & SIF_INITDOMAIN : 0)
-#else
-#define is_initial_xendomain() 0
-#endif
-
-#endif /* __HYPERVISOR_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/intel_intrin.h b/linux-2.6-xen-sparse/include/asm-ia64/intel_intrin.h
deleted file mode 100644 (file)
index 371e42d..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef _ASM_IA64_INTEL_INTRIN_H
-#define _ASM_IA64_INTEL_INTRIN_H
-/*
- * Intel Compiler Intrinsics
- *
- * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
- * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
- * Copyright (C) 2005,2006 Hongjiu Lu <hongjiu.lu@intel.com>
- *
- */
-#include <ia64intrin.h>
-
-#define ia64_barrier()         __memory_barrier()
-
-#define ia64_stop()    /* Nothing: As of now stop bit is generated for each
-                        * intrinsic
-                        */
-
-#define __ia64_getreg          __getReg
-#define __ia64_setreg          __setReg
-
-#define ia64_hint              __hint
-#define ia64_hint_pause                __hint_pause
-
-#define ia64_mux1_brcst                _m64_mux1_brcst
-#define ia64_mux1_mix          _m64_mux1_mix
-#define ia64_mux1_shuf         _m64_mux1_shuf
-#define ia64_mux1_alt          _m64_mux1_alt
-#define ia64_mux1_rev          _m64_mux1_rev
-
-#define ia64_mux1(x,v)         _m_to_int64(_m64_mux1(_m_from_int64(x), (v)))
-#define ia64_popcnt            _m64_popcnt
-#define ia64_getf_exp          __getf_exp
-#define ia64_shrp              _m64_shrp
-
-#define __ia64_tpa             __tpa
-#define ia64_invala            __invala
-#define ia64_invala_gr         __invala_gr
-#define ia64_invala_fr         __invala_fr
-#define ia64_nop               __nop
-#define ia64_sum               __sum
-#define __ia64_ssm             __ssm
-#define ia64_rum               __rum
-#define __ia64_rsm             __rsm
-#define __ia64_fc              __fc
-
-#define ia64_ldfs              __ldfs
-#define ia64_ldfd              __ldfd
-#define ia64_ldfe              __ldfe
-#define ia64_ldf8              __ldf8
-#define ia64_ldf_fill          __ldf_fill
-
-#define ia64_stfs              __stfs
-#define ia64_stfd              __stfd
-#define ia64_stfe              __stfe
-#define ia64_stf8              __stf8
-#define ia64_stf_spill         __stf_spill
-
-#define ia64_mf                        __mf
-#define ia64_mfa               __mfa
-
-#define ia64_fetchadd4_acq     __fetchadd4_acq
-#define ia64_fetchadd4_rel     __fetchadd4_rel
-#define ia64_fetchadd8_acq     __fetchadd8_acq
-#define ia64_fetchadd8_rel     __fetchadd8_rel
-
-#define ia64_xchg1             _InterlockedExchange8
-#define ia64_xchg2             _InterlockedExchange16
-#define ia64_xchg4             _InterlockedExchange
-#define ia64_xchg8             _InterlockedExchange64
-
-#define ia64_cmpxchg1_rel      _InterlockedCompareExchange8_rel
-#define ia64_cmpxchg1_acq      _InterlockedCompareExchange8_acq
-#define ia64_cmpxchg2_rel      _InterlockedCompareExchange16_rel
-#define ia64_cmpxchg2_acq      _InterlockedCompareExchange16_acq
-#define ia64_cmpxchg4_rel      _InterlockedCompareExchange_rel
-#define ia64_cmpxchg4_acq      _InterlockedCompareExchange_acq
-#define ia64_cmpxchg8_rel      _InterlockedCompareExchange64_rel
-#define ia64_cmpxchg8_acq      _InterlockedCompareExchange64_acq
-
-#define __ia64_set_dbr(index, val)     \
-               __setIndReg(_IA64_REG_INDR_DBR, index, val)
-#define __ia64_set_ibr(index, val)     \
-               __setIndReg(_IA64_REG_INDR_IBR, index, val)
-#define __ia64_set_pkr(index, val)     \
-               __setIndReg(_IA64_REG_INDR_PKR, index, val)
-#define __ia64_set_pmc(index, val)     \
-               __setIndReg(_IA64_REG_INDR_PMC, index, val)
-#define __ia64_set_pmd(index, val)     \
-               __setIndReg(_IA64_REG_INDR_PMD, index, val)
-#define __ia64_set_rr(index, val)      \
-               __setIndReg(_IA64_REG_INDR_RR, index, val)
-
-#define __ia64_get_cpuid(index)        __getIndReg(_IA64_REG_INDR_CPUID, index)
-#define __ia64_get_dbr(index)  __getIndReg(_IA64_REG_INDR_DBR, index)
-#define __ia64_get_ibr(index)  __getIndReg(_IA64_REG_INDR_IBR, index)
-#define __ia64_get_pkr(index)  __getIndReg(_IA64_REG_INDR_PKR, index)
-#define __ia64_get_pmc(index)  __getIndReg(_IA64_REG_INDR_PMC, index)
-#define __ia64_get_pmd(index)          __getIndReg(_IA64_REG_INDR_PMD, index)
-#define __ia64_get_rr(index)   __getIndReg(_IA64_REG_INDR_RR, index)
-
-#define ia64_srlz_d            __dsrlz
-#define ia64_srlz_i            __isrlz
-
-#define ia64_dv_serialize_data()
-#define ia64_dv_serialize_instruction()
-
-#define ia64_st1_rel           __st1_rel
-#define ia64_st2_rel           __st2_rel
-#define ia64_st4_rel           __st4_rel
-#define ia64_st8_rel           __st8_rel
-
-#define ia64_ld1_acq           __ld1_acq
-#define ia64_ld2_acq           __ld2_acq
-#define ia64_ld4_acq           __ld4_acq
-#define ia64_ld8_acq           __ld8_acq
-
-#define ia64_sync_i            __synci
-#define __ia64_thash           __thash
-#define __ia64_ttag            __ttag
-#define __ia64_itcd            __itcd
-#define __ia64_itci            __itci
-#define __ia64_itrd            __itrd
-#define __ia64_itri            __itri
-#define __ia64_ptce            __ptce
-#define __ia64_ptcl            __ptcl
-#define __ia64_ptcg            __ptcg
-#define __ia64_ptcga           __ptcga
-#define __ia64_ptri            __ptri
-#define __ia64_ptrd            __ptrd
-#define ia64_dep_mi            _m64_dep_mi
-
-/* Values for lfhint in __lfetch and __lfetch_fault */
-
-#define ia64_lfhint_none       __lfhint_none
-#define ia64_lfhint_nt1                __lfhint_nt1
-#define ia64_lfhint_nt2                __lfhint_nt2
-#define ia64_lfhint_nta                __lfhint_nta
-
-#define ia64_lfetch            __lfetch
-#define ia64_lfetch_excl       __lfetch_excl
-#define ia64_lfetch_fault      __lfetch_fault
-#define ia64_lfetch_fault_excl __lfetch_fault_excl
-
-#define __ia64_intrin_local_irq_restore(x)             \
-do {                                                   \
-       if ((x) != 0) {                                 \
-               __ia64_ssm(IA64_PSR_I);                 \
-               ia64_srlz_d();                          \
-       } else {                                        \
-               __ia64_rsm(IA64_PSR_I);                 \
-       }                                               \
-} while (0)
-
-#define __ia64_get_psr_i()     (__ia64_getreg(_IA64_REG_PSR) & 0x4000UL)
-
-#define __builtin_trap()       __break(0);
-
-#endif /* _ASM_IA64_INTEL_INTRIN_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/io.h b/linux-2.6-xen-sparse/include/asm-ia64/io.h
deleted file mode 100644 (file)
index cc48ed1..0000000
+++ /dev/null
@@ -1,509 +0,0 @@
-#ifndef _ASM_IA64_IO_H
-#define _ASM_IA64_IO_H
-
-/*
- * This file contains the definitions for the emulated IO instructions
- * inb/inw/inl/outb/outw/outl and the "string versions" of the same
- * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
- * versions of the single-IO instructions (inb_p/inw_p/..).
- *
- * This file is not meant to be obfuscating: it's just complicated to
- * (a) handle it all in a way that makes gcc able to optimize it as
- * well as possible and (b) trying to avoid writing the same thing
- * over and over again with slight variations and possibly making a
- * mistake somewhere.
- *
- * Copyright (C) 1998-2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
- * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
- */
-
-/* We don't use IO slowdowns on the ia64, but.. */
-#define __SLOW_DOWN_IO do { } while (0)
-#define SLOW_DOWN_IO   do { } while (0)
-
-#define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED)
-
-/*
- * The legacy I/O space defined by the ia64 architecture supports only 65536 ports, but
- * large machines may have multiple other I/O spaces so we can't place any a priori limit
- * on IO_SPACE_LIMIT.  These additional spaces are described in ACPI.
- */
-#define IO_SPACE_LIMIT         0xffffffffffffffffUL
-
-#define MAX_IO_SPACES_BITS             4
-#define MAX_IO_SPACES                  (1UL << MAX_IO_SPACES_BITS)
-#define IO_SPACE_BITS                  24
-#define IO_SPACE_SIZE                  (1UL << IO_SPACE_BITS)
-
-#define IO_SPACE_NR(port)              ((port) >> IO_SPACE_BITS)
-#define IO_SPACE_BASE(space)           ((space) << IO_SPACE_BITS)
-#define IO_SPACE_PORT(port)            ((port) & (IO_SPACE_SIZE - 1))
-
-#define IO_SPACE_SPARSE_ENCODING(p)    ((((p) >> 2) << 12) | ((p) & 0xfff))
-
-struct io_space {
-       unsigned long mmio_base;        /* base in MMIO space */
-       int sparse;
-};
-
-extern struct io_space io_space[];
-extern unsigned int num_io_spaces;
-
-# ifdef __KERNEL__
-
-/*
- * All MMIO iomem cookies are in region 6; anything less is a PIO cookie:
- *     0xCxxxxxxxxxxxxxxx      MMIO cookie (return from ioremap)
- *     0x000000001SPPPPPP      PIO cookie (S=space number, P..P=port)
- *
- * ioread/writeX() uses the leading 1 in PIO cookies (PIO_OFFSET) to catch
- * code that uses bare port numbers without the prerequisite pci_iomap().
- */
-#define PIO_OFFSET             (1UL << (MAX_IO_SPACES_BITS + IO_SPACE_BITS))
-#define PIO_MASK               (PIO_OFFSET - 1)
-#define PIO_RESERVED           __IA64_UNCACHED_OFFSET
-#define HAVE_ARCH_PIO_SIZE
-
-#include <asm/hypervisor.h>
-#include <asm/intrinsics.h>
-#include <asm/machvec.h>
-#include <asm/page.h>
-#include <asm/privop.h>
-#include <asm/system.h>
-#include <asm-generic/iomap.h>
-
-/*
- * Change virtual addresses to physical addresses and vv.
- */
-static inline unsigned long
-virt_to_phys (volatile void *address)
-{
-       return (unsigned long) address - PAGE_OFFSET;
-}
-
-static inline void*
-phys_to_virt (unsigned long address)
-{
-       return (void *) (address + PAGE_OFFSET);
-}
-
-#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
-extern u64 kern_mem_attribute (unsigned long phys_addr, unsigned long size);
-extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */
-extern int valid_mmap_phys_addr_range (unsigned long pfn, size_t count);
-
-/*
- * The following two macros are deprecated and scheduled for removal.
- * Please use the PCI-DMA interface defined in <asm/pci.h> instead.
- */
-#ifndef CONFIG_XEN
-#define bus_to_virt    phys_to_virt
-#define virt_to_bus    virt_to_phys
-#define page_to_bus    page_to_phys
-#else
-#define bus_to_virt(bus)       \
-       phys_to_virt(machine_to_phys_for_dma(bus))
-#define virt_to_bus(virt)      \
-       phys_to_machine_for_dma(virt_to_phys(virt))
-#define page_to_bus(page)      \
-       phys_to_machine_for_dma(page_to_pseudophys(page))
-
-#define page_to_pseudophys(page) \
-       ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-
-/*
- * Drivers that use page_to_phys() for bus addresses are broken.
- * This includes:
- * drivers/ide/cris/ide-cris.c
- * drivers/scsi/dec_esp.c
- */
-#define page_to_phys(page)     (page_to_pseudophys(page))
-#define bvec_to_bus(bv)                (page_to_bus((bv)->bv_page) + \
-                               (unsigned long) (bv)->bv_offset)
-#define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) +  \
-                                (unsigned long) bio_offset((bio)))
-#define bvec_to_pseudophys(bv)  (page_to_pseudophys((bv)->bv_page) +   \
-                                (unsigned long) (bv)->bv_offset)
-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2)                              \
-       (((bvec_to_bus((vec1)) + (vec1)->bv_len) == bvec_to_bus((vec2))) && \
-        ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) ==              \
-         bvec_to_pseudophys((vec2))))
-
-/* We will be supplying our own /dev/mem implementation */
-#define ARCH_HAS_DEV_MEM
-#define ARCH_HAS_DEV_MEM_MMAP_MEM
-int xen_mmap_mem(struct file * file, struct vm_area_struct * vma);
-#endif /* CONFIG_XEN */
-
-# endif /* KERNEL */
-
-/*
- * Memory fence w/accept.  This should never be used in code that is
- * not IA-64 specific.
- */
-#define __ia64_mf_a()  ia64_mfa()
-
-/**
- * ___ia64_mmiowb - I/O write barrier
- *
- * Ensure ordering of I/O space writes.  This will make sure that writes
- * following the barrier will arrive after all previous writes.  For most
- * ia64 platforms, this is a simple 'mf.a' instruction.
- *
- * See Documentation/DocBook/deviceiobook.tmpl for more information.
- */
-static inline void ___ia64_mmiowb(void)
-{
-       ia64_mfa();
-}
-
-static inline void*
-__ia64_mk_io_addr (unsigned long port)
-{
-       struct io_space *space;
-       unsigned long offset;
-
-       space = &io_space[IO_SPACE_NR(port)];
-       port = IO_SPACE_PORT(port);
-       if (space->sparse)
-               offset = IO_SPACE_SPARSE_ENCODING(port);
-       else
-               offset = port;
-
-       return (void *) (space->mmio_base | offset);
-}
-
-#define __ia64_inb     ___ia64_inb
-#define __ia64_inw     ___ia64_inw
-#define __ia64_inl     ___ia64_inl
-#define __ia64_outb    ___ia64_outb
-#define __ia64_outw    ___ia64_outw
-#define __ia64_outl    ___ia64_outl
-#define __ia64_readb   ___ia64_readb
-#define __ia64_readw   ___ia64_readw
-#define __ia64_readl   ___ia64_readl
-#define __ia64_readq   ___ia64_readq
-#define __ia64_readb_relaxed   ___ia64_readb
-#define __ia64_readw_relaxed   ___ia64_readw
-#define __ia64_readl_relaxed   ___ia64_readl
-#define __ia64_readq_relaxed   ___ia64_readq
-#define __ia64_writeb  ___ia64_writeb
-#define __ia64_writew  ___ia64_writew
-#define __ia64_writel  ___ia64_writel
-#define __ia64_writeq  ___ia64_writeq
-#define __ia64_mmiowb  ___ia64_mmiowb
-
-/*
- * For the in/out routines, we need to do "mf.a" _after_ doing the I/O access to ensure
- * that the access has completed before executing other I/O accesses.  Since we're doing
- * the accesses through an uncachable (UC) translation, the CPU will execute them in
- * program order.  However, we still need to tell the compiler not to shuffle them around
- * during optimization, which is why we use "volatile" pointers.
- */
-
-static inline unsigned int
-___ia64_inb (unsigned long port)
-{
-       volatile unsigned char *addr = __ia64_mk_io_addr(port);
-       unsigned char ret;
-
-       ret = *addr;
-       __ia64_mf_a();
-       return ret;
-}
-
-static inline unsigned int
-___ia64_inw (unsigned long port)
-{
-       volatile unsigned short *addr = __ia64_mk_io_addr(port);
-       unsigned short ret;
-
-       ret = *addr;
-       __ia64_mf_a();
-       return ret;
-}
-
-static inline unsigned int
-___ia64_inl (unsigned long port)
-{
-       volatile unsigned int *addr = __ia64_mk_io_addr(port);
-       unsigned int ret;
-
-       ret = *addr;
-       __ia64_mf_a();
-       return ret;
-}
-
-static inline void
-___ia64_outb (unsigned char val, unsigned long port)
-{
-       volatile unsigned char *addr = __ia64_mk_io_addr(port);
-
-       *addr = val;
-       __ia64_mf_a();
-}
-
-static inline void
-___ia64_outw (unsigned short val, unsigned long port)
-{
-       volatile unsigned short *addr = __ia64_mk_io_addr(port);
-
-       *addr = val;
-       __ia64_mf_a();
-}
-
-static inline void
-___ia64_outl (unsigned int val, unsigned long port)
-{
-       volatile unsigned int *addr = __ia64_mk_io_addr(port);
-
-       *addr = val;
-       __ia64_mf_a();
-}
-
-static inline void
-__insb (unsigned long port, void *dst, unsigned long count)
-{
-       unsigned char *dp = dst;
-
-       while (count--)
-               *dp++ = platform_inb(port);
-}
-
-static inline void
-__insw (unsigned long port, void *dst, unsigned long count)
-{
-       unsigned short *dp = dst;
-
-       while (count--)
-               *dp++ = platform_inw(port);
-}
-
-static inline void
-__insl (unsigned long port, void *dst, unsigned long count)
-{
-       unsigned int *dp = dst;
-
-       while (count--)
-               *dp++ = platform_inl(port);
-}
-
-static inline void
-__outsb (unsigned long port, const void *src, unsigned long count)
-{
-       const unsigned char *sp = src;
-
-       while (count--)
-               platform_outb(*sp++, port);
-}
-
-static inline void
-__outsw (unsigned long port, const void *src, unsigned long count)
-{
-       const unsigned short *sp = src;
-
-       while (count--)
-               platform_outw(*sp++, port);
-}
-
-static inline void
-__outsl (unsigned long port, const void *src, unsigned long count)
-{
-       const unsigned int *sp = src;
-
-       while (count--)
-               platform_outl(*sp++, port);
-}
-
-/*
- * Unfortunately, some platforms are broken and do not follow the IA-64 architecture
- * specification regarding legacy I/O support.  Thus, we have to make these operations
- * platform dependent...
- */
-#define __inb          platform_inb
-#define __inw          platform_inw
-#define __inl          platform_inl
-#define __outb         platform_outb
-#define __outw         platform_outw
-#define __outl         platform_outl
-#define __mmiowb       platform_mmiowb
-
-#define inb(p)         __inb(p)
-#define inw(p)         __inw(p)
-#define inl(p)         __inl(p)
-#define insb(p,d,c)    __insb(p,d,c)
-#define insw(p,d,c)    __insw(p,d,c)
-#define insl(p,d,c)    __insl(p,d,c)
-#define outb(v,p)      __outb(v,p)
-#define outw(v,p)      __outw(v,p)
-#define outl(v,p)      __outl(v,p)
-#define outsb(p,s,c)   __outsb(p,s,c)
-#define outsw(p,s,c)   __outsw(p,s,c)
-#define outsl(p,s,c)   __outsl(p,s,c)
-#define mmiowb()       __mmiowb()
-
-/*
- * The address passed to these functions are ioremap()ped already.
- *
- * We need these to be machine vectors since some platforms don't provide
- * DMA coherence via PIO reads (PCI drivers and the spec imply that this is
- * a good idea).  Writes are ok though for all existing ia64 platforms (and
- * hopefully it'll stay that way).
- */
-static inline unsigned char
-___ia64_readb (const volatile void __iomem *addr)
-{
-       return *(volatile unsigned char __force *)addr;
-}
-
-static inline unsigned short
-___ia64_readw (const volatile void __iomem *addr)
-{
-       return *(volatile unsigned short __force *)addr;
-}
-
-static inline unsigned int
-___ia64_readl (const volatile void __iomem *addr)
-{
-       return *(volatile unsigned int __force *) addr;
-}
-
-static inline unsigned long
-___ia64_readq (const volatile void __iomem *addr)
-{
-       return *(volatile unsigned long __force *) addr;
-}
-
-static inline void
-__writeb (unsigned char val, volatile void __iomem *addr)
-{
-       *(volatile unsigned char __force *) addr = val;
-}
-
-static inline void
-__writew (unsigned short val, volatile void __iomem *addr)
-{
-       *(volatile unsigned short __force *) addr = val;
-}
-
-static inline void
-__writel (unsigned int val, volatile void __iomem *addr)
-{
-       *(volatile unsigned int __force *) addr = val;
-}
-
-static inline void
-__writeq (unsigned long val, volatile void __iomem *addr)
-{
-       *(volatile unsigned long __force *) addr = val;
-}
-
-#define __readb                platform_readb
-#define __readw                platform_readw
-#define __readl                platform_readl
-#define __readq                platform_readq
-#define __readb_relaxed        platform_readb_relaxed
-#define __readw_relaxed        platform_readw_relaxed
-#define __readl_relaxed        platform_readl_relaxed
-#define __readq_relaxed        platform_readq_relaxed
-
-#define readb(a)       __readb((a))
-#define readw(a)       __readw((a))
-#define readl(a)       __readl((a))
-#define readq(a)       __readq((a))
-#define readb_relaxed(a)       __readb_relaxed((a))
-#define readw_relaxed(a)       __readw_relaxed((a))
-#define readl_relaxed(a)       __readl_relaxed((a))
-#define readq_relaxed(a)       __readq_relaxed((a))
-#define __raw_readb    readb
-#define __raw_readw    readw
-#define __raw_readl    readl
-#define __raw_readq    readq
-#define __raw_readb_relaxed    readb_relaxed
-#define __raw_readw_relaxed    readw_relaxed
-#define __raw_readl_relaxed    readl_relaxed
-#define __raw_readq_relaxed    readq_relaxed
-#define writeb(v,a)    __writeb((v), (a))
-#define writew(v,a)    __writew((v), (a))
-#define writel(v,a)    __writel((v), (a))
-#define writeq(v,a)    __writeq((v), (a))
-#define __raw_writeb   writeb
-#define __raw_writew   writew
-#define __raw_writel   writel
-#define __raw_writeq   writeq
-
-#ifndef inb_p
-# define inb_p         inb
-#endif
-#ifndef inw_p
-# define inw_p         inw
-#endif
-#ifndef inl_p
-# define inl_p         inl
-#endif
-
-#ifndef outb_p
-# define outb_p                outb
-#endif
-#ifndef outw_p
-# define outw_p                outw
-#endif
-#ifndef outl_p
-# define outl_p                outl
-#endif
-
-extern void __iomem * ioremap(unsigned long offset, unsigned long size);
-extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
-
-static inline void
-iounmap (volatile void __iomem *addr)
-{
-}
-
-/* Use normal IO mappings for DMI */
-#define dmi_ioremap ioremap
-#define dmi_iounmap(x,l) iounmap(x)
-#define dmi_alloc(l) kmalloc(l, GFP_ATOMIC)
-
-# ifdef __KERNEL__
-
-/*
- * String version of IO memory access ops:
- */
-extern void memcpy_fromio(void *dst, const volatile void __iomem *src, long n);
-extern void memcpy_toio(volatile void __iomem *dst, const void *src, long n);
-extern void memset_io(volatile void __iomem *s, int c, long n);
-
-#define dma_cache_inv(_start,_size)             do { } while (0)
-#define dma_cache_wback(_start,_size)           do { } while (0)
-#define dma_cache_wback_inv(_start,_size)       do { } while (0)
-
-# endif /* __KERNEL__ */
-
-/*
- * Enabling BIO_VMERGE_BOUNDARY forces us to turn off I/O MMU bypassing.  It is said that
- * BIO-level virtual merging can give up to 4% performance boost (not verified for ia64).
- * On the other hand, we know that I/O MMU bypassing gives ~8% performance improvement on
- * SPECweb-like workloads on zx1-based machines.  Thus, for now we favor I/O MMU bypassing
- * over BIO-level virtual merging.
- */
-extern unsigned long ia64_max_iommu_merge_mask;
-#if 1
-#define BIO_VMERGE_BOUNDARY    0
-#else
-/*
- * It makes no sense at all to have this BIO_VMERGE_BOUNDARY macro here.  Should be
- * replaced by dma_merge_mask() or something of that sort.  Note: the only way
- * BIO_VMERGE_BOUNDARY is used is to mask off bits.  Effectively, our definition gets
- * expanded into:
- *
- *     addr & ((ia64_max_iommu_merge_mask + 1) - 1) == (addr & ia64_max_iommu_vmerge_mask)
- *
- * which is precisely what we want.
- */
-#define BIO_VMERGE_BOUNDARY    (ia64_max_iommu_merge_mask + 1)
-#endif
-
-#endif /* _ASM_IA64_IO_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/iosapic.h b/linux-2.6-xen-sparse/include/asm-ia64/iosapic.h
deleted file mode 100644 (file)
index 87de487..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef __ASM_IA64_IOSAPIC_H
-#define __ASM_IA64_IOSAPIC_H
-
-#define        IOSAPIC_REG_SELECT      0x0
-#define        IOSAPIC_WINDOW          0x10
-#define        IOSAPIC_EOI             0x40
-
-#define        IOSAPIC_VERSION         0x1
-
-/*
- * Redirection table entry
- */
-#define        IOSAPIC_RTE_LOW(i)      (0x10+i*2)
-#define        IOSAPIC_RTE_HIGH(i)     (0x11+i*2)
-
-#define        IOSAPIC_DEST_SHIFT              16
-
-/*
- * Delivery mode
- */
-#define        IOSAPIC_DELIVERY_SHIFT          8
-#define        IOSAPIC_FIXED                   0x0
-#define        IOSAPIC_LOWEST_PRIORITY 0x1
-#define        IOSAPIC_PMI                     0x2
-#define        IOSAPIC_NMI                     0x4
-#define        IOSAPIC_INIT                    0x5
-#define        IOSAPIC_EXTINT                  0x7
-
-/*
- * Interrupt polarity
- */
-#define        IOSAPIC_POLARITY_SHIFT          13
-#define        IOSAPIC_POL_HIGH                0
-#define        IOSAPIC_POL_LOW         1
-
-/*
- * Trigger mode
- */
-#define        IOSAPIC_TRIGGER_SHIFT           15
-#define        IOSAPIC_EDGE                    0
-#define        IOSAPIC_LEVEL                   1
-
-/*
- * Mask bit
- */
-
-#define        IOSAPIC_MASK_SHIFT              16
-#define        IOSAPIC_MASK                    (1<<IOSAPIC_MASK_SHIFT)
-
-#ifndef __ASSEMBLY__
-
-#ifdef CONFIG_IOSAPIC
-
-#define NR_IOSAPICS                    256
-
-#ifndef CONFIG_XEN
-static inline unsigned int iosapic_read(char __iomem *iosapic, unsigned int reg)
-{
-       writel(reg, iosapic + IOSAPIC_REG_SELECT);
-       return readl(iosapic + IOSAPIC_WINDOW);
-}
-
-static inline void iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
-{
-       writel(reg, iosapic + IOSAPIC_REG_SELECT);
-       writel(val, iosapic + IOSAPIC_WINDOW);
-}
-#endif
-
-static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
-{
-       writel(vector, iosapic + IOSAPIC_EOI);
-}
-
-extern void __init iosapic_system_init (int pcat_compat);
-extern int __devinit iosapic_init (unsigned long address,
-                                   unsigned int gsi_base);
-#ifdef CONFIG_HOTPLUG
-extern int iosapic_remove (unsigned int gsi_base);
-#else
-#define iosapic_remove(gsi_base)                               (-EINVAL)
-#endif /* CONFIG_HOTPLUG */
-extern int gsi_to_vector (unsigned int gsi);
-extern int gsi_to_irq (unsigned int gsi);
-extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
-                                 unsigned long trigger);
-extern void iosapic_unregister_intr (unsigned int irq);
-extern void __init iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
-                                     unsigned long polarity,
-                                     unsigned long trigger);
-extern int __init iosapic_register_platform_intr (u32 int_type,
-                                          unsigned int gsi,
-                                          int pmi_vector,
-                                          u16 eid, u16 id,
-                                          unsigned long polarity,
-                                          unsigned long trigger);
-extern unsigned int iosapic_version (char __iomem *addr);
-
-#ifdef CONFIG_NUMA
-extern void __devinit map_iosapic_to_node (unsigned int, int);
-#endif
-#else
-#define iosapic_system_init(pcat_compat)                       do { } while (0)
-#define iosapic_init(address,gsi_base)                         (-EINVAL)
-#define iosapic_remove(gsi_base)                               (-ENODEV)
-#define iosapic_register_intr(gsi,polarity,trigger)            (gsi)
-#define iosapic_unregister_intr(irq)                           do { } while (0)
-#define iosapic_override_isa_irq(isa_irq,gsi,polarity,trigger) do { } while (0)
-#define iosapic_register_platform_intr(type,gsi,pmi,eid,id, \
-       polarity,trigger)                                       (gsi)
-#endif
-
-# endif /* !__ASSEMBLY__ */
-#endif /* __ASM_IA64_IOSAPIC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/irq.h b/linux-2.6-xen-sparse/include/asm-ia64/irq.h
deleted file mode 100644 (file)
index ab7e75a..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _ASM_IA64_IRQ_H
-#define _ASM_IA64_IRQ_H
-
-/*
- * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- *
- * 11/24/98    S.Eranian       updated TIMER_IRQ and irq_canonicalize
- * 01/20/99    S.Eranian       added keyboard interrupt
- * 02/29/00     D.Mosberger    moved most things into hw_irq.h
- */
-
-#ifndef CONFIG_XEN
-#define NR_IRQS                256
-#define NR_IRQ_VECTORS NR_IRQS
-#else
-/*
- * The flat IRQ space is divided into two regions:
- *  1. A one-to-one mapping of real physical IRQs. This space is only used
- *     if we have physical device-access privilege. This region is at the 
- *     start of the IRQ space so that existing device drivers do not need
- *     to be modified to translate physical IRQ numbers into our IRQ space.
- *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
- *     are bound using the provided bind/unbind functions.
- */
-
-#define PIRQ_BASE              0
-#define NR_PIRQS               256
-
-#define DYNIRQ_BASE            (PIRQ_BASE + NR_PIRQS)
-#define NR_DYNIRQS             256
-
-#define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
-#define NR_IRQ_VECTORS         NR_IRQS
-
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
-#define RESCHEDULE_VECTOR      0
-#define IPI_VECTOR             1
-#define CMCP_VECTOR            2
-#define CPEP_VECTOR            3
-#define NR_IPIS                        4
-#endif /* CONFIG_XEN */
-
-static __inline__ int
-irq_canonicalize (int irq)
-{
-       /*
-        * We do the legacy thing here of pretending that irqs < 16
-        * are 8259 irqs.  This really shouldn't be necessary at all,
-        * but we keep it here as serial.c still uses it...
-        */
-       return ((irq == 2) ? 9 : irq);
-}
-
-extern void disable_irq (unsigned int);
-extern void disable_irq_nosync (unsigned int);
-extern void enable_irq (unsigned int);
-extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
-
-#endif /* _ASM_IA64_IRQ_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/machvec.h b/linux-2.6-xen-sparse/include/asm-ia64/machvec.h
deleted file mode 100644 (file)
index e712d90..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Machine vector for IA-64.
- *
- * Copyright (C) 1999 Silicon Graphics, Inc.
- * Copyright (C) Srinivasa Thirumalachar <sprasad@engr.sgi.com>
- * Copyright (C) Vijay Chander <vijay@engr.sgi.com>
- * Copyright (C) 1999-2001, 2003-2004 Hewlett-Packard Co.
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-#ifndef _ASM_IA64_MACHVEC_H
-#define _ASM_IA64_MACHVEC_H
-
-#include <linux/types.h>
-
-/* forward declarations: */
-struct device;
-struct pt_regs;
-struct scatterlist;
-struct page;
-struct mm_struct;
-struct pci_bus;
-struct task_struct;
-
-typedef void ia64_mv_setup_t (char **);
-typedef void ia64_mv_cpu_init_t (void);
-typedef void ia64_mv_irq_init_t (void);
-typedef void ia64_mv_send_ipi_t (int, int, int, int);
-typedef void ia64_mv_timer_interrupt_t (int, void *, struct pt_regs *);
-typedef void ia64_mv_global_tlb_purge_t (struct mm_struct *, unsigned long, unsigned long, unsigned long);
-typedef void ia64_mv_tlb_migrate_finish_t (struct mm_struct *);
-typedef unsigned int ia64_mv_local_vector_to_irq (u8);
-typedef char *ia64_mv_pci_get_legacy_mem_t (struct pci_bus *);
-typedef int ia64_mv_pci_legacy_read_t (struct pci_bus *, u16 port, u32 *val,
-                                      u8 size);
-typedef int ia64_mv_pci_legacy_write_t (struct pci_bus *, u16 port, u32 val,
-                                       u8 size);
-typedef void ia64_mv_migrate_t(struct task_struct * task);
-
-/* DMA-mapping interface: */
-typedef void ia64_mv_dma_init (void);
-typedef void *ia64_mv_dma_alloc_coherent (struct device *, size_t, dma_addr_t *, gfp_t);
-typedef void ia64_mv_dma_free_coherent (struct device *, size_t, void *, dma_addr_t);
-typedef dma_addr_t ia64_mv_dma_map_single (struct device *, void *, size_t, int);
-typedef void ia64_mv_dma_unmap_single (struct device *, dma_addr_t, size_t, int);
-typedef int ia64_mv_dma_map_sg (struct device *, struct scatterlist *, int, int);
-typedef void ia64_mv_dma_unmap_sg (struct device *, struct scatterlist *, int, int);
-typedef void ia64_mv_dma_sync_single_for_cpu (struct device *, dma_addr_t, size_t, int);
-typedef void ia64_mv_dma_sync_sg_for_cpu (struct device *, struct scatterlist *, int, int);
-typedef void ia64_mv_dma_sync_single_for_device (struct device *, dma_addr_t, size_t, int);
-typedef void ia64_mv_dma_sync_sg_for_device (struct device *, struct scatterlist *, int, int);
-typedef int ia64_mv_dma_mapping_error (dma_addr_t dma_addr);
-typedef int ia64_mv_dma_supported (struct device *, u64);
-
-/*
- * WARNING: The legacy I/O space is _architected_.  Platforms are
- * expected to follow this architected model (see Section 10.7 in the
- * IA-64 Architecture Software Developer's Manual).  Unfortunately,
- * some broken machines do not follow that model, which is why we have
- * to make the inX/outX operations part of the machine vector.
- * Platform designers should follow the architected model whenever
- * possible.
- */
-typedef unsigned int ia64_mv_inb_t (unsigned long);
-typedef unsigned int ia64_mv_inw_t (unsigned long);
-typedef unsigned int ia64_mv_inl_t (unsigned long);
-typedef void ia64_mv_outb_t (unsigned char, unsigned long);
-typedef void ia64_mv_outw_t (unsigned short, unsigned long);
-typedef void ia64_mv_outl_t (unsigned int, unsigned long);
-typedef void ia64_mv_mmiowb_t (void);
-typedef unsigned char ia64_mv_readb_t (const volatile void __iomem *);
-typedef unsigned short ia64_mv_readw_t (const volatile void __iomem *);
-typedef unsigned int ia64_mv_readl_t (const volatile void __iomem *);
-typedef unsigned long ia64_mv_readq_t (const volatile void __iomem *);
-typedef unsigned char ia64_mv_readb_relaxed_t (const volatile void __iomem *);
-typedef unsigned short ia64_mv_readw_relaxed_t (const volatile void __iomem *);
-typedef unsigned int ia64_mv_readl_relaxed_t (const volatile void __iomem *);
-typedef unsigned long ia64_mv_readq_relaxed_t (const volatile void __iomem *);
-typedef int ia64_mv_msi_init_t (void);
-
-static inline void
-machvec_noop (void)
-{
-}
-
-static inline void
-machvec_noop_mm (struct mm_struct *mm)
-{
-}
-
-static inline void
-machvec_noop_task (struct task_struct *task)
-{
-}
-
-extern void machvec_setup (char **);
-extern void machvec_timer_interrupt (int, void *, struct pt_regs *);
-extern void machvec_dma_sync_single (struct device *, dma_addr_t, size_t, int);
-extern void machvec_dma_sync_sg (struct device *, struct scatterlist *, int, int);
-extern void machvec_tlb_migrate_finish (struct mm_struct *);
-
-# if defined (CONFIG_IA64_HP_SIM)
-#  include <asm/machvec_hpsim.h>
-# elif defined (CONFIG_IA64_DIG)
-#  include <asm/machvec_dig.h>
-# elif defined (CONFIG_IA64_HP_ZX1)
-#  include <asm/machvec_hpzx1.h>
-# elif defined (CONFIG_IA64_HP_ZX1_SWIOTLB)
-#  include <asm/machvec_hpzx1_swiotlb.h>
-# elif defined (CONFIG_IA64_SGI_SN2)
-#  include <asm/machvec_sn2.h>
-# elif defined (CONFIG_IA64_XEN)
-#  include <asm/machvec_xen.h>
-# elif defined (CONFIG_IA64_GENERIC)
-
-# ifdef MACHVEC_PLATFORM_HEADER
-#  include MACHVEC_PLATFORM_HEADER
-# else
-#  define platform_name                ia64_mv.name
-#  define platform_setup       ia64_mv.setup
-#  define platform_cpu_init    ia64_mv.cpu_init
-#  define platform_irq_init    ia64_mv.irq_init
-#  define platform_send_ipi    ia64_mv.send_ipi
-#  define platform_timer_interrupt     ia64_mv.timer_interrupt
-#  define platform_global_tlb_purge    ia64_mv.global_tlb_purge
-#  define platform_tlb_migrate_finish  ia64_mv.tlb_migrate_finish
-#  define platform_dma_init            ia64_mv.dma_init
-#  define platform_dma_alloc_coherent  ia64_mv.dma_alloc_coherent
-#  define platform_dma_free_coherent   ia64_mv.dma_free_coherent
-#  define platform_dma_map_single      ia64_mv.dma_map_single
-#  define platform_dma_unmap_single    ia64_mv.dma_unmap_single
-#  define platform_dma_map_sg          ia64_mv.dma_map_sg
-#  define platform_dma_unmap_sg                ia64_mv.dma_unmap_sg
-#  define platform_dma_sync_single_for_cpu ia64_mv.dma_sync_single_for_cpu
-#  define platform_dma_sync_sg_for_cpu ia64_mv.dma_sync_sg_for_cpu
-#  define platform_dma_sync_single_for_device ia64_mv.dma_sync_single_for_device
-#  define platform_dma_sync_sg_for_device ia64_mv.dma_sync_sg_for_device
-#  define platform_dma_mapping_error           ia64_mv.dma_mapping_error
-#  define platform_dma_supported       ia64_mv.dma_supported
-#  define platform_local_vector_to_irq ia64_mv.local_vector_to_irq
-#  define platform_pci_get_legacy_mem  ia64_mv.pci_get_legacy_mem
-#  define platform_pci_legacy_read     ia64_mv.pci_legacy_read
-#  define platform_pci_legacy_write    ia64_mv.pci_legacy_write
-#  define platform_inb         ia64_mv.inb
-#  define platform_inw         ia64_mv.inw
-#  define platform_inl         ia64_mv.inl
-#  define platform_outb                ia64_mv.outb
-#  define platform_outw                ia64_mv.outw
-#  define platform_outl                ia64_mv.outl
-#  define platform_mmiowb      ia64_mv.mmiowb
-#  define platform_readb        ia64_mv.readb
-#  define platform_readw        ia64_mv.readw
-#  define platform_readl        ia64_mv.readl
-#  define platform_readq        ia64_mv.readq
-#  define platform_readb_relaxed        ia64_mv.readb_relaxed
-#  define platform_readw_relaxed        ia64_mv.readw_relaxed
-#  define platform_readl_relaxed        ia64_mv.readl_relaxed
-#  define platform_readq_relaxed        ia64_mv.readq_relaxed
-#  define platform_migrate             ia64_mv.migrate
-#  define platform_msi_init            ia64_mv.msi_init
-# endif
-
-/* __attribute__((__aligned__(16))) is required to make size of the
- * structure multiple of 16 bytes.
- * This will fillup the holes created because of section 3.3.1 in
- * Software Conventions guide.
- */
-struct ia64_machine_vector {
-       const char *name;
-       ia64_mv_setup_t *setup;
-       ia64_mv_cpu_init_t *cpu_init;
-       ia64_mv_irq_init_t *irq_init;
-       ia64_mv_send_ipi_t *send_ipi;
-       ia64_mv_timer_interrupt_t *timer_interrupt;
-       ia64_mv_global_tlb_purge_t *global_tlb_purge;
-       ia64_mv_tlb_migrate_finish_t *tlb_migrate_finish;
-       ia64_mv_dma_init *dma_init;
-       ia64_mv_dma_alloc_coherent *dma_alloc_coherent;
-       ia64_mv_dma_free_coherent *dma_free_coherent;
-       ia64_mv_dma_map_single *dma_map_single;
-       ia64_mv_dma_unmap_single *dma_unmap_single;
-       ia64_mv_dma_map_sg *dma_map_sg;
-       ia64_mv_dma_unmap_sg *dma_unmap_sg;
-       ia64_mv_dma_sync_single_for_cpu *dma_sync_single_for_cpu;
-       ia64_mv_dma_sync_sg_for_cpu *dma_sync_sg_for_cpu;
-       ia64_mv_dma_sync_single_for_device *dma_sync_single_for_device;
-       ia64_mv_dma_sync_sg_for_device *dma_sync_sg_for_device;
-       ia64_mv_dma_mapping_error *dma_mapping_error;
-       ia64_mv_dma_supported *dma_supported;
-       ia64_mv_local_vector_to_irq *local_vector_to_irq;
-       ia64_mv_pci_get_legacy_mem_t *pci_get_legacy_mem;
-       ia64_mv_pci_legacy_read_t *pci_legacy_read;
-       ia64_mv_pci_legacy_write_t *pci_legacy_write;
-       ia64_mv_inb_t *inb;
-       ia64_mv_inw_t *inw;
-       ia64_mv_inl_t *inl;
-       ia64_mv_outb_t *outb;
-       ia64_mv_outw_t *outw;
-       ia64_mv_outl_t *outl;
-       ia64_mv_mmiowb_t *mmiowb;
-       ia64_mv_readb_t *readb;
-       ia64_mv_readw_t *readw;
-       ia64_mv_readl_t *readl;
-       ia64_mv_readq_t *readq;
-       ia64_mv_readb_relaxed_t *readb_relaxed;
-       ia64_mv_readw_relaxed_t *readw_relaxed;
-       ia64_mv_readl_relaxed_t *readl_relaxed;
-       ia64_mv_readq_relaxed_t *readq_relaxed;
-       ia64_mv_migrate_t *migrate;
-       ia64_mv_msi_init_t *msi_init;
-} __attribute__((__aligned__(16))); /* align attrib? see above comment */
-
-#define MACHVEC_INIT(name)                     \
-{                                              \
-       #name,                                  \
-       platform_setup,                         \
-       platform_cpu_init,                      \
-       platform_irq_init,                      \
-       platform_send_ipi,                      \
-       platform_timer_interrupt,               \
-       platform_global_tlb_purge,              \
-       platform_tlb_migrate_finish,            \
-       platform_dma_init,                      \
-       platform_dma_alloc_coherent,            \
-       platform_dma_free_coherent,             \
-       platform_dma_map_single,                \
-       platform_dma_unmap_single,              \
-       platform_dma_map_sg,                    \
-       platform_dma_unmap_sg,                  \
-       platform_dma_sync_single_for_cpu,       \
-       platform_dma_sync_sg_for_cpu,           \
-       platform_dma_sync_single_for_device,    \
-       platform_dma_sync_sg_for_device,        \
-       platform_dma_mapping_error,                     \
-       platform_dma_supported,                 \
-       platform_local_vector_to_irq,           \
-       platform_pci_get_legacy_mem,            \
-       platform_pci_legacy_read,               \
-       platform_pci_legacy_write,              \
-       platform_inb,                           \
-       platform_inw,                           \
-       platform_inl,                           \
-       platform_outb,                          \
-       platform_outw,                          \
-       platform_outl,                          \
-       platform_mmiowb,                        \
-       platform_readb,                         \
-       platform_readw,                         \
-       platform_readl,                         \
-       platform_readq,                         \
-       platform_readb_relaxed,                 \
-       platform_readw_relaxed,                 \
-       platform_readl_relaxed,                 \
-       platform_readq_relaxed,                 \
-       platform_migrate,                       \
-       platform_msi_init,                      \
-}
-
-extern struct ia64_machine_vector ia64_mv;
-extern void machvec_init (const char *name);
-
-# else
-#  error Unknown configuration.  Update asm-ia64/machvec.h.
-# endif /* CONFIG_IA64_GENERIC */
-
-/*
- * Declare default routines which aren't declared anywhere else:
- */
-extern ia64_mv_dma_init                        swiotlb_init;
-extern ia64_mv_dma_alloc_coherent      swiotlb_alloc_coherent;
-extern ia64_mv_dma_free_coherent       swiotlb_free_coherent;
-extern ia64_mv_dma_map_single          swiotlb_map_single;
-extern ia64_mv_dma_unmap_single                swiotlb_unmap_single;
-extern ia64_mv_dma_map_sg              swiotlb_map_sg;
-extern ia64_mv_dma_unmap_sg            swiotlb_unmap_sg;
-extern ia64_mv_dma_sync_single_for_cpu swiotlb_sync_single_for_cpu;
-extern ia64_mv_dma_sync_sg_for_cpu     swiotlb_sync_sg_for_cpu;
-extern ia64_mv_dma_sync_single_for_device swiotlb_sync_single_for_device;
-extern ia64_mv_dma_sync_sg_for_device  swiotlb_sync_sg_for_device;
-extern ia64_mv_dma_mapping_error       swiotlb_dma_mapping_error;
-extern ia64_mv_dma_supported           swiotlb_dma_supported;
-
-/*
- * Define default versions so we can extend machvec for new platforms without having
- * to update the machvec files for all existing platforms.
- */
-#ifndef platform_setup
-# define platform_setup                        machvec_setup
-#endif
-#ifndef platform_cpu_init
-# define platform_cpu_init             machvec_noop
-#endif
-#ifndef platform_irq_init
-# define platform_irq_init             machvec_noop
-#endif
-
-#ifndef platform_send_ipi
-# define platform_send_ipi             ia64_send_ipi   /* default to architected version */
-#endif
-#ifndef platform_timer_interrupt
-# define platform_timer_interrupt      machvec_timer_interrupt
-#endif
-#ifndef platform_global_tlb_purge
-# define platform_global_tlb_purge     ia64_global_tlb_purge /* default to architected version */
-#endif
-#ifndef platform_tlb_migrate_finish
-# define platform_tlb_migrate_finish   machvec_noop_mm
-#endif
-#ifndef platform_dma_init
-# define platform_dma_init             swiotlb_init
-#endif
-#ifndef platform_dma_alloc_coherent
-# define platform_dma_alloc_coherent   swiotlb_alloc_coherent
-#endif
-#ifndef platform_dma_free_coherent
-# define platform_dma_free_coherent    swiotlb_free_coherent
-#endif
-#ifndef platform_dma_map_single
-# define platform_dma_map_single       swiotlb_map_single
-#endif
-#ifndef platform_dma_unmap_single
-# define platform_dma_unmap_single     swiotlb_unmap_single
-#endif
-#ifndef platform_dma_map_sg
-# define platform_dma_map_sg           swiotlb_map_sg
-#endif
-#ifndef platform_dma_unmap_sg
-# define platform_dma_unmap_sg         swiotlb_unmap_sg
-#endif
-#ifndef platform_dma_sync_single_for_cpu
-# define platform_dma_sync_single_for_cpu      swiotlb_sync_single_for_cpu
-#endif
-#ifndef platform_dma_sync_sg_for_cpu
-# define platform_dma_sync_sg_for_cpu          swiotlb_sync_sg_for_cpu
-#endif
-#ifndef platform_dma_sync_single_for_device
-# define platform_dma_sync_single_for_device   swiotlb_sync_single_for_device
-#endif
-#ifndef platform_dma_sync_sg_for_device
-# define platform_dma_sync_sg_for_device       swiotlb_sync_sg_for_device
-#endif
-#ifndef platform_dma_mapping_error
-# define platform_dma_mapping_error            swiotlb_dma_mapping_error
-#endif
-#ifndef platform_dma_supported
-# define  platform_dma_supported       swiotlb_dma_supported
-#endif
-#ifndef platform_local_vector_to_irq
-# define platform_local_vector_to_irq  __ia64_local_vector_to_irq
-#endif
-#ifndef platform_pci_get_legacy_mem
-# define platform_pci_get_legacy_mem   ia64_pci_get_legacy_mem
-#endif
-#ifndef platform_pci_legacy_read
-# define platform_pci_legacy_read      ia64_pci_legacy_read
-extern int ia64_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size);
-#endif
-#ifndef platform_pci_legacy_write
-# define platform_pci_legacy_write     ia64_pci_legacy_write
-extern int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size);
-#endif
-#ifndef platform_inb
-# define platform_inb          __ia64_inb
-#endif
-#ifndef platform_inw
-# define platform_inw          __ia64_inw
-#endif
-#ifndef platform_inl
-# define platform_inl          __ia64_inl
-#endif
-#ifndef platform_outb
-# define platform_outb         __ia64_outb
-#endif
-#ifndef platform_outw
-# define platform_outw         __ia64_outw
-#endif
-#ifndef platform_outl
-# define platform_outl         __ia64_outl
-#endif
-#ifndef platform_mmiowb
-# define platform_mmiowb       __ia64_mmiowb
-#endif
-#ifndef platform_readb
-# define platform_readb                __ia64_readb
-#endif
-#ifndef platform_readw
-# define platform_readw                __ia64_readw
-#endif
-#ifndef platform_readl
-# define platform_readl                __ia64_readl
-#endif
-#ifndef platform_readq
-# define platform_readq                __ia64_readq
-#endif
-#ifndef platform_readb_relaxed
-# define platform_readb_relaxed        __ia64_readb_relaxed
-#endif
-#ifndef platform_readw_relaxed
-# define platform_readw_relaxed        __ia64_readw_relaxed
-#endif
-#ifndef platform_readl_relaxed
-# define platform_readl_relaxed        __ia64_readl_relaxed
-#endif
-#ifndef platform_readq_relaxed
-# define platform_readq_relaxed        __ia64_readq_relaxed
-#endif
-#ifndef platform_migrate
-# define platform_migrate machvec_noop_task
-#endif
-#ifndef platform_msi_init
-# define platform_msi_init     ((ia64_mv_msi_init_t*)NULL)
-#endif
-
-#endif /* _ASM_IA64_MACHVEC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h b/linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h
deleted file mode 100644 (file)
index 53eff61..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _ASM_IA64_MACHVEC_XEN_h
-#define _ASM_IA64_MACHVEC_XEN_h
-
-extern ia64_mv_setup_t                 xen_setup;
-extern ia64_mv_cpu_init_t              xen_cpu_init;
-extern ia64_mv_irq_init_t              xen_irq_init;
-extern ia64_mv_send_ipi_t              xen_platform_send_ipi;
-extern ia64_mv_dma_alloc_coherent      xen_alloc_coherent;
-extern ia64_mv_dma_free_coherent       xen_free_coherent;
-extern ia64_mv_dma_map_single          xen_map_single;
-extern ia64_mv_dma_unmap_single                xen_unmap_single;
-extern ia64_mv_dma_map_sg              xen_map_sg;
-extern ia64_mv_dma_unmap_sg            xen_unmap_sg;
-extern ia64_mv_dma_supported           xen_dma_supported;
-extern ia64_mv_dma_mapping_error       xen_dma_mapping_error;
-
-/*
- * This stuff has dual use!
- *
- * For a generic kernel, the macros are used to initialize the
- * platform's machvec structure.  When compiling a non-generic kernel,
- * the macros are used directly.
- */
-#define platform_name                          "xen"
-#define platform_setup                         xen_setup
-#define platform_cpu_init                      xen_cpu_init
-#define platform_irq_init                      xen_irq_init
-#define platform_send_ipi                      xen_platform_send_ipi
-#define platform_dma_init                      machvec_noop
-#define platform_dma_alloc_coherent            xen_alloc_coherent
-#define platform_dma_free_coherent             xen_free_coherent
-#define platform_dma_map_single                        xen_map_single
-#define platform_dma_unmap_single              xen_unmap_single
-#define platform_dma_map_sg                    xen_map_sg
-#define platform_dma_unmap_sg                  xen_unmap_sg
-#define platform_dma_sync_single_for_cpu       machvec_dma_sync_single
-#define platform_dma_sync_sg_for_cpu           machvec_dma_sync_sg
-#define platform_dma_sync_single_for_device    machvec_dma_sync_single
-#define platform_dma_sync_sg_for_device                machvec_dma_sync_sg
-#define platform_dma_supported                 xen_dma_supported
-#define platform_dma_mapping_error             xen_dma_mapping_error
-
-#endif /* _ASM_IA64_MACHVEC_XEN_h */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/maddr.h b/linux-2.6-xen-sparse/include/asm-ia64/maddr.h
deleted file mode 100644 (file)
index be72422..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef _ASM_IA64_MADDR_H
-#define _ASM_IA64_MADDR_H
-
-#include <linux/kernel.h>
-#include <asm/hypervisor.h>
-#include <xen/features.h>
-#include <xen/interface/xen.h>
-
-#ifdef CONFIG_XEN
-
-#define INVALID_P2M_ENTRY       (~0UL)
-
-#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
-extern int p2m_initialized;
-extern unsigned long p2m_min_low_pfn;
-extern unsigned long p2m_max_low_pfn;
-extern unsigned long p2m_convert_min_pfn;
-extern unsigned long p2m_convert_max_pfn;
-extern volatile const pte_t* p2m_pte;
-unsigned long p2m_phystomach(unsigned long gpfn);
-#else
-#define p2m_initialized                (0)
-#define p2m_phystomach(gpfn)   INVALID_MFN
-#endif
-
-/* XXX xen page size != page size */
-static inline unsigned long
-pfn_to_mfn_for_dma(unsigned long pfn)
-{
-       unsigned long mfn;
-       if (p2m_initialized)
-               return p2m_phystomach(pfn);
-       mfn = HYPERVISOR_phystomach(pfn);
-       BUG_ON(mfn == 0); // XXX
-       BUG_ON(mfn == INVALID_P2M_ENTRY); // XXX
-       BUG_ON(mfn == INVALID_MFN);
-       return mfn;
-}
-
-static inline unsigned long
-phys_to_machine_for_dma(unsigned long phys)
-{
-       unsigned long machine =
-                     pfn_to_mfn_for_dma(phys >> PAGE_SHIFT) << PAGE_SHIFT;
-       machine |= (phys & ~PAGE_MASK);
-       return machine;
-}
-
-static inline unsigned long
-mfn_to_pfn_for_dma(unsigned long mfn)
-{
-       unsigned long pfn;
-       pfn = HYPERVISOR_machtophys(mfn);
-       BUG_ON(pfn == 0);
-       //BUG_ON(pfn == INVALID_M2P_ENTRY);
-       return pfn;
-}
-
-static inline unsigned long
-machine_to_phys_for_dma(unsigned long machine)
-{
-       unsigned long phys =
-                     mfn_to_pfn_for_dma(machine >> PAGE_SHIFT) << PAGE_SHIFT;
-       phys |= (machine & ~PAGE_MASK);
-       return phys;
-}
-
-#ifdef CONFIG_SPARSEMEM
-/*
- * When CONFIG_SPARSEMEM=y, pfn_valid() is defined in
- * linux/include/linux/mmzone.h. Hoever #include <linux/mmzone.h>
- * causes the header inclusion hell.
- */
-static inline int pfn_valid(unsigned long pfn);
-#endif
-
-static inline unsigned long
-mfn_to_local_pfn(unsigned long mfn)
-{
-       unsigned long pfn = mfn_to_pfn_for_dma(mfn);
-       if (!pfn_valid(pfn))
-               return INVALID_P2M_ENTRY;
-       return pfn;
-}
-
-#else /* !CONFIG_XEN */
-
-#define pfn_to_mfn_for_dma(pfn) (pfn)
-#define mfn_to_pfn_for_dma(mfn) (mfn)
-#define phys_to_machine_for_dma(phys) (phys)
-#define machine_to_phys_for_dma(machine) (machine)
-#define mfn_to_local_pfn(mfn) (mfn)
-
-#endif /* !CONFIG_XEN */
-
-#define mfn_to_pfn(mfn) (mfn)
-#define pfn_to_mfn(pfn) (pfn)
-
-#define mfn_to_virt(mfn) (__va((mfn) << PAGE_SHIFT))
-#define virt_to_mfn(virt) (__pa(virt) >> PAGE_SHIFT)
-#define virt_to_machine(virt) __pa(virt) // for tpmfront.c
-
-#define set_phys_to_machine(pfn, mfn) do { } while (0)
-
-typedef unsigned long maddr_t; // to compile netback, netfront
-
-#endif /* _ASM_IA64_MADDR_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/meminit.h b/linux-2.6-xen-sparse/include/asm-ia64/meminit.h
deleted file mode 100644 (file)
index 5cd4b89..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef meminit_h
-#define meminit_h
-
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-
-/*
- * Entries defined so far:
- *     - boot param structure itself
- *     - memory map
- *     - initrd (optional)
- *     - command line string
- *     - kernel code & data
- *     - Kernel memory map built from EFI memory map
- *     - xen start info
- *
- * More could be added if necessary
- */
-#ifndef CONFIG_XEN
-#define IA64_MAX_RSVD_REGIONS 6
-#else
-#define IA64_MAX_RSVD_REGIONS 7
-#endif
-
-struct rsvd_region {
-       unsigned long start;    /* virtual address of beginning of element */
-       unsigned long end;      /* virtual address of end of element + 1 */
-};
-
-extern struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1];
-extern int num_rsvd_regions;
-
-extern void find_memory (void);
-extern void reserve_memory (void);
-extern void find_initrd (void);
-extern int filter_rsvd_memory (unsigned long start, unsigned long end, void *arg);
-extern void efi_memmap_init(unsigned long *, unsigned long *);
-
-/*
- * For rounding an address to the next IA64_GRANULE_SIZE or order
- */
-#define GRANULEROUNDDOWN(n)    ((n) & ~(IA64_GRANULE_SIZE-1))
-#define GRANULEROUNDUP(n)      (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1))
-#define ORDERROUNDDOWN(n)      ((n) & ~((PAGE_SIZE<<MAX_ORDER)-1))
-
-#ifdef CONFIG_NUMA
-  extern void call_pernode_memory (unsigned long start, unsigned long len, void *func);
-#else
-# define call_pernode_memory(start, len, func) (*func)(start, len, 0)
-#endif
-
-#define IGNORE_PFN0    1       /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */
-
-#ifdef CONFIG_VIRTUAL_MEM_MAP
-# define LARGE_GAP     0x40000000 /* Use virtual mem map if hole is > than this */
-  extern unsigned long vmalloc_end;
-  extern struct page *vmem_map;
-  extern int find_largest_hole (u64 start, u64 end, void *arg);
-  extern int create_mem_map_page_table (u64 start, u64 end, void *arg);
-  extern int vmemmap_find_next_valid_pfn(int, int);
-#else
-static inline int vmemmap_find_next_valid_pfn(int node, int i)
-{
-       return i + 1;
-}
-#endif
-#endif /* meminit_h */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/page.h b/linux-2.6-xen-sparse/include/asm-ia64/page.h
deleted file mode 100644 (file)
index c4b69c9..0000000
+++ /dev/null
@@ -1,254 +0,0 @@
-#ifndef _ASM_IA64_PAGE_H
-#define _ASM_IA64_PAGE_H
-/*
- * Pagetable related stuff.
- *
- * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-# ifdef __KERNEL__
-
-#include <asm/intrinsics.h>
-#include <asm/types.h>
-
-/*
- * The top three bits of an IA64 address are its Region Number.
- * Different regions are assigned to different purposes.
- */
-#define RGN_SHIFT      (61)
-#define RGN_BASE(r)    (__IA64_UL_CONST(r)<<RGN_SHIFT)
-#define RGN_BITS       (RGN_BASE(-1))
-
-#define RGN_KERNEL     7       /* Identity mapped region */
-#define RGN_UNCACHED    6      /* Identity mapped I/O region */
-#define RGN_GATE       5       /* Gate page, Kernel text, etc */
-#define RGN_HPAGE      4       /* For Huge TLB pages */
-
-/*
- * PAGE_SHIFT determines the actual kernel page size.
- */
-#if defined(CONFIG_IA64_PAGE_SIZE_4KB)
-# define PAGE_SHIFT    12
-#elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
-# define PAGE_SHIFT    13
-#elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
-# define PAGE_SHIFT    14
-#elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
-# define PAGE_SHIFT    16
-#else
-# error Unsupported page size!
-#endif
-
-#define PAGE_SIZE              (__IA64_UL_CONST(1) << PAGE_SHIFT)
-#define PAGE_MASK              (~(PAGE_SIZE - 1))
-#define PAGE_ALIGN(addr)       (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
-
-#define PERCPU_PAGE_SHIFT      16      /* log2() of max. size of per-CPU area */
-#define PERCPU_PAGE_SIZE       (__IA64_UL_CONST(1) << PERCPU_PAGE_SHIFT)
-
-
-#ifdef CONFIG_HUGETLB_PAGE
-# define HPAGE_REGION_BASE     RGN_BASE(RGN_HPAGE)
-# define HPAGE_SHIFT           hpage_shift
-# define HPAGE_SHIFT_DEFAULT   28      /* check ia64 SDM for architecture supported size */
-# define HPAGE_SIZE            (__IA64_UL_CONST(1) << HPAGE_SHIFT)
-# define HPAGE_MASK            (~(HPAGE_SIZE - 1))
-
-# define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
-# define ARCH_HAS_HUGEPAGE_ONLY_RANGE
-# define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
-# define ARCH_HAS_HUGETLB_FREE_PGD_RANGE
-#endif /* CONFIG_HUGETLB_PAGE */
-
-#ifdef __ASSEMBLY__
-# define __pa(x)               ((x) - PAGE_OFFSET)
-# define __va(x)               ((x) + PAGE_OFFSET)
-#else /* !__ASSEMBLY */
-#  define STRICT_MM_TYPECHECKS
-
-extern void clear_page (void *page);
-extern void copy_page (void *to, void *from);
-
-/*
- * clear_user_page() and copy_user_page() can't be inline functions because
- * flush_dcache_page() can't be defined until later...
- */
-#define clear_user_page(addr, vaddr, page)     \
-do {                                           \
-       clear_page(addr);                       \
-       flush_dcache_page(page);                \
-} while (0)
-
-#define copy_user_page(to, from, vaddr, page)  \
-do {                                           \
-       copy_page((to), (from));                \
-       flush_dcache_page(page);                \
-} while (0)
-
-
-#define alloc_zeroed_user_highpage(vma, vaddr) \
-({                                             \
-       struct page *page = alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr); \
-       if (page)                               \
-               flush_dcache_page(page);        \
-       page;                                   \
-})
-
-#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-
-#ifdef CONFIG_VIRTUAL_MEM_MAP
-extern int ia64_pfn_valid (unsigned long pfn);
-#elif defined(CONFIG_FLATMEM)
-# define ia64_pfn_valid(pfn) 1
-#endif
-
-#ifdef CONFIG_VIRTUAL_MEM_MAP
-extern struct page *vmem_map;
-#ifdef CONFIG_DISCONTIGMEM
-# define page_to_pfn(page)     ((unsigned long) (page - vmem_map))
-# define pfn_to_page(pfn)      (vmem_map + (pfn))
-#endif
-#endif
-
-#if defined(CONFIG_FLATMEM) || defined(CONFIG_SPARSEMEM)
-/* FLATMEM always configures mem_map (mem_map = vmem_map if necessary) */
-#include <asm-generic/memory_model.h>
-#endif
-
-#ifdef CONFIG_FLATMEM
-extern unsigned long max_mapnr;
-# define pfn_valid(pfn)                (((pfn) < max_mapnr) && ia64_pfn_valid(pfn))
-#elif defined(CONFIG_DISCONTIGMEM)
-extern unsigned long min_low_pfn;
-extern unsigned long max_low_pfn;
-# define pfn_valid(pfn)                (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn))
-#endif
-
-#ifndef CONFIG_XEN
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
-#endif
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-
-typedef union ia64_va {
-       struct {
-               unsigned long off : 61;         /* intra-region offset */
-               unsigned long reg :  3;         /* region number */
-       } f;
-       unsigned long l;
-       void *p;
-} ia64_va;
-
-/*
- * Note: These macros depend on the fact that PAGE_OFFSET has all
- * region bits set to 1 and all other bits set to zero.  They are
- * expressed in this way to ensure they result in a single "dep"
- * instruction.
- */
-#define __pa(x)                ({ia64_va _v; _v.l = (long) (x); _v.f.reg = 0; _v.l;})
-#define __va(x)                ({ia64_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.p;})
-
-#define REGION_NUMBER(x)       ({ia64_va _v; _v.l = (long) (x); _v.f.reg;})
-#define REGION_OFFSET(x)       ({ia64_va _v; _v.l = (long) (x); _v.f.off;})
-
-#ifdef CONFIG_HUGETLB_PAGE
-# define htlbpage_to_page(x)   (((unsigned long) REGION_NUMBER(x) << 61)                       \
-                                | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
-# define HUGETLB_PAGE_ORDER    (HPAGE_SHIFT - PAGE_SHIFT)
-# define is_hugepage_only_range(mm, addr, len)         \
-        (REGION_NUMBER(addr) == RGN_HPAGE ||   \
-         REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE)
-extern unsigned int hpage_shift;
-#endif
-
-static __inline__ int
-get_order (unsigned long size)
-{
-       long double d = size - 1;
-       long order;
-
-       order = ia64_getf_exp(d);
-       order = order - PAGE_SHIFT - 0xffff + 1;
-       if (order < 0)
-               order = 0;
-       return order;
-}
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef STRICT_MM_TYPECHECKS
-  /*
-   * These are used to make use of C type-checking..
-   */
-  typedef struct { unsigned long pte; } pte_t;
-  typedef struct { unsigned long pmd; } pmd_t;
-#ifdef CONFIG_PGTABLE_4
-  typedef struct { unsigned long pud; } pud_t;
-#endif
-  typedef struct { unsigned long pgd; } pgd_t;
-  typedef struct { unsigned long pgprot; } pgprot_t;
-
-# define pte_val(x)    ((x).pte)
-# define pmd_val(x)    ((x).pmd)
-#ifdef CONFIG_PGTABLE_4
-# define pud_val(x)    ((x).pud)
-#endif
-# define pgd_val(x)    ((x).pgd)
-# define pgprot_val(x) ((x).pgprot)
-
-# define __pte(x)      ((pte_t) { (x) } )
-# define __pgprot(x)   ((pgprot_t) { (x) } )
-
-#else /* !STRICT_MM_TYPECHECKS */
-  /*
-   * .. while these make it easier on the compiler
-   */
-# ifndef __ASSEMBLY__
-    typedef unsigned long pte_t;
-    typedef unsigned long pmd_t;
-    typedef unsigned long pgd_t;
-    typedef unsigned long pgprot_t;
-# endif
-
-# define pte_val(x)    (x)
-# define pmd_val(x)    (x)
-# define pgd_val(x)    (x)
-# define pgprot_val(x) (x)
-
-# define __pte(x)      (x)
-# define __pgd(x)      (x)
-# define __pgprot(x)   (x)
-#endif /* !STRICT_MM_TYPECHECKS */
-
-#define PAGE_OFFSET                    RGN_BASE(RGN_KERNEL)
-
-#define VM_DATA_DEFAULT_FLAGS          (VM_READ | VM_WRITE |                                   \
-                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC |                \
-                                        (((current->personality & READ_IMPLIES_EXEC) != 0)     \
-                                         ? VM_EXEC : 0))
-
-#ifndef __ASSEMBLY__
-#ifdef CONFIG_XEN
-
-#include <linux/kernel.h>
-#include <asm/hypervisor.h>
-#include <xen/features.h>      // to compile netback, netfront
-#include <asm/maddr.h>
-
-#define arch_free_page(_page, _order)          \
-({                                             \
-       int foreign = PageForeign(_page);       \
-       if (foreign)                            \
-               PageForeignDestructor(_page);   \
-       foreign;                                \
-})
-#define HAVE_ARCH_FREE_PAGE
-
-#endif /* CONFIG_XEN */
-#endif /* __ASSEMBLY__ */
-
-# endif /* __KERNEL__ */
-#endif /* _ASM_IA64_PAGE_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/pal.h b/linux-2.6-xen-sparse/include/asm-ia64/pal.h
deleted file mode 100644 (file)
index 1b2fbc6..0000000
+++ /dev/null
@@ -1,1686 +0,0 @@
-#ifndef _ASM_IA64_PAL_H
-#define _ASM_IA64_PAL_H
-
-/*
- * Processor Abstraction Layer definitions.
- *
- * This is based on Intel IA-64 Architecture Software Developer's Manual rev 1.0
- * chapter 11 IA-64 Processor Abstraction Layer
- *
- * Copyright (C) 1998-2001 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999 Srinivasa Prasad Thirumalachar <sprasad@sprasad.engr.sgi.com>
- *
- * 99/10/01    davidm  Make sure we pass zero for reserved parameters.
- * 00/03/07    davidm  Updated pal_cache_flush() to be in sync with PAL v2.6.
- * 00/03/23     cfleck  Modified processor min-state save area to match updated PAL & SAL info
- * 00/05/24     eranian Updated to latest PAL spec, fix structures bugs, added
- * 00/05/25    eranian Support for stack calls, and static physical calls
- * 00/06/18    eranian Support for stacked physical calls
- */
-
-/*
- * Note that some of these calls use a static-register only calling
- * convention which has nothing to do with the regular calling
- * convention.
- */
-#define PAL_CACHE_FLUSH                1       /* flush i/d cache */
-#define PAL_CACHE_INFO         2       /* get detailed i/d cache info */
-#define PAL_CACHE_INIT         3       /* initialize i/d cache */
-#define PAL_CACHE_SUMMARY      4       /* get summary of cache heirarchy */
-#define PAL_MEM_ATTRIB         5       /* list supported memory attributes */
-#define PAL_PTCE_INFO          6       /* purge TLB info */
-#define PAL_VM_INFO            7       /* return supported virtual memory features */
-#define PAL_VM_SUMMARY         8       /* return summary on supported vm features */
-#define PAL_BUS_GET_FEATURES   9       /* return processor bus interface features settings */
-#define PAL_BUS_SET_FEATURES   10      /* set processor bus features */
-#define PAL_DEBUG_INFO         11      /* get number of debug registers */
-#define PAL_FIXED_ADDR         12      /* get fixed component of processors's directed address */
-#define PAL_FREQ_BASE          13      /* base frequency of the platform */
-#define PAL_FREQ_RATIOS                14      /* ratio of processor, bus and ITC frequency */
-#define PAL_PERF_MON_INFO      15      /* return performance monitor info */
-#define PAL_PLATFORM_ADDR      16      /* set processor interrupt block and IO port space addr */
-#define PAL_PROC_GET_FEATURES  17      /* get configurable processor features & settings */
-#define PAL_PROC_SET_FEATURES  18      /* enable/disable configurable processor features */
-#define PAL_RSE_INFO           19      /* return rse information */
-#define PAL_VERSION            20      /* return version of PAL code */
-#define PAL_MC_CLEAR_LOG       21      /* clear all processor log info */
-#define PAL_MC_DRAIN           22      /* drain operations which could result in an MCA */
-#define PAL_MC_EXPECTED                23      /* set/reset expected MCA indicator */
-#define PAL_MC_DYNAMIC_STATE   24      /* get processor dynamic state */
-#define PAL_MC_ERROR_INFO      25      /* get processor MCA info and static state */
-#define PAL_MC_RESUME          26      /* Return to interrupted process */
-#define PAL_MC_REGISTER_MEM    27      /* Register memory for PAL to use during MCAs and inits */
-#define PAL_HALT               28      /* enter the low power HALT state */
-#define PAL_HALT_LIGHT         29      /* enter the low power light halt state*/
-#define PAL_COPY_INFO          30      /* returns info needed to relocate PAL */
-#define PAL_CACHE_LINE_INIT    31      /* init tags & data of cache line */
-#define PAL_PMI_ENTRYPOINT     32      /* register PMI memory entry points with the processor */
-#define PAL_ENTER_IA_32_ENV    33      /* enter IA-32 system environment */
-#define PAL_VM_PAGE_SIZE       34      /* return vm TC and page walker page sizes */
-
-#define PAL_MEM_FOR_TEST       37      /* get amount of memory needed for late processor test */
-#define PAL_CACHE_PROT_INFO    38      /* get i/d cache protection info */
-#define PAL_REGISTER_INFO      39      /* return AR and CR register information*/
-#define PAL_SHUTDOWN           40      /* enter processor shutdown state */
-#define PAL_PREFETCH_VISIBILITY        41      /* Make Processor Prefetches Visible */
-#define PAL_LOGICAL_TO_PHYSICAL 42     /* returns information on logical to physical processor mapping */
-#define PAL_CACHE_SHARED_INFO  43      /* returns information on caches shared by logical processor */
-
-#define PAL_COPY_PAL           256     /* relocate PAL procedures and PAL PMI */
-#define PAL_HALT_INFO          257     /* return the low power capabilities of processor */
-#define PAL_TEST_PROC          258     /* perform late processor self-test */
-#define PAL_CACHE_READ         259     /* read tag & data of cacheline for diagnostic testing */
-#define PAL_CACHE_WRITE                260     /* write tag & data of cacheline for diagnostic testing */
-#define PAL_VM_TR_READ         261     /* read contents of translation register */
-#define PAL_GET_PSTATE         262     /* get the current P-state */
-#define PAL_SET_PSTATE         263     /* set the P-state */
-
-#ifndef __ASSEMBLY__
-
-#include <linux/types.h>
-#include <asm/processor.h>
-#include <asm/fpu.h>
-
-/*
- * Data types needed to pass information into PAL procedures and
- * interpret information returned by them.
- */
-
-/* Return status from the PAL procedure */
-typedef s64                            pal_status_t;
-
-#define PAL_STATUS_SUCCESS             0       /* No error */
-#define PAL_STATUS_UNIMPLEMENTED       (-1)    /* Unimplemented procedure */
-#define PAL_STATUS_EINVAL              (-2)    /* Invalid argument */
-#define PAL_STATUS_ERROR               (-3)    /* Error */
-#define PAL_STATUS_CACHE_INIT_FAIL     (-4)    /* Could not initialize the
-                                                * specified level and type of
-                                                * cache without sideeffects
-                                                * and "restrict" was 1
-                                                */
-
-/* Processor cache level in the heirarchy */
-typedef u64                            pal_cache_level_t;
-#define PAL_CACHE_LEVEL_L0             0       /* L0 */
-#define PAL_CACHE_LEVEL_L1             1       /* L1 */
-#define PAL_CACHE_LEVEL_L2             2       /* L2 */
-
-
-/* Processor cache type at a particular level in the heirarchy */
-
-typedef u64                            pal_cache_type_t;
-#define PAL_CACHE_TYPE_INSTRUCTION     1       /* Instruction cache */
-#define PAL_CACHE_TYPE_DATA            2       /* Data or unified cache */
-#define PAL_CACHE_TYPE_INSTRUCTION_DATA        3       /* Both Data & Instruction */
-
-
-#define PAL_CACHE_FLUSH_INVALIDATE     1       /* Invalidate clean lines */
-#define PAL_CACHE_FLUSH_CHK_INTRS      2       /* check for interrupts/mc while flushing */
-
-/* Processor cache line size in bytes  */
-typedef int                            pal_cache_line_size_t;
-
-/* Processor cache line state */
-typedef u64                            pal_cache_line_state_t;
-#define PAL_CACHE_LINE_STATE_INVALID   0       /* Invalid */
-#define PAL_CACHE_LINE_STATE_SHARED    1       /* Shared */
-#define PAL_CACHE_LINE_STATE_EXCLUSIVE 2       /* Exclusive */
-#define PAL_CACHE_LINE_STATE_MODIFIED  3       /* Modified */
-
-typedef struct pal_freq_ratio {
-       u32 den, num;           /* numerator & denominator */
-} itc_ratio, proc_ratio;
-
-typedef        union  pal_cache_config_info_1_s {
-       struct {
-               u64             u               : 1,    /* 0 Unified cache ? */
-                               at              : 2,    /* 2-1 Cache mem attr*/
-                               reserved        : 5,    /* 7-3 Reserved */
-                               associativity   : 8,    /* 16-8 Associativity*/
-                               line_size       : 8,    /* 23-17 Line size */
-                               stride          : 8,    /* 31-24 Stride */
-                               store_latency   : 8,    /*39-32 Store latency*/
-                               load_latency    : 8,    /* 47-40 Load latency*/
-                               store_hints     : 8,    /* 55-48 Store hints*/
-                               load_hints      : 8;    /* 63-56 Load hints */
-       } pcci1_bits;
-       u64                     pcci1_data;
-} pal_cache_config_info_1_t;
-
-typedef        union  pal_cache_config_info_2_s {
-       struct {
-               u32             cache_size;             /*cache size in bytes*/
-
-
-               u32             alias_boundary  : 8,    /* 39-32 aliased addr
-                                                        * separation for max
-                                                        * performance.
-                                                        */
-                               tag_ls_bit      : 8,    /* 47-40 LSb of addr*/
-                               tag_ms_bit      : 8,    /* 55-48 MSb of addr*/
-                               reserved        : 8;    /* 63-56 Reserved */
-       } pcci2_bits;
-       u64                     pcci2_data;
-} pal_cache_config_info_2_t;
-
-
-typedef struct pal_cache_config_info_s {
-       pal_status_t                    pcci_status;
-       pal_cache_config_info_1_t       pcci_info_1;
-       pal_cache_config_info_2_t       pcci_info_2;
-       u64                             pcci_reserved;
-} pal_cache_config_info_t;
-
-#define pcci_ld_hints          pcci_info_1.pcci1_bits.load_hints
-#define pcci_st_hints          pcci_info_1.pcci1_bits.store_hints
-#define pcci_ld_latency                pcci_info_1.pcci1_bits.load_latency
-#define pcci_st_latency                pcci_info_1.pcci1_bits.store_latency
-#define pcci_stride            pcci_info_1.pcci1_bits.stride
-#define pcci_line_size         pcci_info_1.pcci1_bits.line_size
-#define pcci_assoc             pcci_info_1.pcci1_bits.associativity
-#define pcci_cache_attr                pcci_info_1.pcci1_bits.at
-#define pcci_unified           pcci_info_1.pcci1_bits.u
-#define pcci_tag_msb           pcci_info_2.pcci2_bits.tag_ms_bit
-#define pcci_tag_lsb           pcci_info_2.pcci2_bits.tag_ls_bit
-#define pcci_alias_boundary    pcci_info_2.pcci2_bits.alias_boundary
-#define pcci_cache_size                pcci_info_2.pcci2_bits.cache_size
-
-
-
-/* Possible values for cache attributes */
-
-#define PAL_CACHE_ATTR_WT              0       /* Write through cache */
-#define PAL_CACHE_ATTR_WB              1       /* Write back cache */
-#define PAL_CACHE_ATTR_WT_OR_WB                2       /* Either write thru or write
-                                                * back depending on TLB
-                                                * memory attributes
-                                                */
-
-
-/* Possible values for cache hints */
-
-#define PAL_CACHE_HINT_TEMP_1          0       /* Temporal level 1 */
-#define PAL_CACHE_HINT_NTEMP_1         1       /* Non-temporal level 1 */
-#define PAL_CACHE_HINT_NTEMP_ALL       3       /* Non-temporal all levels */
-
-/* Processor cache protection  information */
-typedef union pal_cache_protection_element_u {
-       u32                     pcpi_data;
-       struct {
-               u32             data_bits       : 8, /* # data bits covered by
-                                                     * each unit of protection
-                                                     */
-
-                               tagprot_lsb     : 6, /* Least -do- */
-                               tagprot_msb     : 6, /* Most Sig. tag address
-                                                     * bit that this
-                                                     * protection covers.
-                                                     */
-                               prot_bits       : 6, /* # of protection bits */
-                               method          : 4, /* Protection method */
-                               t_d             : 2; /* Indicates which part
-                                                     * of the cache this
-                                                     * protection encoding
-                                                     * applies.
-                                                     */
-       } pcp_info;
-} pal_cache_protection_element_t;
-
-#define pcpi_cache_prot_part   pcp_info.t_d
-#define pcpi_prot_method       pcp_info.method
-#define pcpi_prot_bits         pcp_info.prot_bits
-#define pcpi_tagprot_msb       pcp_info.tagprot_msb
-#define pcpi_tagprot_lsb       pcp_info.tagprot_lsb
-#define pcpi_data_bits         pcp_info.data_bits
-
-/* Processor cache part encodings */
-#define PAL_CACHE_PROT_PART_DATA       0       /* Data protection  */
-#define PAL_CACHE_PROT_PART_TAG                1       /* Tag  protection */
-#define PAL_CACHE_PROT_PART_TAG_DATA   2       /* Tag+data protection (tag is
-                                                * more significant )
-                                                */
-#define PAL_CACHE_PROT_PART_DATA_TAG   3       /* Data+tag protection (data is
-                                                * more significant )
-                                                */
-#define PAL_CACHE_PROT_PART_MAX                6
-
-
-typedef struct pal_cache_protection_info_s {
-       pal_status_t                    pcpi_status;
-       pal_cache_protection_element_t  pcp_info[PAL_CACHE_PROT_PART_MAX];
-} pal_cache_protection_info_t;
-
-
-/* Processor cache protection method encodings */
-#define PAL_CACHE_PROT_METHOD_NONE             0       /* No protection */
-#define PAL_CACHE_PROT_METHOD_ODD_PARITY       1       /* Odd parity */
-#define PAL_CACHE_PROT_METHOD_EVEN_PARITY      2       /* Even parity */
-#define PAL_CACHE_PROT_METHOD_ECC              3       /* ECC protection */
-
-
-/* Processor cache line identification in the heirarchy */
-typedef union pal_cache_line_id_u {
-       u64                     pclid_data;
-       struct {
-               u64             cache_type      : 8,    /* 7-0 cache type */
-                               level           : 8,    /* 15-8 level of the
-                                                        * cache in the
-                                                        * heirarchy.
-                                                        */
-                               way             : 8,    /* 23-16 way in the set
-                                                        */
-                               part            : 8,    /* 31-24 part of the
-                                                        * cache
-                                                        */
-                               reserved        : 32;   /* 63-32 is reserved*/
-       } pclid_info_read;
-       struct {
-               u64             cache_type      : 8,    /* 7-0 cache type */
-                               level           : 8,    /* 15-8 level of the
-                                                        * cache in the
-                                                        * heirarchy.
-                                                        */
-                               way             : 8,    /* 23-16 way in the set
-                                                        */
-                               part            : 8,    /* 31-24 part of the
-                                                        * cache
-                                                        */
-                               mesi            : 8,    /* 39-32 cache line
-                                                        * state
-                                                        */
-                               start           : 8,    /* 47-40 lsb of data to
-                                                        * invert
-                                                        */
-                               length          : 8,    /* 55-48 #bits to
-                                                        * invert
-                                                        */
-                               trigger         : 8;    /* 63-56 Trigger error
-                                                        * by doing a load
-                                                        * after the write
-                                                        */
-
-       } pclid_info_write;
-} pal_cache_line_id_u_t;
-
-#define pclid_read_part                pclid_info_read.part
-#define pclid_read_way         pclid_info_read.way
-#define pclid_read_level       pclid_info_read.level
-#define pclid_read_cache_type  pclid_info_read.cache_type
-
-#define pclid_write_trigger    pclid_info_write.trigger
-#define pclid_write_length     pclid_info_write.length
-#define pclid_write_start      pclid_info_write.start
-#define pclid_write_mesi       pclid_info_write.mesi
-#define pclid_write_part       pclid_info_write.part
-#define pclid_write_way                pclid_info_write.way
-#define pclid_write_level      pclid_info_write.level
-#define pclid_write_cache_type pclid_info_write.cache_type
-
-/* Processor cache line part encodings */
-#define PAL_CACHE_LINE_ID_PART_DATA            0       /* Data */
-#define PAL_CACHE_LINE_ID_PART_TAG             1       /* Tag */
-#define PAL_CACHE_LINE_ID_PART_DATA_PROT       2       /* Data protection */
-#define PAL_CACHE_LINE_ID_PART_TAG_PROT                3       /* Tag protection */
-#define PAL_CACHE_LINE_ID_PART_DATA_TAG_PROT   4       /* Data+tag
-                                                        * protection
-                                                        */
-typedef struct pal_cache_line_info_s {
-       pal_status_t            pcli_status;            /* Return status of the read cache line
-                                                        * info call.
-                                                        */
-       u64                     pcli_data;              /* 64-bit data, tag, protection bits .. */
-       u64                     pcli_data_len;          /* data length in bits */
-       pal_cache_line_state_t  pcli_cache_line_state;  /* mesi state */
-
-} pal_cache_line_info_t;
-
-
-/* Machine Check related crap */
-
-/* Pending event status bits  */
-typedef u64                                    pal_mc_pending_events_t;
-
-#define PAL_MC_PENDING_MCA                     (1 << 0)
-#define PAL_MC_PENDING_INIT                    (1 << 1)
-
-/* Error information type */
-typedef u64                                    pal_mc_info_index_t;
-
-#define PAL_MC_INFO_PROCESSOR                  0       /* Processor */
-#define PAL_MC_INFO_CACHE_CHECK                        1       /* Cache check */
-#define PAL_MC_INFO_TLB_CHECK                  2       /* Tlb check */
-#define PAL_MC_INFO_BUS_CHECK                  3       /* Bus check */
-#define PAL_MC_INFO_REQ_ADDR                   4       /* Requestor address */
-#define PAL_MC_INFO_RESP_ADDR                  5       /* Responder address */
-#define PAL_MC_INFO_TARGET_ADDR                        6       /* Target address */
-#define PAL_MC_INFO_IMPL_DEP                   7       /* Implementation
-                                                        * dependent
-                                                        */
-
-
-typedef struct pal_process_state_info_s {
-       u64             reserved1       : 2,
-                       rz              : 1,    /* PAL_CHECK processor
-                                                * rendezvous
-                                                * successful.
-                                                */
-
-                       ra              : 1,    /* PAL_CHECK attempted
-                                                * a rendezvous.
-                                                */
-                       me              : 1,    /* Distinct multiple
-                                                * errors occurred
-                                                */
-
-                       mn              : 1,    /* Min. state save
-                                                * area has been
-                                                * registered with PAL
-                                                */
-
-                       sy              : 1,    /* Storage integrity
-                                                * synched
-                                                */
-
-
-                       co              : 1,    /* Continuable */
-                       ci              : 1,    /* MC isolated */
-                       us              : 1,    /* Uncontained storage
-                                                * damage.
-                                                */
-
-
-                       hd              : 1,    /* Non-essential hw
-                                                * lost (no loss of
-                                                * functionality)
-                                                * causing the
-                                                * processor to run in
-                                                * degraded mode.
-                                                */
-
-                       tl              : 1,    /* 1 => MC occurred
-                                                * after an instr was
-                                                * executed but before
-                                                * the trap that
-                                                * resulted from instr
-                                                * execution was
-                                                * generated.
-                                                * (Trap Lost )
-                                                */
-                       mi              : 1,    /* More information available
-                                                * call PAL_MC_ERROR_INFO
-                                                */
-                       pi              : 1,    /* Precise instruction pointer */
-                       pm              : 1,    /* Precise min-state save area */
-
-                       dy              : 1,    /* Processor dynamic
-                                                * state valid
-                                                */
-
-
-                       in              : 1,    /* 0 = MC, 1 = INIT */
-                       rs              : 1,    /* RSE valid */
-                       cm              : 1,    /* MC corrected */
-                       ex              : 1,    /* MC is expected */
-                       cr              : 1,    /* Control regs valid*/
-                       pc              : 1,    /* Perf cntrs valid */
-                       dr              : 1,    /* Debug regs valid */
-                       tr              : 1,    /* Translation regs
-                                                * valid
-                                                */
-                       rr              : 1,    /* Region regs valid */
-                       ar              : 1,    /* App regs valid */
-                       br              : 1,    /* Branch regs valid */
-                       pr              : 1,    /* Predicate registers
-                                                * valid
-                                                */
-
-                       fp              : 1,    /* fp registers valid*/
-                       b1              : 1,    /* Preserved bank one
-                                                * general registers
-                                                * are valid
-                                                */
-                       b0              : 1,    /* Preserved bank zero
-                                                * general registers
-                                                * are valid
-                                                */
-                       gr              : 1,    /* General registers
-                                                * are valid
-                                                * (excl. banked regs)
-                                                */
-                       dsize           : 16,   /* size of dynamic
-                                                * state returned
-                                                * by the processor
-                                                */
-
-                       reserved2       : 11,
-                       cc              : 1,    /* Cache check */
-                       tc              : 1,    /* TLB check */
-                       bc              : 1,    /* Bus check */
-                       rc              : 1,    /* Register file check */
-                       uc              : 1;    /* Uarch check */
-
-} pal_processor_state_info_t;
-
-typedef struct pal_cache_check_info_s {
-       u64             op              : 4,    /* Type of cache
-                                                * operation that
-                                                * caused the machine
-                                                * check.
-                                                */
-                       level           : 2,    /* Cache level */
-                       reserved1       : 2,
-                       dl              : 1,    /* Failure in data part
-                                                * of cache line
-                                                */
-                       tl              : 1,    /* Failure in tag part
-                                                * of cache line
-                                                */
-                       dc              : 1,    /* Failure in dcache */
-                       ic              : 1,    /* Failure in icache */
-                       mesi            : 3,    /* Cache line state */
-                       mv              : 1,    /* mesi valid */
-                       way             : 5,    /* Way in which the
-                                                * error occurred
-                                                */
-                       wiv             : 1,    /* Way field valid */
-                       reserved2       : 10,
-
-                       index           : 20,   /* Cache line index */
-                       reserved3       : 2,
-
-                       is              : 1,    /* instruction set (1 == ia32) */
-                       iv              : 1,    /* instruction set field valid */
-                       pl              : 2,    /* privilege level */
-                       pv              : 1,    /* privilege level field valid */
-                       mcc             : 1,    /* Machine check corrected */
-                       tv              : 1,    /* Target address
-                                                * structure is valid
-                                                */
-                       rq              : 1,    /* Requester identifier
-                                                * structure is valid
-                                                */
-                       rp              : 1,    /* Responder identifier
-                                                * structure is valid
-                                                */
-                       pi              : 1;    /* Precise instruction pointer
-                                                * structure is valid
-                                                */
-} pal_cache_check_info_t;
-
-typedef struct pal_tlb_check_info_s {
-
-       u64             tr_slot         : 8,    /* Slot# of TR where
-                                                * error occurred
-                                                */
-                       trv             : 1,    /* tr_slot field is valid */
-                       reserved1       : 1,
-                       level           : 2,    /* TLB level where failure occurred */
-                       reserved2       : 4,
-                       dtr             : 1,    /* Fail in data TR */
-                       itr             : 1,    /* Fail in inst TR */
-                       dtc             : 1,    /* Fail in data TC */
-                       itc             : 1,    /* Fail in inst. TC */
-                       op              : 4,    /* Cache operation */
-                       reserved3       : 30,
-
-                       is              : 1,    /* instruction set (1 == ia32) */
-                       iv              : 1,    /* instruction set field valid */
-                       pl              : 2,    /* privilege level */
-                       pv              : 1,    /* privilege level field valid */
-                       mcc             : 1,    /* Machine check corrected */
-                       tv              : 1,    /* Target address
-                                                * structure is valid
-                                                */
-                       rq              : 1,    /* Requester identifier
-                                                * structure is valid
-                                                */
-                       rp              : 1,    /* Responder identifier
-                                                * structure is valid
-                                                */
-                       pi              : 1;    /* Precise instruction pointer
-                                                * structure is valid
-                                                */
-} pal_tlb_check_info_t;
-
-typedef struct pal_bus_check_info_s {
-       u64             size            : 5,    /* Xaction size */
-                       ib              : 1,    /* Internal bus error */
-                       eb              : 1,    /* External bus error */
-                       cc              : 1,    /* Error occurred
-                                                * during cache-cache
-                                                * transfer.
-                                                */
-                       type            : 8,    /* Bus xaction type*/
-                       sev             : 5,    /* Bus error severity*/
-                       hier            : 2,    /* Bus hierarchy level */
-                       reserved1       : 1,
-                       bsi             : 8,    /* Bus error status
-                                                * info
-                                                */
-                       reserved2       : 22,
-
-                       is              : 1,    /* instruction set (1 == ia32) */
-                       iv              : 1,    /* instruction set field valid */
-                       pl              : 2,    /* privilege level */
-                       pv              : 1,    /* privilege level field valid */
-                       mcc             : 1,    /* Machine check corrected */
-                       tv              : 1,    /* Target address
-                                                * structure is valid
-                                                */
-                       rq              : 1,    /* Requester identifier
-                                                * structure is valid
-                                                */
-                       rp              : 1,    /* Responder identifier
-                                                * structure is valid
-                                                */
-                       pi              : 1;    /* Precise instruction pointer
-                                                * structure is valid
-                                                */
-} pal_bus_check_info_t;
-
-typedef struct pal_reg_file_check_info_s {
-       u64             id              : 4,    /* Register file identifier */
-                       op              : 4,    /* Type of register
-                                                * operation that
-                                                * caused the machine
-                                                * check.
-                                                */
-                       reg_num         : 7,    /* Register number */
-                       rnv             : 1,    /* reg_num valid */
-                       reserved2       : 38,
-
-                       is              : 1,    /* instruction set (1 == ia32) */
-                       iv              : 1,    /* instruction set field valid */
-                       pl              : 2,    /* privilege level */
-                       pv              : 1,    /* privilege level field valid */
-                       mcc             : 1,    /* Machine check corrected */
-                       reserved3       : 3,
-                       pi              : 1;    /* Precise instruction pointer
-                                                * structure is valid
-                                                */
-} pal_reg_file_check_info_t;
-
-typedef struct pal_uarch_check_info_s {
-       u64             sid             : 5,    /* Structure identification */
-                       level           : 3,    /* Level of failure */
-                       array_id        : 4,    /* Array identification */
-                       op              : 4,    /* Type of
-                                                * operation that
-                                                * caused the machine
-                                                * check.
-                                                */
-                       way             : 6,    /* Way of structure */
-                       wv              : 1,    /* way valid */
-                       xv              : 1,    /* index valid */
-                       reserved1       : 8,
-                       index           : 8,    /* Index or set of the uarch
-                                                * structure that failed.
-                                                */
-                       reserved2       : 24,
-
-                       is              : 1,    /* instruction set (1 == ia32) */
-                       iv              : 1,    /* instruction set field valid */
-                       pl              : 2,    /* privilege level */
-                       pv              : 1,    /* privilege level field valid */
-                       mcc             : 1,    /* Machine check corrected */
-                       tv              : 1,    /* Target address
-                                                * structure is valid
-                                                */
-                       rq              : 1,    /* Requester identifier
-                                                * structure is valid
-                                                */
-                       rp              : 1,    /* Responder identifier
-                                                * structure is valid
-                                                */
-                       pi              : 1;    /* Precise instruction pointer
-                                                * structure is valid
-                                                */
-} pal_uarch_check_info_t;
-
-typedef union pal_mc_error_info_u {
-       u64                             pmei_data;
-       pal_processor_state_info_t      pme_processor;
-       pal_cache_check_info_t          pme_cache;
-       pal_tlb_check_info_t            pme_tlb;
-       pal_bus_check_info_t            pme_bus;
-       pal_reg_file_check_info_t       pme_reg_file;
-       pal_uarch_check_info_t          pme_uarch;
-} pal_mc_error_info_t;
-
-#define pmci_proc_unknown_check                        pme_processor.uc
-#define pmci_proc_bus_check                    pme_processor.bc
-#define pmci_proc_tlb_check                    pme_processor.tc
-#define pmci_proc_cache_check                  pme_processor.cc
-#define pmci_proc_dynamic_state_size           pme_processor.dsize
-#define pmci_proc_gpr_valid                    pme_processor.gr
-#define pmci_proc_preserved_bank0_gpr_valid    pme_processor.b0
-#define pmci_proc_preserved_bank1_gpr_valid    pme_processor.b1
-#define pmci_proc_fp_valid                     pme_processor.fp
-#define pmci_proc_predicate_regs_valid         pme_processor.pr
-#define pmci_proc_branch_regs_valid            pme_processor.br
-#define pmci_proc_app_regs_valid               pme_processor.ar
-#define pmci_proc_region_regs_valid            pme_processor.rr
-#define pmci_proc_translation_regs_valid       pme_processor.tr
-#define pmci_proc_debug_regs_valid             pme_processor.dr
-#define pmci_proc_perf_counters_valid          pme_processor.pc
-#define pmci_proc_control_regs_valid           pme_processor.cr
-#define pmci_proc_machine_check_expected       pme_processor.ex
-#define pmci_proc_machine_check_corrected      pme_processor.cm
-#define pmci_proc_rse_valid                    pme_processor.rs
-#define pmci_proc_machine_check_or_init                pme_processor.in
-#define pmci_proc_dynamic_state_valid          pme_processor.dy
-#define pmci_proc_operation                    pme_processor.op
-#define pmci_proc_trap_lost                    pme_processor.tl
-#define pmci_proc_hardware_damage              pme_processor.hd
-#define pmci_proc_uncontained_storage_damage   pme_processor.us
-#define pmci_proc_machine_check_isolated       pme_processor.ci
-#define pmci_proc_continuable                  pme_processor.co
-#define pmci_proc_storage_intergrity_synced    pme_processor.sy
-#define pmci_proc_min_state_save_area_regd     pme_processor.mn
-#define        pmci_proc_distinct_multiple_errors      pme_processor.me
-#define pmci_proc_pal_attempted_rendezvous     pme_processor.ra
-#define pmci_proc_pal_rendezvous_complete      pme_processor.rz
-
-
-#define pmci_cache_level                       pme_cache.level
-#define pmci_cache_line_state                  pme_cache.mesi
-#define pmci_cache_line_state_valid            pme_cache.mv
-#define pmci_cache_line_index                  pme_cache.index
-#define pmci_cache_instr_cache_fail            pme_cache.ic
-#define pmci_cache_data_cache_fail             pme_cache.dc
-#define pmci_cache_line_tag_fail               pme_cache.tl
-#define pmci_cache_line_data_fail              pme_cache.dl
-#define pmci_cache_operation                   pme_cache.op
-#define pmci_cache_way_valid                   pme_cache.wv
-#define pmci_cache_target_address_valid                pme_cache.tv
-#define pmci_cache_way                         pme_cache.way
-#define pmci_cache_mc                          pme_cache.mc
-
-#define pmci_tlb_instr_translation_cache_fail  pme_tlb.itc
-#define pmci_tlb_data_translation_cache_fail   pme_tlb.dtc
-#define pmci_tlb_instr_translation_reg_fail    pme_tlb.itr
-#define pmci_tlb_data_translation_reg_fail     pme_tlb.dtr
-#define pmci_tlb_translation_reg_slot          pme_tlb.tr_slot
-#define pmci_tlb_mc                            pme_tlb.mc
-
-#define pmci_bus_status_info                   pme_bus.bsi
-#define pmci_bus_req_address_valid             pme_bus.rq
-#define pmci_bus_resp_address_valid            pme_bus.rp
-#define pmci_bus_target_address_valid          pme_bus.tv
-#define pmci_bus_error_severity                        pme_bus.sev
-#define pmci_bus_transaction_type              pme_bus.type
-#define pmci_bus_cache_cache_transfer          pme_bus.cc
-#define pmci_bus_transaction_size              pme_bus.size
-#define pmci_bus_internal_error                        pme_bus.ib
-#define pmci_bus_external_error                        pme_bus.eb
-#define pmci_bus_mc                            pme_bus.mc
-
-/*
- * NOTE: this min_state_save area struct only includes the 1KB
- * architectural state save area.  The other 3 KB is scratch space
- * for PAL.
- */
-
-typedef struct pal_min_state_area_s {
-       u64     pmsa_nat_bits;          /* nat bits for saved GRs  */
-       u64     pmsa_gr[15];            /* GR1  - GR15             */
-       u64     pmsa_bank0_gr[16];      /* GR16 - GR31             */
-       u64     pmsa_bank1_gr[16];      /* GR16 - GR31             */
-       u64     pmsa_pr;                /* predicate registers     */
-       u64     pmsa_br0;               /* branch register 0       */
-       u64     pmsa_rsc;               /* ar.rsc                  */
-       u64     pmsa_iip;               /* cr.iip                  */
-       u64     pmsa_ipsr;              /* cr.ipsr                 */
-       u64     pmsa_ifs;               /* cr.ifs                  */
-       u64     pmsa_xip;               /* previous iip            */
-       u64     pmsa_xpsr;              /* previous psr            */
-       u64     pmsa_xfs;               /* previous ifs            */
-       u64     pmsa_br1;               /* branch register 1       */
-       u64     pmsa_reserved[70];      /* pal_min_state_area should total to 1KB */
-} pal_min_state_area_t;
-
-
-struct ia64_pal_retval {
-       /*
-        * A zero status value indicates call completed without error.
-        * A negative status value indicates reason of call failure.
-        * A positive status value indicates success but an
-        * informational value should be printed (e.g., "reboot for
-        * change to take effect").
-        */
-       s64 status;
-       u64 v0;
-       u64 v1;
-       u64 v2;
-};
-
-/*
- * Note: Currently unused PAL arguments are generally labeled
- * "reserved" so the value specified in the PAL documentation
- * (generally 0) MUST be passed.  Reserved parameters are not optional
- * parameters.
- */
-extern struct ia64_pal_retval ia64_pal_call_static (u64, u64, u64, u64, u64);
-extern struct ia64_pal_retval ia64_pal_call_stacked (u64, u64, u64, u64);
-extern struct ia64_pal_retval ia64_pal_call_phys_static (u64, u64, u64, u64);
-extern struct ia64_pal_retval ia64_pal_call_phys_stacked (u64, u64, u64, u64);
-extern void ia64_save_scratch_fpregs (struct ia64_fpreg *);
-extern void ia64_load_scratch_fpregs (struct ia64_fpreg *);
-
-#define PAL_CALL(iprv,a0,a1,a2,a3) do {                        \
-       struct ia64_fpreg fr[6];                        \
-       ia64_save_scratch_fpregs(fr);                   \
-       iprv = ia64_pal_call_static(a0, a1, a2, a3, 0); \
-       ia64_load_scratch_fpregs(fr);                   \
-} while (0)
-
-#define PAL_CALL_IC_OFF(iprv,a0,a1,a2,a3) do {         \
-       struct ia64_fpreg fr[6];                        \
-       ia64_save_scratch_fpregs(fr);                   \
-       iprv = ia64_pal_call_static(a0, a1, a2, a3, 1); \
-       ia64_load_scratch_fpregs(fr);                   \
-} while (0)
-
-#define PAL_CALL_STK(iprv,a0,a1,a2,a3) do {            \
-       struct ia64_fpreg fr[6];                        \
-       ia64_save_scratch_fpregs(fr);                   \
-       iprv = ia64_pal_call_stacked(a0, a1, a2, a3);   \
-       ia64_load_scratch_fpregs(fr);                   \
-} while (0)
-
-#define PAL_CALL_PHYS(iprv,a0,a1,a2,a3) do {                   \
-       struct ia64_fpreg fr[6];                                \
-       ia64_save_scratch_fpregs(fr);                           \
-       iprv = ia64_pal_call_phys_static(a0, a1, a2, a3);       \
-       ia64_load_scratch_fpregs(fr);                           \
-} while (0)
-
-#define PAL_CALL_PHYS_STK(iprv,a0,a1,a2,a3) do {               \
-       struct ia64_fpreg fr[6];                                \
-       ia64_save_scratch_fpregs(fr);                           \
-       iprv = ia64_pal_call_phys_stacked(a0, a1, a2, a3);      \
-       ia64_load_scratch_fpregs(fr);                           \
-} while (0)
-
-typedef int (*ia64_pal_handler) (u64, ...);
-extern ia64_pal_handler ia64_pal;
-extern void ia64_pal_handler_init (void *);
-
-extern ia64_pal_handler ia64_pal;
-
-extern pal_cache_config_info_t         l0d_cache_config_info;
-extern pal_cache_config_info_t         l0i_cache_config_info;
-extern pal_cache_config_info_t         l1_cache_config_info;
-extern pal_cache_config_info_t         l2_cache_config_info;
-
-extern pal_cache_protection_info_t     l0d_cache_protection_info;
-extern pal_cache_protection_info_t     l0i_cache_protection_info;
-extern pal_cache_protection_info_t     l1_cache_protection_info;
-extern pal_cache_protection_info_t     l2_cache_protection_info;
-
-extern pal_cache_config_info_t         pal_cache_config_info_get(pal_cache_level_t,
-                                                                 pal_cache_type_t);
-
-extern pal_cache_protection_info_t     pal_cache_protection_info_get(pal_cache_level_t,
-                                                                     pal_cache_type_t);
-
-
-extern void                            pal_error(int);
-
-
-/* Useful wrappers for the current list of pal procedures */
-
-typedef union pal_bus_features_u {
-       u64     pal_bus_features_val;
-       struct {
-               u64     pbf_reserved1                           :       29;
-               u64     pbf_req_bus_parking                     :       1;
-               u64     pbf_bus_lock_mask                       :       1;
-               u64     pbf_enable_half_xfer_rate               :       1;
-               u64     pbf_reserved2                           :       22;
-               u64     pbf_disable_xaction_queueing            :       1;
-               u64     pbf_disable_resp_err_check              :       1;
-               u64     pbf_disable_berr_check                  :       1;
-               u64     pbf_disable_bus_req_internal_err_signal :       1;
-               u64     pbf_disable_bus_req_berr_signal         :       1;
-               u64     pbf_disable_bus_init_event_check        :       1;
-               u64     pbf_disable_bus_init_event_signal       :       1;
-               u64     pbf_disable_bus_addr_err_check          :       1;
-               u64     pbf_disable_bus_addr_err_signal         :       1;
-               u64     pbf_disable_bus_data_err_check          :       1;
-       } pal_bus_features_s;
-} pal_bus_features_u_t;
-
-extern void pal_bus_features_print (u64);
-
-/* Provide information about configurable processor bus features */
-static inline s64
-ia64_pal_bus_get_features (pal_bus_features_u_t *features_avail,
-                          pal_bus_features_u_t *features_status,
-                          pal_bus_features_u_t *features_control)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS(iprv, PAL_BUS_GET_FEATURES, 0, 0, 0);
-       if (features_avail)
-               features_avail->pal_bus_features_val = iprv.v0;
-       if (features_status)
-               features_status->pal_bus_features_val = iprv.v1;
-       if (features_control)
-               features_control->pal_bus_features_val = iprv.v2;
-       return iprv.status;
-}
-
-/* Enables/disables specific processor bus features */
-static inline s64
-ia64_pal_bus_set_features (pal_bus_features_u_t feature_select)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS(iprv, PAL_BUS_SET_FEATURES, feature_select.pal_bus_features_val, 0, 0);
-       return iprv.status;
-}
-
-/* Get detailed cache information */
-static inline s64
-ia64_pal_cache_config_info (u64 cache_level, u64 cache_type, pal_cache_config_info_t *conf)
-{
-       struct ia64_pal_retval iprv;
-
-       PAL_CALL(iprv, PAL_CACHE_INFO, cache_level, cache_type, 0);
-
-       if (iprv.status == 0) {
-               conf->pcci_status                 = iprv.status;
-               conf->pcci_info_1.pcci1_data      = iprv.v0;
-               conf->pcci_info_2.pcci2_data      = iprv.v1;
-               conf->pcci_reserved               = iprv.v2;
-       }
-       return iprv.status;
-
-}
-
-/* Get detailed cche protection information */
-static inline s64
-ia64_pal_cache_prot_info (u64 cache_level, u64 cache_type, pal_cache_protection_info_t *prot)
-{
-       struct ia64_pal_retval iprv;
-
-       PAL_CALL(iprv, PAL_CACHE_PROT_INFO, cache_level, cache_type, 0);
-
-       if (iprv.status == 0) {
-               prot->pcpi_status           = iprv.status;
-               prot->pcp_info[0].pcpi_data = iprv.v0 & 0xffffffff;
-               prot->pcp_info[1].pcpi_data = iprv.v0 >> 32;
-               prot->pcp_info[2].pcpi_data = iprv.v1 & 0xffffffff;
-               prot->pcp_info[3].pcpi_data = iprv.v1 >> 32;
-               prot->pcp_info[4].pcpi_data = iprv.v2 & 0xffffffff;
-               prot->pcp_info[5].pcpi_data = iprv.v2 >> 32;
-       }
-       return iprv.status;
-}
-
-/*
- * Flush the processor instruction or data caches.  *PROGRESS must be
- * initialized to zero before calling this for the first time..
- */
-static inline s64
-ia64_pal_cache_flush (u64 cache_type, u64 invalidate, u64 *progress, u64 *vector)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_FLUSH, cache_type, invalidate, *progress);
-       if (vector)
-               *vector = iprv.v0;
-       *progress = iprv.v1;
-       return iprv.status;
-}
-
-
-/* Initialize the processor controlled caches */
-static inline s64
-ia64_pal_cache_init (u64 level, u64 cache_type, u64 rest)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_INIT, level, cache_type, rest);
-       return iprv.status;
-}
-
-/* Initialize the tags and data of a data or unified cache line of
- * processor controlled cache to known values without the availability
- * of backing memory.
- */
-static inline s64
-ia64_pal_cache_line_init (u64 physical_addr, u64 data_value)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_LINE_INIT, physical_addr, data_value, 0);
-       return iprv.status;
-}
-
-
-/* Read the data and tag of a processor controlled cache line for diags */
-static inline s64
-ia64_pal_cache_read (pal_cache_line_id_u_t line_id, u64 physical_addr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_READ, line_id.pclid_data, physical_addr, 0);
-       return iprv.status;
-}
-
-/* Return summary information about the heirarchy of caches controlled by the processor */
-static inline s64
-ia64_pal_cache_summary (u64 *cache_levels, u64 *unique_caches)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_SUMMARY, 0, 0, 0);
-       if (cache_levels)
-               *cache_levels = iprv.v0;
-       if (unique_caches)
-               *unique_caches = iprv.v1;
-       return iprv.status;
-}
-
-/* Write the data and tag of a processor-controlled cache line for diags */
-static inline s64
-ia64_pal_cache_write (pal_cache_line_id_u_t line_id, u64 physical_addr, u64 data)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_CACHE_WRITE, line_id.pclid_data, physical_addr, data);
-       return iprv.status;
-}
-
-
-/* Return the parameters needed to copy relocatable PAL procedures from ROM to memory */
-static inline s64
-ia64_pal_copy_info (u64 copy_type, u64 num_procs, u64 num_iopics,
-                   u64 *buffer_size, u64 *buffer_align)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_COPY_INFO, copy_type, num_procs, num_iopics);
-       if (buffer_size)
-               *buffer_size = iprv.v0;
-       if (buffer_align)
-               *buffer_align = iprv.v1;
-       return iprv.status;
-}
-
-/* Copy relocatable PAL procedures from ROM to memory */
-static inline s64
-ia64_pal_copy_pal (u64 target_addr, u64 alloc_size, u64 processor, u64 *pal_proc_offset)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_COPY_PAL, target_addr, alloc_size, processor);
-       if (pal_proc_offset)
-               *pal_proc_offset = iprv.v0;
-       return iprv.status;
-}
-
-/* Return the number of instruction and data debug register pairs */
-static inline s64
-ia64_pal_debug_info (u64 *inst_regs,  u64 *data_regs)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_DEBUG_INFO, 0, 0, 0);
-       if (inst_regs)
-               *inst_regs = iprv.v0;
-       if (data_regs)
-               *data_regs = iprv.v1;
-
-       return iprv.status;
-}
-
-#ifdef TBD
-/* Switch from IA64-system environment to IA-32 system environment */
-static inline s64
-ia64_pal_enter_ia32_env (ia32_env1, ia32_env2, ia32_env3)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_ENTER_IA_32_ENV, ia32_env1, ia32_env2, ia32_env3);
-       return iprv.status;
-}
-#endif
-
-/* Get unique geographical address of this processor on its bus */
-static inline s64
-ia64_pal_fixed_addr (u64 *global_unique_addr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_FIXED_ADDR, 0, 0, 0);
-       if (global_unique_addr)
-               *global_unique_addr = iprv.v0;
-       return iprv.status;
-}
-
-/* Get base frequency of the platform if generated by the processor */
-static inline s64
-ia64_pal_freq_base (u64 *platform_base_freq)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_FREQ_BASE, 0, 0, 0);
-       if (platform_base_freq)
-               *platform_base_freq = iprv.v0;
-       return iprv.status;
-}
-
-/*
- * Get the ratios for processor frequency, bus frequency and interval timer to
- * to base frequency of the platform
- */
-static inline s64
-ia64_pal_freq_ratios (struct pal_freq_ratio *proc_ratio, struct pal_freq_ratio *bus_ratio,
-                     struct pal_freq_ratio *itc_ratio)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_FREQ_RATIOS, 0, 0, 0);
-       if (proc_ratio)
-               *(u64 *)proc_ratio = iprv.v0;
-       if (bus_ratio)
-               *(u64 *)bus_ratio = iprv.v1;
-       if (itc_ratio)
-               *(u64 *)itc_ratio = iprv.v2;
-       return iprv.status;
-}
-
-/* Make the processor enter HALT or one of the implementation dependent low
- * power states where prefetching and execution are suspended and cache and
- * TLB coherency is not maintained.
- */
-static inline s64
-ia64_pal_halt (u64 halt_state)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_HALT, halt_state, 0, 0);
-       return iprv.status;
-}
-
-typedef union pal_power_mgmt_info_u {
-       u64                     ppmi_data;
-       struct {
-              u64              exit_latency            : 16,
-                               entry_latency           : 16,
-                               power_consumption       : 28,
-                               im                      : 1,
-                               co                      : 1,
-                               reserved                : 2;
-       } pal_power_mgmt_info_s;
-} pal_power_mgmt_info_u_t;
-
-/* Return information about processor's optional power management capabilities. */
-static inline s64
-ia64_pal_halt_info (pal_power_mgmt_info_u_t *power_buf)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_STK(iprv, PAL_HALT_INFO, (unsigned long) power_buf, 0, 0);
-       return iprv.status;
-}
-
-/* Get the current P-state information */
-static inline s64
-ia64_pal_get_pstate (u64 *pstate_index)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_STK(iprv, PAL_GET_PSTATE, 0, 0, 0);
-       *pstate_index = iprv.v0;
-       return iprv.status;
-}
-
-/* Set the P-state */
-static inline s64
-ia64_pal_set_pstate (u64 pstate_index)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_STK(iprv, PAL_SET_PSTATE, pstate_index, 0, 0);
-       return iprv.status;
-}
-
-/* Cause the processor to enter LIGHT HALT state, where prefetching and execution are
- * suspended, but cache and TLB coherency is maintained.
- */
-static inline s64
-ia64_pal_halt_light (void)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_HALT_LIGHT, 0, 0, 0);
-       return iprv.status;
-}
-
-/* Clear all the processor error logging   registers and reset the indicator that allows
- * the error logging registers to be written. This procedure also checks the pending
- * machine check bit and pending INIT bit and reports their states.
- */
-static inline s64
-ia64_pal_mc_clear_log (u64 *pending_vector)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_CLEAR_LOG, 0, 0, 0);
-       if (pending_vector)
-               *pending_vector = iprv.v0;
-       return iprv.status;
-}
-
-/* Ensure that all outstanding transactions in a processor are completed or that any
- * MCA due to thes outstanding transaction is taken.
- */
-static inline s64
-ia64_pal_mc_drain (void)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_DRAIN, 0, 0, 0);
-       return iprv.status;
-}
-
-/* Return the machine check dynamic processor state */
-static inline s64
-ia64_pal_mc_dynamic_state (u64 offset, u64 *size, u64 *pds)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_DYNAMIC_STATE, offset, 0, 0);
-       if (size)
-               *size = iprv.v0;
-       if (pds)
-               *pds = iprv.v1;
-       return iprv.status;
-}
-
-/* Return processor machine check information */
-static inline s64
-ia64_pal_mc_error_info (u64 info_index, u64 type_index, u64 *size, u64 *error_info)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_ERROR_INFO, info_index, type_index, 0);
-       if (size)
-               *size = iprv.v0;
-       if (error_info)
-               *error_info = iprv.v1;
-       return iprv.status;
-}
-
-/* Inform PALE_CHECK whether a machine check is expected so that PALE_CHECK willnot
- * attempt to correct any expected machine checks.
- */
-static inline s64
-ia64_pal_mc_expected (u64 expected, u64 *previous)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_EXPECTED, expected, 0, 0);
-       if (previous)
-               *previous = iprv.v0;
-       return iprv.status;
-}
-
-/* Register a platform dependent location with PAL to which it can save
- * minimal processor state in the event of a machine check or initialization
- * event.
- */
-static inline s64
-ia64_pal_mc_register_mem (u64 physical_addr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_REGISTER_MEM, physical_addr, 0, 0);
-       return iprv.status;
-}
-
-/* Restore minimal architectural processor state, set CMC interrupt if necessary
- * and resume execution
- */
-static inline s64
-ia64_pal_mc_resume (u64 set_cmci, u64 save_ptr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MC_RESUME, set_cmci, save_ptr, 0);
-       return iprv.status;
-}
-
-/* Return the memory attributes implemented by the processor */
-static inline s64
-ia64_pal_mem_attrib (u64 *mem_attrib)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MEM_ATTRIB, 0, 0, 0);
-       if (mem_attrib)
-               *mem_attrib = iprv.v0 & 0xff;
-       return iprv.status;
-}
-
-/* Return the amount of memory needed for second phase of processor
- * self-test and the required alignment of memory.
- */
-static inline s64
-ia64_pal_mem_for_test (u64 *bytes_needed, u64 *alignment)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_MEM_FOR_TEST, 0, 0, 0);
-       if (bytes_needed)
-               *bytes_needed = iprv.v0;
-       if (alignment)
-               *alignment = iprv.v1;
-       return iprv.status;
-}
-
-typedef union pal_perf_mon_info_u {
-       u64                       ppmi_data;
-       struct {
-              u64              generic         : 8,
-                               width           : 8,
-                               cycles          : 8,
-                               retired         : 8,
-                               reserved        : 32;
-       } pal_perf_mon_info_s;
-} pal_perf_mon_info_u_t;
-
-/* Return the performance monitor information about what can be counted
- * and how to configure the monitors to count the desired events.
- */
-static inline s64
-ia64_pal_perf_mon_info (u64 *pm_buffer, pal_perf_mon_info_u_t *pm_info)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_PERF_MON_INFO, (unsigned long) pm_buffer, 0, 0);
-       if (pm_info)
-               pm_info->ppmi_data = iprv.v0;
-       return iprv.status;
-}
-
-/* Specifies the physical address of the processor interrupt block
- * and I/O port space.
- */
-static inline s64
-ia64_pal_platform_addr (u64 type, u64 physical_addr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_PLATFORM_ADDR, type, physical_addr, 0);
-       return iprv.status;
-}
-
-/* Set the SAL PMI entrypoint in memory */
-static inline s64
-ia64_pal_pmi_entrypoint (u64 sal_pmi_entry_addr)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_PMI_ENTRYPOINT, sal_pmi_entry_addr, 0, 0);
-       return iprv.status;
-}
-
-struct pal_features_s;
-/* Provide information about configurable processor features */
-static inline s64
-ia64_pal_proc_get_features (u64 *features_avail,
-                           u64 *features_status,
-                           u64 *features_control)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, 0, 0);
-       if (iprv.status == 0) {
-               *features_avail   = iprv.v0;
-               *features_status  = iprv.v1;
-               *features_control = iprv.v2;
-       }
-       return iprv.status;
-}
-
-/* Enable/disable processor dependent features */
-static inline s64
-ia64_pal_proc_set_features (u64 feature_select)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES, feature_select, 0, 0);
-       return iprv.status;
-}
-
-/*
- * Put everything in a struct so we avoid the global offset table whenever
- * possible.
- */
-typedef struct ia64_ptce_info_s {
-       u64             base;
-       u32             count[2];
-       u32             stride[2];
-} ia64_ptce_info_t;
-
-/* Return the information required for the architected loop used to purge
- * (initialize) the entire TC
- */
-static inline s64
-ia64_get_ptce (ia64_ptce_info_t *ptce)
-{
-       struct ia64_pal_retval iprv;
-
-       if (!ptce)
-               return -1;
-
-       PAL_CALL(iprv, PAL_PTCE_INFO, 0, 0, 0);
-       if (iprv.status == 0) {
-               ptce->base = iprv.v0;
-               ptce->count[0] = iprv.v1 >> 32;
-               ptce->count[1] = iprv.v1 & 0xffffffff;
-               ptce->stride[0] = iprv.v2 >> 32;
-               ptce->stride[1] = iprv.v2 & 0xffffffff;
-       }
-       return iprv.status;
-}
-
-/* Return info about implemented application and control registers. */
-static inline s64
-ia64_pal_register_info (u64 info_request, u64 *reg_info_1, u64 *reg_info_2)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_REGISTER_INFO, info_request, 0, 0);
-       if (reg_info_1)
-               *reg_info_1 = iprv.v0;
-       if (reg_info_2)
-               *reg_info_2 = iprv.v1;
-       return iprv.status;
-}
-
-typedef union pal_hints_u {
-       u64                     ph_data;
-       struct {
-              u64              si              : 1,
-                               li              : 1,
-                               reserved        : 62;
-       } pal_hints_s;
-} pal_hints_u_t;
-
-/* Return information about the register stack and RSE for this processor
- * implementation.
- */
-static inline s64
-ia64_pal_rse_info (u64 *num_phys_stacked, pal_hints_u_t *hints)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_RSE_INFO, 0, 0, 0);
-       if (num_phys_stacked)
-               *num_phys_stacked = iprv.v0;
-       if (hints)
-               hints->ph_data = iprv.v1;
-       return iprv.status;
-}
-
-/* Cause the processor to enter        SHUTDOWN state, where prefetching and execution are
- * suspended, but cause cache and TLB coherency to be maintained.
- * This is usually called in IA-32 mode.
- */
-static inline s64
-ia64_pal_shutdown (void)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_SHUTDOWN, 0, 0, 0);
-       return iprv.status;
-}
-
-/* Perform the second phase of processor self-test. */
-static inline s64
-ia64_pal_test_proc (u64 test_addr, u64 test_size, u64 attributes, u64 *self_test_state)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_TEST_PROC, test_addr, test_size, attributes);
-       if (self_test_state)
-               *self_test_state = iprv.v0;
-       return iprv.status;
-}
-
-typedef union  pal_version_u {
-       u64     pal_version_val;
-       struct {
-               u64     pv_pal_b_rev            :       8;
-               u64     pv_pal_b_model          :       8;
-               u64     pv_reserved1            :       8;
-               u64     pv_pal_vendor           :       8;
-               u64     pv_pal_a_rev            :       8;
-               u64     pv_pal_a_model          :       8;
-               u64     pv_reserved2            :       16;
-       } pal_version_s;
-} pal_version_u_t;
-
-
-/*
- * Return PAL version information.  While the documentation states that
- * PAL_VERSION can be called in either physical or virtual mode, some
- * implementations only allow physical calls.  We don't call it very often,
- * so the overhead isn't worth eliminating.
- */
-static inline s64
-ia64_pal_version (pal_version_u_t *pal_min_version, pal_version_u_t *pal_cur_version)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS(iprv, PAL_VERSION, 0, 0, 0);
-       if (pal_min_version)
-               pal_min_version->pal_version_val = iprv.v0;
-
-       if (pal_cur_version)
-               pal_cur_version->pal_version_val = iprv.v1;
-
-       return iprv.status;
-}
-
-typedef union pal_tc_info_u {
-       u64                     pti_val;
-       struct {
-              u64              num_sets        :       8,
-                               associativity   :       8,
-                               num_entries     :       16,
-                               pf              :       1,
-                               unified         :       1,
-                               reduce_tr       :       1,
-                               reserved        :       29;
-       } pal_tc_info_s;
-} pal_tc_info_u_t;
-
-#define tc_reduce_tr           pal_tc_info_s.reduce_tr
-#define tc_unified             pal_tc_info_s.unified
-#define tc_pf                  pal_tc_info_s.pf
-#define tc_num_entries         pal_tc_info_s.num_entries
-#define tc_associativity       pal_tc_info_s.associativity
-#define tc_num_sets            pal_tc_info_s.num_sets
-
-
-/* Return information about the virtual memory characteristics of the processor
- * implementation.
- */
-static inline s64
-ia64_pal_vm_info (u64 tc_level, u64 tc_type,  pal_tc_info_u_t *tc_info, u64 *tc_pages)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_VM_INFO, tc_level, tc_type, 0);
-       if (tc_info)
-               tc_info->pti_val = iprv.v0;
-       if (tc_pages)
-               *tc_pages = iprv.v1;
-       return iprv.status;
-}
-
-/* Get page size information about the virtual memory characteristics of the processor
- * implementation.
- */
-static inline s64
-ia64_pal_vm_page_size (u64 *tr_pages, u64 *vw_pages)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_VM_PAGE_SIZE, 0, 0, 0);
-       if (tr_pages)
-               *tr_pages = iprv.v0;
-       if (vw_pages)
-               *vw_pages = iprv.v1;
-       return iprv.status;
-}
-
-typedef union pal_vm_info_1_u {
-       u64                     pvi1_val;
-       struct {
-               u64             vw              : 1,
-                               phys_add_size   : 7,
-                               key_size        : 8,
-                               max_pkr         : 8,
-                               hash_tag_id     : 8,
-                               max_dtr_entry   : 8,
-                               max_itr_entry   : 8,
-                               max_unique_tcs  : 8,
-                               num_tc_levels   : 8;
-       } pal_vm_info_1_s;
-} pal_vm_info_1_u_t;
-
-typedef union pal_vm_info_2_u {
-       u64                     pvi2_val;
-       struct {
-               u64             impl_va_msb     : 8,
-                               rid_size        : 8,
-                               reserved        : 48;
-       } pal_vm_info_2_s;
-} pal_vm_info_2_u_t;
-
-/* Get summary information about the virtual memory characteristics of the processor
- * implementation.
- */
-static inline s64
-ia64_pal_vm_summary (pal_vm_info_1_u_t *vm_info_1, pal_vm_info_2_u_t *vm_info_2)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_VM_SUMMARY, 0, 0, 0);
-       if (vm_info_1)
-               vm_info_1->pvi1_val = iprv.v0;
-       if (vm_info_2)
-               vm_info_2->pvi2_val = iprv.v1;
-       return iprv.status;
-}
-
-typedef union pal_itr_valid_u {
-       u64                     piv_val;
-       struct {
-              u64              access_rights_valid     : 1,
-                               priv_level_valid        : 1,
-                               dirty_bit_valid         : 1,
-                               mem_attr_valid          : 1,
-                               reserved                : 60;
-       } pal_tr_valid_s;
-} pal_tr_valid_u_t;
-
-/* Read a translation register */
-static inline s64
-ia64_pal_tr_read (u64 reg_num, u64 tr_type, u64 *tr_buffer, pal_tr_valid_u_t *tr_valid)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL_PHYS_STK(iprv, PAL_VM_TR_READ, reg_num, tr_type,(u64)ia64_tpa(tr_buffer));
-       if (tr_valid)
-               tr_valid->piv_val = iprv.v0;
-       return iprv.status;
-}
-
-/*
- * PAL_PREFETCH_VISIBILITY transaction types
- */
-#define PAL_VISIBILITY_VIRTUAL         0
-#define PAL_VISIBILITY_PHYSICAL                1
-
-/*
- * PAL_PREFETCH_VISIBILITY return codes
- */
-#define PAL_VISIBILITY_OK              1
-#define PAL_VISIBILITY_OK_REMOTE_NEEDED        0
-#define PAL_VISIBILITY_INVAL_ARG       -2
-#define PAL_VISIBILITY_ERROR           -3
-
-static inline s64
-ia64_pal_prefetch_visibility (s64 trans_type)
-{
-       struct ia64_pal_retval iprv;
-       PAL_CALL(iprv, PAL_PREFETCH_VISIBILITY, trans_type, 0, 0);
-       return iprv.status;
-}
-
-/* data structure for getting information on logical to physical mappings */
-typedef union pal_log_overview_u {
-       struct {
-               u64     num_log         :16,    /* Total number of logical
-                                                * processors on this die
-                                                */
-                       tpc             :8,     /* Threads per core */
-                       reserved3       :8,     /* Reserved */
-                       cpp             :8,     /* Cores per processor */
-                       reserved2       :8,     /* Reserved */
-                       ppid            :8,     /* Physical processor ID */
-                       reserved1       :8;     /* Reserved */
-       } overview_bits;
-       u64 overview_data;
-} pal_log_overview_t;
-
-typedef union pal_proc_n_log_info1_u{
-       struct {
-               u64     tid             :16,    /* Thread id */
-                       reserved2       :16,    /* Reserved */
-                       cid             :16,    /* Core id */
-                       reserved1       :16;    /* Reserved */
-       } ppli1_bits;
-       u64     ppli1_data;
-} pal_proc_n_log_info1_t;
-
-typedef union pal_proc_n_log_info2_u {
-       struct {
-               u64     la              :16,    /* Logical address */
-                       reserved        :48;    /* Reserved */
-       } ppli2_bits;
-       u64     ppli2_data;
-} pal_proc_n_log_info2_t;
-
-typedef struct pal_logical_to_physical_s
-{
-       pal_log_overview_t overview;
-       pal_proc_n_log_info1_t ppli1;
-       pal_proc_n_log_info2_t ppli2;
-} pal_logical_to_physical_t;
-
-#define overview_num_log       overview.overview_bits.num_log
-#define overview_tpc           overview.overview_bits.tpc
-#define overview_cpp           overview.overview_bits.cpp
-#define overview_ppid          overview.overview_bits.ppid
-#define log1_tid               ppli1.ppli1_bits.tid
-#define log1_cid               ppli1.ppli1_bits.cid
-#define log2_la                        ppli2.ppli2_bits.la
-
-/* Get information on logical to physical processor mappings. */
-static inline s64
-ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping)
-{
-       struct ia64_pal_retval iprv;
-
-       PAL_CALL(iprv, PAL_LOGICAL_TO_PHYSICAL, proc_number, 0, 0);
-
-       if (iprv.status == PAL_STATUS_SUCCESS)
-       {
-               mapping->overview.overview_data = iprv.v0;
-               mapping->ppli1.ppli1_data = iprv.v1;
-               mapping->ppli2.ppli2_data = iprv.v2;
-       }
-
-       return iprv.status;
-}
-
-typedef struct pal_cache_shared_info_s
-{
-       u64 num_shared;
-       pal_proc_n_log_info1_t ppli1;
-       pal_proc_n_log_info2_t ppli2;
-} pal_cache_shared_info_t;
-
-/* Get information on logical to physical processor mappings. */
-static inline s64
-ia64_pal_cache_shared_info(u64 level,
-               u64 type,
-               u64 proc_number,
-               pal_cache_shared_info_t *info)
-{
-       struct ia64_pal_retval iprv;
-
-       PAL_CALL(iprv, PAL_CACHE_SHARED_INFO, level, type, proc_number);
-
-       if (iprv.status == PAL_STATUS_SUCCESS) {
-               info->num_shared = iprv.v0;
-               info->ppli1.ppli1_data = iprv.v1;
-               info->ppli2.ppli2_data = iprv.v2;
-       }
-
-       return iprv.status;
-}
-#endif /* __ASSEMBLY__ */
-
-#endif /* _ASM_IA64_PAL_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/pgalloc.h b/linux-2.6-xen-sparse/include/asm-ia64/pgalloc.h
deleted file mode 100644 (file)
index 5162603..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef _ASM_IA64_PGALLOC_H
-#define _ASM_IA64_PGALLOC_H
-
-/*
- * This file contains the functions and defines necessary to allocate
- * page tables.
- *
- * This hopefully works with any (fixed) ia-64 page-size, as defined
- * in <asm/page.h> (currently 8192).
- *
- * Copyright (C) 1998-2001 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 2000, Goutham Rao <goutham.rao@intel.com>
- */
-
-
-#include <linux/compiler.h>
-#include <linux/mm.h>
-#include <linux/page-flags.h>
-#include <linux/threads.h>
-
-#include <asm/mmu_context.h>
-
-DECLARE_PER_CPU(unsigned long *, __pgtable_quicklist);
-#define pgtable_quicklist __ia64_per_cpu_var(__pgtable_quicklist)
-DECLARE_PER_CPU(long, __pgtable_quicklist_size);
-#define pgtable_quicklist_size __ia64_per_cpu_var(__pgtable_quicklist_size)
-
-static inline long pgtable_quicklist_total_size(void)
-{
-       long ql_size = 0;
-       int cpuid;
-
-       for_each_online_cpu(cpuid) {
-               ql_size += per_cpu(__pgtable_quicklist_size, cpuid);
-       }
-       return ql_size;
-}
-
-static inline void *pgtable_quicklist_alloc(void)
-{
-       unsigned long *ret = NULL;
-
-       preempt_disable();
-
-       ret = pgtable_quicklist;
-       if (likely(ret != NULL)) {
-               pgtable_quicklist = (unsigned long *)(*ret);
-               ret[0] = 0;
-               --pgtable_quicklist_size;
-               preempt_enable();
-       } else {
-               preempt_enable();
-               ret = (unsigned long *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
-       }
-
-       return ret;
-}
-
-static inline void pgtable_quicklist_free(void *pgtable_entry)
-{
-#ifdef CONFIG_NUMA
-       unsigned long nid = page_to_nid(virt_to_page(pgtable_entry));
-
-       if (unlikely(nid != numa_node_id())) {
-               free_page((unsigned long)pgtable_entry);
-               return;
-       }
-#endif
-
-       preempt_disable();
-       *(unsigned long *)pgtable_entry = (unsigned long)pgtable_quicklist;
-       pgtable_quicklist = (unsigned long *)pgtable_entry;
-       ++pgtable_quicklist_size;
-       preempt_enable();
-}
-
-static inline pgd_t *pgd_alloc(struct mm_struct *mm)
-{
-       return pgtable_quicklist_alloc();
-}
-
-static inline void pgd_free(pgd_t * pgd)
-{
-       pgtable_quicklist_free(pgd);
-}
-
-#ifdef CONFIG_PGTABLE_4
-static inline void
-pgd_populate(struct mm_struct *mm, pgd_t * pgd_entry, pud_t * pud)
-{
-       pgd_val(*pgd_entry) = __pa(pud);
-}
-
-static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       return pgtable_quicklist_alloc();
-}
-
-static inline void pud_free(pud_t * pud)
-{
-       pgtable_quicklist_free(pud);
-}
-#define __pud_free_tlb(tlb, pud)       pud_free(pud)
-#endif /* CONFIG_PGTABLE_4 */
-
-static inline void
-pud_populate(struct mm_struct *mm, pud_t * pud_entry, pmd_t * pmd)
-{
-       pud_val(*pud_entry) = __pa(pmd);
-}
-
-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       return pgtable_quicklist_alloc();
-}
-
-static inline void pmd_free(pmd_t * pmd)
-{
-       pgtable_quicklist_free(pmd);
-}
-
-#define __pmd_free_tlb(tlb, pmd)       pmd_free(pmd)
-
-static inline void
-pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, struct page *pte)
-{
-#ifndef CONFIG_XEN
-       pmd_val(*pmd_entry) = page_to_phys(pte);
-#else
-       pmd_val(*pmd_entry) = page_to_pseudophys(pte);
-#endif
-}
-
-static inline void
-pmd_populate_kernel(struct mm_struct *mm, pmd_t * pmd_entry, pte_t * pte)
-{
-       pmd_val(*pmd_entry) = __pa(pte);
-}
-
-static inline struct page *pte_alloc_one(struct mm_struct *mm,
-                                        unsigned long addr)
-{
-       return virt_to_page(pgtable_quicklist_alloc());
-}
-
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
-                                         unsigned long addr)
-{
-       return pgtable_quicklist_alloc();
-}
-
-static inline void pte_free(struct page *pte)
-{
-       pgtable_quicklist_free(page_address(pte));
-}
-
-static inline void pte_free_kernel(pte_t * pte)
-{
-       pgtable_quicklist_free(pte);
-}
-
-#define __pte_free_tlb(tlb, pte)       pte_free(pte)
-
-extern void check_pgt_cache(void);
-
-#endif                         /* _ASM_IA64_PGALLOC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/privop.h b/linux-2.6-xen-sparse/include/asm-ia64/privop.h
deleted file mode 100644 (file)
index 0593540..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef _ASM_IA64_PRIVOP_H
-#define _ASM_IA64_PRIVOP_H
-
-/*
- * Copyright (C) 2005 Hewlett-Packard Co
- *     Dan Magenheimer <dan.magenheimer@hp.com>
- *
- */
-
-#ifdef CONFIG_XEN
-#include <asm/xen/privop.h>
-#endif
-
-#ifndef __ASSEMBLY
-
-#ifndef IA64_PARAVIRTUALIZED
-
-#define ia64_getreg                    __ia64_getreg
-#define ia64_setreg                    __ia64_setreg
-#define ia64_hint                      __ia64_hint
-#define ia64_thash                     __ia64_thash
-#define ia64_itci                      __ia64_itci
-#define ia64_itcd                      __ia64_itcd
-#define ia64_itri                      __ia64_itri
-#define ia64_itrd                      __ia64_itrd
-#define ia64_tpa                       __ia64_tpa
-#define ia64_set_ibr                   __ia64_set_ibr
-#define ia64_set_pkr                   __ia64_set_pkr
-#define ia64_set_pmc                   __ia64_set_pmc
-#define ia64_set_pmd                   __ia64_set_pmd
-#define ia64_set_rr                    __ia64_set_rr
-#define ia64_get_cpuid                 __ia64_get_cpuid
-#define ia64_get_ibr                   __ia64_get_ibr
-#define ia64_get_pkr                   __ia64_get_pkr
-#define ia64_get_pmc                   __ia64_get_pmc
-#define ia64_get_pmd                   __ia64_get_pmd
-#define ia64_get_rr                    __ia64_get_rr
-#define ia64_fc                                __ia64_fc
-#define ia64_ssm                       __ia64_ssm
-#define ia64_rsm                       __ia64_rsm
-#define ia64_ptce                      __ia64_ptce
-#define ia64_ptcga                     __ia64_ptcga
-#define ia64_ptcl                      __ia64_ptcl
-#define ia64_ptri                      __ia64_ptri
-#define ia64_ptrd                      __ia64_ptrd
-#define ia64_get_psr_i                 __ia64_get_psr_i
-#define ia64_intrin_local_irq_restore  __ia64_intrin_local_irq_restore
-#define ia64_pal_halt_light            __ia64_pal_halt_light
-#define ia64_leave_kernel              __ia64_leave_kernel
-#define ia64_leave_syscall             __ia64_leave_syscall
-#define ia64_trace_syscall             __ia64_trace_syscall
-#define ia64_ret_from_clone            __ia64_ret_from_clone
-#define ia64_switch_to                 __ia64_switch_to
-#define ia64_pal_call_static           __ia64_pal_call_static
-
-#endif /* !IA64_PARAVIRTUALIZED */
-
-#endif /* !__ASSEMBLY */
-
-#endif /* _ASM_IA64_PRIVOP_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/processor.h b/linux-2.6-xen-sparse/include/asm-ia64/processor.h
deleted file mode 100644 (file)
index 1837234..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-#ifndef _ASM_IA64_PROCESSOR_H
-#define _ASM_IA64_PROCESSOR_H
-
-/*
- * Copyright (C) 1998-2004 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- *     Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
- * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
- *
- * 11/24/98    S.Eranian       added ia64_set_iva()
- * 12/03/99    D. Mosberger    implement thread_saved_pc() via kernel unwind API
- * 06/16/00    A. Mallick      added csd/ssd/tssd for ia32 support
- */
-
-
-#include <asm/intrinsics.h>
-#include <asm/kregs.h>
-#include <asm/ptrace.h>
-#include <asm/ustack.h>
-#include <asm/privop.h>
-
-#define IA64_NUM_DBG_REGS      8
-/*
- * Limits for PMC and PMD are set to less than maximum architected values
- * but should be sufficient for a while
- */
-#define IA64_NUM_PMC_REGS      64
-#define IA64_NUM_PMD_REGS      64
-
-#define DEFAULT_MAP_BASE       __IA64_UL_CONST(0x2000000000000000)
-#define DEFAULT_TASK_SIZE      __IA64_UL_CONST(0xa000000000000000)
-
-/*
- * TASK_SIZE really is a mis-named.  It really is the maximum user
- * space address (plus one).  On IA-64, there are five regions of 2TB
- * each (assuming 8KB page size), for a total of 8TB of user virtual
- * address space.
- */
-#define TASK_SIZE              (current->thread.task_size)
-
-/*
- * This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE     (current->thread.map_base)
-
-#define IA64_THREAD_FPH_VALID  (__IA64_UL(1) << 0)     /* floating-point high state valid? */
-#define IA64_THREAD_DBG_VALID  (__IA64_UL(1) << 1)     /* debug registers valid? */
-#define IA64_THREAD_PM_VALID   (__IA64_UL(1) << 2)     /* performance registers valid? */
-#define IA64_THREAD_UAC_NOPRINT        (__IA64_UL(1) << 3)     /* don't log unaligned accesses */
-#define IA64_THREAD_UAC_SIGBUS (__IA64_UL(1) << 4)     /* generate SIGBUS on unaligned acc. */
-#define IA64_THREAD_MIGRATION  (__IA64_UL(1) << 5)     /* require migration
-                                                          sync at ctx sw */
-#define IA64_THREAD_FPEMU_NOPRINT (__IA64_UL(1) << 6)  /* don't log any fpswa faults */
-#define IA64_THREAD_FPEMU_SIGFPE  (__IA64_UL(1) << 7)  /* send a SIGFPE for fpswa faults */
-
-#define IA64_THREAD_UAC_SHIFT  3
-#define IA64_THREAD_UAC_MASK   (IA64_THREAD_UAC_NOPRINT | IA64_THREAD_UAC_SIGBUS)
-#define IA64_THREAD_FPEMU_SHIFT        6
-#define IA64_THREAD_FPEMU_MASK (IA64_THREAD_FPEMU_NOPRINT | IA64_THREAD_FPEMU_SIGFPE)
-
-
-/*
- * This shift should be large enough to be able to represent 1000000000/itc_freq with good
- * accuracy while being small enough to fit 10*1000000000<<IA64_NSEC_PER_CYC_SHIFT in 64 bits
- * (this will give enough slack to represent 10 seconds worth of time as a scaled number).
- */
-#define IA64_NSEC_PER_CYC_SHIFT        30
-
-#ifndef __ASSEMBLY__
-
-#include <linux/cache.h>
-#include <linux/compiler.h>
-#include <linux/threads.h>
-#include <linux/types.h>
-
-#include <asm/fpu.h>
-#include <asm/page.h>
-#include <asm/percpu.h>
-#include <asm/rse.h>
-#include <asm/unwind.h>
-#include <asm/atomic.h>
-#ifdef CONFIG_NUMA
-#include <asm/nodedata.h>
-#endif
-
-/* like above but expressed as bitfields for more efficient access: */
-struct ia64_psr {
-       __u64 reserved0 : 1;
-       __u64 be : 1;
-       __u64 up : 1;
-       __u64 ac : 1;
-       __u64 mfl : 1;
-       __u64 mfh : 1;
-       __u64 reserved1 : 7;
-       __u64 ic : 1;
-       __u64 i : 1;
-       __u64 pk : 1;
-       __u64 reserved2 : 1;
-       __u64 dt : 1;
-       __u64 dfl : 1;
-       __u64 dfh : 1;
-       __u64 sp : 1;
-       __u64 pp : 1;
-       __u64 di : 1;
-       __u64 si : 1;
-       __u64 db : 1;
-       __u64 lp : 1;
-       __u64 tb : 1;
-       __u64 rt : 1;
-       __u64 reserved3 : 4;
-       __u64 cpl : 2;
-       __u64 is : 1;
-       __u64 mc : 1;
-       __u64 it : 1;
-       __u64 id : 1;
-       __u64 da : 1;
-       __u64 dd : 1;
-       __u64 ss : 1;
-       __u64 ri : 2;
-       __u64 ed : 1;
-       __u64 bn : 1;
-       __u64 reserved4 : 19;
-};
-
-/*
- * CPU type, hardware bug flags, and per-CPU state.  Frequently used
- * state comes earlier:
- */
-struct cpuinfo_ia64 {
-       __u32 softirq_pending;
-       __u64 itm_delta;        /* # of clock cycles between clock ticks */
-       __u64 itm_next;         /* interval timer mask value to use for next clock tick */
-       __u64 nsec_per_cyc;     /* (1000000000<<IA64_NSEC_PER_CYC_SHIFT)/itc_freq */
-       __u64 unimpl_va_mask;   /* mask of unimplemented virtual address bits (from PAL) */
-       __u64 unimpl_pa_mask;   /* mask of unimplemented physical address bits (from PAL) */
-       __u64 itc_freq;         /* frequency of ITC counter */
-       __u64 proc_freq;        /* frequency of processor */
-       __u64 cyc_per_usec;     /* itc_freq/1000000 */
-       __u64 ptce_base;
-       __u32 ptce_count[2];
-       __u32 ptce_stride[2];
-       struct task_struct *ksoftirqd;  /* kernel softirq daemon for this CPU */
-
-#ifdef CONFIG_SMP
-       __u64 loops_per_jiffy;
-       int cpu;
-       __u32 socket_id;        /* physical processor socket id */
-       __u16 core_id;          /* core id */
-       __u16 thread_id;        /* thread id */
-       __u16 num_log;          /* Total number of logical processors on
-                                * this socket that were successfully booted */
-       __u8  cores_per_socket; /* Cores per processor socket */
-       __u8  threads_per_core; /* Threads per core */
-#endif
-
-       /* CPUID-derived information: */
-       __u64 ppn;
-       __u64 features;
-       __u8 number;
-       __u8 revision;
-       __u8 model;
-       __u8 family;
-       __u8 archrev;
-       char vendor[16];
-
-#ifdef CONFIG_NUMA
-       struct ia64_node_data *node_data;
-#endif
-};
-
-DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info);
-
-/*
- * The "local" data variable.  It refers to the per-CPU data of the currently executing
- * CPU, much like "current" points to the per-task data of the currently executing task.
- * Do not use the address of local_cpu_data, since it will be different from
- * cpu_data(smp_processor_id())!
- */
-#define local_cpu_data         (&__ia64_per_cpu_var(cpu_info))
-#define cpu_data(cpu)          (&per_cpu(cpu_info, cpu))
-
-extern void print_cpu_info (struct cpuinfo_ia64 *);
-
-typedef struct {
-       unsigned long seg;
-} mm_segment_t;
-
-#define SET_UNALIGN_CTL(task,value)                                                            \
-({                                                                                             \
-       (task)->thread.flags = (((task)->thread.flags & ~IA64_THREAD_UAC_MASK)                  \
-                               | (((value) << IA64_THREAD_UAC_SHIFT) & IA64_THREAD_UAC_MASK)); \
-       0;                                                                                      \
-})
-#define GET_UNALIGN_CTL(task,addr)                                                             \
-({                                                                                             \
-       put_user(((task)->thread.flags & IA64_THREAD_UAC_MASK) >> IA64_THREAD_UAC_SHIFT,        \
-                (int __user *) (addr));                                                        \
-})
-
-#define SET_FPEMU_CTL(task,value)                                                              \
-({                                                                                             \
-       (task)->thread.flags = (((task)->thread.flags & ~IA64_THREAD_FPEMU_MASK)                \
-                         | (((value) << IA64_THREAD_FPEMU_SHIFT) & IA64_THREAD_FPEMU_MASK));   \
-       0;                                                                                      \
-})
-#define GET_FPEMU_CTL(task,addr)                                                               \
-({                                                                                             \
-       put_user(((task)->thread.flags & IA64_THREAD_FPEMU_MASK) >> IA64_THREAD_FPEMU_SHIFT,    \
-                (int __user *) (addr));                                                        \
-})
-
-#ifdef CONFIG_IA32_SUPPORT
-struct desc_struct {
-       unsigned int a, b;
-};
-
-#define desc_empty(desc)               (!((desc)->a + (desc)->b))
-#define desc_equal(desc1, desc2)       (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
-
-#define GDT_ENTRY_TLS_ENTRIES  3
-#define GDT_ENTRY_TLS_MIN      6
-#define GDT_ENTRY_TLS_MAX      (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
-
-#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
-
-struct partial_page_list;
-#endif
-
-struct thread_struct {
-       __u32 flags;                    /* various thread flags (see IA64_THREAD_*) */
-       /* writing on_ustack is performance-critical, so it's worth spending 8 bits on it... */
-       __u8 on_ustack;                 /* executing on user-stacks? */
-       __u8 pad[3];
-       __u64 ksp;                      /* kernel stack pointer */
-       __u64 map_base;                 /* base address for get_unmapped_area() */
-       __u64 task_size;                /* limit for task size */
-       __u64 rbs_bot;                  /* the base address for the RBS */
-       int last_fph_cpu;               /* CPU that may hold the contents of f32-f127 */
-
-#ifdef CONFIG_IA32_SUPPORT
-       __u64 eflag;                    /* IA32 EFLAGS reg */
-       __u64 fsr;                      /* IA32 floating pt status reg */
-       __u64 fcr;                      /* IA32 floating pt control reg */
-       __u64 fir;                      /* IA32 fp except. instr. reg */
-       __u64 fdr;                      /* IA32 fp except. data reg */
-       __u64 old_k1;                   /* old value of ar.k1 */
-       __u64 old_iob;                  /* old IOBase value */
-       struct partial_page_list *ppl;  /* partial page list for 4K page size issue */
-        /* cached TLS descriptors. */
-       struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
-
-# define INIT_THREAD_IA32      .eflag =        0,                      \
-                               .fsr =          0,                      \
-                               .fcr =          0x17800000037fULL,      \
-                               .fir =          0,                      \
-                               .fdr =          0,                      \
-                               .old_k1 =       0,                      \
-                               .old_iob =      0,                      \
-                               .ppl =          NULL,
-#else
-# define INIT_THREAD_IA32
-#endif /* CONFIG_IA32_SUPPORT */
-#ifdef CONFIG_PERFMON
-       __u64 pmcs[IA64_NUM_PMC_REGS];
-       __u64 pmds[IA64_NUM_PMD_REGS];
-       void *pfm_context;                   /* pointer to detailed PMU context */
-       unsigned long pfm_needs_checking;    /* when >0, pending perfmon work on kernel exit */
-# define INIT_THREAD_PM                .pmcs =                 {0UL, },  \
-                               .pmds =                 {0UL, },  \
-                               .pfm_context =          NULL,     \
-                               .pfm_needs_checking =   0UL,
-#else
-# define INIT_THREAD_PM
-#endif
-       __u64 dbr[IA64_NUM_DBG_REGS];
-       __u64 ibr[IA64_NUM_DBG_REGS];
-       struct ia64_fpreg fph[96];      /* saved/loaded on demand */
-};
-
-#define INIT_THREAD {                                          \
-       .flags =        0,                                      \
-       .on_ustack =    0,                                      \
-       .ksp =          0,                                      \
-       .map_base =     DEFAULT_MAP_BASE,                       \
-       .rbs_bot =      STACK_TOP - DEFAULT_USER_STACK_SIZE,    \
-       .task_size =    DEFAULT_TASK_SIZE,                      \
-       .last_fph_cpu =  -1,                                    \
-       INIT_THREAD_IA32                                        \
-       INIT_THREAD_PM                                          \
-       .dbr =          {0, },                                  \
-       .ibr =          {0, },                                  \
-       .fph =          {{{{0}}}, }                             \
-}
-
-#define start_thread(regs,new_ip,new_sp) do {                                                  \
-       set_fs(USER_DS);                                                                        \
-       regs->cr_ipsr = ((regs->cr_ipsr | (IA64_PSR_BITS_TO_SET | IA64_PSR_CPL))                \
-                        & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_RI | IA64_PSR_IS));              \
-       regs->cr_iip = new_ip;                                                                  \
-       regs->ar_rsc = 0xf;             /* eager mode, privilege level 3 */                     \
-       regs->ar_rnat = 0;                                                                      \
-       regs->ar_bspstore = current->thread.rbs_bot;                                            \
-       regs->ar_fpsr = FPSR_DEFAULT;                                                           \
-       regs->loadrs = 0;                                                                       \
-       regs->r8 = current->mm->dumpable;       /* set "don't zap registers" flag */            \
-       regs->r12 = new_sp - 16;        /* allocate 16 byte scratch area */                     \
-       if (unlikely(!current->mm->dumpable)) {                                                 \
-               /*                                                                              \
-                * Zap scratch regs to avoid leaking bits between processes with different      \
-                * uid/privileges.                                                              \
-                */                                                                             \
-               regs->ar_pfs = 0; regs->b0 = 0; regs->pr = 0;                                   \
-               regs->r1 = 0; regs->r9  = 0; regs->r11 = 0; regs->r13 = 0; regs->r15 = 0;       \
-       }                                                                                       \
-} while (0)
-
-/* Forward declarations, a strange C thing... */
-struct mm_struct;
-struct task_struct;
-
-/*
- * Free all resources held by a thread. This is called after the
- * parent of DEAD_TASK has collected the exit status of the task via
- * wait().
- */
-#define release_thread(dead_task)
-
-/* Prepare to copy thread state - unlazy all lazy status */
-#define prepare_to_copy(tsk)   do { } while (0)
-
-/*
- * This is the mechanism for creating a new kernel thread.
- *
- * NOTE 1: Only a kernel-only process (ie the swapper or direct
- * descendants who haven't done an "execve()") should use this: it
- * will work within a system call from a "real" process, but the
- * process memory space will not be free'd until both the parent and
- * the child have exited.
- *
- * NOTE 2: This MUST NOT be an inlined function.  Otherwise, we get
- * into trouble in init/main.c when the child thread returns to
- * do_basic_setup() and the timing is such that free_initmem() has
- * been called already.
- */
-extern pid_t kernel_thread (int (*fn)(void *), void *arg, unsigned long flags);
-
-/* Get wait channel for task P.  */
-extern unsigned long get_wchan (struct task_struct *p);
-
-/* Return instruction pointer of blocked task TSK.  */
-#define KSTK_EIP(tsk)                                  \
-  ({                                                   \
-       struct pt_regs *_regs = task_pt_regs(tsk);      \
-       _regs->cr_iip + ia64_psr(_regs)->ri;            \
-  })
-
-/* Return stack pointer of blocked task TSK.  */
-#define KSTK_ESP(tsk)  ((tsk)->thread.ksp)
-
-extern void ia64_getreg_unknown_kr (void);
-extern void ia64_setreg_unknown_kr (void);
-
-#define ia64_get_kr(regnum)                                    \
-({                                                             \
-       unsigned long r = 0;                                    \
-                                                               \
-       switch (regnum) {                                       \
-           case 0: r = ia64_getreg(_IA64_REG_AR_KR0); break;   \
-           case 1: r = ia64_getreg(_IA64_REG_AR_KR1); break;   \
-           case 2: r = ia64_getreg(_IA64_REG_AR_KR2); break;   \
-           case 3: r = ia64_getreg(_IA64_REG_AR_KR3); break;   \
-           case 4: r = ia64_getreg(_IA64_REG_AR_KR4); break;   \
-           case 5: r = ia64_getreg(_IA64_REG_AR_KR5); break;   \
-           case 6: r = ia64_getreg(_IA64_REG_AR_KR6); break;   \
-           case 7: r = ia64_getreg(_IA64_REG_AR_KR7); break;   \
-           default: ia64_getreg_unknown_kr(); break;           \
-       }                                                       \
-       r;                                                      \
-})
-
-#define ia64_set_kr(regnum, r)                                         \
-({                                                             \
-       switch (regnum) {                                       \
-           case 0: ia64_setreg(_IA64_REG_AR_KR0, r); break;    \
-           case 1: ia64_setreg(_IA64_REG_AR_KR1, r); break;    \
-           case 2: ia64_setreg(_IA64_REG_AR_KR2, r); break;    \
-           case 3: ia64_setreg(_IA64_REG_AR_KR3, r); break;    \
-           case 4: ia64_setreg(_IA64_REG_AR_KR4, r); break;    \
-           case 5: ia64_setreg(_IA64_REG_AR_KR5, r); break;    \
-           case 6: ia64_setreg(_IA64_REG_AR_KR6, r); break;    \
-           case 7: ia64_setreg(_IA64_REG_AR_KR7, r); break;    \
-           default: ia64_setreg_unknown_kr(); break;           \
-       }                                                       \
-})
-
-/*
- * The following three macros can't be inline functions because we don't have struct
- * task_struct at this point.
- */
-
-/*
- * Return TRUE if task T owns the fph partition of the CPU we're running on.
- * Must be called from code that has preemption disabled.
- */
-#define ia64_is_local_fpu_owner(t)                                                             \
-({                                                                                             \
-       struct task_struct *__ia64_islfo_task = (t);                                            \
-       (__ia64_islfo_task->thread.last_fph_cpu == smp_processor_id()                           \
-        && __ia64_islfo_task == (struct task_struct *) ia64_get_kr(IA64_KR_FPU_OWNER));        \
-})
-
-/*
- * Mark task T as owning the fph partition of the CPU we're running on.
- * Must be called from code that has preemption disabled.
- */
-#define ia64_set_local_fpu_owner(t) do {                                               \
-       struct task_struct *__ia64_slfo_task = (t);                                     \
-       __ia64_slfo_task->thread.last_fph_cpu = smp_processor_id();                     \
-       ia64_set_kr(IA64_KR_FPU_OWNER, (unsigned long) __ia64_slfo_task);               \
-} while (0)
-
-/* Mark the fph partition of task T as being invalid on all CPUs.  */
-#define ia64_drop_fpu(t)       ((t)->thread.last_fph_cpu = -1)
-
-extern void __ia64_init_fpu (void);
-extern void __ia64_save_fpu (struct ia64_fpreg *fph);
-extern void __ia64_load_fpu (struct ia64_fpreg *fph);
-extern void ia64_save_debug_regs (unsigned long *save_area);
-extern void ia64_load_debug_regs (unsigned long *save_area);
-
-#ifdef CONFIG_IA32_SUPPORT
-extern void ia32_save_state (struct task_struct *task);
-extern void ia32_load_state (struct task_struct *task);
-#endif
-
-#define ia64_fph_enable()      do { ia64_rsm(IA64_PSR_DFH); ia64_srlz_d(); } while (0)
-#define ia64_fph_disable()     do { ia64_ssm(IA64_PSR_DFH); ia64_srlz_d(); } while (0)
-
-/* load fp 0.0 into fph */
-static inline void
-ia64_init_fpu (void) {
-       ia64_fph_enable();
-       __ia64_init_fpu();
-       ia64_fph_disable();
-}
-
-/* save f32-f127 at FPH */
-static inline void
-ia64_save_fpu (struct ia64_fpreg *fph) {
-       ia64_fph_enable();
-       __ia64_save_fpu(fph);
-       ia64_fph_disable();
-}
-
-/* load f32-f127 from FPH */
-static inline void
-ia64_load_fpu (struct ia64_fpreg *fph) {
-       ia64_fph_enable();
-       __ia64_load_fpu(fph);
-       ia64_fph_disable();
-}
-
-static inline __u64
-ia64_clear_ic (void)
-{
-       __u64 psr;
-       psr = ia64_getreg(_IA64_REG_PSR);
-       ia64_stop();
-       ia64_rsm(IA64_PSR_I | IA64_PSR_IC);
-       ia64_srlz_i();
-       return psr;
-}
-
-/*
- * Restore the psr.
- */
-static inline void
-ia64_set_psr (__u64 psr)
-{
-       ia64_stop();
-       ia64_setreg(_IA64_REG_PSR_L, psr);
-       ia64_srlz_d();
-}
-
-/*
- * Insert a translation into an instruction and/or data translation
- * register.
- */
-static inline void
-ia64_itr (__u64 target_mask, __u64 tr_num,
-         __u64 vmaddr, __u64 pte,
-         __u64 log_page_size)
-{
-       ia64_setreg(_IA64_REG_CR_ITIR, (log_page_size << 2));
-       ia64_setreg(_IA64_REG_CR_IFA, vmaddr);
-       ia64_stop();
-       if (target_mask & 0x1)
-               ia64_itri(tr_num, pte);
-       if (target_mask & 0x2)
-               ia64_itrd(tr_num, pte);
-}
-
-/*
- * Insert a translation into the instruction and/or data translation
- * cache.
- */
-static inline void
-ia64_itc (__u64 target_mask, __u64 vmaddr, __u64 pte,
-         __u64 log_page_size)
-{
-       ia64_setreg(_IA64_REG_CR_ITIR, (log_page_size << 2));
-       ia64_setreg(_IA64_REG_CR_IFA, vmaddr);
-       ia64_stop();
-       /* as per EAS2.6, itc must be the last instruction in an instruction group */
-       if (target_mask & 0x1)
-               ia64_itci(pte);
-       if (target_mask & 0x2)
-               ia64_itcd(pte);
-}
-
-/*
- * Purge a range of addresses from instruction and/or data translation
- * register(s).
- */
-static inline void
-ia64_ptr (__u64 target_mask, __u64 vmaddr, __u64 log_size)
-{
-       if (target_mask & 0x1)
-               ia64_ptri(vmaddr, (log_size << 2));
-       if (target_mask & 0x2)
-               ia64_ptrd(vmaddr, (log_size << 2));
-}
-
-/* Set the interrupt vector address.  The address must be suitably aligned (32KB).  */
-static inline void
-ia64_set_iva (void *ivt_addr)
-{
-       ia64_setreg(_IA64_REG_CR_IVA, (__u64) ivt_addr);
-       ia64_srlz_i();
-}
-
-/* Set the page table address and control bits.  */
-static inline void
-ia64_set_pta (__u64 pta)
-{
-       /* Note: srlz.i implies srlz.d */
-       ia64_setreg(_IA64_REG_CR_PTA, pta);
-       ia64_srlz_i();
-}
-
-static inline void
-ia64_eoi (void)
-{
-       ia64_setreg(_IA64_REG_CR_EOI, 0);
-       ia64_srlz_d();
-}
-
-#define cpu_relax()    ia64_hint(ia64_hint_pause)
-
-static inline int
-ia64_get_irr(unsigned int vector)
-{
-       unsigned int reg = vector / 64;
-       unsigned int bit = vector % 64;
-       u64 irr;
-
-       switch (reg) {
-       case 0: irr = ia64_getreg(_IA64_REG_CR_IRR0); break;
-       case 1: irr = ia64_getreg(_IA64_REG_CR_IRR1); break;
-       case 2: irr = ia64_getreg(_IA64_REG_CR_IRR2); break;
-       case 3: irr = ia64_getreg(_IA64_REG_CR_IRR3); break;
-       }
-
-       return test_bit(bit, &irr);
-}
-
-static inline void
-ia64_set_lrr0 (unsigned long val)
-{
-       ia64_setreg(_IA64_REG_CR_LRR0, val);
-       ia64_srlz_d();
-}
-
-static inline void
-ia64_set_lrr1 (unsigned long val)
-{
-       ia64_setreg(_IA64_REG_CR_LRR1, val);
-       ia64_srlz_d();
-}
-
-
-/*
- * Given the address to which a spill occurred, return the unat bit
- * number that corresponds to this address.
- */
-static inline __u64
-ia64_unat_pos (void *spill_addr)
-{
-       return ((__u64) spill_addr >> 3) & 0x3f;
-}
-
-/*
- * Set the NaT bit of an integer register which was spilled at address
- * SPILL_ADDR.  UNAT is the mask to be updated.
- */
-static inline void
-ia64_set_unat (__u64 *unat, void *spill_addr, unsigned long nat)
-{
-       __u64 bit = ia64_unat_pos(spill_addr);
-       __u64 mask = 1UL << bit;
-
-       *unat = (*unat & ~mask) | (nat << bit);
-}
-
-/*
- * Return saved PC of a blocked thread.
- * Note that the only way T can block is through a call to schedule() -> switch_to().
- */
-static inline unsigned long
-thread_saved_pc (struct task_struct *t)
-{
-       struct unw_frame_info info;
-       unsigned long ip;
-
-       unw_init_from_blocked_task(&info, t);
-       if (unw_unwind(&info) < 0)
-               return 0;
-       unw_get_ip(&info, &ip);
-       return ip;
-}
-
-/*
- * Get the current instruction/program counter value.
- */
-#define current_text_addr() \
-       ({ void *_pc; _pc = (void *)ia64_getreg(_IA64_REG_IP); _pc; })
-
-static inline __u64
-ia64_get_ivr (void)
-{
-       __u64 r;
-       ia64_srlz_d();
-       r = ia64_getreg(_IA64_REG_CR_IVR);
-       ia64_srlz_d();
-       return r;
-}
-
-static inline void
-ia64_set_dbr (__u64 regnum, __u64 value)
-{
-       __ia64_set_dbr(regnum, value);
-#ifdef CONFIG_ITANIUM
-       ia64_srlz_d();
-#endif
-}
-
-static inline __u64
-ia64_get_dbr (__u64 regnum)
-{
-       __u64 retval;
-
-       retval = __ia64_get_dbr(regnum);
-#ifdef CONFIG_ITANIUM
-       ia64_srlz_d();
-#endif
-       return retval;
-}
-
-static inline __u64
-ia64_rotr (__u64 w, __u64 n)
-{
-       return (w >> n) | (w << (64 - n));
-}
-
-#define ia64_rotl(w,n) ia64_rotr((w), (64) - (n))
-
-/*
- * Take a mapped kernel address and return the equivalent address
- * in the region 7 identity mapped virtual area.
- */
-static inline void *
-ia64_imva (void *addr)
-{
-       void *result;
-       result = (void *) ia64_tpa(addr);
-       return __va(result);
-}
-
-#define ARCH_HAS_PREFETCH
-#define ARCH_HAS_PREFETCHW
-#define ARCH_HAS_SPINLOCK_PREFETCH
-#define PREFETCH_STRIDE                        L1_CACHE_BYTES
-
-static inline void
-prefetch (const void *x)
-{
-        ia64_lfetch(ia64_lfhint_none, x);
-}
-
-static inline void
-prefetchw (const void *x)
-{
-       ia64_lfetch_excl(ia64_lfhint_none, x);
-}
-
-#define spin_lock_prefetch(x)  prefetchw(x)
-
-extern unsigned long boot_option_idle_override;
-
-#endif /* !__ASSEMBLY__ */
-
-#endif /* _ASM_IA64_PROCESSOR_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/sal.h b/linux-2.6-xen-sparse/include/asm-ia64/sal.h
deleted file mode 100644 (file)
index 9439b49..0000000
+++ /dev/null
@@ -1,904 +0,0 @@
-#ifndef _ASM_IA64_SAL_H
-#define _ASM_IA64_SAL_H
-
-/*
- * System Abstraction Layer definitions.
- *
- * This is based on version 2.5 of the manual "IA-64 System
- * Abstraction Layer".
- *
- * Copyright (C) 2001 Intel
- * Copyright (C) 2002 Jenna Hall <jenna.s.hall@intel.com>
- * Copyright (C) 2001 Fred Lewis <frederick.v.lewis@intel.com>
- * Copyright (C) 1998, 1999, 2001, 2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 Srinivasa Prasad Thirumalachar <sprasad@sprasad.engr.sgi.com>
- *
- * 02/01/04 J. Hall Updated Error Record Structures to conform to July 2001
- *                 revision of the SAL spec.
- * 01/01/03 fvlewis Updated Error Record Structures to conform with Nov. 2000
- *                  revision of the SAL spec.
- * 99/09/29 davidm     Updated for SAL 2.6.
- * 00/03/29 cfleck      Updated SAL Error Logging info for processor (SAL 2.6)
- *                      (plus examples of platform error info structures from smariset @ Intel)
- */
-
-#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT         0
-#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT   1
-#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT   2
-#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT                3
-
-#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK       (1<<IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT)
-#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT)
-#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT)
-#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT      (1<<IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT)
-
-#ifndef __ASSEMBLY__
-
-#include <linux/bcd.h>
-#include <linux/spinlock.h>
-#include <linux/efi.h>
-
-#include <asm/pal.h>
-#include <asm/system.h>
-#include <asm/fpu.h>
-#ifdef CONFIG_XEN
-#include <asm/xen/xencomm.h>
-#endif
-
-extern spinlock_t sal_lock;
-
-/* SAL spec _requires_ eight args for each call. */
-#define __SAL_CALL(result,a0,a1,a2,a3,a4,a5,a6,a7)     \
-       result = (*ia64_sal)(a0,a1,a2,a3,a4,a5,a6,a7)
-
-# define SAL_CALL(result,args...) do {                         \
-       unsigned long __ia64_sc_flags;                          \
-       struct ia64_fpreg __ia64_sc_fr[6];                      \
-       ia64_save_scratch_fpregs(__ia64_sc_fr);                 \
-       spin_lock_irqsave(&sal_lock, __ia64_sc_flags);          \
-       __SAL_CALL(result, args);                               \
-       spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags);     \
-       ia64_load_scratch_fpregs(__ia64_sc_fr);                 \
-} while (0)
-
-# define SAL_CALL_NOLOCK(result,args...) do {          \
-       unsigned long __ia64_scn_flags;                 \
-       struct ia64_fpreg __ia64_scn_fr[6];             \
-       ia64_save_scratch_fpregs(__ia64_scn_fr);        \
-       local_irq_save(__ia64_scn_flags);               \
-       __SAL_CALL(result, args);                       \
-       local_irq_restore(__ia64_scn_flags);            \
-       ia64_load_scratch_fpregs(__ia64_scn_fr);        \
-} while (0)
-
-# define SAL_CALL_REENTRANT(result,args...) do {       \
-       struct ia64_fpreg __ia64_scs_fr[6];             \
-       ia64_save_scratch_fpregs(__ia64_scs_fr);        \
-       preempt_disable();                              \
-       __SAL_CALL(result, args);                       \
-       preempt_enable();                               \
-       ia64_load_scratch_fpregs(__ia64_scs_fr);        \
-} while (0)
-
-#define SAL_SET_VECTORS                        0x01000000
-#define SAL_GET_STATE_INFO             0x01000001
-#define SAL_GET_STATE_INFO_SIZE                0x01000002
-#define SAL_CLEAR_STATE_INFO           0x01000003
-#define SAL_MC_RENDEZ                  0x01000004
-#define SAL_MC_SET_PARAMS              0x01000005
-#define SAL_REGISTER_PHYSICAL_ADDR     0x01000006
-
-#define SAL_CACHE_FLUSH                        0x01000008
-#define SAL_CACHE_INIT                 0x01000009
-#define SAL_PCI_CONFIG_READ            0x01000010
-#define SAL_PCI_CONFIG_WRITE           0x01000011
-#define SAL_FREQ_BASE                  0x01000012
-#define SAL_PHYSICAL_ID_INFO           0x01000013
-
-#define SAL_UPDATE_PAL                 0x01000020
-
-struct ia64_sal_retval {
-       /*
-        * A zero status value indicates call completed without error.
-        * A negative status value indicates reason of call failure.
-        * A positive status value indicates success but an
-        * informational value should be printed (e.g., "reboot for
-        * change to take effect").
-        */
-       s64 status;
-       u64 v0;
-       u64 v1;
-       u64 v2;
-};
-
-typedef struct ia64_sal_retval (*ia64_sal_handler) (u64, ...);
-
-enum {
-       SAL_FREQ_BASE_PLATFORM = 0,
-       SAL_FREQ_BASE_INTERVAL_TIMER = 1,
-       SAL_FREQ_BASE_REALTIME_CLOCK = 2
-};
-
-/*
- * The SAL system table is followed by a variable number of variable
- * length descriptors.  The structure of these descriptors follows
- * below.
- * The defininition follows SAL specs from July 2000
- */
-struct ia64_sal_systab {
-       u8 signature[4];        /* should be "SST_" */
-       u32 size;               /* size of this table in bytes */
-       u8 sal_rev_minor;
-       u8 sal_rev_major;
-       u16 entry_count;        /* # of entries in variable portion */
-       u8 checksum;
-       u8 reserved1[7];
-       u8 sal_a_rev_minor;
-       u8 sal_a_rev_major;
-       u8 sal_b_rev_minor;
-       u8 sal_b_rev_major;
-       /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */
-       u8 oem_id[32];
-       u8 product_id[32];      /* ASCII product id  */
-       u8 reserved2[8];
-};
-
-enum sal_systab_entry_type {
-       SAL_DESC_ENTRY_POINT = 0,
-       SAL_DESC_MEMORY = 1,
-       SAL_DESC_PLATFORM_FEATURE = 2,
-       SAL_DESC_TR = 3,
-       SAL_DESC_PTC = 4,
-       SAL_DESC_AP_WAKEUP = 5
-};
-
-/*
- * Entry type: Size:
- *     0       48
- *     1       32
- *     2       16
- *     3       32
- *     4       16
- *     5       16
- */
-#define SAL_DESC_SIZE(type)    "\060\040\020\040\020\020"[(unsigned) type]
-
-typedef struct ia64_sal_desc_entry_point {
-       u8 type;
-       u8 reserved1[7];
-       u64 pal_proc;
-       u64 sal_proc;
-       u64 gp;
-       u8 reserved2[16];
-}ia64_sal_desc_entry_point_t;
-
-typedef struct ia64_sal_desc_memory {
-       u8 type;
-       u8 used_by_sal; /* needs to be mapped for SAL? */
-       u8 mem_attr;            /* current memory attribute setting */
-       u8 access_rights;       /* access rights set up by SAL */
-       u8 mem_attr_mask;       /* mask of supported memory attributes */
-       u8 reserved1;
-       u8 mem_type;            /* memory type */
-       u8 mem_usage;           /* memory usage */
-       u64 addr;               /* physical address of memory */
-       u32 length;     /* length (multiple of 4KB pages) */
-       u32 reserved2;
-       u8 oem_reserved[8];
-} ia64_sal_desc_memory_t;
-
-typedef struct ia64_sal_desc_platform_feature {
-       u8 type;
-       u8 feature_mask;
-       u8 reserved1[14];
-} ia64_sal_desc_platform_feature_t;
-
-typedef struct ia64_sal_desc_tr {
-       u8 type;
-       u8 tr_type;             /* 0 == instruction, 1 == data */
-       u8 regnum;              /* translation register number */
-       u8 reserved1[5];
-       u64 addr;               /* virtual address of area covered */
-       u64 page_size;          /* encoded page size */
-       u8 reserved2[8];
-} ia64_sal_desc_tr_t;
-
-typedef struct ia64_sal_desc_ptc {
-       u8 type;
-       u8 reserved1[3];
-       u32 num_domains;        /* # of coherence domains */
-       u64 domain_info;        /* physical address of domain info table */
-} ia64_sal_desc_ptc_t;
-
-typedef struct ia64_sal_ptc_domain_info {
-       u64 proc_count;         /* number of processors in domain */
-       u64 proc_list;          /* physical address of LID array */
-} ia64_sal_ptc_domain_info_t;
-
-typedef struct ia64_sal_ptc_domain_proc_entry {
-       u64 id  : 8;            /* id of processor */
-       u64 eid : 8;            /* eid of processor */
-} ia64_sal_ptc_domain_proc_entry_t;
-
-
-#define IA64_SAL_AP_EXTERNAL_INT 0
-
-typedef struct ia64_sal_desc_ap_wakeup {
-       u8 type;
-       u8 mechanism;           /* 0 == external interrupt */
-       u8 reserved1[6];
-       u64 vector;             /* interrupt vector in range 0x10-0xff */
-} ia64_sal_desc_ap_wakeup_t ;
-
-extern ia64_sal_handler ia64_sal;
-extern struct ia64_sal_desc_ptc *ia64_ptc_domain_info;
-
-extern unsigned short sal_revision;    /* supported SAL spec revision */
-extern unsigned short sal_version;     /* SAL version; OEM dependent */
-#define SAL_VERSION_CODE(major, minor) ((BIN2BCD(major) << 8) | BIN2BCD(minor))
-
-extern const char *ia64_sal_strerror (long status);
-extern void ia64_sal_init (struct ia64_sal_systab *sal_systab);
-
-/* SAL information type encodings */
-enum {
-       SAL_INFO_TYPE_MCA  = 0,         /* Machine check abort information */
-        SAL_INFO_TYPE_INIT = 1,                /* Init information */
-        SAL_INFO_TYPE_CMC  = 2,                /* Corrected machine check information */
-        SAL_INFO_TYPE_CPE  = 3         /* Corrected platform error information */
-};
-
-/* Encodings for machine check parameter types */
-enum {
-       SAL_MC_PARAM_RENDEZ_INT    = 1, /* Rendezvous interrupt */
-       SAL_MC_PARAM_RENDEZ_WAKEUP = 2, /* Wakeup */
-       SAL_MC_PARAM_CPE_INT       = 3  /* Corrected Platform Error Int */
-};
-
-/* Encodings for rendezvous mechanisms */
-enum {
-       SAL_MC_PARAM_MECHANISM_INT = 1, /* Use interrupt */
-       SAL_MC_PARAM_MECHANISM_MEM = 2  /* Use memory synchronization variable*/
-};
-
-/* Encodings for vectors which can be registered by the OS with SAL */
-enum {
-       SAL_VECTOR_OS_MCA         = 0,
-       SAL_VECTOR_OS_INIT        = 1,
-       SAL_VECTOR_OS_BOOT_RENDEZ = 2
-};
-
-/* Encodings for mca_opt parameter sent to SAL_MC_SET_PARAMS */
-#define        SAL_MC_PARAM_RZ_ALWAYS          0x1
-#define        SAL_MC_PARAM_BINIT_ESCALATE     0x10
-
-/*
- * Definition of the SAL Error Log from the SAL spec
- */
-
-/* SAL Error Record Section GUID Definitions */
-#define SAL_PROC_DEV_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf1, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_MEM_DEV_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf2, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_SEL_DEV_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf3, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_PCI_BUS_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf4, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf5, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_PCI_COMP_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf6, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_SPECIFIC_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf7, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_HOST_CTLR_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf8, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-#define SAL_PLAT_BUS_ERR_SECT_GUID  \
-    EFI_GUID(0xe429faf9, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
-
-#define MAX_CACHE_ERRORS       6
-#define MAX_TLB_ERRORS         6
-#define MAX_BUS_ERRORS         1
-
-/* Definition of version  according to SAL spec for logging purposes */
-typedef struct sal_log_revision {
-       u8 minor;               /* BCD (0..99) */
-       u8 major;               /* BCD (0..99) */
-} sal_log_revision_t;
-
-/* Definition of timestamp according to SAL spec for logging purposes */
-typedef struct sal_log_timestamp {
-       u8 slh_second;          /* Second (0..59) */
-       u8 slh_minute;          /* Minute (0..59) */
-       u8 slh_hour;            /* Hour (0..23) */
-       u8 slh_reserved;
-       u8 slh_day;             /* Day (1..31) */
-       u8 slh_month;           /* Month (1..12) */
-       u8 slh_year;            /* Year (00..99) */
-       u8 slh_century;         /* Century (19, 20, 21, ...) */
-} sal_log_timestamp_t;
-
-/* Definition of log record  header structures */
-typedef struct sal_log_record_header {
-       u64 id;                         /* Unique monotonically increasing ID */
-       sal_log_revision_t revision;    /* Major and Minor revision of header */
-       u8 severity;                    /* Error Severity */
-       u8 validation_bits;             /* 0: platform_guid, 1: !timestamp */
-       u32 len;                        /* Length of this error log in bytes */
-       sal_log_timestamp_t timestamp;  /* Timestamp */
-       efi_guid_t platform_guid;       /* Unique OEM Platform ID */
-} sal_log_record_header_t;
-
-#define sal_log_severity_recoverable   0
-#define sal_log_severity_fatal         1
-#define sal_log_severity_corrected     2
-
-/* Definition of log section header structures */
-typedef struct sal_log_sec_header {
-    efi_guid_t guid;                   /* Unique Section ID */
-    sal_log_revision_t revision;       /* Major and Minor revision of Section */
-    u16 reserved;
-    u32 len;                           /* Section length */
-} sal_log_section_hdr_t;
-
-typedef struct sal_log_mod_error_info {
-       struct {
-               u64 check_info              : 1,
-                   requestor_identifier    : 1,
-                   responder_identifier    : 1,
-                   target_identifier       : 1,
-                   precise_ip              : 1,
-                   reserved                : 59;
-       } valid;
-       u64 check_info;
-       u64 requestor_identifier;
-       u64 responder_identifier;
-       u64 target_identifier;
-       u64 precise_ip;
-} sal_log_mod_error_info_t;
-
-typedef struct sal_processor_static_info {
-       struct {
-               u64 minstate        : 1,
-                   br              : 1,
-                   cr              : 1,
-                   ar              : 1,
-                   rr              : 1,
-                   fr              : 1,
-                   reserved        : 58;
-       } valid;
-       pal_min_state_area_t min_state_area;
-       u64 br[8];
-       u64 cr[128];
-       u64 ar[128];
-       u64 rr[8];
-       struct ia64_fpreg __attribute__ ((packed)) fr[128];
-} sal_processor_static_info_t;
-
-struct sal_cpuid_info {
-       u64 regs[5];
-       u64 reserved;
-};
-
-typedef struct sal_log_processor_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 proc_error_map      : 1,
-                   proc_state_param    : 1,
-                   proc_cr_lid         : 1,
-                   psi_static_struct   : 1,
-                   num_cache_check     : 4,
-                   num_tlb_check       : 4,
-                   num_bus_check       : 4,
-                   num_reg_file_check  : 4,
-                   num_ms_check        : 4,
-                   cpuid_info          : 1,
-                   reserved1           : 39;
-       } valid;
-       u64 proc_error_map;
-       u64 proc_state_parameter;
-       u64 proc_cr_lid;
-       /*
-        * The rest of this structure consists of variable-length arrays, which can't be
-        * expressed in C.
-        */
-       sal_log_mod_error_info_t info[0];
-       /*
-        * This is what the rest looked like if C supported variable-length arrays:
-        *
-        * sal_log_mod_error_info_t cache_check_info[.valid.num_cache_check];
-        * sal_log_mod_error_info_t tlb_check_info[.valid.num_tlb_check];
-        * sal_log_mod_error_info_t bus_check_info[.valid.num_bus_check];
-        * sal_log_mod_error_info_t reg_file_check_info[.valid.num_reg_file_check];
-        * sal_log_mod_error_info_t ms_check_info[.valid.num_ms_check];
-        * struct sal_cpuid_info cpuid_info;
-        * sal_processor_static_info_t processor_static_info;
-        */
-} sal_log_processor_info_t;
-
-/* Given a sal_log_processor_info_t pointer, return a pointer to the processor_static_info: */
-#define SAL_LPI_PSI_INFO(l)                                                                    \
-({     sal_log_processor_info_t *_l = (l);                                                     \
-       ((sal_processor_static_info_t *)                                                        \
-        ((char *) _l->info + ((_l->valid.num_cache_check + _l->valid.num_tlb_check             \
-                               + _l->valid.num_bus_check + _l->valid.num_reg_file_check        \
-                               + _l->valid.num_ms_check) * sizeof(sal_log_mod_error_info_t)    \
-                              + sizeof(struct sal_cpuid_info))));                              \
-})
-
-/* platform error log structures */
-
-typedef struct sal_log_mem_dev_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 error_status    : 1,
-                   physical_addr   : 1,
-                   addr_mask       : 1,
-                   node            : 1,
-                   card            : 1,
-                   module          : 1,
-                   bank            : 1,
-                   device          : 1,
-                   row             : 1,
-                   column          : 1,
-                   bit_position    : 1,
-                   requestor_id    : 1,
-                   responder_id    : 1,
-                   target_id       : 1,
-                   bus_spec_data   : 1,
-                   oem_id          : 1,
-                   oem_data        : 1,
-                   reserved        : 47;
-       } valid;
-       u64 error_status;
-       u64 physical_addr;
-       u64 addr_mask;
-       u16 node;
-       u16 card;
-       u16 module;
-       u16 bank;
-       u16 device;
-       u16 row;
-       u16 column;
-       u16 bit_position;
-       u64 requestor_id;
-       u64 responder_id;
-       u64 target_id;
-       u64 bus_spec_data;
-       u8 oem_id[16];
-       u8 oem_data[1];                 /* Variable length data */
-} sal_log_mem_dev_err_info_t;
-
-typedef struct sal_log_sel_dev_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 record_id       : 1,
-                   record_type     : 1,
-                   generator_id    : 1,
-                   evm_rev         : 1,
-                   sensor_type     : 1,
-                   sensor_num      : 1,
-                   event_dir       : 1,
-                   event_data1     : 1,
-                   event_data2     : 1,
-                   event_data3     : 1,
-                   reserved        : 54;
-       } valid;
-       u16 record_id;
-       u8 record_type;
-       u8 timestamp[4];
-       u16 generator_id;
-       u8 evm_rev;
-       u8 sensor_type;
-       u8 sensor_num;
-       u8 event_dir;
-       u8 event_data1;
-       u8 event_data2;
-       u8 event_data3;
-} sal_log_sel_dev_err_info_t;
-
-typedef struct sal_log_pci_bus_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 err_status      : 1,
-                   err_type        : 1,
-                   bus_id          : 1,
-                   bus_address     : 1,
-                   bus_data        : 1,
-                   bus_cmd         : 1,
-                   requestor_id    : 1,
-                   responder_id    : 1,
-                   target_id       : 1,
-                   oem_data        : 1,
-                   reserved        : 54;
-       } valid;
-       u64 err_status;
-       u16 err_type;
-       u16 bus_id;
-       u32 reserved;
-       u64 bus_address;
-       u64 bus_data;
-       u64 bus_cmd;
-       u64 requestor_id;
-       u64 responder_id;
-       u64 target_id;
-       u8 oem_data[1];                 /* Variable length data */
-} sal_log_pci_bus_err_info_t;
-
-typedef struct sal_log_smbios_dev_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 event_type      : 1,
-                   length          : 1,
-                   time_stamp      : 1,
-                   data            : 1,
-                   reserved1       : 60;
-       } valid;
-       u8 event_type;
-       u8 length;
-       u8 time_stamp[6];
-       u8 data[1];                     /* data of variable length, length == slsmb_length */
-} sal_log_smbios_dev_err_info_t;
-
-typedef struct sal_log_pci_comp_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 err_status      : 1,
-                   comp_info       : 1,
-                   num_mem_regs    : 1,
-                   num_io_regs     : 1,
-                   reg_data_pairs  : 1,
-                   oem_data        : 1,
-                   reserved        : 58;
-       } valid;
-       u64 err_status;
-       struct {
-               u16 vendor_id;
-               u16 device_id;
-               u8 class_code[3];
-               u8 func_num;
-               u8 dev_num;
-               u8 bus_num;
-               u8 seg_num;
-               u8 reserved[5];
-       } comp_info;
-       u32 num_mem_regs;
-       u32 num_io_regs;
-       u64 reg_data_pairs[1];
-       /*
-        * array of address/data register pairs is num_mem_regs + num_io_regs elements
-        * long.  Each array element consists of a u64 address followed by a u64 data
-        * value.  The oem_data array immediately follows the reg_data_pairs array
-        */
-       u8 oem_data[1];                 /* Variable length data */
-} sal_log_pci_comp_err_info_t;
-
-typedef struct sal_log_plat_specific_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 err_status      : 1,
-                   guid            : 1,
-                   oem_data        : 1,
-                   reserved        : 61;
-       } valid;
-       u64 err_status;
-       efi_guid_t guid;
-       u8 oem_data[1];                 /* platform specific variable length data */
-} sal_log_plat_specific_err_info_t;
-
-typedef struct sal_log_host_ctlr_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 err_status      : 1,
-                   requestor_id    : 1,
-                   responder_id    : 1,
-                   target_id       : 1,
-                   bus_spec_data   : 1,
-                   oem_data        : 1,
-                   reserved        : 58;
-       } valid;
-       u64 err_status;
-       u64 requestor_id;
-       u64 responder_id;
-       u64 target_id;
-       u64 bus_spec_data;
-       u8 oem_data[1];                 /* Variable length OEM data */
-} sal_log_host_ctlr_err_info_t;
-
-typedef struct sal_log_plat_bus_err_info {
-       sal_log_section_hdr_t header;
-       struct {
-               u64 err_status      : 1,
-                   requestor_id    : 1,
-                   responder_id    : 1,
-                   target_id       : 1,
-                   bus_spec_data   : 1,
-                   oem_data        : 1,
-                   reserved        : 58;
-       } valid;
-       u64 err_status;
-       u64 requestor_id;
-       u64 responder_id;
-       u64 target_id;
-       u64 bus_spec_data;
-       u8 oem_data[1];                 /* Variable length OEM data */
-} sal_log_plat_bus_err_info_t;
-
-/* Overall platform error section structure */
-typedef union sal_log_platform_err_info {
-       sal_log_mem_dev_err_info_t mem_dev_err;
-       sal_log_sel_dev_err_info_t sel_dev_err;
-       sal_log_pci_bus_err_info_t pci_bus_err;
-       sal_log_smbios_dev_err_info_t smbios_dev_err;
-       sal_log_pci_comp_err_info_t pci_comp_err;
-       sal_log_plat_specific_err_info_t plat_specific_err;
-       sal_log_host_ctlr_err_info_t host_ctlr_err;
-       sal_log_plat_bus_err_info_t plat_bus_err;
-} sal_log_platform_err_info_t;
-
-/* SAL log over-all, multi-section error record structure (processor+platform) */
-typedef struct err_rec {
-       sal_log_record_header_t sal_elog_header;
-       sal_log_processor_info_t proc_err;
-       sal_log_platform_err_info_t plat_err;
-       u8 oem_data_pad[1024];
-} ia64_err_rec_t;
-
-/*
- * Now define a couple of inline functions for improved type checking
- * and convenience.
- */
-static inline long
-ia64_sal_freq_base (unsigned long which, unsigned long *ticks_per_second,
-                   unsigned long *drift_info)
-{
-       struct ia64_sal_retval isrv;
-
-       SAL_CALL(isrv, SAL_FREQ_BASE, which, 0, 0, 0, 0, 0, 0);
-       *ticks_per_second = isrv.v0;
-       *drift_info = isrv.v1;
-       return isrv.status;
-}
-
-extern s64 ia64_sal_cache_flush (u64 cache_type);
-
-/* Initialize all the processor and platform level instruction and data caches */
-static inline s64
-ia64_sal_cache_init (void)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_CACHE_INIT, 0, 0, 0, 0, 0, 0, 0);
-       return isrv.status;
-}
-
-/*
- * Clear the processor and platform information logged by SAL with respect to the machine
- * state at the time of MCA's, INITs, CMCs, or CPEs.
- */
-static inline s64
-ia64_sal_clear_state_info (u64 sal_info_type)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL_REENTRANT(isrv, SAL_CLEAR_STATE_INFO, sal_info_type, 0,
-                     0, 0, 0, 0, 0);
-       return isrv.status;
-}
-
-
-/* Get the processor and platform information logged by SAL with respect to the machine
- * state at the time of the MCAs, INITs, CMCs, or CPEs.
- */
-#ifdef CONFIG_XEN
-static inline u64 ia64_sal_get_state_info_size (u64 sal_info_type);
-#endif
-
-static inline u64
-ia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info)
-{
-       struct ia64_sal_retval isrv;
-#ifdef CONFIG_XEN
-       if (is_running_on_xen()) {
-               struct xencomm_handle *desc;
-
-               if (xencomm_create(sal_info,
-                                  ia64_sal_get_state_info_size(sal_info_type),
-                                  &desc, GFP_KERNEL))
-                       return 0;
-
-               SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
-                                  desc, 0, 0, 0, 0);
-               xencomm_free(desc);
-       } else
-#endif
-       SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
-                     sal_info, 0, 0, 0, 0);
-       if (isrv.status)
-               return 0;
-
-       return isrv.v0;
-}
-
-/*
- * Get the maximum size of the information logged by SAL with respect to the machine state
- * at the time of MCAs, INITs, CMCs, or CPEs.
- */
-static inline u64
-ia64_sal_get_state_info_size (u64 sal_info_type)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO_SIZE, sal_info_type, 0,
-                     0, 0, 0, 0, 0);
-       if (isrv.status)
-               return 0;
-       return isrv.v0;
-}
-
-/*
- * Causes the processor to go into a spin loop within SAL where SAL awaits a wakeup from
- * the monarch processor.  Must not lock, because it will not return on any cpu until the
- * monarch processor sends a wake up.
- */
-static inline s64
-ia64_sal_mc_rendez (void)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL_NOLOCK(isrv, SAL_MC_RENDEZ, 0, 0, 0, 0, 0, 0, 0);
-       return isrv.status;
-}
-
-/*
- * Allow the OS to specify the interrupt number to be used by SAL to interrupt OS during
- * the machine check rendezvous sequence as well as the mechanism to wake up the
- * non-monarch processor at the end of machine check processing.
- * Returns the complete ia64_sal_retval because some calls return more than just a status
- * value.
- */
-static inline struct ia64_sal_retval
-ia64_sal_mc_set_params (u64 param_type, u64 i_or_m, u64 i_or_m_val, u64 timeout, u64 rz_always)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_MC_SET_PARAMS, param_type, i_or_m, i_or_m_val,
-                timeout, rz_always, 0, 0);
-       return isrv;
-}
-
-/* Read from PCI configuration space */
-static inline s64
-ia64_sal_pci_config_read (u64 pci_config_addr, int type, u64 size, u64 *value)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_PCI_CONFIG_READ, pci_config_addr, size, type, 0, 0, 0, 0);
-       if (value)
-               *value = isrv.v0;
-       return isrv.status;
-}
-
-/* Write to PCI configuration space */
-static inline s64
-ia64_sal_pci_config_write (u64 pci_config_addr, int type, u64 size, u64 value)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_PCI_CONFIG_WRITE, pci_config_addr, size, value,
-                type, 0, 0, 0);
-       return isrv.status;
-}
-
-/*
- * Register physical addresses of locations needed by SAL when SAL procedures are invoked
- * in virtual mode.
- */
-static inline s64
-ia64_sal_register_physical_addr (u64 phys_entry, u64 phys_addr)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_REGISTER_PHYSICAL_ADDR, phys_entry, phys_addr,
-                0, 0, 0, 0, 0);
-       return isrv.status;
-}
-
-/*
- * Register software dependent code locations within SAL. These locations are handlers or
- * entry points where SAL will pass control for the specified event. These event handlers
- * are for the bott rendezvous, MCAs and INIT scenarios.
- */
-static inline s64
-ia64_sal_set_vectors (u64 vector_type,
-                     u64 handler_addr1, u64 gp1, u64 handler_len1,
-                     u64 handler_addr2, u64 gp2, u64 handler_len2)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_SET_VECTORS, vector_type,
-                       handler_addr1, gp1, handler_len1,
-                       handler_addr2, gp2, handler_len2);
-
-       return isrv.status;
-}
-
-/* Update the contents of PAL block in the non-volatile storage device */
-static inline s64
-ia64_sal_update_pal (u64 param_buf, u64 scratch_buf, u64 scratch_buf_size,
-                    u64 *error_code, u64 *scratch_buf_size_needed)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_UPDATE_PAL, param_buf, scratch_buf, scratch_buf_size,
-                0, 0, 0, 0);
-       if (error_code)
-               *error_code = isrv.v0;
-       if (scratch_buf_size_needed)
-               *scratch_buf_size_needed = isrv.v1;
-       return isrv.status;
-}
-
-/* Get physical processor die mapping in the platform. */
-static inline s64
-ia64_sal_physical_id_info(u16 *splid)
-{
-       struct ia64_sal_retval isrv;
-       SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0);
-       if (splid)
-               *splid = isrv.v0;
-       return isrv.status;
-}
-
-extern unsigned long sal_platform_features;
-
-extern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *);
-
-struct sal_ret_values {
-       long r8; long r9; long r10; long r11;
-};
-
-#define IA64_SAL_OEMFUNC_MIN           0x02000000
-#define IA64_SAL_OEMFUNC_MAX           0x03ffffff
-
-extern int ia64_sal_oemcall(struct ia64_sal_retval *, u64, u64, u64, u64, u64,
-                           u64, u64, u64);
-extern int ia64_sal_oemcall_nolock(struct ia64_sal_retval *, u64, u64, u64,
-                                  u64, u64, u64, u64, u64);
-extern int ia64_sal_oemcall_reentrant(struct ia64_sal_retval *, u64, u64, u64,
-                                     u64, u64, u64, u64, u64);
-#ifdef CONFIG_HOTPLUG_CPU
-/*
- * System Abstraction Layer Specification
- * Section 3.2.5.1: OS_BOOT_RENDEZ to SAL return State.
- * Note: region regs are stored first in head.S _start. Hence they must
- * stay up front.
- */
-struct sal_to_os_boot {
-       u64 rr[8];              /* Region Registers */
-       u64     br[6];          /* br0: return addr into SAL boot rendez routine */
-       u64 gr1;                /* SAL:GP */
-       u64 gr12;               /* SAL:SP */
-       u64 gr13;               /* SAL: Task Pointer */
-       u64 fpsr;
-       u64     pfs;
-       u64 rnat;
-       u64 unat;
-       u64 bspstore;
-       u64 dcr;                /* Default Control Register */
-       u64 iva;
-       u64 pta;
-       u64 itv;
-       u64 pmv;
-       u64 cmcv;
-       u64 lrr[2];
-       u64 gr[4];
-       u64 pr;                 /* Predicate registers */
-       u64 lc;                 /* Loop Count */
-       struct ia64_fpreg fp[20];
-};
-
-/*
- * Global array allocated for NR_CPUS at boot time
- */
-extern struct sal_to_os_boot sal_boot_rendez_state[NR_CPUS];
-
-extern void ia64_jump_to_sal(struct sal_to_os_boot *);
-#endif
-
-extern void ia64_sal_handler_init(void *entry_point, void *gpval);
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _ASM_IA64_SAL_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h b/linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h
deleted file mode 100644 (file)
index c9afcbb..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef _ASM_SWIOTLB_H
-#define _ASM_SWIOTLB_H 1
-
-/* SWIOTLB interface */
-
-extern dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, size_t size,
-                                     int dir);
-extern void swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr,
-                                 size_t size, int dir);
-extern void swiotlb_sync_single_for_cpu(struct device *hwdev,
-                                        dma_addr_t dev_addr,
-                                        size_t size, int dir);
-extern void swiotlb_sync_single_for_device(struct device *hwdev,
-                                           dma_addr_t dev_addr,
-                                           size_t size, int dir);
-extern void swiotlb_sync_sg_for_cpu(struct device *hwdev,
-                                    struct scatterlist *sg, int nelems,
-                                    int dir);
-extern void swiotlb_sync_sg_for_device(struct device *hwdev,
-                                       struct scatterlist *sg, int nelems,
-                                       int dir);
-extern int swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg,
-                     int nents, int direction);
-extern void swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg,
-                        int nents, int direction);
-extern int swiotlb_dma_mapping_error(dma_addr_t dma_addr);
-extern dma_addr_t swiotlb_map_page(struct device *hwdev, struct page *page,
-                                   unsigned long offset, size_t size,
-                                   enum dma_data_direction direction);
-extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
-                               size_t size, enum dma_data_direction direction);
-extern int swiotlb_dma_supported(struct device *hwdev, u64 mask);
-extern void swiotlb_init(void);
-
-#ifdef CONFIG_SWIOTLB
-extern int swiotlb;
-#else
-#define swiotlb 0
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/synch_bitops.h b/linux-2.6-xen-sparse/include/asm-ia64/synch_bitops.h
deleted file mode 100644 (file)
index 21b7f8c..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef __XEN_SYNCH_BITOPS_H__
-#define __XEN_SYNCH_BITOPS_H__
-
-/*
- * Copyright 1992, Linus Torvalds.
- * Heavily modified to provide guaranteed strong synchronisation
- * when communicating with Xen or other guest OSes running on other CPUs.
- */
-
-#define ADDR (*(volatile long *) addr)
-
-static __inline__ void synch_set_bit(int nr, volatile void * addr)
-{
-       set_bit(nr, addr);
-}
-
-static __inline__ void synch_clear_bit(int nr, volatile void * addr)
-{
-       clear_bit(nr, addr);
-}
-
-static __inline__ void synch_change_bit(int nr, volatile void * addr)
-{
-       change_bit(nr, addr);
-}
-
-static __inline__ int synch_test_and_set_bit(int nr, volatile void * addr)
-{
-    return test_and_set_bit(nr, addr);
-}
-
-static __inline__ int synch_test_and_clear_bit(int nr, volatile void * addr)
-{
-    return test_and_clear_bit(nr, addr);
-}
-
-static __inline__ int synch_test_and_change_bit(int nr, volatile void * addr)
-{
-    return test_and_change_bit(nr, addr);
-}
-
-static __inline__ int synch_const_test_bit(int nr, const volatile void * addr)
-{
-    return test_bit(nr, addr);
-}
-
-static __inline__ int synch_var_test_bit(int nr, volatile void * addr)
-{
-    return test_bit(nr, addr);
-}
-
-#define synch_cmpxchg  ia64_cmpxchg4_acq
-
-#define synch_test_bit(nr,addr) \
-(__builtin_constant_p(nr) ? \
- synch_const_test_bit((nr),(addr)) : \
- synch_var_test_bit((nr),(addr)))
-
-#define synch_cmpxchg_subword synch_cmpxchg
-
-#endif /* __XEN_SYNCH_BITOPS_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/system.h b/linux-2.6-xen-sparse/include/asm-ia64/system.h
deleted file mode 100644 (file)
index 8d94828..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-#ifndef _ASM_IA64_SYSTEM_H
-#define _ASM_IA64_SYSTEM_H
-
-/*
- * System defines. Note that this is included both from .c and .S
- * files, so it does only defines, not any C code.  This is based
- * on information published in the Processor Abstraction Layer
- * and the System Abstraction Layer manual.
- *
- * Copyright (C) 1998-2003 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
- * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
- */
-
-#include <asm/kregs.h>
-#include <asm/page.h>
-#include <asm/pal.h>
-#include <asm/percpu.h>
-
-#define GATE_ADDR              RGN_BASE(RGN_GATE)
-
-/*
- * 0xa000000000000000+2*PERCPU_PAGE_SIZE
- * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
- */
-#define KERNEL_START            (GATE_ADDR+__IA64_UL_CONST(0x100000000))
-#define PERCPU_ADDR            (-PERCPU_PAGE_SIZE)
-
-#ifndef __ASSEMBLY__
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-struct pci_vector_struct {
-       __u16 segment;  /* PCI Segment number */
-       __u16 bus;      /* PCI Bus number */
-       __u32 pci_id;   /* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */
-       __u8 pin;       /* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */
-       __u32 irq;      /* IRQ assigned */
-};
-
-extern struct ia64_boot_param {
-       __u64 command_line;             /* physical address of command line arguments */
-       __u64 efi_systab;               /* physical address of EFI system table */
-       __u64 efi_memmap;               /* physical address of EFI memory map */
-       __u64 efi_memmap_size;          /* size of EFI memory map */
-       __u64 efi_memdesc_size;         /* size of an EFI memory map descriptor */
-       __u32 efi_memdesc_version;      /* memory descriptor version */
-       struct {
-               __u16 num_cols; /* number of columns on console output device */
-               __u16 num_rows; /* number of rows on console output device */
-               __u16 orig_x;   /* cursor's x position */
-               __u16 orig_y;   /* cursor's y position */
-       } console_info;
-       __u64 fpswa;            /* physical address of the fpswa interface */
-       __u64 initrd_start;
-       __u64 initrd_size;
-} *ia64_boot_param;
-
-/*
- * Macros to force memory ordering.  In these descriptions, "previous"
- * and "subsequent" refer to program order; "visible" means that all
- * architecturally visible effects of a memory access have occurred
- * (at a minimum, this means the memory has been read or written).
- *
- *   wmb():    Guarantees that all preceding stores to memory-
- *             like regions are visible before any subsequent
- *             stores and that all following stores will be
- *             visible only after all previous stores.
- *   rmb():    Like wmb(), but for reads.
- *   mb():     wmb()/rmb() combo, i.e., all previous memory
- *             accesses are visible before all subsequent
- *             accesses and vice versa.  This is also known as
- *             a "fence."
- *
- * Note: "mb()" and its variants cannot be used as a fence to order
- * accesses to memory mapped I/O registers.  For that, mf.a needs to
- * be used.  However, we don't want to always use mf.a because (a)
- * it's (presumably) much slower than mf and (b) mf.a is supported for
- * sequential memory pages only.
- */
-#define mb()   ia64_mf()
-#define rmb()  mb()
-#define wmb()  mb()
-#define read_barrier_depends() do { } while(0)
-
-#ifdef CONFIG_SMP
-# define smp_mb()      mb()
-# define smp_rmb()     rmb()
-# define smp_wmb()     wmb()
-# define smp_read_barrier_depends()    read_barrier_depends()
-#else
-# define smp_mb()      barrier()
-# define smp_rmb()     barrier()
-# define smp_wmb()     barrier()
-# define smp_read_barrier_depends()    do { } while(0)
-#endif
-
-/*
- * XXX check on this ---I suspect what Linus really wants here is
- * acquire vs release semantics but we can't discuss this stuff with
- * Linus just yet.  Grrr...
- */
-#define set_mb(var, value)     do { (var) = (value); mb(); } while (0)
-
-#define safe_halt()         ia64_pal_halt_light()    /* PAL_HALT_LIGHT */
-
-/*
- * The group barrier in front of the rsm & ssm are necessary to ensure
- * that none of the previous instructions in the same group are
- * affected by the rsm/ssm.
- */
-/* For spinlocks etc */
-
-/*
- * - clearing psr.i is implicitly serialized (visible by next insn)
- * - setting psr.i requires data serialization
- * - we need a stop-bit before reading PSR because we sometimes
- *   write a floating-point register right before reading the PSR
- *   and that writes to PSR.mfl
- */
-#define __local_irq_save(x)                    \
-do {                                           \
-       ia64_stop();                            \
-       (x) = ia64_get_psr_i();                 \
-       ia64_stop();                            \
-       ia64_rsm(IA64_PSR_I);                   \
-} while (0)
-
-#define __local_irq_disable()                  \
-do {                                           \
-       ia64_stop();                            \
-       ia64_rsm(IA64_PSR_I);                   \
-} while (0)
-
-#define __local_irq_restore(x) ia64_intrin_local_irq_restore((x) & IA64_PSR_I)
-
-#ifdef CONFIG_IA64_DEBUG_IRQ
-
-  extern unsigned long last_cli_ip;
-
-# define __save_ip()           last_cli_ip = ia64_getreg(_IA64_REG_IP)
-
-# define local_irq_save(x)                                     \
-do {                                                           \
-       unsigned long psr;                                      \
-                                                               \
-       __local_irq_save(psr);                                  \
-       if (psr & IA64_PSR_I)                                   \
-               __save_ip();                                    \
-       (x) = psr;                                              \
-} while (0)
-
-# define local_irq_disable()   do { unsigned long x; local_irq_save(x); } while (0)
-
-# define local_irq_restore(x)                                  \
-do {                                                           \
-       unsigned long old_psr, psr = (x);                       \
-                                                               \
-       local_save_flags(old_psr);                              \
-       __local_irq_restore(psr);                               \
-       if ((old_psr & IA64_PSR_I) && !(psr & IA64_PSR_I))      \
-               __save_ip();                                    \
-} while (0)
-
-#else /* !CONFIG_IA64_DEBUG_IRQ */
-# define local_irq_save(x)     __local_irq_save(x)
-# define local_irq_disable()   __local_irq_disable()
-# define local_irq_restore(x)  __local_irq_restore(x)
-#endif /* !CONFIG_IA64_DEBUG_IRQ */
-
-#define local_irq_enable()     ({ ia64_stop(); ia64_ssm(IA64_PSR_I); ia64_srlz_d(); })
-#define local_save_flags(flags)        ({ ia64_stop(); (flags) = ia64_get_psr_i(); })
-
-#define irqs_disabled()                                \
-({                                             \
-       unsigned long __ia64_id_flags;          \
-       local_save_flags(__ia64_id_flags);      \
-       (__ia64_id_flags & IA64_PSR_I) == 0;    \
-})
-
-#ifdef __KERNEL__
-
-#ifdef CONFIG_IA32_SUPPORT
-# define IS_IA32_PROCESS(regs) (ia64_psr(regs)->is != 0)
-#else
-# define IS_IA32_PROCESS(regs)         0
-struct task_struct;
-static inline void ia32_save_state(struct task_struct *t __attribute__((unused))){}
-static inline void ia32_load_state(struct task_struct *t __attribute__((unused))){}
-#endif
-
-/*
- * Context switch from one thread to another.  If the two threads have
- * different address spaces, schedule() has already taken care of
- * switching to the new address space by calling switch_mm().
- *
- * Disabling access to the fph partition and the debug-register
- * context switch MUST be done before calling ia64_switch_to() since a
- * newly created thread returns directly to
- * ia64_ret_from_syscall_clear_r8.
- */
-extern struct task_struct *ia64_switch_to (void *next_task);
-
-struct task_struct;
-
-extern void ia64_save_extra (struct task_struct *task);
-extern void ia64_load_extra (struct task_struct *task);
-
-#ifdef CONFIG_PERFMON
-  DECLARE_PER_CPU(unsigned long, pfm_syst_info);
-# define PERFMON_IS_SYSWIDE() (__get_cpu_var(pfm_syst_info) & 0x1)
-#else
-# define PERFMON_IS_SYSWIDE() (0)
-#endif
-
-#define IA64_HAS_EXTRA_STATE(t)                                                        \
-       ((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID)       \
-        || IS_IA32_PROCESS(task_pt_regs(t)) || PERFMON_IS_SYSWIDE())
-
-#define __switch_to(prev,next,last) do {                                                        \
-       if (IA64_HAS_EXTRA_STATE(prev))                                                          \
-               ia64_save_extra(prev);                                                           \
-       if (IA64_HAS_EXTRA_STATE(next))                                                          \
-               ia64_load_extra(next);                                                           \
-       ia64_psr(task_pt_regs(next))->dfh = !ia64_is_local_fpu_owner(next);                      \
-       (last) = ia64_switch_to((next));                                                         \
-} while (0)
-
-#ifdef CONFIG_SMP
-/*
- * In the SMP case, we save the fph state when context-switching away from a thread that
- * modified fph.  This way, when the thread gets scheduled on another CPU, the CPU can
- * pick up the state from task->thread.fph, avoiding the complication of having to fetch
- * the latest fph state from another CPU.  In other words: eager save, lazy restore.
- */
-# define switch_to(prev,next,last) do {                                                \
-       if (ia64_psr(task_pt_regs(prev))->mfh && ia64_is_local_fpu_owner(prev)) {                               \
-               ia64_psr(task_pt_regs(prev))->mfh = 0;                  \
-               (prev)->thread.flags |= IA64_THREAD_FPH_VALID;                  \
-               __ia64_save_fpu((prev)->thread.fph);                            \
-       }                                                                       \
-       __switch_to(prev, next, last);                                          \
-       /* "next" in old context is "current" in new context */                 \
-       if (unlikely((current->thread.flags & IA64_THREAD_MIGRATION) &&        \
-                    (task_cpu(current) !=                                     \
-                                     task_thread_info(current)->last_cpu))) { \
-               platform_migrate(current);                                     \
-               task_thread_info(current)->last_cpu = task_cpu(current);       \
-       }                                                                      \
-} while (0)
-#else
-# define switch_to(prev,next,last)     __switch_to(prev, next, last)
-#endif
-
-#define __ARCH_WANT_UNLOCKED_CTXSW
-#define ARCH_HAS_PREFETCH_SWITCH_STACK
-#define ia64_platform_is(x) (strcmp(x, platform_name) == 0)
-
-void cpu_idle_wait(void);
-void sched_cacheflush(void);
-
-#define arch_align_stack(x) (x)
-
-void default_idle(void);
-
-#endif /* __KERNEL__ */
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _ASM_IA64_SYSTEM_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/uaccess.h b/linux-2.6-xen-sparse/include/asm-ia64/uaccess.h
deleted file mode 100644 (file)
index e015fd0..0000000
+++ /dev/null
@@ -1,421 +0,0 @@
-#ifndef _ASM_IA64_UACCESS_H
-#define _ASM_IA64_UACCESS_H
-
-/*
- * This file defines various macros to transfer memory areas across
- * the user/kernel boundary.  This needs to be done carefully because
- * this code is executed in kernel mode and uses user-specified
- * addresses.  Thus, we need to be careful not to let the user to
- * trick us into accessing kernel memory that would normally be
- * inaccessible.  This code is also fairly performance sensitive,
- * so we want to spend as little time doing safety checks as
- * possible.
- *
- * To make matters a bit more interesting, these macros sometimes also
- * called from within the kernel itself, in which case the address
- * validity check must be skipped.  The get_fs() macro tells us what
- * to do: if get_fs()==USER_DS, checking is performed, if
- * get_fs()==KERNEL_DS, checking is bypassed.
- *
- * Note that even if the memory area specified by the user is in a
- * valid address range, it is still possible that we'll get a page
- * fault while accessing it.  This is handled by filling out an
- * exception handler fixup entry for each instruction that has the
- * potential to fault.  When such a fault occurs, the page fault
- * handler checks to see whether the faulting instruction has a fixup
- * associated and, if so, sets r8 to -EFAULT and clears r9 to 0 and
- * then resumes execution at the continuation point.
- *
- * Based on <asm-alpha/uaccess.h>.
- *
- * Copyright (C) 1998, 1999, 2001-2004 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-#include <linux/compiler.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/page-flags.h>
-#include <linux/mm.h>
-
-#include <asm/intrinsics.h>
-#include <asm/pgtable.h>
-#include <asm/io.h>
-
-/*
- * For historical reasons, the following macros are grossly misnamed:
- */
-#define KERNEL_DS      ((mm_segment_t) { ~0UL })               /* cf. access_ok() */
-#define USER_DS                ((mm_segment_t) { TASK_SIZE-1 })        /* cf. access_ok() */
-
-#define VERIFY_READ    0
-#define VERIFY_WRITE   1
-
-#define get_ds()  (KERNEL_DS)
-#define get_fs()  (current_thread_info()->addr_limit)
-#define set_fs(x) (current_thread_info()->addr_limit = (x))
-
-#define segment_eq(a, b)       ((a).seg == (b).seg)
-
-/*
- * When accessing user memory, we need to make sure the entire area really is in
- * user-level space.  In order to do this efficiently, we make sure that the page at
- * address TASK_SIZE is never valid.  We also need to make sure that the address doesn't
- * point inside the virtually mapped linear page table.
- */
-#define __access_ok(addr, size, segment)                                               \
-({                                                                                     \
-       __chk_user_ptr(addr);                                                           \
-       (likely((unsigned long) (addr) <= (segment).seg)                                \
-        && ((segment).seg == KERNEL_DS.seg                                             \
-            || likely(REGION_OFFSET((unsigned long) (addr)) < RGN_MAP_LIMIT)));        \
-})
-#define access_ok(type, addr, size)    __access_ok((addr), (size), get_fs())
-
-/*
- * These are the main single-value transfer routines.  They automatically
- * use the right size if we just have the right pointer type.
- *
- * Careful to not
- * (a) re-use the arguments for side effects (sizeof/typeof is ok)
- * (b) require any knowledge of processes at this stage
- */
-#define put_user(x, ptr)       __put_user_check((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)), get_fs())
-#define get_user(x, ptr)       __get_user_check((x), (ptr), sizeof(*(ptr)), get_fs())
-
-/*
- * The "__xxx" versions do not do address space checking, useful when
- * doing multiple accesses to the same area (the programmer has to do the
- * checks by hand with "access_ok()")
- */
-#define __put_user(x, ptr)     __put_user_nocheck((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
-#define __get_user(x, ptr)     __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
-
-extern long __put_user_unaligned_unknown (void);
-
-#define __put_user_unaligned(x, ptr)                                                           \
-({                                                                                             \
-       long __ret;                                                                             \
-       switch (sizeof(*(ptr))) {                                                               \
-               case 1: __ret = __put_user((x), (ptr)); break;                                  \
-               case 2: __ret = (__put_user((x), (u8 __user *)(ptr)))                           \
-                       | (__put_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break;              \
-               case 4: __ret = (__put_user((x), (u16 __user *)(ptr)))                          \
-                       | (__put_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break;            \
-               case 8: __ret = (__put_user((x), (u32 __user *)(ptr)))                          \
-                       | (__put_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break;            \
-               default: __ret = __put_user_unaligned_unknown();                                \
-       }                                                                                       \
-       __ret;                                                                                  \
-})
-
-extern long __get_user_unaligned_unknown (void);
-
-#define __get_user_unaligned(x, ptr)                                                           \
-({                                                                                             \
-       long __ret;                                                                             \
-       switch (sizeof(*(ptr))) {                                                               \
-               case 1: __ret = __get_user((x), (ptr)); break;                                  \
-               case 2: __ret = (__get_user((x), (u8 __user *)(ptr)))                           \
-                       | (__get_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break;              \
-               case 4: __ret = (__get_user((x), (u16 __user *)(ptr)))                          \
-                       | (__get_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break;            \
-               case 8: __ret = (__get_user((x), (u32 __user *)(ptr)))                          \
-                       | (__get_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break;            \
-               default: __ret = __get_user_unaligned_unknown();                                \
-       }                                                                                       \
-       __ret;                                                                                  \
-})
-
-#ifdef ASM_SUPPORTED
-  struct __large_struct { unsigned long buf[100]; };
-# define __m(x) (*(struct __large_struct __user *)(x))
-
-/* We need to declare the __ex_table section before we can use it in .xdata.  */
-asm (".section \"__ex_table\", \"a\"\n\t.previous");
-
-# define __get_user_size(val, addr, n, err)                                                    \
-do {                                                                                           \
-       register long __gu_r8 asm ("r8") = 0;                                                   \
-       register long __gu_r9 asm ("r9");                                                       \
-       asm ("\n[1:]\tld"#n" %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"     \
-            "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n"                                         \
-            "[1:]"                                                                             \
-            : "=r"(__gu_r9), "=r"(__gu_r8) : "m"(__m(addr)), "1"(__gu_r8));                    \
-       (err) = __gu_r8;                                                                        \
-       (val) = __gu_r9;                                                                        \
-} while (0)
-
-/*
- * The "__put_user_size()" macro tells gcc it reads from memory instead of writing it.  This
- * is because they do not write to any memory gcc knows about, so there are no aliasing
- * issues.
- */
-# define __put_user_size(val, addr, n, err)                                                    \
-do {                                                                                           \
-       register long __pu_r8 asm ("r8") = 0;                                                   \
-       asm volatile ("\n[1:]\tst"#n" %1=%r2%P1\t// %0 gets overwritten by exception handler\n" \
-                     "\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"                                  \
-                     "[1:]"                                                                    \
-                     : "=r"(__pu_r8) : "m"(__m(addr)), "rO"(val), "0"(__pu_r8));               \
-       (err) = __pu_r8;                                                                        \
-} while (0)
-
-#else /* !ASM_SUPPORTED */
-# define RELOC_TYPE    2       /* ip-rel */
-# define __get_user_size(val, addr, n, err)                            \
-do {                                                                   \
-       __ld_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE);   \
-       (err) = ia64_getreg(_IA64_REG_R8);                              \
-       (val) = ia64_getreg(_IA64_REG_R9);                              \
-} while (0)
-# define __put_user_size(val, addr, n, err)                                                    \
-do {                                                                                           \
-       __st_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE, (unsigned long) (val));    \
-       (err) = ia64_getreg(_IA64_REG_R8);                                                      \
-} while (0)
-#endif /* !ASM_SUPPORTED */
-
-extern void __get_user_unknown (void);
-
-/*
- * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
- * could clobber r8 and r9 (among others).  Thus, be careful not to evaluate it while
- * using r8/r9.
- */
-#define __do_get_user(check, x, ptr, size, segment)                                    \
-({                                                                                     \
-       const __typeof__(*(ptr)) __user *__gu_ptr = (ptr);                              \
-       __typeof__ (size) __gu_size = (size);                                           \
-       long __gu_err = -EFAULT;                                                        \
-       unsigned long __gu_val = 0;                                                     \
-       if (!check || __access_ok(__gu_ptr, size, segment))                             \
-               switch (__gu_size) {                                                    \
-                     case 1: __get_user_size(__gu_val, __gu_ptr, 1, __gu_err); break;  \
-                     case 2: __get_user_size(__gu_val, __gu_ptr, 2, __gu_err); break;  \
-                     case 4: __get_user_size(__gu_val, __gu_ptr, 4, __gu_err); break;  \
-                     case 8: __get_user_size(__gu_val, __gu_ptr, 8, __gu_err); break;  \
-                     default: __get_user_unknown(); break;                             \
-               }                                                                       \
-       (x) = (__typeof__(*(__gu_ptr))) __gu_val;                                       \
-       __gu_err;                                                                       \
-})
-
-#define __get_user_nocheck(x, ptr, size)       __do_get_user(0, x, ptr, size, KERNEL_DS)
-#define __get_user_check(x, ptr, size, segment)        __do_get_user(1, x, ptr, size, segment)
-
-extern void __put_user_unknown (void);
-
-/*
- * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
- * could clobber r8 (among others).  Thus, be careful not to evaluate them while using r8.
- */
-#define __do_put_user(check, x, ptr, size, segment)                                    \
-({                                                                                     \
-       __typeof__ (x) __pu_x = (x);                                                    \
-       __typeof__ (*(ptr)) __user *__pu_ptr = (ptr);                                   \
-       __typeof__ (size) __pu_size = (size);                                           \
-       long __pu_err = -EFAULT;                                                        \
-                                                                                       \
-       if (!check || __access_ok(__pu_ptr, __pu_size, segment))                        \
-               switch (__pu_size) {                                                    \
-                     case 1: __put_user_size(__pu_x, __pu_ptr, 1, __pu_err); break;    \
-                     case 2: __put_user_size(__pu_x, __pu_ptr, 2, __pu_err); break;    \
-                     case 4: __put_user_size(__pu_x, __pu_ptr, 4, __pu_err); break;    \
-                     case 8: __put_user_size(__pu_x, __pu_ptr, 8, __pu_err); break;    \
-                     default: __put_user_unknown(); break;                             \
-               }                                                                       \
-       __pu_err;                                                                       \
-})
-
-#define __put_user_nocheck(x, ptr, size)       __do_put_user(0, x, ptr, size, KERNEL_DS)
-#define __put_user_check(x, ptr, size, segment)        __do_put_user(1, x, ptr, size, segment)
-
-/*
- * Complex access routines
- */
-extern unsigned long __must_check __copy_user (void __user *to, const void __user *from,
-                                              unsigned long count);
-
-static inline unsigned long
-__copy_to_user (void __user *to, const void *from, unsigned long count)
-{
-       return __copy_user(to, (__force void __user *) from, count);
-}
-
-static inline unsigned long
-__copy_from_user (void *to, const void __user *from, unsigned long count)
-{
-       return __copy_user((__force void __user *) to, from, count);
-}
-
-#define __copy_to_user_inatomic                __copy_to_user
-#define __copy_from_user_inatomic      __copy_from_user
-#define copy_to_user(to, from, n)                                                      \
-({                                                                                     \
-       void __user *__cu_to = (to);                                                    \
-       const void *__cu_from = (from);                                                 \
-       long __cu_len = (n);                                                            \
-                                                                                       \
-       if (__access_ok(__cu_to, __cu_len, get_fs()))                                   \
-               __cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len);   \
-       __cu_len;                                                                       \
-})
-
-#define copy_from_user(to, from, n)                                                    \
-({                                                                                     \
-       void *__cu_to = (to);                                                           \
-       const void __user *__cu_from = (from);                                          \
-       long __cu_len = (n);                                                            \
-                                                                                       \
-       __chk_user_ptr(__cu_from);                                                      \
-       if (__access_ok(__cu_from, __cu_len, get_fs()))                                 \
-               __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len);   \
-       __cu_len;                                                                       \
-})
-
-#define __copy_in_user(to, from, size) __copy_user((to), (from), (size))
-
-static inline unsigned long
-copy_in_user (void __user *to, const void __user *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_READ, from, n) && access_ok(VERIFY_WRITE, to, n)))
-               n = __copy_user(to, from, n);
-       return n;
-}
-
-extern unsigned long __do_clear_user (void __user *, unsigned long);
-
-#define __clear_user(to, n)            __do_clear_user(to, n)
-
-#define clear_user(to, n)                                      \
-({                                                             \
-       unsigned long __cu_len = (n);                           \
-       if (__access_ok(to, __cu_len, get_fs()))                \
-               __cu_len = __do_clear_user(to, __cu_len);       \
-       __cu_len;                                               \
-})
-
-
-/*
- * Returns: -EFAULT if exception before terminator, N if the entire buffer filled, else
- * strlen.
- */
-extern long __must_check __strncpy_from_user (char *to, const char __user *from, long to_len);
-
-#define strncpy_from_user(to, from, n)                                 \
-({                                                                     \
-       const char __user * __sfu_from = (from);                        \
-       long __sfu_ret = -EFAULT;                                       \
-       if (__access_ok(__sfu_from, 0, get_fs()))                       \
-               __sfu_ret = __strncpy_from_user((to), __sfu_from, (n)); \
-       __sfu_ret;                                                      \
-})
-
-/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
-extern unsigned long __strlen_user (const char __user *);
-
-#define strlen_user(str)                               \
-({                                                     \
-       const char __user *__su_str = (str);            \
-       unsigned long __su_ret = 0;                     \
-       if (__access_ok(__su_str, 0, get_fs()))         \
-               __su_ret = __strlen_user(__su_str);     \
-       __su_ret;                                       \
-})
-
-/*
- * Returns: 0 if exception before NUL or reaching the supplied limit
- * (N), a value greater than N if the limit would be exceeded, else
- * strlen.
- */
-extern unsigned long __strnlen_user (const char __user *, long);
-
-#define strnlen_user(str, len)                                 \
-({                                                             \
-       const char __user *__su_str = (str);                    \
-       unsigned long __su_ret = 0;                             \
-       if (__access_ok(__su_str, 0, get_fs()))                 \
-               __su_ret = __strnlen_user(__su_str, len);       \
-       __su_ret;                                               \
-})
-
-/* Generic code can't deal with the location-relative format that we use for compactness.  */
-#define ARCH_HAS_SORT_EXTABLE
-#define ARCH_HAS_SEARCH_EXTABLE
-
-struct exception_table_entry {
-       int addr;       /* location-relative address of insn this fixup is for */
-       int cont;       /* location-relative continuation addr.; if bit 2 is set, r9 is set to 0 */
-};
-
-extern void ia64_handle_exception (struct pt_regs *regs, const struct exception_table_entry *e);
-extern const struct exception_table_entry *search_exception_tables (unsigned long addr);
-
-static inline int
-ia64_done_with_exception (struct pt_regs *regs)
-{
-       const struct exception_table_entry *e;
-       e = search_exception_tables(regs->cr_iip + ia64_psr(regs)->ri);
-       if (e) {
-               ia64_handle_exception(regs, e);
-               return 1;
-       }
-       return 0;
-}
-
-#define ARCH_HAS_TRANSLATE_MEM_PTR     1
-#ifndef CONFIG_XEN
-static __inline__ char *
-xlate_dev_mem_ptr (unsigned long p)
-{
-       struct page *page;
-       char * ptr;
-
-       page = pfn_to_page(p >> PAGE_SHIFT);
-       if (PageUncached(page))
-               ptr = (char *)p + __IA64_UNCACHED_OFFSET;
-       else
-               ptr = __va(p);
-
-       return ptr;
-}
-#else
-static __inline__ char *
-xlate_dev_mem_ptr (unsigned long p, ssize_t sz)
-{
-       unsigned long pfn = p >> PAGE_SHIFT;
-
-       if (pfn_valid(pfn) && !PageUncached(pfn_to_page(pfn)))
-               return __va(p);
-
-       return ioremap(p, sz);
-}
-
-static __inline__ void
-xlate_dev_mem_ptr_unmap (char* v)
-{
-       if (REGION_NUMBER(v) == RGN_UNCACHED)
-               iounmap(v);
-}
-#endif
-
-/*
- * Convert a virtual cached kernel memory pointer to an uncached pointer
- */
-static __inline__ char *
-xlate_dev_kmem_ptr (char * p)
-{
-       struct page *page;
-       char * ptr;
-
-       page = virt_to_page((unsigned long)p >> PAGE_SHIFT);
-       if (PageUncached(page))
-               ptr = (char *)__pa(p) + __IA64_UNCACHED_OFFSET;
-       else
-               ptr = p;
-
-       return ptr;
-}
-
-#endif /* _ASM_IA64_UACCESS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h
deleted file mode 100644 (file)
index 96f5f09..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-#ifndef _ASM_IA64_XEN_PRIVOP_H
-#define _ASM_IA64_XEN_PRIVOP_H
-
-/*
- * Copyright (C) 2005 Hewlett-Packard Co
- *     Dan Magenheimer <dan.magenheimer@hp.com>
- *
- * Paravirtualizations of privileged operations for Xen/ia64
- *
- */
-
-
-#include <xen/interface/arch-ia64.h>
-
-#define IA64_PARAVIRTUALIZED
-
-/* At 1 MB, before per-cpu space but still addressable using addl instead
-   of movl. */
-#define XSI_BASE                               0xfffffffffff00000
-
-/* Address of mapped regs.  */
-#define XMAPPEDREGS_BASE               (XSI_BASE + XSI_SIZE)
-
-#ifdef __ASSEMBLY__
-#define        XEN_HYPER_RFI                   break HYPERPRIVOP_RFI
-#define        XEN_HYPER_RSM_PSR_DT            break HYPERPRIVOP_RSM_DT
-#define        XEN_HYPER_SSM_PSR_DT            break HYPERPRIVOP_SSM_DT
-#define        XEN_HYPER_COVER                 break HYPERPRIVOP_COVER
-#define        XEN_HYPER_ITC_D                 break HYPERPRIVOP_ITC_D
-#define        XEN_HYPER_ITC_I                 break HYPERPRIVOP_ITC_I
-#define        XEN_HYPER_SSM_I                 break HYPERPRIVOP_SSM_I
-#define        XEN_HYPER_GET_IVR               break HYPERPRIVOP_GET_IVR
-#define        XEN_HYPER_GET_TPR               break HYPERPRIVOP_GET_TPR
-#define        XEN_HYPER_SET_TPR               break HYPERPRIVOP_SET_TPR
-#define        XEN_HYPER_EOI                   break HYPERPRIVOP_EOI
-#define        XEN_HYPER_SET_ITM               break HYPERPRIVOP_SET_ITM
-#define        XEN_HYPER_THASH                 break HYPERPRIVOP_THASH
-#define        XEN_HYPER_PTC_GA                break HYPERPRIVOP_PTC_GA
-#define        XEN_HYPER_ITR_D                 break HYPERPRIVOP_ITR_D
-#define        XEN_HYPER_GET_RR                break HYPERPRIVOP_GET_RR
-#define        XEN_HYPER_SET_RR                break HYPERPRIVOP_SET_RR
-#define        XEN_HYPER_SET_KR                break HYPERPRIVOP_SET_KR
-#define        XEN_HYPER_FC                    break HYPERPRIVOP_FC
-#define        XEN_HYPER_GET_CPUID             break HYPERPRIVOP_GET_CPUID
-#define        XEN_HYPER_GET_PMD               break HYPERPRIVOP_GET_PMD
-#define        XEN_HYPER_GET_EFLAG             break HYPERPRIVOP_GET_EFLAG
-#define        XEN_HYPER_SET_EFLAG             break HYPERPRIVOP_SET_EFLAG
-#define        XEN_HYPER_GET_PSR               break HYPERPRIVOP_GET_PSR
-
-#define XSI_IFS                        (XSI_BASE + XSI_IFS_OFS)
-#define XSI_PRECOVER_IFS       (XSI_BASE + XSI_PRECOVER_IFS_OFS)
-#define XSI_IFA                        (XSI_BASE + XSI_IFA_OFS)
-#define XSI_ISR                        (XSI_BASE + XSI_ISR_OFS)
-#define XSI_IIM                        (XSI_BASE + XSI_IIM_OFS)
-#define XSI_ITIR               (XSI_BASE + XSI_ITIR_OFS)
-#define XSI_PSR_I_ADDR         (XSI_BASE + XSI_PSR_I_ADDR_OFS)
-#define XSI_PSR_IC             (XSI_BASE + XSI_PSR_IC_OFS)
-#define XSI_IPSR               (XSI_BASE + XSI_IPSR_OFS)
-#define XSI_IIP                        (XSI_BASE + XSI_IIP_OFS)
-#define XSI_B1NAT              (XSI_BASE + XSI_B1NATS_OFS)
-#define XSI_BANK1_R16          (XSI_BASE + XSI_BANK1_R16_OFS)
-#define XSI_BANKNUM            (XSI_BASE + XSI_BANKNUM_OFS)
-#define XSI_IHA                        (XSI_BASE + XSI_IHA_OFS)
-#endif
-
-#ifndef __ASSEMBLY__
-#define        XEN_HYPER_SSM_I         asm("break %0" : : "i" (HYPERPRIVOP_SSM_I))
-#define        XEN_HYPER_GET_IVR       asm("break %0" : : "i" (HYPERPRIVOP_GET_IVR))
-
-/************************************************/
-/* Instructions paravirtualized for correctness */
-/************************************************/
-
-/* "fc" and "thash" are privilege-sensitive instructions, meaning they
- *  may have different semantics depending on whether they are executed
- *  at PL0 vs PL!=0.  When paravirtualized, these instructions mustn't
- *  be allowed to execute directly, lest incorrect semantics result. */
-extern unsigned long xen_fc(unsigned long addr);
-#define ia64_fc(addr)                  xen_fc((unsigned long)(addr))
-extern unsigned long xen_thash(unsigned long addr);
-#define ia64_thash(addr)               xen_thash((unsigned long)(addr))
-/* Note that "ttag" and "cover" are also privilege-sensitive; "ttag"
- * is not currently used (though it may be in a long-format VHPT system!)
- * and the semantics of cover only change if psr.ic is off which is very
- * rare (and currently non-existent outside of assembly code */
-
-/* There are also privilege-sensitive registers.  These registers are
- * readable at any privilege level but only writable at PL0. */
-extern unsigned long xen_get_cpuid(int index);
-#define        ia64_get_cpuid(i)               xen_get_cpuid(i)
-extern unsigned long xen_get_pmd(int index);
-#define        ia64_get_pmd(i)                 xen_get_pmd(i)
-extern unsigned long xen_get_eflag(void);      /* see xen_ia64_getreg */
-extern void xen_set_eflag(unsigned long);      /* see xen_ia64_setreg */
-
-/************************************************/
-/* Instructions paravirtualized for performance */
-/************************************************/
-
-/* Xen uses memory-mapped virtual privileged registers for access to many
- * performance-sensitive privileged registers.  Some, like the processor
- * status register (psr), are broken up into multiple memory locations.
- * Others, like "pend", are abstractions based on privileged registers.
- * "Pend" is guaranteed to be set if reading cr.ivr would return a
- * (non-spurious) interrupt. */
-#define XEN_MAPPEDREGS ((struct mapped_regs *)XMAPPEDREGS_BASE)
-#define XSI_PSR_I                      \
-       (*XEN_MAPPEDREGS->interrupt_mask_addr)
-#define xen_get_virtual_psr_i()                \
-       (!XSI_PSR_I)
-#define xen_set_virtual_psr_i(_val)    \
-       ({ XSI_PSR_I = (uint8_t)(_val) ? 0 : 1; })
-#define xen_set_virtual_psr_ic(_val)   \
-       ({ XEN_MAPPEDREGS->interrupt_collection_enabled = _val ? 1 : 0; })
-#define xen_get_virtual_pend()         \
-       (*(((uint8_t *)XEN_MAPPEDREGS->interrupt_mask_addr) - 1))
-
-/* Hyperprivops are "break" instructions with a well-defined API.
- * In particular, the virtual psr.ic bit must be off; in this way
- * it is guaranteed to never conflict with a linux break instruction.
- * Normally, this is done in a xen stub but this one is frequent enough
- * that we inline it */
-#define xen_hyper_ssm_i()                                              \
-({                                                                     \
-       XEN_HYPER_SSM_I;                                                \
-})
-
-/* turning off interrupts can be paravirtualized simply by writing
- * to a memory-mapped virtual psr.i bit (implemented as a 16-bit bool) */
-#define xen_rsm_i()    xen_set_virtual_psr_i(0)
-
-/* turning on interrupts is a bit more complicated.. write to the
- * memory-mapped virtual psr.i bit first (to avoid race condition),
- * then if any interrupts were pending, we have to execute a hyperprivop
- * to ensure the pending interrupt gets delivered; else we're done! */
-#define xen_ssm_i()                                                    \
-({                                                                     \
-       int old = xen_get_virtual_psr_i();                              \
-       if (!old) {                                                     \
-               if (xen_get_virtual_pend())                             \
-                       xen_hyper_ssm_i();                              \
-               else                                                    \
-                       xen_set_virtual_psr_i(1);                       \
-       }                                                               \
-})
-
-#define xen_ia64_intrin_local_irq_restore(x)                           \
-{                                                                      \
-     if (is_running_on_xen()) {                                                \
-       if ((x) & IA64_PSR_I) { xen_ssm_i(); }                          \
-       else { xen_rsm_i(); }                                           \
-    }                                                                  \
-    else __ia64_intrin_local_irq_restore((x));                         \
-}
-
-#define        xen_get_psr_i()                                                 \
-(                                                                      \
-       (is_running_on_xen()) ?                                         \
-               (xen_get_virtual_psr_i() ? IA64_PSR_I : 0)              \
-               : __ia64_get_psr_i()                                    \
-)
-
-#define xen_ia64_ssm(mask)                                             \
-{                                                                      \
-       if ((mask)==IA64_PSR_I) {                                       \
-               if (is_running_on_xen()) { xen_ssm_i(); }                       \
-               else { __ia64_ssm(mask); }                              \
-       }                                                               \
-       else { __ia64_ssm(mask); }                                      \
-}
-
-#define xen_ia64_rsm(mask)                                             \
-{                                                                      \
-       if ((mask)==IA64_PSR_I) {                                       \
-               if (is_running_on_xen()) { xen_rsm_i(); }                       \
-               else { __ia64_rsm(mask); }                              \
-       }                                                               \
-       else { __ia64_rsm(mask); }                                      \
-}
-
-
-/* Although all privileged operations can be left to trap and will
- * be properly handled by Xen, some are frequent enough that we use
- * hyperprivops for performance. */
-
-extern unsigned long xen_get_psr(void);
-extern unsigned long xen_get_ivr(void);
-extern unsigned long xen_get_tpr(void);
-extern void xen_set_itm(unsigned long);
-extern void xen_set_tpr(unsigned long);
-extern void xen_eoi(void);
-extern void xen_set_rr(unsigned long index, unsigned long val);
-extern unsigned long xen_get_rr(unsigned long index);
-extern void xen_set_kr(unsigned long index, unsigned long val);
-extern void xen_ptcga(unsigned long addr, unsigned long size);
-
-/* Note: It may look wrong to test for is_running_on_xen() in each case.
- * However regnum is always a constant so, as written, the compiler
- * eliminates the switch statement, whereas is_running_on_xen() must be
- * tested dynamically. */
-#define xen_ia64_getreg(regnum)                                                \
-({                                                                     \
-       __u64 ia64_intri_res;                                           \
-                                                                       \
-       switch(regnum) {                                                \
-       case _IA64_REG_PSR:                                             \
-               ia64_intri_res = (is_running_on_xen()) ?                        \
-                       xen_get_psr() :                                 \
-                       __ia64_getreg(regnum);                          \
-               break;                                                  \
-       case _IA64_REG_CR_IVR:                                          \
-               ia64_intri_res = (is_running_on_xen()) ?                        \
-                       xen_get_ivr() :                                 \
-                       __ia64_getreg(regnum);                          \
-               break;                                                  \
-       case _IA64_REG_CR_TPR:                                          \
-               ia64_intri_res = (is_running_on_xen()) ?                        \
-                       xen_get_tpr() :                                 \
-                       __ia64_getreg(regnum);                          \
-               break;                                                  \
-       case _IA64_REG_AR_EFLAG:                                        \
-               ia64_intri_res = (is_running_on_xen()) ?                        \
-                       xen_get_eflag() :                               \
-                       __ia64_getreg(regnum);                          \
-               break;                                                  \
-       default:                                                        \
-               ia64_intri_res = __ia64_getreg(regnum);                 \
-               break;                                                  \
-       }                                                               \
-       ia64_intri_res;                                                 \
-})
-
-#define xen_ia64_setreg(regnum,val)                                    \
-({                                                                     \
-       switch(regnum) {                                                \
-       case _IA64_REG_AR_KR0 ... _IA64_REG_AR_KR7:                     \
-               (is_running_on_xen()) ?                                 \
-                       xen_set_kr((regnum-_IA64_REG_AR_KR0), val) :    \
-                       __ia64_setreg(regnum,val);                      \
-               break;                                                  \
-       case _IA64_REG_CR_ITM:                                          \
-               (is_running_on_xen()) ?                                 \
-                       xen_set_itm(val) :                              \
-                       __ia64_setreg(regnum,val);                      \
-               break;                                                  \
-       case _IA64_REG_CR_TPR:                                          \
-               (is_running_on_xen()) ?                                 \
-                       xen_set_tpr(val) :                              \
-                       __ia64_setreg(regnum,val);                      \
-               break;                                                  \
-       case _IA64_REG_CR_EOI:                                          \
-               (is_running_on_xen()) ?                                 \
-                       xen_eoi() :                                     \
-                       __ia64_setreg(regnum,val);                      \
-               break;                                                  \
-       case _IA64_REG_AR_EFLAG:                                        \
-               (is_running_on_xen()) ?                                 \
-                       xen_set_eflag(val) :                            \
-                       __ia64_setreg(regnum,val);                      \
-               break;                                                  \
-       default:                                                        \
-               __ia64_setreg(regnum,val);                              \
-               break;                                                  \
-       }                                                               \
-})
-
-#define ia64_ssm                       xen_ia64_ssm
-#define ia64_rsm                       xen_ia64_rsm
-#define ia64_intrin_local_irq_restore  xen_ia64_intrin_local_irq_restore
-#define        ia64_ptcga                      xen_ptcga
-#define        ia64_set_rr(index,val)          xen_set_rr(index,val)
-#define        ia64_get_rr(index)              xen_get_rr(index)
-#define ia64_getreg                    xen_ia64_getreg
-#define ia64_setreg                    xen_ia64_setreg
-#define        ia64_get_psr_i                  xen_get_psr_i
-
-/* the remainder of these are not performance-sensitive so its
- * OK to not paravirtualize and just take a privop trap and emulate */
-#define ia64_hint                      __ia64_hint
-#define ia64_set_pmd                   __ia64_set_pmd
-#define ia64_itci                      __ia64_itci
-#define ia64_itcd                      __ia64_itcd
-#define ia64_itri                      __ia64_itri
-#define ia64_itrd                      __ia64_itrd
-#define ia64_tpa                       __ia64_tpa
-#define ia64_set_ibr                   __ia64_set_ibr
-#define ia64_set_pkr                   __ia64_set_pkr
-#define ia64_set_pmc                   __ia64_set_pmc
-#define ia64_get_ibr                   __ia64_get_ibr
-#define ia64_get_pkr                   __ia64_get_pkr
-#define ia64_get_pmc                   __ia64_get_pmc
-#define ia64_ptce                      __ia64_ptce
-#define ia64_ptcl                      __ia64_ptcl
-#define ia64_ptri                      __ia64_ptri
-#define ia64_ptrd                      __ia64_ptrd
-
-#endif /* !__ASSEMBLY__ */
-
-/* these routines utilize privilege-sensitive or performance-sensitive
- * privileged instructions so the code must be replaced with
- * paravirtualized versions */
-#define ia64_pal_halt_light            xen_pal_halt_light
-#define        ia64_leave_kernel               xen_leave_kernel
-#define        ia64_leave_syscall              xen_leave_syscall
-#define        ia64_trace_syscall              xen_trace_syscall
-#define        ia64_ret_from_clone             xen_ret_from_clone
-#define        ia64_switch_to                  xen_switch_to
-#define        ia64_pal_call_static            xen_pal_call_static
-
-#endif /* _ASM_IA64_XEN_PRIVOP_H */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h b/linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h
deleted file mode 100644 (file)
index 913f276..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2006 Tristan Gingold <tristan.gingold@bull.net>, Bull SAS
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-
-#ifndef _LINUX_XENCOMM_HCALL_H_
-#define _LINUX_XENCOMM_HCALL_H_
-
-/* These function creates inline descriptor for the parameters and
-   calls the corresponding xencomm_arch_hypercall_X.
-   Architectures should defines HYPERVISOR_xxx as xencomm_hypercall_xxx unless
-   they want to use their own wrapper.  */
-extern int xencomm_hypercall_console_io(int cmd, int count, char *str);
-
-extern int xencomm_hypercall_event_channel_op(int cmd, void *op);
-
-extern int xencomm_hypercall_xen_version(int cmd, void *arg);
-
-extern int xencomm_hypercall_physdev_op(int cmd, void *op);
-
-extern int xencomm_hypercall_grant_table_op(unsigned int cmd, void *op,
-                                            unsigned int count);
-
-extern int xencomm_hypercall_sched_op(int cmd, void *arg);
-
-extern int xencomm_hypercall_multicall(void *call_list, int nr_calls);
-
-extern int xencomm_hypercall_callback_op(int cmd, void *arg);
-
-extern int xencomm_hypercall_memory_op(unsigned int cmd, void *arg);
-
-extern unsigned long xencomm_hypercall_hvm_op(int cmd, void *arg);
-
-extern int xencomm_hypercall_suspend(unsigned long srec);
-
-extern int xencomm_hypercall_xenoprof_op(int op, void *arg);
-
-extern int xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg,
-                                        unsigned long count);
-
-extern long xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg);
-
-/* Using mini xencomm.  */
-extern int xencomm_mini_hypercall_console_io(int cmd, int count, char *str);
-
-extern int xencomm_mini_hypercall_event_channel_op(int cmd, void *op);
-
-extern int xencomm_mini_hypercall_xen_version(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_physdev_op(int cmd, void *op);
-
-extern int xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
-                                                 unsigned int count);
-
-extern int xencomm_mini_hypercall_sched_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_multicall(void *call_list, int nr_calls);
-
-extern int xencomm_mini_hypercall_callback_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg);
-
-extern unsigned long xencomm_mini_hypercall_hvm_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_xenoprof_op(int op, void *arg);
-
-extern int xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
-                                             unsigned long count);
-
-/* For privcmd.  Locally declare argument type to avoid include storm.
-   Type coherency will be checked within privcmd.c  */
-struct privcmd_hypercall;
-extern int privcmd_hypercall(struct privcmd_hypercall *hypercall);
-
-#endif /* _LINUX_XENCOMM_HCALL_H_ */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/xen/xencomm.h b/linux-2.6-xen-sparse/include/asm-ia64/xen/xencomm.h
deleted file mode 100644 (file)
index eae1136..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- */
-
-#ifndef _LINUX_XENCOMM_H_
-#define _LINUX_XENCOMM_H_
-
-#include <xen/interface/xencomm.h>
-
-#define XENCOMM_MINI_ADDRS 3
-struct xencomm_mini {
-       struct xencomm_desc _desc;
-       uint64_t address[XENCOMM_MINI_ADDRS];
-};
-
-/* Must be called before any hypercall.  */
-extern void xencomm_init (void);
-
-/* To avoid additionnal virt to phys conversion, an opaque structure is
-   presented.  */
-struct xencomm_handle;
-
-extern int xencomm_create(void *buffer, unsigned long bytes,
-                          struct xencomm_handle **desc, gfp_t type);
-extern void xencomm_free(struct xencomm_handle *desc);
-
-extern int xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
-                               void *buffer, unsigned long bytes,
-                               struct xencomm_handle **ret);
-
-/* Translate virtual address to physical address.  */
-extern unsigned long xencomm_vaddr_to_paddr(unsigned long vaddr);
-
-/* Inline version.  To be used only on linear space (kernel space).  */
-static inline struct xencomm_handle *
-xencomm_create_inline(void *buffer)
-{
-       unsigned long paddr;
-
-       paddr = xencomm_vaddr_to_paddr((unsigned long)buffer);
-       return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG);
-}
-
-#define xen_guest_handle(hnd)  ((hnd).p)
-
-#endif /* _LINUX_XENCOMM_H_ */
diff --git a/linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h b/linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h
deleted file mode 100644 (file)
index b45c6ca..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/******************************************************************************
- * asm-ia64/xenoprof.h
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-#ifndef __ASM_XENOPROF_H__
-#define __ASM_XENOPROF_H__
-#ifdef CONFIG_XEN
-
-#undef HAVE_XENOPROF_CREATE_FILES
-
-struct xenoprof_init;
-void xenoprof_arch_init_counter(struct xenoprof_init *init);
-void xenoprof_arch_counter(void);
-void xenoprof_arch_start(void);
-void xenoprof_arch_stop(void);
-
-struct xenoprof_arch_shared_buffer {
-       struct resource*        res;
-};
-
-struct xenoprof_shared_buffer;
-void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf);
-struct xenoprof_get_buffer;
-int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer,
-                                    struct xenoprof_shared_buffer* sbuf);
-struct xenoprof_passive;
-int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain,
-                              struct xenoprof_shared_buffer* sbuf);
-
-#endif /* CONFIG_XEN */
-#endif /* __ASM_XENOPROF_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-um/page.h b/linux-2.6-xen-sparse/include/asm-um/page.h
deleted file mode 100644 (file)
index 7ea7726..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
- * Copyright 2003 PathScale, Inc.
- * Licensed under the GPL
- */
-
-#ifndef __UM_PAGE_H
-#define __UM_PAGE_H
-
-struct page;
-
-#include <asm/vm-flags.h>
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT     12
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#define PAGE_MASK      (~(PAGE_SIZE-1))
-
-/*
- * These are used to make use of C type-checking..
- */
-
-#define clear_page(page)       memset((void *)(page), 0, PAGE_SIZE)
-#define copy_page(to,from)     memcpy((void *)(to), (void *)(from), PAGE_SIZE)
-
-#define clear_user_page(page, vaddr, pg)       clear_page(page)
-#define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
-
-#if defined(CONFIG_3_LEVEL_PGTABLES) && !defined(CONFIG_64BIT)
-
-typedef struct { unsigned long pte_low, pte_high; } pte_t;
-typedef struct { unsigned long long pmd; } pmd_t;
-typedef struct { unsigned long pgd; } pgd_t;
-#define pte_val(x) ((x).pte_low | ((unsigned long long) (x).pte_high << 32))
-
-#define pte_get_bits(pte, bits) ((pte).pte_low & (bits))
-#define pte_set_bits(pte, bits) ((pte).pte_low |= (bits))
-#define pte_clear_bits(pte, bits) ((pte).pte_low &= ~(bits))
-#define pte_copy(to, from) ({ (to).pte_high = (from).pte_high; \
-                             smp_wmb(); \
-                             (to).pte_low = (from).pte_low; })
-#define pte_is_zero(pte) (!((pte).pte_low & ~_PAGE_NEWPAGE) && !(pte).pte_high)
-#define pte_set_val(pte, phys, prot) \
-       ({ (pte).pte_high = (phys) >> 32; \
-          (pte).pte_low = (phys) | pgprot_val(prot); })
-
-#define pmd_val(x)     ((x).pmd)
-#define __pmd(x) ((pmd_t) { (x) } )
-
-typedef unsigned long long pfn_t;
-typedef unsigned long long phys_t;
-
-#else
-
-typedef struct { unsigned long pte; } pte_t;
-typedef struct { unsigned long pgd; } pgd_t;
-
-#ifdef CONFIG_3_LEVEL_PGTABLES
-typedef struct { unsigned long pmd; } pmd_t;
-#define pmd_val(x)     ((x).pmd)
-#define __pmd(x) ((pmd_t) { (x) } )
-#endif
-
-#define pte_val(x)     ((x).pte)
-
-
-#define pte_get_bits(p, bits) ((p).pte & (bits))
-#define pte_set_bits(p, bits) ((p).pte |= (bits))
-#define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
-#define pte_copy(to, from) ((to).pte = (from).pte)
-#define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
-#define pte_set_val(p, phys, prot) (p).pte = (phys | pgprot_val(prot))
-
-typedef unsigned long pfn_t;
-typedef unsigned long phys_t;
-
-#endif
-
-typedef struct { unsigned long pgprot; } pgprot_t;
-
-#define pgd_val(x)     ((x).pgd)
-#define pgprot_val(x)  ((x).pgprot)
-
-#define __pte(x) ((pte_t) { (x) } )
-#define __pgd(x) ((pgd_t) { (x) } )
-#define __pgprot(x)    ((pgprot_t) { (x) } )
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-extern unsigned long uml_physmem;
-
-#define PAGE_OFFSET (uml_physmem)
-#define KERNELBASE PAGE_OFFSET
-
-#define __va_space (8*1024*1024)
-
-#include "mem.h"
-
-/* Cast to unsigned long before casting to void * to avoid a warning from
- * mmap_kmem about cutting a long long down to a void *.  Not sure that
- * casting is the right thing, but 32-bit UML can't have 64-bit virtual
- * addresses
- */
-#define __pa(virt) to_phys((void *) (unsigned long) (virt))
-#define __va(phys) to_virt((unsigned long) (phys))
-
-#define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
-#define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT)
-
-#define pfn_valid(pfn) ((pfn) < max_mapnr)
-#define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
-
-extern struct page *arch_validate(struct page *page, gfp_t mask, int order);
-#define HAVE_ARCH_VALIDATE
-
-extern int arch_free_page(struct page *page, int order);
-#define HAVE_ARCH_FREE_PAGE
-
-#include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/apic.h b/linux-2.6-xen-sparse/include/asm-x86_64/apic.h
deleted file mode 100644 (file)
index 309cee9..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef __ASM_APIC_H
-#define __ASM_APIC_H
-
-#include <linux/pm.h>
-#include <asm/fixmap.h>
-#include <asm/apicdef.h>
-#include <asm/system.h>
-
-#define Dprintk(x...)
-
-/*
- * Debugging macros
- */
-#define APIC_QUIET   0
-#define APIC_VERBOSE 1
-#define APIC_DEBUG   2
-
-extern int apic_verbosity;
-extern int apic_runs_main_timer;
-
-/*
- * Define the default level of output to be very little
- * This can be turned up by using apic=verbose for more
- * information and apic=debug for _lots_ of information.
- * apic_verbosity is defined in apic.c
- */
-#define apic_printk(v, s, a...) do {       \
-               if ((v) <= apic_verbosity) \
-                       printk(s, ##a);    \
-       } while (0)
-
-#ifdef CONFIG_X86_LOCAL_APIC
-
-struct pt_regs;
-
-/*
- * Basic functions accessing APICs.
- */
-
-static __inline void apic_write(unsigned long reg, unsigned int v)
-{
-       *((volatile unsigned int *)(APIC_BASE+reg)) = v;
-}
-
-static __inline unsigned int apic_read(unsigned long reg)
-{
-       return *((volatile unsigned int *)(APIC_BASE+reg));
-}
-
-static __inline__ void apic_wait_icr_idle(void)
-{
-       while (apic_read( APIC_ICR ) & APIC_ICR_BUSY)
-               cpu_relax();
-}
-
-static inline void ack_APIC_irq(void)
-{
-       /*
-        * ack_APIC_irq() actually gets compiled as a single instruction:
-        * - a single rmw on Pentium/82489DX
-        * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
-        * ... yummie.
-        */
-
-       /* Docs say use 0 for future compatibility */
-       apic_write(APIC_EOI, 0);
-}
-
-extern int get_maxlvt (void);
-extern void clear_local_APIC (void);
-extern void connect_bsp_APIC (void);
-extern void disconnect_bsp_APIC (int virt_wire_setup);
-extern void disable_local_APIC (void);
-extern int verify_local_APIC (void);
-extern void cache_APIC_registers (void);
-extern void sync_Arb_IDs (void);
-extern void init_bsp_APIC (void);
-extern void setup_local_APIC (void);
-extern void init_apic_mappings (void);
-extern void smp_local_timer_interrupt (struct pt_regs * regs);
-extern void setup_boot_APIC_clock (void);
-extern void setup_secondary_APIC_clock (void);
-extern int APIC_init_uniprocessor (void);
-extern void disable_APIC_timer(void);
-extern void enable_APIC_timer(void);
-extern void clustered_apic_check(void);
-
-extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector,
-                                  unsigned char msg_type, unsigned char mask);
-
-#define K8_APIC_EXT_LVT_BASE    0x500
-#define K8_APIC_EXT_INT_MSG_FIX 0x0
-#define K8_APIC_EXT_INT_MSG_SMI 0x2
-#define K8_APIC_EXT_INT_MSG_NMI 0x4
-#define K8_APIC_EXT_INT_MSG_EXT 0x7
-#define K8_APIC_EXT_LVT_ENTRY_THRESHOLD    0
-
-extern int disable_timer_pin_1;
-
-
-#ifndef CONFIG_XEN
-void smp_send_timer_broadcast_ipi(void);
-void switch_APIC_timer_to_ipi(void *cpumask);
-void switch_ipi_to_APIC_timer(void *cpumask);
-
-#define ARCH_APICTIMER_STOPS_ON_C3     1
-#endif
-
-#endif /* CONFIG_X86_LOCAL_APIC */
-
-extern unsigned boot_cpu_id;
-
-#endif /* __ASM_APIC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/kexec.h b/linux-2.6-xen-sparse/include/asm-x86_64/kexec.h
deleted file mode 100644 (file)
index 3e112d9..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef _X86_64_KEXEC_H
-#define _X86_64_KEXEC_H
-
-#define PA_CONTROL_PAGE  0
-#define VA_CONTROL_PAGE  1
-#define PA_PGD           2
-#define VA_PGD           3
-#define PA_PUD_0         4
-#define VA_PUD_0         5
-#define PA_PMD_0         6
-#define VA_PMD_0         7
-#define PA_PTE_0         8
-#define VA_PTE_0         9
-#define PA_PUD_1         10
-#define VA_PUD_1         11
-#define PA_PMD_1         12
-#define VA_PMD_1         13
-#define PA_PTE_1         14
-#define VA_PTE_1         15
-#define PA_TABLE_PAGE    16
-#define PAGES_NR         17
-
-#ifndef __ASSEMBLY__
-
-#include <linux/string.h>
-
-#include <asm/page.h>
-#include <asm/ptrace.h>
-
-/*
- * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
- * I.e. Maximum page that is mapped directly into kernel memory,
- * and kmap is not required.
- *
- * So far x86_64 is limited to 40 physical address bits.
- */
-
-/* Maximum physical address we can use pages from */
-#define KEXEC_SOURCE_MEMORY_LIMIT      (0xFFFFFFFFFFUL)
-/* Maximum address we can reach in physical address mode */
-#define KEXEC_DESTINATION_MEMORY_LIMIT (0xFFFFFFFFFFUL)
-/* Maximum address we can use for the control pages */
-#define KEXEC_CONTROL_MEMORY_LIMIT     (0xFFFFFFFFFFUL)
-
-/* Allocate one page for the pdp and the second for the code */
-#define KEXEC_CONTROL_CODE_SIZE  (4096UL + 4096UL)
-
-/* The native architecture */
-#define KEXEC_ARCH KEXEC_ARCH_X86_64
-
-#define MAX_NOTE_BYTES 1024
-
-/*
- * Saving the registers of the cpu on which panic occured in
- * crash_kexec to save a valid sp. The registers of other cpus
- * will be saved in machine_crash_shutdown while shooting down them.
- */
-
-static inline void crash_setup_regs(struct pt_regs *newregs,
-                                               struct pt_regs *oldregs)
-{
-       if (oldregs)
-               memcpy(newregs, oldregs, sizeof(*newregs));
-       else {
-               __asm__ __volatile__("movq %%rbx,%0" : "=m"(newregs->rbx));
-               __asm__ __volatile__("movq %%rcx,%0" : "=m"(newregs->rcx));
-               __asm__ __volatile__("movq %%rdx,%0" : "=m"(newregs->rdx));
-               __asm__ __volatile__("movq %%rsi,%0" : "=m"(newregs->rsi));
-               __asm__ __volatile__("movq %%rdi,%0" : "=m"(newregs->rdi));
-               __asm__ __volatile__("movq %%rbp,%0" : "=m"(newregs->rbp));
-               __asm__ __volatile__("movq %%rax,%0" : "=m"(newregs->rax));
-               __asm__ __volatile__("movq %%rsp,%0" : "=m"(newregs->rsp));
-               __asm__ __volatile__("movq %%r8,%0" : "=m"(newregs->r8));
-               __asm__ __volatile__("movq %%r9,%0" : "=m"(newregs->r9));
-               __asm__ __volatile__("movq %%r10,%0" : "=m"(newregs->r10));
-               __asm__ __volatile__("movq %%r11,%0" : "=m"(newregs->r11));
-               __asm__ __volatile__("movq %%r12,%0" : "=m"(newregs->r12));
-               __asm__ __volatile__("movq %%r13,%0" : "=m"(newregs->r13));
-               __asm__ __volatile__("movq %%r14,%0" : "=m"(newregs->r14));
-               __asm__ __volatile__("movq %%r15,%0" : "=m"(newregs->r15));
-               __asm__ __volatile__("movl %%ss, %%eax;" :"=a"(newregs->ss));
-               __asm__ __volatile__("movl %%cs, %%eax;" :"=a"(newregs->cs));
-               __asm__ __volatile__("pushfq; popq %0" :"=m"(newregs->eflags));
-
-               newregs->rip = (unsigned long)current_text_addr();
-       }
-}
-
-NORET_TYPE void
-relocate_kernel(unsigned long indirection_page,
-               unsigned long page_list,
-               unsigned long start_address) ATTRIB_NORET;
-
-/* Under Xen we need to work with machine addresses. These macros give the
- * machine address of a certain page to the generic kexec code instead of 
- * the pseudo physical address which would be given by the default macros.
- */
-
-#ifdef CONFIG_XEN
-#define KEXEC_ARCH_HAS_PAGE_MACROS
-#define kexec_page_to_pfn(page)  pfn_to_mfn(page_to_pfn(page))
-#define kexec_pfn_to_page(pfn)   pfn_to_page(mfn_to_pfn(pfn))
-#define kexec_virt_to_phys(addr) virt_to_machine(addr)
-#define kexec_phys_to_virt(addr) phys_to_virt(machine_to_phys(addr))
-#endif
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _X86_64_KEXEC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/agp.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/agp.h
deleted file mode 100644 (file)
index 60c12a8..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef AGP_H
-#define AGP_H 1
-
-#include <asm/cacheflush.h>
-#include <asm/system.h>
-
-/*
- * Functions to keep the agpgart mappings coherent.
- * The GART gives the CPU a physical alias of memory. The alias is
- * mapped uncacheable. Make sure there are no conflicting mappings
- * with different cachability attributes for the same page.
- */
-
-int map_page_into_agp(struct page *page);
-int unmap_page_from_agp(struct page *page);
-#define flush_agp_mappings() global_flush_tlb()
-
-/* Could use CLFLUSH here if the cpu supports it. But then it would
-   need to be called for each cacheline of the whole page so it may not be
-   worth it. Would need a page for it. */
-#define flush_agp_cache() wbinvd()
-
-/* Convert a physical address to an address suitable for the GART. */
-#define phys_to_gart(x) phys_to_machine(x)
-#define gart_to_phys(x) machine_to_phys(x)
-
-/* GATT allocation. Returns/accepts GATT kernel virtual address. */
-#define alloc_gatt_pages(order)        ({                                          \
-       char *_t; dma_addr_t _d;                                            \
-       _t = dma_alloc_coherent(NULL,PAGE_SIZE<<(order),&_d,GFP_KERNEL);    \
-       _t; })
-#define free_gatt_pages(table, order)  \
-       dma_free_coherent(NULL,PAGE_SIZE<<(order),(table),virt_to_bus(table))
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/arch_hooks.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/arch_hooks.h
deleted file mode 100644 (file)
index 28b96a6..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _ASM_ARCH_HOOKS_H
-#define _ASM_ARCH_HOOKS_H
-
-#include <linux/interrupt.h>
-
-/*
- *     linux/include/asm/arch_hooks.h
- *
- *     define the architecture specific hooks 
- */
-
-/* these aren't arch hooks, they are generic routines
- * that can be used by the hooks */
-extern void init_ISA_irqs(void);
-extern void apic_intr_init(void);
-extern void smp_intr_init(void);
-extern irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-
-/* these are the defined hooks */
-extern void intr_init_hook(void);
-extern void pre_intr_init_hook(void);
-extern void pre_setup_arch_hook(void);
-extern void trap_init_hook(void);
-extern void time_init_hook(void);
-extern void mca_nmi_hook(void);
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/bootsetup.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/bootsetup.h
deleted file mode 100644 (file)
index 7983eec..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-
-#ifndef _X86_64_BOOTSETUP_H
-#define _X86_64_BOOTSETUP_H 1
-
-#define BOOT_PARAM_SIZE                4096
-extern char x86_boot_params[BOOT_PARAM_SIZE];
-
-/*
- * This is set up by the setup-routine at boot-time
- */
-#define PARAM  ((unsigned char *)x86_boot_params)
-#define SCREEN_INFO (*(struct screen_info *) (PARAM+0))
-#define EXT_MEM_K (*(unsigned short *) (PARAM+2))
-#define ALT_MEM_K (*(unsigned int *) (PARAM+0x1e0))
-#define E820_MAP_NR (*(char*) (PARAM+E820NR))
-#define E820_MAP    ((struct e820entry *) (PARAM+E820MAP))
-#define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40))
-#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
-#define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
-#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
-#define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
-#define SAVED_VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA))
-#define ORIG_ROOT_DEV (*(unsigned short *) (PARAM+0x1FC))
-#define AUX_DEVICE_INFO (*(unsigned char *) (PARAM+0x1FF))
-#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
-#define KERNEL_START (*(unsigned int *) (PARAM+0x214))
-
-#define INITRD_START (__pa(xen_start_info->mod_start))
-#define INITRD_SIZE (xen_start_info->mod_len)
-#define EDID_INFO   (*(struct edid_info *) (PARAM+0x440))
-
-#define EDD_NR     (*(unsigned char *) (PARAM+EDDNR))
-#define EDD_MBR_SIG_NR (*(unsigned char *) (PARAM+EDD_MBR_SIG_NR_BUF))
-#define EDD_MBR_SIGNATURE ((unsigned int *) (PARAM+EDD_MBR_SIG_BUF))
-#define EDD_BUF     ((struct edd_info *) (PARAM+EDDBUF))
-#define COMMAND_LINE saved_command_line
-
-#define RAMDISK_IMAGE_START_MASK       0x07FF
-#define RAMDISK_PROMPT_FLAG            0x8000
-#define RAMDISK_LOAD_FLAG              0x4000  
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h
deleted file mode 100644 (file)
index 00f8c41..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/* Written 2000 by Andi Kleen */ 
-#ifndef __ARCH_DESC_H
-#define __ARCH_DESC_H
-
-#include <linux/threads.h>
-#include <asm/ldt.h>
-
-#ifndef __ASSEMBLY__
-
-#include <linux/string.h>
-#include <linux/smp.h>
-
-#include <asm/segment.h>
-#include <asm/mmu.h>
-
-// 8 byte segment descriptor
-struct desc_struct { 
-       u16 limit0;
-       u16 base0;
-       unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1;
-       unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8;
-} __attribute__((packed)); 
-
-struct n_desc_struct { 
-       unsigned int a,b;
-};     
-
-enum { 
-       GATE_INTERRUPT = 0xE, 
-       GATE_TRAP = 0xF,        
-       GATE_CALL = 0xC,
-};     
-
-// 16byte gate
-struct gate_struct {          
-       u16 offset_low;
-       u16 segment; 
-       unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
-       u16 offset_middle;
-       u32 offset_high;
-       u32 zero1; 
-} __attribute__((packed));
-
-#define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) 
-#define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF)
-#define PTR_HIGH(x) ((unsigned long)(x) >> 32)
-
-enum { 
-       DESC_TSS = 0x9,
-       DESC_LDT = 0x2,
-}; 
-
-// LDT or TSS descriptor in the GDT. 16 bytes.
-struct ldttss_desc { 
-       u16 limit0;
-       u16 base0;
-       unsigned base1 : 8, type : 5, dpl : 2, p : 1;
-       unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
-       u32 base3;
-       u32 zero1; 
-} __attribute__((packed)); 
-
-struct desc_ptr {
-       unsigned short size;
-       unsigned long address;
-} __attribute__((packed)) ;
-
-extern struct desc_ptr idt_descr, cpu_gdt_descr[NR_CPUS];
-
-extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
-
-#define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8))
-#define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8))
-
-static inline void clear_LDT(void)
-{
-       int cpu = get_cpu();
-
-       /*
-        * NB. We load the default_ldt for lcall7/27 handling on demand, as
-        * it slows down context switching. Noone uses it anyway.
-        */
-       cpu = cpu;              /* XXX avoid compiler warning */
-       xen_set_ldt(0UL, 0);
-       put_cpu();
-}
-
-/*
- * This is the ldt that every process will get unless we need
- * something other than this.
- */
-extern struct desc_struct default_ldt[];
-#ifndef CONFIG_X86_NO_IDT
-extern struct gate_struct idt_table[]; 
-#endif
-extern struct desc_ptr cpu_gdt_descr[];
-
-/* the cpu gdt accessor */
-#define cpu_gdt(_cpu) ((struct desc_struct *)cpu_gdt_descr[_cpu].address)
-
-static inline void _set_gate(void *adr, unsigned type, unsigned long func, unsigned dpl, unsigned ist)  
-{
-       struct gate_struct s;   
-       s.offset_low = PTR_LOW(func); 
-       s.segment = __KERNEL_CS;
-       s.ist = ist; 
-       s.p = 1;
-       s.dpl = dpl; 
-       s.zero0 = 0;
-       s.zero1 = 0; 
-       s.type = type; 
-       s.offset_middle = PTR_MIDDLE(func); 
-       s.offset_high = PTR_HIGH(func); 
-       /* does not need to be atomic because it is only done once at setup time */ 
-       memcpy(adr, &s, 16); 
-} 
-
-#ifndef CONFIG_X86_NO_IDT
-static inline void set_intr_gate(int nr, void *func) 
-{ 
-       BUG_ON((unsigned)nr > 0xFF);
-       _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, 0); 
-} 
-
-static inline void set_intr_gate_ist(int nr, void *func, unsigned ist) 
-{ 
-       BUG_ON((unsigned)nr > 0xFF);
-       _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, ist); 
-} 
-
-static inline void set_system_gate(int nr, void *func) 
-{ 
-       BUG_ON((unsigned)nr > 0xFF);
-       _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, 0); 
-} 
-
-static inline void set_system_gate_ist(int nr, void *func, unsigned ist)
-{
-       _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, ist);
-}
-#endif
-
-static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned type, 
-                                        unsigned size) 
-{ 
-       struct ldttss_desc d;
-       memset(&d,0,sizeof(d)); 
-       d.limit0 = size & 0xFFFF;
-       d.base0 = PTR_LOW(tss); 
-       d.base1 = PTR_MIDDLE(tss) & 0xFF; 
-       d.type = type;
-       d.p = 1; 
-       d.limit1 = (size >> 16) & 0xF;
-       d.base2 = (PTR_MIDDLE(tss) >> 8) & 0xFF; 
-       d.base3 = PTR_HIGH(tss); 
-       memcpy(ptr, &d, 16); 
-}
-
-#ifndef CONFIG_X86_NO_TSS
-static inline void set_tss_desc(unsigned cpu, void *addr)
-{ 
-       /*
-        * sizeof(unsigned long) coming from an extra "long" at the end
-        * of the iobitmap. See tss_struct definition in processor.h
-        *
-        * -1? seg base+limit should be pointing to the address of the
-        * last valid byte
-        */
-       set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_TSS], 
-               (unsigned long)addr, DESC_TSS,
-               IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
-} 
-#endif
-
-static inline void set_ldt_desc(unsigned cpu, void *addr, int size)
-{ 
-       set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_LDT], (unsigned long)addr,
-                             DESC_LDT, size * 8 - 1);
-}
-
-static inline void set_seg_base(unsigned cpu, int entry, void *base)
-{ 
-       struct desc_struct *d = &cpu_gdt(cpu)[entry];
-       u32 addr = (u32)(u64)base;
-       BUG_ON((u64)base >> 32); 
-       d->base0 = addr & 0xffff;
-       d->base1 = (addr >> 16) & 0xff;
-       d->base2 = (addr >> 24) & 0xff;
-} 
-
-#define LDT_entry_a(info) \
-       ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
-/* Don't allow setting of the lm bit. It is useless anyways because 
-   64bit system calls require __USER_CS. */ 
-#define LDT_entry_b(info) \
-       (((info)->base_addr & 0xff000000) | \
-       (((info)->base_addr & 0x00ff0000) >> 16) | \
-       ((info)->limit & 0xf0000) | \
-       (((info)->read_exec_only ^ 1) << 9) | \
-       ((info)->contents << 10) | \
-       (((info)->seg_not_present ^ 1) << 15) | \
-       ((info)->seg_32bit << 22) | \
-       ((info)->limit_in_pages << 23) | \
-       ((info)->useable << 20) | \
-       /* ((info)->lm << 21) | */ \
-       0x7000)
-
-#define LDT_empty(info) (\
-       (info)->base_addr       == 0    && \
-       (info)->limit           == 0    && \
-       (info)->contents        == 0    && \
-       (info)->read_exec_only  == 1    && \
-       (info)->seg_32bit       == 0    && \
-       (info)->limit_in_pages  == 0    && \
-       (info)->seg_not_present == 1    && \
-       (info)->useable         == 0    && \
-       (info)->lm              == 0)
-
-#if TLS_SIZE != 24
-# error update this code.
-#endif
-
-static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
-{
-#if 0
-       u64 *gdt = (u64 *)(cpu_gdt(cpu) + GDT_ENTRY_TLS_MIN);
-       gdt[0] = t->tls_array[0];
-       gdt[1] = t->tls_array[1];
-       gdt[2] = t->tls_array[2];
-#endif
-#define C(i) \
-       HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + i]), t->tls_array[i])
-
-       C(0); C(1); C(2);
-#undef C
-} 
-
-/*
- * load one particular LDT into the current CPU
- */
-static inline void load_LDT_nolock (mm_context_t *pc, int cpu)
-{
-       void *segments = pc->ldt;
-       int count = pc->size;
-
-       if (likely(!count))
-               segments = NULL;
-
-       xen_set_ldt((unsigned long)segments, count);
-}
-
-static inline void load_LDT(mm_context_t *pc)
-{
-       int cpu = get_cpu();
-       load_LDT_nolock(pc, cpu);
-       put_cpu();
-}
-
-extern struct desc_ptr idt_descr;
-
-#endif /* !__ASSEMBLY__ */
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/dma-mapping.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/dma-mapping.h
deleted file mode 100644 (file)
index ae33eb3..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-#ifndef _X8664_DMA_MAPPING_H
-#define _X8664_DMA_MAPPING_H 1
-
-/*
- * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
- * documentation.
- */
-
-
-#include <asm/scatterlist.h>
-#include <asm/io.h>
-#include <asm/swiotlb.h>
-
-struct dma_mapping_ops {
-       int             (*mapping_error)(dma_addr_t dma_addr);
-       void*           (*alloc_coherent)(struct device *dev, size_t size,
-                                dma_addr_t *dma_handle, gfp_t gfp);
-       void            (*free_coherent)(struct device *dev, size_t size,
-                                void *vaddr, dma_addr_t dma_handle);
-       dma_addr_t      (*map_single)(struct device *hwdev, void *ptr,
-                                size_t size, int direction);
-       /* like map_single, but doesn't check the device mask */
-       dma_addr_t      (*map_simple)(struct device *hwdev, char *ptr,
-                                size_t size, int direction);
-       void            (*unmap_single)(struct device *dev, dma_addr_t addr,
-                               size_t size, int direction);
-       void            (*sync_single_for_cpu)(struct device *hwdev,
-                               dma_addr_t dma_handle, size_t size,
-                               int direction);
-       void            (*sync_single_for_device)(struct device *hwdev,
-                                dma_addr_t dma_handle, size_t size,
-                               int direction);
-       void            (*sync_single_range_for_cpu)(struct device *hwdev,
-                                dma_addr_t dma_handle, unsigned long offset,
-                               size_t size, int direction);
-       void            (*sync_single_range_for_device)(struct device *hwdev,
-                               dma_addr_t dma_handle, unsigned long offset,
-                               size_t size, int direction);
-       void            (*sync_sg_for_cpu)(struct device *hwdev,
-                                struct scatterlist *sg, int nelems,
-                               int direction);
-       void            (*sync_sg_for_device)(struct device *hwdev,
-                               struct scatterlist *sg, int nelems,
-                               int direction);
-       int             (*map_sg)(struct device *hwdev, struct scatterlist *sg,
-                               int nents, int direction);
-       void            (*unmap_sg)(struct device *hwdev,
-                               struct scatterlist *sg, int nents,
-                               int direction);
-       int             (*dma_supported)(struct device *hwdev, u64 mask);
-       int             is_phys;
-};
-
-extern dma_addr_t bad_dma_address;
-extern struct dma_mapping_ops* dma_ops;
-extern int iommu_merge;
-
-static inline int valid_dma_direction(int dma_direction)
-{
-       return ((dma_direction == DMA_BIDIRECTIONAL) ||
-               (dma_direction == DMA_TO_DEVICE) ||
-               (dma_direction == DMA_FROM_DEVICE));
-}
-
-#if 0
-static inline int dma_mapping_error(dma_addr_t dma_addr)
-{
-       if (dma_ops->mapping_error)
-               return dma_ops->mapping_error(dma_addr);
-
-       return (dma_addr == bad_dma_address);
-}
-
-extern void *dma_alloc_coherent(struct device *dev, size_t size,
-                               dma_addr_t *dma_handle, gfp_t gfp);
-extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-                             dma_addr_t dma_handle);
-
-static inline dma_addr_t
-dma_map_single(struct device *hwdev, void *ptr, size_t size,
-              int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       return dma_ops->map_single(hwdev, ptr, size, direction);
-}
-
-static inline void
-dma_unmap_single(struct device *dev, dma_addr_t addr,size_t size,
-                int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       dma_ops->unmap_single(dev, addr, size, direction);
-}
-
-#define dma_map_page(dev,page,offset,size,dir) \
-       dma_map_single((dev), page_address(page)+(offset), (size), (dir))
-
-#define dma_unmap_page dma_unmap_single
-
-static inline void
-dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle,
-                       size_t size, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_single_for_cpu)
-               dma_ops->sync_single_for_cpu(hwdev, dma_handle, size,
-                                            direction);
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle,
-                          size_t size, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_single_for_device)
-               dma_ops->sync_single_for_device(hwdev, dma_handle, size,
-                                               direction);
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle,
-                             unsigned long offset, size_t size, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_single_range_for_cpu) {
-               dma_ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, size, direction);
-       }
-
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle,
-                                unsigned long offset, size_t size, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_single_range_for_device)
-               dma_ops->sync_single_range_for_device(hwdev, dma_handle,
-                                                     offset, size, direction);
-
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg,
-                   int nelems, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_sg_for_cpu)
-               dma_ops->sync_sg_for_cpu(hwdev, sg, nelems, direction);
-       flush_write_buffers();
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
-                      int nelems, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       if (dma_ops->sync_sg_for_device) {
-               dma_ops->sync_sg_for_device(hwdev, sg, nelems, direction);
-       }
-
-       flush_write_buffers();
-}
-
-static inline int
-dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       return dma_ops->map_sg(hwdev, sg, nents, direction);
-}
-
-static inline void
-dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-            int direction)
-{
-       BUG_ON(!valid_dma_direction(direction));
-       dma_ops->unmap_sg(hwdev, sg, nents, direction);
-}
-
-extern int dma_supported(struct device *hwdev, u64 mask);
-
-/* same for gart, swiotlb, and nommu */
-static inline int dma_get_cache_alignment(void)
-{
-       return boot_cpu_data.x86_clflush_size;
-}
-
-#define dma_is_consistent(h) 1
-
-extern int dma_set_mask(struct device *dev, u64 mask);
-
-static inline void
-dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction dir)
-{
-       flush_write_buffers();
-}
-
-extern struct device fallback_dev;
-extern int panic_on_overflow;
-#endif
-
-#endif /* _X8664_DMA_MAPPING_H */
-
-#include <asm-i386/mach-xen/asm/dma-mapping.h>
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/e820.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/e820.h
deleted file mode 100644 (file)
index c15bf3f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * structures and definitions for the int 15, ax=e820 memory map
- * scheme.
- *
- * In a nutshell, setup.S populates a scratch table in the
- * empty_zero_block that contains a list of usable address/size
- * duples.  setup.c, this information is transferred into the e820map,
- * and in init.c/numa.c, that new information is used to mark pages
- * reserved or not.
- */
-#ifndef __E820_HEADER
-#define __E820_HEADER
-
-#include <linux/mmzone.h>
-
-#define E820MAP        0x2d0           /* our map */
-#define E820MAX        128             /* number of entries in E820MAP */
-#define E820NR 0x1e8           /* # entries in E820MAP */
-
-#define E820_RAM       1
-#define E820_RESERVED  2
-#define E820_ACPI      3 /* usable as RAM once ACPI tables have been read */
-#define E820_NVS       4
-
-#define HIGH_MEMORY    (1024*1024)
-
-#define LOWMEMSIZE()   (0x9f000)
-
-#ifndef __ASSEMBLY__
-struct e820entry {
-       u64 addr;       /* start of memory segment */
-       u64 size;       /* size of memory segment */
-       u32 type;       /* type of memory segment */
-} __attribute__((packed));
-
-struct e820map {
-    int nr_map;
-       struct e820entry map[E820MAX];
-};
-
-extern unsigned long find_e820_area(unsigned long start, unsigned long end, 
-                                   unsigned size);
-extern void add_memory_region(unsigned long start, unsigned long size, 
-                             int type);
-extern void setup_memory_region(void);
-extern void contig_e820_setup(void); 
-extern unsigned long e820_end_of_ram(void);
-extern void e820_reserve_resources(struct e820entry *e820, int nr_map);
-extern void e820_print_map(char *who);
-extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type);
-extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type);
-
-extern void e820_bootmem_free(pg_data_t *pgdat, unsigned long start,unsigned long end);
-extern void e820_setup_gap(struct e820entry *e820, int nr_map);
-extern unsigned long e820_hole_size(unsigned long start_pfn,
-                                   unsigned long end_pfn);
-
-extern void __init parse_memopt(char *p, char **end);
-extern void __init parse_memmapopt(char *p, char **end);
-
-extern struct e820map e820;
-
-extern unsigned ebda_addr, ebda_size;
-#endif/*!__ASSEMBLY__*/
-
-#endif/*__E820_HEADER*/
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/fixmap.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/fixmap.h
deleted file mode 100644 (file)
index 3e4d0da..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * fixmap.h: compile-time virtual memory allocation
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1998 Ingo Molnar
- */
-
-#ifndef _ASM_FIXMAP_H
-#define _ASM_FIXMAP_H
-
-#include <linux/kernel.h>
-#include <asm/apicdef.h>
-#include <asm/page.h>
-#include <asm/vsyscall.h>
-#include <asm/vsyscall32.h>
-#include <asm/acpi.h>
-
-/*
- * Here we define all the compile-time 'special' virtual
- * addresses. The point is to have a constant address at
- * compile time, but to set the physical address only
- * in the boot process.
- *
- * these 'compile-time allocated' memory buffers are
- * fixed-size 4k pages. (or larger if used with an increment
- * highger than 1) use fixmap_set(idx,phys) to associate
- * physical memory with fixmap indices.
- *
- * TLB entries of such buffers will not be flushed across
- * task switches.
- */
-
-enum fixed_addresses {
-       VSYSCALL_LAST_PAGE,
-       VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
-       VSYSCALL_HPET,
-       FIX_HPET_BASE,
-#ifdef CONFIG_X86_LOCAL_APIC
-       FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
-#endif
-#ifdef CONFIG_X86_IO_APIC
-       FIX_IO_APIC_BASE_0,
-       FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
-#endif
-#ifdef CONFIG_ACPI
-       FIX_ACPI_BEGIN,
-       FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-#endif
-       FIX_SHARED_INFO,
-#define NR_FIX_ISAMAPS 256
-       FIX_ISAMAP_END,
-       FIX_ISAMAP_BEGIN = FIX_ISAMAP_END + NR_FIX_ISAMAPS - 1,
-       __end_of_permanent_fixed_addresses,
-       /* temporary boot-time mappings, used before ioremap() is functional */
-#define NR_FIX_BTMAPS  16
-       FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
-       FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
-       __end_of_fixed_addresses
-};
-
-extern void __set_fixmap (enum fixed_addresses idx,
-                                       unsigned long phys, pgprot_t flags);
-
-#define set_fixmap(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL)
-/*
- * Some hardware wants to get fixmapped without caching.
- */
-#define set_fixmap_nocache(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-
-#define clear_fixmap(idx) \
-                __set_fixmap(idx, 0, __pgprot(0))
-
-#define FIXADDR_TOP    (VSYSCALL_END-PAGE_SIZE)
-#define FIXADDR_SIZE   (__end_of_fixed_addresses << PAGE_SHIFT)
-#define FIXADDR_START  (FIXADDR_TOP - FIXADDR_SIZE)
-
-/* Only covers 32bit vsyscalls currently. Need another set for 64bit. */
-#define FIXADDR_USER_START     ((unsigned long)VSYSCALL32_VSYSCALL)
-#define FIXADDR_USER_END       (FIXADDR_USER_START + PAGE_SIZE)
-
-#define __fix_to_virt(x)       (FIXADDR_TOP - ((x) << PAGE_SHIFT))
-
-extern void __this_fixmap_does_not_exist(void);
-
-/*
- * 'index to address' translation. If anyone tries to use the idx
- * directly without translation, we catch the bug with a NULL-deference
- * kernel oops. Illegal ranges of incoming indices are caught too.
- */
-static __always_inline unsigned long fix_to_virt(const unsigned int idx)
-{
-       /*
-        * this branch gets completely eliminated after inlining,
-        * except when someone tries to use fixaddr indices in an
-        * illegal way. (such as mixing up address types or using
-        * out-of-range indices).
-        *
-        * If it doesn't get removed, the linker will complain
-        * loudly with a reasonably clear error message..
-        */
-       if (idx >= __end_of_fixed_addresses)
-               __this_fixmap_does_not_exist();
-
-        return __fix_to_virt(idx);
-}
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/floppy.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/floppy.h
deleted file mode 100644 (file)
index e7893c5..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Architecture specific parts of the Floppy driver
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1995
- *
- * Modifications for Xen are Copyright (c) 2004, Keir Fraser.
- */
-#ifndef __ASM_XEN_X86_64_FLOPPY_H
-#define __ASM_XEN_X86_64_FLOPPY_H
-
-#include <linux/vmalloc.h>
-
-/*
- * The DMA channel used by the floppy controller cannot access data at
- * addresses >= 16MB
- *
- * Went back to the 1MB limit, as some people had problems with the floppy
- * driver otherwise. It doesn't matter much for performance anyway, as most
- * floppy accesses go through the track buffer.
- */
-#define _CROSS_64KB(a,s,vdma) \
-(!(vdma) && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))
-
-/* XEN: Hit DMA paths on the head. This trick from asm-m68k/floppy.h. */
-#include <asm/dma.h>
-#undef MAX_DMA_ADDRESS
-#define MAX_DMA_ADDRESS 0
-#define CROSS_64KB(a,s) (0)
-
-#define fd_inb(port)                   inb_p(port)
-#define fd_outb(value,port)            outb_p(value,port)
-
-#define fd_request_dma()        (0)
-#define fd_free_dma()           ((void)0)
-#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
-#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
-#define fd_free_irq()          free_irq(FLOPPY_IRQ, NULL)
-#define fd_get_dma_residue()    vdma_get_dma_residue(FLOPPY_DMA)
-/*
- * Do not use vmalloc/vfree: floppy_release_irq_and_dma() gets called from
- * softirq context via motor_off_callback. A generic bug we happen to trigger.
- */
-#define fd_dma_mem_alloc(size) __get_free_pages(GFP_KERNEL|__GFP_NORETRY, get_order(size))
-#define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
-#define fd_dma_setup(addr, size, mode, io) vdma_dma_setup(addr, size, mode, io)
-
-static int virtual_dma_count;
-static int virtual_dma_residue;
-static char *virtual_dma_addr;
-static int virtual_dma_mode;
-static int doing_pdma;
-
-static irqreturn_t floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
-{
-       register unsigned char st;
-
-#undef TRACE_FLPY_INT
-
-#ifdef TRACE_FLPY_INT
-       static int calls=0;
-       static int bytes=0;
-       static int dma_wait=0;
-#endif
-       if (!doing_pdma)
-               return floppy_interrupt(irq, dev_id, regs);
-
-#ifdef TRACE_FLPY_INT
-       if(!calls)
-               bytes = virtual_dma_count;
-#endif
-
-       {
-               register int lcount;
-               register char *lptr;
-
-               st = 1;
-               for(lcount=virtual_dma_count, lptr=virtual_dma_addr; 
-                   lcount; lcount--, lptr++) {
-                       st=inb(virtual_dma_port+4) & 0xa0 ;
-                       if(st != 0xa0) 
-                               break;
-                       if(virtual_dma_mode)
-                               outb_p(*lptr, virtual_dma_port+5);
-                       else
-                               *lptr = inb_p(virtual_dma_port+5);
-               }
-               virtual_dma_count = lcount;
-               virtual_dma_addr = lptr;
-               st = inb(virtual_dma_port+4);
-       }
-
-#ifdef TRACE_FLPY_INT
-       calls++;
-#endif
-       if(st == 0x20)
-               return IRQ_HANDLED;
-       if(!(st & 0x20)) {
-               virtual_dma_residue += virtual_dma_count;
-               virtual_dma_count=0;
-#ifdef TRACE_FLPY_INT
-               printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n", 
-                      virtual_dma_count, virtual_dma_residue, calls, bytes,
-                      dma_wait);
-               calls = 0;
-               dma_wait=0;
-#endif
-               doing_pdma = 0;
-               floppy_interrupt(irq, dev_id, regs);
-               return IRQ_HANDLED;
-       }
-#ifdef TRACE_FLPY_INT
-       if(!virtual_dma_count)
-               dma_wait++;
-#endif
-       return IRQ_HANDLED;
-}
-
-static void fd_disable_dma(void)
-{
-       doing_pdma = 0;
-       virtual_dma_residue += virtual_dma_count;
-       virtual_dma_count=0;
-}
-
-static int vdma_get_dma_residue(unsigned int dummy)
-{
-       return virtual_dma_count + virtual_dma_residue;
-}
-
-
-static int fd_request_irq(void)
-{
-       return request_irq(FLOPPY_IRQ, floppy_hardint,
-                          IRQF_DISABLED, "floppy", NULL);
-}
-
-#if 0
-static unsigned long vdma_mem_alloc(unsigned long size)
-{
-       return (unsigned long) vmalloc(size);
-
-}
-
-static void vdma_mem_free(unsigned long addr, unsigned long size)
-{
-       vfree((void *)addr);
-}
-#endif
-
-static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
-{
-       doing_pdma = 1;
-       virtual_dma_port = io;
-       virtual_dma_mode = (mode  == DMA_MODE_WRITE);
-       virtual_dma_addr = addr;
-       virtual_dma_count = size;
-       virtual_dma_residue = 0;
-       return 0;
-}
-
-/* XEN: This trick to force 'virtual DMA' is from include/asm-m68k/floppy.h. */
-#define FDC1 xen_floppy_init()
-static int FDC2 = -1;
-
-static int xen_floppy_init(void)
-{
-       use_virtual_dma = 1;
-       can_use_virtual_dma = 1;
-       return 0x3f0;
-}
-
-/*
- * Floppy types are stored in the rtc's CMOS RAM and so rtc_lock
- * is needed to prevent corrupted CMOS RAM in case "insmod floppy"
- * coincides with another rtc CMOS user.               Paul G.
- */
-#define FLOPPY0_TYPE   ({                              \
-       unsigned long flags;                            \
-       unsigned char val;                              \
-       spin_lock_irqsave(&rtc_lock, flags);            \
-       val = (CMOS_READ(0x10) >> 4) & 15;              \
-       spin_unlock_irqrestore(&rtc_lock, flags);       \
-       val;                                            \
-})
-
-#define FLOPPY1_TYPE   ({                              \
-       unsigned long flags;                            \
-       unsigned char val;                              \
-       spin_lock_irqsave(&rtc_lock, flags);            \
-       val = CMOS_READ(0x10) & 15;                     \
-       spin_unlock_irqrestore(&rtc_lock, flags);       \
-       val;                                            \
-})
-
-#define N_FDC 2
-#define N_DRIVE 8
-
-#define FLOPPY_MOTOR_MASK 0xf0
-
-#define EXTRA_FLOPPY_PARAMS
-
-#endif /* __ASM_XEN_X86_64_FLOPPY_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hw_irq.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hw_irq.h
deleted file mode 100644 (file)
index 3ce0bbc..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef _ASM_HW_IRQ_H
-#define _ASM_HW_IRQ_H
-
-/*
- *     linux/include/asm/hw_irq.h
- *
- *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
- *
- *     moved some of the old arch/i386/kernel/irq.h to here. VY
- *
- *     IRQ/IPI changes taken from work by Thomas Radke
- *     <tomsoft@informatik.tu-chemnitz.de>
- *
- *     hacked by Andi Kleen for x86-64.
- */
-
-#ifndef __ASSEMBLY__
-#include <asm/atomic.h>
-#include <asm/irq.h>
-#include <linux/profile.h>
-#include <linux/smp.h>
-
-struct hw_interrupt_type;
-#endif
-
-#define NMI_VECTOR             0x02
-/*
- * IDT vectors usable for external interrupt sources start
- * at 0x20:
- */
-#define FIRST_EXTERNAL_VECTOR  0x20
-
-#define IA32_SYSCALL_VECTOR    0x80
-
-
-/*
- * Vectors 0x20-0x2f are used for ISA interrupts.
- */
-
-/*
- * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
- *
- *  some of the following vectors are 'rare', they are merged
- *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
- *  TLB, reschedule and local APIC vectors are performance-critical.
- */
-#ifndef CONFIG_XEN
-#define SPURIOUS_APIC_VECTOR   0xff
-#define ERROR_APIC_VECTOR      0xfe
-#define RESCHEDULE_VECTOR      0xfd
-#define CALL_FUNCTION_VECTOR   0xfc
-/* fb free - please don't readd KDB here because it's useless
-   (hint - think what a NMI bit does to a vector) */
-#define THERMAL_APIC_VECTOR    0xfa
-#define THRESHOLD_APIC_VECTOR   0xf9
-/* f8 free */
-#define INVALIDATE_TLB_VECTOR_END      0xf7
-#define INVALIDATE_TLB_VECTOR_START    0xf0    /* f0-f7 used for TLB flush */
-
-#define NUM_INVALIDATE_TLB_VECTORS     8
-#endif
-
-/*
- * Local APIC timer IRQ vector is on a different priority level,
- * to work around the 'lost local interrupt if more than 2 IRQ
- * sources per level' errata.
- */
-#define LOCAL_TIMER_VECTOR     0xef
-
-/*
- * First APIC vector available to drivers: (vectors 0x30-0xee)
- * we start at 0x31 to spread out vectors evenly between priority
- * levels. (0x80 is the syscall vector)
- */
-#define FIRST_DEVICE_VECTOR    0x31
-#define FIRST_SYSTEM_VECTOR    0xef   /* duplicated in irq.h */
-
-
-#ifndef __ASSEMBLY__
-extern u8 irq_vector[NR_IRQ_VECTORS];
-#define IO_APIC_VECTOR(irq)    (irq_vector[irq])
-#define AUTO_ASSIGN            -1
-
-/*
- * Various low-level irq details needed by irq.c, process.c,
- * time.c, io_apic.c and smp.c
- *
- * Interrupt entry/exit code at both C and assembly level
- */
-
-extern void disable_8259A_irq(unsigned int irq);
-extern void enable_8259A_irq(unsigned int irq);
-extern int i8259A_irq_pending(unsigned int irq);
-extern void make_8259A_irq(unsigned int irq);
-extern void init_8259A(int aeoi);
-extern void FASTCALL(send_IPI_self(int vector));
-extern void init_VISWS_APIC_irqs(void);
-extern void setup_IO_APIC(void);
-extern void disable_IO_APIC(void);
-extern void print_IO_APIC(void);
-extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
-extern void send_IPI(int dest, int vector);
-extern void setup_ioapic_dest(void);
-
-extern unsigned long io_apic_irqs;
-
-extern atomic_t irq_err_count;
-extern atomic_t irq_mis_count;
-
-#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
-
-#define __STR(x) #x
-#define STR(x) __STR(x)
-
-#include <asm/ptrace.h>
-
-#define IRQ_NAME2(nr) nr##_interrupt(void)
-#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)
-
-/*
- *     SMP has a few special interrupts for IPI messages
- */
-
-#define BUILD_IRQ(nr) \
-asmlinkage void IRQ_NAME(nr); \
-__asm__( \
-"\n.p2align\n" \
-"IRQ" #nr "_interrupt:\n\t" \
-       "push $~(" #nr ") ; " \
-       "jmp common_interrupt");
-
-#define platform_legacy_irq(irq)       ((irq) < 16)
-
-#endif
-
-#endif /* _ASM_HW_IRQ_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h
deleted file mode 100644 (file)
index 0f4aa7f..0000000
+++ /dev/null
@@ -1,406 +0,0 @@
-/******************************************************************************
- * hypercall.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * 64-bit updates:
- *   Benjamin Liu <benjamin.liu@intel.com>
- *   Jun Nakajima <jun.nakajima@intel.com>
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERCALL_H__
-#define __HYPERCALL_H__
-
-#include <linux/string.h> /* memcpy() */
-
-#ifndef __HYPERVISOR_H__
-# error "please don't include this file directly"
-#endif
-
-#define __STR(x) #x
-#define STR(x) __STR(x)
-
-#ifdef CONFIG_XEN
-#define HYPERCALL_STR(name)                                    \
-       "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
-#else
-#define HYPERCALL_STR(name)                                    \
-       "mov hypercall_stubs,%%rax; "                           \
-       "add $("STR(__HYPERVISOR_##name)" * 32),%%rax; "        \
-       "call *%%rax"
-#endif
-
-#define _hypercall0(type, name)                        \
-({                                             \
-       long __res;                             \
-       asm volatile (                          \
-               HYPERCALL_STR(name)             \
-               : "=a" (__res)                  \
-               :                               \
-               : "memory" );                   \
-       (type)__res;                            \
-})
-
-#define _hypercall1(type, name, a1)                            \
-({                                                             \
-       long __res, __ign1;                                     \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=D" (__ign1)                   \
-               : "1" ((long)(a1))                              \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall2(type, name, a1, a2)                                \
-({                                                             \
-       long __res, __ign1, __ign2;                             \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=D" (__ign1), "=S" (__ign2)    \
-               : "1" ((long)(a1)), "2" ((long)(a2))            \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall3(type, name, a1, a2, a3)                    \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3;                     \
-       asm volatile (                                          \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-               "=d" (__ign3)                                   \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3))                                \
-               : "memory" );                                   \
-       (type)__res;                                            \
-})
-
-#define _hypercall4(type, name, a1, a2, a3, a4)                        \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3;                     \
-       asm volatile (                                          \
-               "movq %7,%%r10; "                               \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-               "=d" (__ign3)                                   \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3)), "g" ((long)(a4))              \
-               : "memory", "r10" );                            \
-       (type)__res;                                            \
-})
-
-#define _hypercall5(type, name, a1, a2, a3, a4, a5)            \
-({                                                             \
-       long __res, __ign1, __ign2, __ign3;                     \
-       asm volatile (                                          \
-               "movq %7,%%r10; movq %8,%%r8; "                 \
-               HYPERCALL_STR(name)                             \
-               : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-               "=d" (__ign3)                                   \
-               : "1" ((long)(a1)), "2" ((long)(a2)),           \
-               "3" ((long)(a3)), "g" ((long)(a4)),             \
-               "g" ((long)(a5))                                \
-               : "memory", "r10", "r8" );                      \
-       (type)__res;                                            \
-})
-
-static inline int
-HYPERVISOR_set_trap_table(
-       trap_info_t *table)
-{
-       return _hypercall1(int, set_trap_table, table);
-}
-
-static inline int
-HYPERVISOR_mmu_update(
-       mmu_update_t *req, int count, int *success_count, domid_t domid)
-{
-       return _hypercall4(int, mmu_update, req, count, success_count, domid);
-}
-
-static inline int
-HYPERVISOR_mmuext_op(
-       struct mmuext_op *op, int count, int *success_count, domid_t domid)
-{
-       return _hypercall4(int, mmuext_op, op, count, success_count, domid);
-}
-
-static inline int
-HYPERVISOR_set_gdt(
-       unsigned long *frame_list, int entries)
-{
-       return _hypercall2(int, set_gdt, frame_list, entries);
-}
-
-static inline int
-HYPERVISOR_stack_switch(
-       unsigned long ss, unsigned long esp)
-{
-       return _hypercall2(int, stack_switch, ss, esp);
-}
-
-static inline int
-HYPERVISOR_set_callbacks(
-       unsigned long event_address, unsigned long failsafe_address, 
-       unsigned long syscall_address)
-{
-       return _hypercall3(int, set_callbacks,
-                          event_address, failsafe_address, syscall_address);
-}
-
-static inline int
-HYPERVISOR_fpu_taskswitch(
-       int set)
-{
-       return _hypercall1(int, fpu_taskswitch, set);
-}
-
-static inline int
-HYPERVISOR_sched_op_compat(
-       int cmd, unsigned long arg)
-{
-       return _hypercall2(int, sched_op_compat, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_sched_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, sched_op, cmd, arg);
-}
-
-static inline long
-HYPERVISOR_set_timer_op(
-       u64 timeout)
-{
-       return _hypercall1(long, set_timer_op, timeout);
-}
-
-static inline int
-HYPERVISOR_platform_op(
-       struct xen_platform_op *platform_op)
-{
-       platform_op->interface_version = XENPF_INTERFACE_VERSION;
-       return _hypercall1(int, platform_op, platform_op);
-}
-
-static inline int
-HYPERVISOR_set_debugreg(
-       int reg, unsigned long value)
-{
-       return _hypercall2(int, set_debugreg, reg, value);
-}
-
-static inline unsigned long
-HYPERVISOR_get_debugreg(
-       int reg)
-{
-       return _hypercall1(unsigned long, get_debugreg, reg);
-}
-
-static inline int
-HYPERVISOR_update_descriptor(
-       unsigned long ma, unsigned long word)
-{
-       return _hypercall2(int, update_descriptor, ma, word);
-}
-
-static inline int
-HYPERVISOR_memory_op(
-       unsigned int cmd, void *arg)
-{
-       return _hypercall2(int, memory_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_multicall(
-       multicall_entry_t *call_list, int nr_calls)
-{
-       return _hypercall2(int, multicall, call_list, nr_calls);
-}
-
-static inline int
-HYPERVISOR_update_va_mapping(
-       unsigned long va, pte_t new_val, unsigned long flags)
-{
-       return _hypercall3(int, update_va_mapping, va, new_val.pte, flags);
-}
-
-static inline int
-HYPERVISOR_event_channel_op(
-       int cmd, void *arg)
-{
-       int rc = _hypercall2(int, event_channel_op, cmd, arg);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               struct evtchn_op op;
-               op.cmd = cmd;
-               memcpy(&op.u, arg, sizeof(op.u));
-               rc = _hypercall1(int, event_channel_op_compat, &op);
-               memcpy(arg, &op.u, sizeof(op.u));
-       }
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_acm_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, acm_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_xen_version(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, xen_version, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_console_io(
-       int cmd, int count, char *str)
-{
-       return _hypercall3(int, console_io, cmd, count, str);
-}
-
-static inline int
-HYPERVISOR_physdev_op(
-       int cmd, void *arg)
-{
-       int rc = _hypercall2(int, physdev_op, cmd, arg);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (unlikely(rc == -ENOSYS)) {
-               struct physdev_op op;
-               op.cmd = cmd;
-               memcpy(&op.u, arg, sizeof(op.u));
-               rc = _hypercall1(int, physdev_op_compat, &op);
-               memcpy(arg, &op.u, sizeof(op.u));
-       }
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_grant_table_op(
-       unsigned int cmd, void *uop, unsigned int count)
-{
-       return _hypercall3(int, grant_table_op, cmd, uop, count);
-}
-
-static inline int
-HYPERVISOR_update_va_mapping_otherdomain(
-       unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
-{
-       return _hypercall4(int, update_va_mapping_otherdomain, va,
-                          new_val.pte, flags, domid);
-}
-
-static inline int
-HYPERVISOR_vm_assist(
-       unsigned int cmd, unsigned int type)
-{
-       return _hypercall2(int, vm_assist, cmd, type);
-}
-
-static inline int
-HYPERVISOR_vcpu_op(
-       int cmd, int vcpuid, void *extra_args)
-{
-       return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
-}
-
-static inline int
-HYPERVISOR_set_segment_base(
-       int reg, unsigned long value)
-{
-       return _hypercall2(int, set_segment_base, reg, value);
-}
-
-static inline int
-HYPERVISOR_suspend(
-       unsigned long srec)
-{
-       struct sched_shutdown sched_shutdown = {
-               .reason = SHUTDOWN_suspend
-       };
-
-       int rc = _hypercall3(int, sched_op, SCHEDOP_shutdown,
-                            &sched_shutdown, srec);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = _hypercall3(int, sched_op_compat, SCHEDOP_shutdown,
-                                SHUTDOWN_suspend, srec);
-#endif
-
-       return rc;
-}
-
-static inline int
-HYPERVISOR_nmi_op(
-       unsigned long op, void *arg)
-{
-       return _hypercall2(int, nmi_op, op, arg);
-}
-
-static inline unsigned long
-HYPERVISOR_hvm_op(
-    int op, void *arg)
-{
-    return _hypercall2(unsigned long, hvm_op, op, arg);
-}
-
-static inline int
-HYPERVISOR_callback_op(
-       int cmd, void *arg)
-{
-       return _hypercall2(int, callback_op, cmd, arg);
-}
-
-static inline int
-HYPERVISOR_xenoprof_op(
-       int op, void *arg)
-{
-       return _hypercall2(int, xenoprof_op, op, arg);
-}
-
-static inline int
-HYPERVISOR_kexec_op(
-       unsigned long op, void *args)
-{
-       return _hypercall2(int, kexec_op, op, args);
-}
-
-#endif /* __HYPERCALL_H__ */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypervisor.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypervisor.h
deleted file mode 100644 (file)
index cbfa5a3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#include <asm-i386/mach-xen/asm/hypervisor.h>
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h
deleted file mode 100644 (file)
index d92cbd5..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-#ifndef _ASM_IO_H
-#define _ASM_IO_H
-
-#include <asm/fixmap.h>
-
-/*
- * This file contains the definitions for the x86 IO instructions
- * inb/inw/inl/outb/outw/outl and the "string versions" of the same
- * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
- * versions of the single-IO instructions (inb_p/inw_p/..).
- *
- * This file is not meant to be obfuscating: it's just complicated
- * to (a) handle it all in a way that makes gcc able to optimize it
- * as well as possible and (b) trying to avoid writing the same thing
- * over and over again with slight variations and possibly making a
- * mistake somewhere.
- */
-
-/*
- * Thanks to James van Artsdalen for a better timing-fix than
- * the two short jumps: using outb's to a nonexistent port seems
- * to guarantee better timings even on fast machines.
- *
- * On the other hand, I'd like to be sure of a non-existent port:
- * I feel a bit unsafe about using 0x80 (should be safe, though)
- *
- *             Linus
- */
-
- /*
-  *  Bit simplified and optimized by Jan Hubicka
-  *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999.
-  *
-  *  isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added,
-  *  isa_read[wl] and isa_write[wl] fixed
-  *  - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
-  */
-
-#define __SLOW_DOWN_IO "\noutb %%al,$0x80"
-
-#ifdef REALLY_SLOW_IO
-#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO
-#else
-#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO
-#endif
-
-/*
- * Talk about misusing macros..
- */
-#define __OUT1(s,x) \
-static inline void out##s(unsigned x value, unsigned short port) {
-
-#define __OUT2(s,s1,s2) \
-__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1"
-
-#define __OUT(s,s1,x) \
-__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \
-__OUT1(s##_p,x) __OUT2(s,s1,"w") __FULL_SLOW_DOWN_IO : : "a" (value), "Nd" (port));} \
-
-#define __IN1(s) \
-static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v;
-
-#define __IN2(s,s1,s2) \
-__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0"
-
-#define __IN(s,s1,i...) \
-__IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
-__IN1(s##_p) __IN2(s,s1,"w") __FULL_SLOW_DOWN_IO : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
-
-#define __INS(s) \
-static inline void ins##s(unsigned short port, void * addr, unsigned long count) \
-{ __asm__ __volatile__ ("rep ; ins" #s \
-: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
-
-#define __OUTS(s) \
-static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \
-{ __asm__ __volatile__ ("rep ; outs" #s \
-: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
-
-#define RETURN_TYPE unsigned char
-__IN(b,"")
-#undef RETURN_TYPE
-#define RETURN_TYPE unsigned short
-__IN(w,"")
-#undef RETURN_TYPE
-#define RETURN_TYPE unsigned int
-__IN(l,"")
-#undef RETURN_TYPE
-
-__OUT(b,"b",char)
-__OUT(w,"w",short)
-__OUT(l,,int)
-
-__INS(b)
-__INS(w)
-__INS(l)
-
-__OUTS(b)
-__OUTS(w)
-__OUTS(l)
-
-#define IO_SPACE_LIMIT 0xffff
-
-#if defined(__KERNEL__) && __x86_64__
-
-#include <linux/vmalloc.h>
-
-#ifndef __i386__
-/*
- * Change virtual addresses to physical addresses and vv.
- * These are pretty trivial
- */
-static inline unsigned long virt_to_phys(volatile void * address)
-{
-       return __pa(address);
-}
-
-static inline void * phys_to_virt(unsigned long address)
-{
-       return __va(address);
-}
-
-#define virt_to_bus(_x) phys_to_machine(__pa(_x))
-#define bus_to_virt(_x) __va(machine_to_phys(_x))
-#endif
-
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-#define page_to_phys(page)      (phys_to_machine(page_to_pseudophys(page)))
-#define page_to_bus(page)       (phys_to_machine(page_to_pseudophys(page)))
-
-#define bio_to_pseudophys(bio)  (page_to_pseudophys(bio_page((bio))) + \
-                                 (unsigned long) bio_offset((bio)))
-#define bvec_to_pseudophys(bv)  (page_to_pseudophys((bv)->bv_page) + \
-                                 (unsigned long) (bv)->bv_offset)
-
-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2)      \
-       (((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) && \
-        ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) == \
-         bvec_to_pseudophys((vec2))))
-
-#include <asm-generic/iomap.h>
-
-extern void __iomem *__ioremap(unsigned long offset, unsigned long size, unsigned long flags);
-
-static inline void __iomem * ioremap (unsigned long offset, unsigned long size)
-{
-       return __ioremap(offset, size, 0);
-}
-
-extern void *bt_ioremap(unsigned long addr, unsigned long size);
-extern void bt_iounmap(void *addr, unsigned long size);
-#define early_ioremap bt_ioremap
-#define early_iounmap bt_iounmap
-
-/*
- * This one maps high address device memory and turns off caching for that area.
- * it's useful if some control registers are in such an area and write combining
- * or read caching is not desirable:
- */
-extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
-extern void iounmap(volatile void __iomem *addr);
-
-/*
- * ISA I/O bus memory addresses are 1:1 with the physical address.
- */
-
-#define isa_virt_to_bus(_x) isa_virt_to_bus_is_UNSUPPORTED->x
-#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->x
-#define isa_bus_to_virt(_x) (void *)(__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x))
-
-/*
- * However PCI ones are not necessarily 1:1 and therefore these interfaces
- * are forbidden in portable PCI drivers.
- *
- * Allow them on x86 for legacy drivers, though.
- */
-#define virt_to_bus(_x) phys_to_machine(__pa(_x))
-#define bus_to_virt(_x) __va(machine_to_phys(_x))
-
-/*
- * readX/writeX() are used to access memory mapped devices. On some
- * architectures the memory mapped IO stuff needs to be accessed
- * differently. On the x86 architecture, we just read/write the
- * memory location directly.
- */
-
-static inline __u8 __readb(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u8 *)addr;
-}
-static inline __u16 __readw(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u16 *)addr;
-}
-static __always_inline __u32 __readl(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u32 *)addr;
-}
-static inline __u64 __readq(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u64 *)addr;
-}
-#define readb(x) __readb(x)
-#define readw(x) __readw(x)
-#define readl(x) __readl(x)
-#define readq(x) __readq(x)
-#define readb_relaxed(a) readb(a)
-#define readw_relaxed(a) readw(a)
-#define readl_relaxed(a) readl(a)
-#define readq_relaxed(a) readq(a)
-#define __raw_readb readb
-#define __raw_readw readw
-#define __raw_readl readl
-#define __raw_readq readq
-
-#define mmiowb()
-
-static inline void __writel(__u32 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u32 *)addr = b;
-}
-static inline void __writeq(__u64 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u64 *)addr = b;
-}
-static inline void __writeb(__u8 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u8 *)addr = b;
-}
-static inline void __writew(__u16 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u16 *)addr = b;
-}
-#define writeq(val,addr) __writeq((val),(addr))
-#define writel(val,addr) __writel((val),(addr))
-#define writew(val,addr) __writew((val),(addr))
-#define writeb(val,addr) __writeb((val),(addr))
-#define __raw_writeb writeb
-#define __raw_writew writew
-#define __raw_writel writel
-#define __raw_writeq writeq
-
-void __memcpy_fromio(void*,unsigned long,unsigned);
-void __memcpy_toio(unsigned long,const void*,unsigned);
-
-static inline void memcpy_fromio(void *to, const volatile void __iomem *from, unsigned len)
-{
-       __memcpy_fromio(to,(unsigned long)from,len);
-}
-static inline void memcpy_toio(volatile void __iomem *to, const void *from, unsigned len)
-{
-       __memcpy_toio((unsigned long)to,from,len);
-}
-
-void memset_io(volatile void __iomem *a, int b, size_t c);
-
-/*
- * ISA space is 'always mapped' on a typical x86 system, no need to
- * explicitly ioremap() it. The fact that the ISA IO space is mapped
- * to PAGE_OFFSET is pure coincidence - it does not mean ISA values
- * are physical addresses. The following constant pointer can be
- * used as the IO-area pointer (it can be iounmapped as well, so the
- * analogy with PCI is quite large):
- */
-#define __ISA_IO_base ((char __iomem *)(fix_to_virt(FIX_ISAMAP_BEGIN)))
-
-/*
- * Again, x86-64 does not require mem IO specific function.
- */
-
-#define eth_io_copy_and_sum(a,b,c,d)           eth_copy_and_sum((a),(void *)(b),(c),(d))
-
-/**
- *     check_signature         -       find BIOS signatures
- *     @io_addr: mmio address to check 
- *     @signature:  signature block
- *     @length: length of signature
- *
- *     Perform a signature comparison with the mmio address io_addr. This
- *     address should have been obtained by ioremap.
- *     Returns 1 on a match.
- */
-static inline int check_signature(void __iomem *io_addr,
-       const unsigned char *signature, int length)
-{
-       int retval = 0;
-       do {
-               if (readb(io_addr) != *signature)
-                       goto out;
-               io_addr++;
-               signature++;
-               length--;
-       } while (length);
-       retval = 1;
-out:
-       return retval;
-}
-
-/* Nothing to do */
-
-#define dma_cache_inv(_start,_size)            do { } while (0)
-#define dma_cache_wback(_start,_size)          do { } while (0)
-#define dma_cache_wback_inv(_start,_size)      do { } while (0)
-
-#define flush_write_buffers() 
-
-extern int iommu_bio_merge;
-#define BIO_VMERGE_BOUNDARY iommu_bio_merge
-
-/*
- * Convert a physical pointer to a virtual kernel pointer for /dev/mem
- * access
- */
-#define xlate_dev_mem_ptr(p, sz)       ioremap(p, sz)
-#define xlate_dev_mem_ptr_unmap(p)     iounmap(p)
-
-/*
- * Convert a virtual cached pointer to an uncached pointer
- */
-#define xlate_dev_kmem_ptr(p)  p
-
-#endif /* __KERNEL__ */
-
-#define ARCH_HAS_DEV_MEM
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irq.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irq.h
deleted file mode 100644 (file)
index f489bf5..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _ASM_IRQ_H
-#define _ASM_IRQ_H
-
-/*
- *     linux/include/asm/irq.h
- *
- *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
- *
- *     IRQ/IPI changes taken from work by Thomas Radke
- *     <tomsoft@informatik.tu-chemnitz.de>
- */
-
-#include <linux/sched.h>
-/* include comes from machine specific directory */
-#include "irq_vectors.h"
-#include <asm/thread_info.h>
-
-static __inline__ int irq_canonicalize(int irq)
-{
-       return ((irq == 2) ? 9 : irq);
-}
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#define ARCH_HAS_NMI_WATCHDOG          /* See include/linux/nmi.h */
-#endif
-
-#define KDB_VECTOR     0xf9
-
-# define irq_ctx_init(cpu) do { } while (0)
-
-#ifdef CONFIG_HOTPLUG_CPU
-#include <linux/cpumask.h>
-extern void fixup_irqs(cpumask_t map);
-#endif
-
-#define __ARCH_HAS_DO_SOFTIRQ 1
-
-#endif /* _ASM_IRQ_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irqflags.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/irqflags.h
deleted file mode 100644 (file)
index 45dff0f..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * include/asm-x86_64/irqflags.h
- *
- * IRQ flags handling
- *
- * This file gets included from lowlevel asm headers too, to provide
- * wrapped versions of the local_irq_*() APIs, based on the
- * raw_local_irq_*() functions from the lowlevel headers.
- */
-#ifndef _ASM_IRQFLAGS_H
-#define _ASM_IRQFLAGS_H
-
-#ifndef __ASSEMBLY__
-/*
- * Interrupt control:
- */
-
-/*
- * The use of 'barrier' in the following reflects their use as local-lock
- * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
- * critical operations are executed. All critical operations must complete
- * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also
- * includes these barriers, for example.
- */
-
-#define __raw_local_save_flags() (current_vcpu_info()->evtchn_upcall_mask)
-
-#define raw_local_save_flags(flags) \
-               do { (flags) = __raw_local_save_flags(); } while (0)
-
-#define raw_local_irq_restore(x)                                       \
-do {                                                                   \
-       vcpu_info_t *_vcpu;                                             \
-       barrier();                                                      \
-       _vcpu = current_vcpu_info();            \
-       if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                   \
-               barrier(); /* unmask then check (avoid races) */        \
-               if ( unlikely(_vcpu->evtchn_upcall_pending) )           \
-                       force_evtchn_callback();                        \
-       }                                                               \
-} while (0)
-
-#ifdef CONFIG_X86_VSMP
-
-/*
- * Interrupt control for the VSMP architecture:
- */
-
-static inline void raw_local_irq_disable(void)
-{
-       unsigned long flags = __raw_local_save_flags();
-
-       raw_local_irq_restore((flags & ~(1 << 9)) | (1 << 18));
-}
-
-static inline void raw_local_irq_enable(void)
-{
-       unsigned long flags = __raw_local_save_flags();
-
-       raw_local_irq_restore((flags | (1 << 9)) & ~(1 << 18));
-}
-
-static inline int raw_irqs_disabled_flags(unsigned long flags)
-{
-       return !(flags & (1<<9)) || (flags & (1 << 18));
-}
-
-#else /* CONFIG_X86_VSMP */
-
-#define raw_local_irq_disable()                                                \
-do {                                                                   \
-       current_vcpu_info()->evtchn_upcall_mask = 1;                                    \
-       barrier();                                                      \
-} while (0)
-
-#define raw_local_irq_enable()                                         \
-do {                                                                   \
-       vcpu_info_t *_vcpu;                                             \
-       barrier();                                                      \
-       _vcpu = current_vcpu_info();            \
-       _vcpu->evtchn_upcall_mask = 0;                                  \
-       barrier(); /* unmask then check (avoid races) */                \
-       if ( unlikely(_vcpu->evtchn_upcall_pending) )                   \
-               force_evtchn_callback();                                \
-} while (0)
-
-static inline int raw_irqs_disabled_flags(unsigned long flags)
-{
-       return (flags != 0);
-}
-
-#endif
-
-/*
- * For spinlocks, etc.:
- */
-
-#define __raw_local_irq_save()                                         \
-({                                                                     \
-       unsigned long flags = __raw_local_save_flags();                 \
-                                                                       \
-       raw_local_irq_disable();                                        \
-                                                                       \
-       flags;                                                          \
-})
-
-#define raw_local_irq_save(flags) \
-               do { (flags) = __raw_local_irq_save(); } while (0)
-
-#define raw_irqs_disabled()                                            \
-({                                                                     \
-       unsigned long flags = __raw_local_save_flags();                 \
-                                                                       \
-       raw_irqs_disabled_flags(flags);                                 \
-})
-
-/*
- * Used in the idle loop; sti takes one instruction cycle
- * to complete:
- */
-void raw_safe_halt(void);
-
-/*
- * Used when interrupts are already enabled or to
- * shutdown the processor:
- */
-void halt(void);
-
-#else /* __ASSEMBLY__: */
-# ifdef CONFIG_TRACE_IRQFLAGS
-#  define TRACE_IRQS_ON                call trace_hardirqs_on_thunk
-#  define TRACE_IRQS_OFF       call trace_hardirqs_off_thunk
-# else
-#  define TRACE_IRQS_ON
-#  define TRACE_IRQS_OFF
-# endif
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h
deleted file mode 100644 (file)
index 0524e2c..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-#ifndef _X86_64_MADDR_H
-#define _X86_64_MADDR_H
-
-#include <xen/features.h>
-#include <xen/interface/xen.h>
-
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY      (~0UL)
-#define FOREIGN_FRAME_BIT      (1UL<<63)
-#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
-
-/* Definitions for machine and pseudophysical addresses. */
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-
-#ifdef CONFIG_XEN
-
-extern unsigned long *phys_to_machine_mapping;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int   machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return pfn;
-       BUG_ON(end_pfn && pfn >= end_pfn);
-       return phys_to_machine_mapping[pfn] & ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return 1;
-       BUG_ON(end_pfn && pfn >= end_pfn);
-       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
-       unsigned long pfn;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return mfn;
-
-       if (unlikely((mfn >> machine_to_phys_order) != 0))
-               return end_pfn;
-
-       /* The array access can fail (e.g., device space beyond end of RAM). */
-       asm (
-               "1:     movq %1,%0\n"
-               "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:     movq %2,%0\n"
-               "       jmp  2b\n"
-               ".previous\n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 8\n"
-               "       .quad 1b,3b\n"
-               ".previous"
-               : "=r" (pfn)
-               : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) );
-
-       return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- *  1. If the MFN is an I/O page then Xen will set the m2p entry
- *     to be outside our maximum possible pseudophys range.
- *  2. If the MFN belongs to a different domain then we will certainly
- *     not have MFN in our p2m table. Conversely, if the page is ours,
- *     then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- *      require. In all the cases we care about, the FOREIGN_FRAME bit is
- *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
-       unsigned long pfn = mfn_to_pfn(mfn);
-       if ((pfn < end_pfn)
-           && !xen_feature(XENFEAT_auto_translated_physmap)
-           && (phys_to_machine_mapping[pfn] != mfn))
-               return end_pfn; /* force !pfn_valid() */
-       return pfn;
-}
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-       BUG_ON(end_pfn && pfn >= end_pfn);
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-               return;
-       }
-       phys_to_machine_mapping[pfn] = mfn;
-}
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
-       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-       return machine;
-}
-
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
-       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-       return phys;
-}
-
-static inline paddr_t pte_phys_to_machine(paddr_t phys)
-{
-       maddr_t machine;
-       machine = pfn_to_mfn((phys & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PHYSICAL_PAGE_MASK);
-       return machine;
-}
-
-static inline paddr_t pte_machine_to_phys(maddr_t machine)
-{
-       paddr_t phys;
-       phys = mfn_to_pfn((machine & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PHYSICAL_PAGE_MASK);
-       return phys;
-}
-
-#define __pte_ma(x)     ((pte_t) { (x) } )
-#define pfn_pte_ma(pfn, prot)  __pte_ma((((pfn) << PAGE_SHIFT) | pgprot_val(prot)) & __supported_pte_mask)
-
-#else /* !CONFIG_XEN */
-
-#define pfn_to_mfn(pfn) (pfn)
-#define mfn_to_pfn(mfn) (mfn)
-#define mfn_to_local_pfn(mfn) (mfn)
-#define set_phys_to_machine(pfn, mfn) ((void)0)
-#define phys_to_machine_mapping_valid(pfn) (1)
-#define phys_to_machine(phys) ((maddr_t)(phys))
-#define machine_to_phys(mach) ((paddr_t)(mach))
-#define pfn_pte_ma(pfn, prot) pfn_pte(pfn, prot)
-#define __pte_ma(x) __pte(x)
-
-#endif /* !CONFIG_XEN */
-
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
-#endif /* _X86_64_MADDR_H */
-
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu.h
deleted file mode 100644 (file)
index 2ac8252..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef __x86_64_MMU_H
-#define __x86_64_MMU_H
-
-#include <linux/spinlock.h>
-#include <asm/semaphore.h>
-
-/*
- * The x86_64 doesn't have a mmu context, but
- * we put the segment information here.
- *
- * cpu_vm_mask is used to optimize ldt flushing.
- */
-typedef struct { 
-       void *ldt;
-       rwlock_t ldtlock; 
-       int size;
-       struct semaphore sem; 
-#ifdef CONFIG_XEN
-       unsigned pinned:1;
-       unsigned has_foreign_mappings:1;
-       struct list_head unpinned;
-#endif
-} mm_context_t;
-
-#ifdef CONFIG_XEN
-extern struct list_head mm_unpinned;
-extern spinlock_t mm_unpinned_lock;
-
-/* mm/memory.c:exit_mmap hook */
-extern void _arch_exit_mmap(struct mm_struct *mm);
-#define arch_exit_mmap(_mm) _arch_exit_mmap(_mm)
-
-/* kernel/fork.c:dup_mmap hook */
-extern void _arch_dup_mmap(struct mm_struct *mm);
-#define arch_dup_mmap(mm, oldmm) ((void)(oldmm), _arch_dup_mmap(mm))
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu_context.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu_context.h
deleted file mode 100644 (file)
index e0a03bf..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef __X86_64_MMU_CONTEXT_H
-#define __X86_64_MMU_CONTEXT_H
-
-#include <asm/desc.h>
-#include <asm/atomic.h>
-#include <asm/pgalloc.h>
-#include <asm/page.h>
-#include <asm/pda.h>
-#include <asm/pgtable.h>
-#include <asm/tlbflush.h>
-
-/*
- * possibly do the LDT unload here?
- */
-int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
-void destroy_context(struct mm_struct *mm);
-
-static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-{
-#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-       if (read_pda(mmu_state) == TLBSTATE_OK) 
-               write_pda(mmu_state, TLBSTATE_LAZY);
-#endif
-}
-
-#define prepare_arch_switch(next)      __prepare_arch_switch()
-
-static inline void __prepare_arch_switch(void)
-{
-       /*
-        * Save away %es, %ds, %fs and %gs. Must happen before reload
-        * of cr3/ldt (i.e., not in __switch_to).
-        */
-       __asm__ __volatile__ (
-               "mov %%es,%0 ; mov %%ds,%1 ; mov %%fs,%2 ; mov %%gs,%3"
-               : "=m" (current->thread.es),
-                 "=m" (current->thread.ds),
-                 "=m" (current->thread.fsindex),
-                 "=m" (current->thread.gsindex) );
-
-       if (current->thread.ds)
-               __asm__ __volatile__ ( "movl %0,%%ds" : : "r" (0) );
-
-       if (current->thread.es)
-               __asm__ __volatile__ ( "movl %0,%%es" : : "r" (0) );
-
-       if (current->thread.fsindex) {
-               __asm__ __volatile__ ( "movl %0,%%fs" : : "r" (0) );
-               current->thread.fs = 0;
-       }
-
-       if (current->thread.gsindex) {
-               load_gs_index(0);
-               current->thread.gs = 0;
-       }
-}
-
-extern void mm_pin(struct mm_struct *mm);
-extern void mm_unpin(struct mm_struct *mm);
-void mm_pin_all(void);
-
-static inline void load_cr3(pgd_t *pgd)
-{
-       asm volatile("movq %0,%%cr3" :: "r" (phys_to_machine(__pa(pgd))) :
-                    "memory");
-}
-
-static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, 
-                            struct task_struct *tsk)
-{
-       unsigned cpu = smp_processor_id();
-       struct mmuext_op _op[3], *op = _op;
-
-       if (likely(prev != next)) {
-               BUG_ON(!xen_feature(XENFEAT_writable_page_tables) &&
-                      !next->context.pinned);
-
-               /* stop flush ipis for the previous mm */
-               cpu_clear(cpu, prev->cpu_vm_mask);
-#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-               write_pda(mmu_state, TLBSTATE_OK);
-               write_pda(active_mm, next);
-#endif
-               cpu_set(cpu, next->cpu_vm_mask);
-
-               /* load_cr3(next->pgd) */
-               op->cmd = MMUEXT_NEW_BASEPTR;
-               op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
-               op++;
-
-               /* xen_new_user_pt(__pa(__user_pgd(next->pgd))) */
-               op->cmd = MMUEXT_NEW_USER_BASEPTR;
-               op->arg1.mfn = pfn_to_mfn(__pa(__user_pgd(next->pgd)) >> PAGE_SHIFT);
-               op++;
-               
-               if (unlikely(next->context.ldt != prev->context.ldt)) {
-                       /* load_LDT_nolock(&next->context, cpu) */
-                       op->cmd = MMUEXT_SET_LDT;
-                       op->arg1.linear_addr = (unsigned long)next->context.ldt;
-                       op->arg2.nr_ents     = next->context.size;
-                       op++;
-               }
-
-               BUG_ON(HYPERVISOR_mmuext_op(_op, op-_op, NULL, DOMID_SELF));
-       }
-#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-       else {
-               write_pda(mmu_state, TLBSTATE_OK);
-               if (read_pda(active_mm) != next)
-                       out_of_line_bug();
-               if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
-                       /* We were in lazy tlb mode and leave_mm disabled 
-                        * tlb flush IPI delivery. We must reload CR3
-                        * to make sure to use no freed page tables.
-                        */
-                        load_cr3(next->pgd);
-                        xen_new_user_pt(__pa(__user_pgd(next->pgd)));          
-                       load_LDT_nolock(&next->context, cpu);
-               }
-       }
-#endif
-}
-
-#define deactivate_mm(tsk,mm)  do { \
-       load_gs_index(0); \
-       asm volatile("movl %0,%%fs"::"r"(0));  \
-} while(0)
-
-static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
-{
-       if (!next->context.pinned)
-               mm_pin(next);
-       switch_mm(prev, next, NULL);
-}
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/msr.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/msr.h
deleted file mode 100644 (file)
index 5628de7..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-#ifndef X86_64_MSR_H
-#define X86_64_MSR_H 1
-
-#ifndef __ASSEMBLY__
-/*
- * Access to machine-specific registers (available on 586 and better only)
- * Note: the rd* operations modify the parameters directly (without using
- * pointer indirection), this allows gcc to optimize better
- */
-
-#define rdmsr(msr,val1,val2) \
-       __asm__ __volatile__("rdmsr" \
-                           : "=a" (val1), "=d" (val2) \
-                           : "c" (msr))
-
-
-#define rdmsrl(msr,val) do { unsigned long a__,b__; \
-       __asm__ __volatile__("rdmsr" \
-                           : "=a" (a__), "=d" (b__) \
-                           : "c" (msr)); \
-       val = a__ | (b__<<32); \
-} while(0)
-
-#define wrmsr(msr,val1,val2) \
-     __asm__ __volatile__("wrmsr" \
-                         : /* no outputs */ \
-                         : "c" (msr), "a" (val1), "d" (val2))
-
-#define wrmsrl(msr,val) wrmsr(msr,(__u32)((__u64)(val)),((__u64)(val))>>32) 
-
-/* wrmsr with exception handling */
-#define wrmsr_safe(msr,a,b) ({ int ret__;                      \
-       asm volatile("2: wrmsr ; xorl %0,%0\n"                  \
-                    "1:\n\t"                                   \
-                    ".section .fixup,\"ax\"\n\t"               \
-                    "3:  movl %4,%0 ; jmp 1b\n\t"              \
-                    ".previous\n\t"                            \
-                    ".section __ex_table,\"a\"\n"              \
-                    "   .align 8\n\t"                          \
-                    "   .quad  2b,3b\n\t"                      \
-                    ".previous"                                \
-                    : "=a" (ret__)                             \
-                    : "c" (msr), "0" (a), "d" (b), "i" (-EFAULT)); \
-       ret__; })
-
-#define checking_wrmsrl(msr,val) wrmsr_safe(msr,(u32)(val),(u32)((val)>>32))
-
-#define rdmsr_safe(msr,a,b) \
-       ({ int ret__;                                           \
-         asm volatile ("1:       rdmsr\n"                      \
-                      "2:\n"                                   \
-                      ".section .fixup,\"ax\"\n"               \
-                      "3:       movl %4,%0\n"                  \
-                      " jmp 2b\n"                              \
-                      ".previous\n"                            \
-                      ".section __ex_table,\"a\"\n"            \
-                      " .align 8\n"                            \
-                      " .quad 1b,3b\n"                         \
-                      ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b))\
-                      :"c"(msr), "i"(-EIO), "0"(0));           \
-         ret__; })             
-
-#define rdtsc(low,high) \
-     __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
-
-#define rdtscl(low) \
-     __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx")
-
-#define rdtscll(val) do { \
-     unsigned int __a,__d; \
-     asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \
-     (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \
-} while(0)
-
-#define write_tsc(val1,val2) wrmsr(0x10, val1, val2)
-
-#define rdpmc(counter,low,high) \
-     __asm__ __volatile__("rdpmc" \
-                         : "=a" (low), "=d" (high) \
-                         : "c" (counter))
-
-static inline void cpuid(int op, unsigned int *eax, unsigned int *ebx,
-                        unsigned int *ecx, unsigned int *edx)
-{
-       __asm__(XEN_CPUID
-               : "=a" (*eax),
-                 "=b" (*ebx),
-                 "=c" (*ecx),
-                 "=d" (*edx)
-               : "0" (op));
-}
-
-/* Some CPUID calls want 'count' to be placed in ecx */
-static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
-               int *edx)
-{
-       __asm__(XEN_CPUID
-               : "=a" (*eax),
-                 "=b" (*ebx),
-                 "=c" (*ecx),
-                 "=d" (*edx)
-               : "0" (op), "c" (count));
-}
-
-/*
- * CPUID functions returning a single datum
- */
-static inline unsigned int cpuid_eax(unsigned int op)
-{
-       unsigned int eax;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax)
-               : "0" (op)
-               : "bx", "cx", "dx");
-       return eax;
-}
-static inline unsigned int cpuid_ebx(unsigned int op)
-{
-       unsigned int eax, ebx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=b" (ebx)
-               : "0" (op)
-               : "cx", "dx" );
-       return ebx;
-}
-static inline unsigned int cpuid_ecx(unsigned int op)
-{
-       unsigned int eax, ecx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=c" (ecx)
-               : "0" (op)
-               : "bx", "dx" );
-       return ecx;
-}
-static inline unsigned int cpuid_edx(unsigned int op)
-{
-       unsigned int eax, edx;
-
-       __asm__(XEN_CPUID
-               : "=a" (eax), "=d" (edx)
-               : "0" (op)
-               : "bx", "cx");
-       return edx;
-}
-
-#define MSR_IA32_UCODE_WRITE           0x79
-#define MSR_IA32_UCODE_REV             0x8b
-
-
-#endif
-
-/* AMD/K8 specific MSRs */ 
-#define MSR_EFER 0xc0000080            /* extended feature register */
-#define MSR_STAR 0xc0000081            /* legacy mode SYSCALL target */
-#define MSR_LSTAR 0xc0000082           /* long mode SYSCALL target */
-#define MSR_CSTAR 0xc0000083           /* compatibility mode SYSCALL target */
-#define MSR_SYSCALL_MASK 0xc0000084    /* EFLAGS mask for syscall */
-#define MSR_FS_BASE 0xc0000100         /* 64bit GS base */
-#define MSR_GS_BASE 0xc0000101         /* 64bit FS base */
-#define MSR_KERNEL_GS_BASE  0xc0000102 /* SwapGS GS shadow (or USER_GS from kernel) */ 
-/* EFER bits: */ 
-#define _EFER_SCE 0  /* SYSCALL/SYSRET */
-#define _EFER_LME 8  /* Long mode enable */
-#define _EFER_LMA 10 /* Long mode active (read-only) */
-#define _EFER_NX 11  /* No execute enable */
-
-#define EFER_SCE (1<<_EFER_SCE)
-#define EFER_LME (1<<_EFER_LME)
-#define EFER_LMA (1<<_EFER_LMA)
-#define EFER_NX (1<<_EFER_NX)
-
-/* Intel MSRs. Some also available on other CPUs */
-#define MSR_IA32_TSC           0x10
-#define MSR_IA32_PLATFORM_ID   0x17
-
-#define MSR_IA32_PERFCTR0      0xc1
-#define MSR_IA32_PERFCTR1      0xc2
-
-#define MSR_MTRRcap            0x0fe
-#define MSR_IA32_BBL_CR_CTL        0x119
-
-#define MSR_IA32_SYSENTER_CS   0x174
-#define MSR_IA32_SYSENTER_ESP  0x175
-#define MSR_IA32_SYSENTER_EIP  0x176
-
-#define MSR_IA32_MCG_CAP       0x179
-#define MSR_IA32_MCG_STATUS        0x17a
-#define MSR_IA32_MCG_CTL       0x17b
-
-#define MSR_IA32_EVNTSEL0      0x186
-#define MSR_IA32_EVNTSEL1      0x187
-
-#define MSR_IA32_DEBUGCTLMSR       0x1d9
-#define MSR_IA32_LASTBRANCHFROMIP  0x1db
-#define MSR_IA32_LASTBRANCHTOIP        0x1dc
-#define MSR_IA32_LASTINTFROMIP     0x1dd
-#define MSR_IA32_LASTINTTOIP       0x1de
-
-#define MSR_MTRRfix64K_00000   0x250
-#define MSR_MTRRfix16K_80000   0x258
-#define MSR_MTRRfix16K_A0000   0x259
-#define MSR_MTRRfix4K_C0000    0x268
-#define MSR_MTRRfix4K_C8000    0x269
-#define MSR_MTRRfix4K_D0000    0x26a
-#define MSR_MTRRfix4K_D8000    0x26b
-#define MSR_MTRRfix4K_E0000    0x26c
-#define MSR_MTRRfix4K_E8000    0x26d
-#define MSR_MTRRfix4K_F0000    0x26e
-#define MSR_MTRRfix4K_F8000    0x26f
-#define MSR_MTRRdefType                0x2ff
-
-#define MSR_IA32_MC0_CTL       0x400
-#define MSR_IA32_MC0_STATUS        0x401
-#define MSR_IA32_MC0_ADDR      0x402
-#define MSR_IA32_MC0_MISC      0x403
-
-#define MSR_P6_PERFCTR0                        0xc1
-#define MSR_P6_PERFCTR1                        0xc2
-#define MSR_P6_EVNTSEL0                        0x186
-#define MSR_P6_EVNTSEL1                        0x187
-
-/* K7/K8 MSRs. Not complete. See the architecture manual for a more complete list. */
-#define MSR_K7_EVNTSEL0            0xC0010000
-#define MSR_K7_PERFCTR0            0xC0010004
-#define MSR_K7_EVNTSEL1            0xC0010001
-#define MSR_K7_PERFCTR1            0xC0010005
-#define MSR_K7_EVNTSEL2            0xC0010002
-#define MSR_K7_PERFCTR2            0xC0010006
-#define MSR_K7_EVNTSEL3            0xC0010003
-#define MSR_K7_PERFCTR3            0xC0010007
-#define MSR_K8_TOP_MEM1                   0xC001001A
-#define MSR_K8_TOP_MEM2                   0xC001001D
-#define MSR_K8_SYSCFG             0xC0010010
-#define MSR_K8_HWCR               0xC0010015
-
-/* K6 MSRs */
-#define MSR_K6_EFER                    0xC0000080
-#define MSR_K6_STAR                    0xC0000081
-#define MSR_K6_WHCR                    0xC0000082
-#define MSR_K6_UWCCR                   0xC0000085
-#define MSR_K6_PSOR                    0xC0000087
-#define MSR_K6_PFIR                    0xC0000088
-
-/* Centaur-Hauls/IDT defined MSRs. */
-#define MSR_IDT_FCR1                   0x107
-#define MSR_IDT_FCR2                   0x108
-#define MSR_IDT_FCR3                   0x109
-#define MSR_IDT_FCR4                   0x10a
-
-#define MSR_IDT_MCR0                   0x110
-#define MSR_IDT_MCR1                   0x111
-#define MSR_IDT_MCR2                   0x112
-#define MSR_IDT_MCR3                   0x113
-#define MSR_IDT_MCR4                   0x114
-#define MSR_IDT_MCR5                   0x115
-#define MSR_IDT_MCR6                   0x116
-#define MSR_IDT_MCR7                   0x117
-#define MSR_IDT_MCR_CTRL               0x120
-
-/* VIA Cyrix defined MSRs*/
-#define MSR_VIA_FCR                    0x1107
-#define MSR_VIA_LONGHAUL               0x110a
-#define MSR_VIA_RNG                    0x110b
-#define MSR_VIA_BCR2                   0x1147
-
-/* Intel defined MSRs. */
-#define MSR_IA32_P5_MC_ADDR            0
-#define MSR_IA32_P5_MC_TYPE            1
-#define MSR_IA32_PLATFORM_ID           0x17
-#define MSR_IA32_EBL_CR_POWERON                0x2a
-
-#define MSR_IA32_APICBASE               0x1b
-#define MSR_IA32_APICBASE_BSP           (1<<8)
-#define MSR_IA32_APICBASE_ENABLE        (1<<11)
-#define MSR_IA32_APICBASE_BASE          (0xfffff<<12)
-
-/* P4/Xeon+ specific */
-#define MSR_IA32_MCG_EAX               0x180
-#define MSR_IA32_MCG_EBX               0x181
-#define MSR_IA32_MCG_ECX               0x182
-#define MSR_IA32_MCG_EDX               0x183
-#define MSR_IA32_MCG_ESI               0x184
-#define MSR_IA32_MCG_EDI               0x185
-#define MSR_IA32_MCG_EBP               0x186
-#define MSR_IA32_MCG_ESP               0x187
-#define MSR_IA32_MCG_EFLAGS            0x188
-#define MSR_IA32_MCG_EIP               0x189
-#define MSR_IA32_MCG_RESERVED          0x18A
-
-#define MSR_P6_EVNTSEL0                        0x186
-#define MSR_P6_EVNTSEL1                        0x187
-
-#define MSR_IA32_PERF_STATUS           0x198
-#define MSR_IA32_PERF_CTL              0x199
-
-#define MSR_IA32_THERM_CONTROL         0x19a
-#define MSR_IA32_THERM_INTERRUPT       0x19b
-#define MSR_IA32_THERM_STATUS          0x19c
-#define MSR_IA32_MISC_ENABLE           0x1a0
-
-#define MSR_IA32_DEBUGCTLMSR           0x1d9
-#define MSR_IA32_LASTBRANCHFROMIP      0x1db
-#define MSR_IA32_LASTBRANCHTOIP                0x1dc
-#define MSR_IA32_LASTINTFROMIP         0x1dd
-#define MSR_IA32_LASTINTTOIP           0x1de
-
-#define MSR_IA32_MC0_CTL               0x400
-#define MSR_IA32_MC0_STATUS            0x401
-#define MSR_IA32_MC0_ADDR              0x402
-#define MSR_IA32_MC0_MISC              0x403
-
-/* Pentium IV performance counter MSRs */
-#define MSR_P4_BPU_PERFCTR0            0x300
-#define MSR_P4_BPU_PERFCTR1            0x301
-#define MSR_P4_BPU_PERFCTR2            0x302
-#define MSR_P4_BPU_PERFCTR3            0x303
-#define MSR_P4_MS_PERFCTR0             0x304
-#define MSR_P4_MS_PERFCTR1             0x305
-#define MSR_P4_MS_PERFCTR2             0x306
-#define MSR_P4_MS_PERFCTR3             0x307
-#define MSR_P4_FLAME_PERFCTR0          0x308
-#define MSR_P4_FLAME_PERFCTR1          0x309
-#define MSR_P4_FLAME_PERFCTR2          0x30a
-#define MSR_P4_FLAME_PERFCTR3          0x30b
-#define MSR_P4_IQ_PERFCTR0             0x30c
-#define MSR_P4_IQ_PERFCTR1             0x30d
-#define MSR_P4_IQ_PERFCTR2             0x30e
-#define MSR_P4_IQ_PERFCTR3             0x30f
-#define MSR_P4_IQ_PERFCTR4             0x310
-#define MSR_P4_IQ_PERFCTR5             0x311
-#define MSR_P4_BPU_CCCR0               0x360
-#define MSR_P4_BPU_CCCR1               0x361
-#define MSR_P4_BPU_CCCR2               0x362
-#define MSR_P4_BPU_CCCR3               0x363
-#define MSR_P4_MS_CCCR0                0x364
-#define MSR_P4_MS_CCCR1                0x365
-#define MSR_P4_MS_CCCR2                0x366
-#define MSR_P4_MS_CCCR3                0x367
-#define MSR_P4_FLAME_CCCR0             0x368
-#define MSR_P4_FLAME_CCCR1             0x369
-#define MSR_P4_FLAME_CCCR2             0x36a
-#define MSR_P4_FLAME_CCCR3             0x36b
-#define MSR_P4_IQ_CCCR0                0x36c
-#define MSR_P4_IQ_CCCR1                0x36d
-#define MSR_P4_IQ_CCCR2                0x36e
-#define MSR_P4_IQ_CCCR3                0x36f
-#define MSR_P4_IQ_CCCR4                0x370
-#define MSR_P4_IQ_CCCR5                0x371
-#define MSR_P4_ALF_ESCR0               0x3ca
-#define MSR_P4_ALF_ESCR1               0x3cb
-#define MSR_P4_BPU_ESCR0               0x3b2
-#define MSR_P4_BPU_ESCR1               0x3b3
-#define MSR_P4_BSU_ESCR0               0x3a0
-#define MSR_P4_BSU_ESCR1               0x3a1
-#define MSR_P4_CRU_ESCR0               0x3b8
-#define MSR_P4_CRU_ESCR1               0x3b9
-#define MSR_P4_CRU_ESCR2               0x3cc
-#define MSR_P4_CRU_ESCR3               0x3cd
-#define MSR_P4_CRU_ESCR4               0x3e0
-#define MSR_P4_CRU_ESCR5               0x3e1
-#define MSR_P4_DAC_ESCR0               0x3a8
-#define MSR_P4_DAC_ESCR1               0x3a9
-#define MSR_P4_FIRM_ESCR0              0x3a4
-#define MSR_P4_FIRM_ESCR1              0x3a5
-#define MSR_P4_FLAME_ESCR0             0x3a6
-#define MSR_P4_FLAME_ESCR1             0x3a7
-#define MSR_P4_FSB_ESCR0               0x3a2
-#define MSR_P4_FSB_ESCR1               0x3a3
-#define MSR_P4_IQ_ESCR0                0x3ba
-#define MSR_P4_IQ_ESCR1                0x3bb
-#define MSR_P4_IS_ESCR0                0x3b4
-#define MSR_P4_IS_ESCR1                0x3b5
-#define MSR_P4_ITLB_ESCR0              0x3b6
-#define MSR_P4_ITLB_ESCR1              0x3b7
-#define MSR_P4_IX_ESCR0                0x3c8
-#define MSR_P4_IX_ESCR1                0x3c9
-#define MSR_P4_MOB_ESCR0               0x3aa
-#define MSR_P4_MOB_ESCR1               0x3ab
-#define MSR_P4_MS_ESCR0                0x3c0
-#define MSR_P4_MS_ESCR1                0x3c1
-#define MSR_P4_PMH_ESCR0               0x3ac
-#define MSR_P4_PMH_ESCR1               0x3ad
-#define MSR_P4_RAT_ESCR0               0x3bc
-#define MSR_P4_RAT_ESCR1               0x3bd
-#define MSR_P4_SAAT_ESCR0              0x3ae
-#define MSR_P4_SAAT_ESCR1              0x3af
-#define MSR_P4_SSU_ESCR0               0x3be
-#define MSR_P4_SSU_ESCR1               0x3bf    /* guess: not defined in manual */
-#define MSR_P4_TBPU_ESCR0              0x3c2
-#define MSR_P4_TBPU_ESCR1              0x3c3
-#define MSR_P4_TC_ESCR0                0x3c4
-#define MSR_P4_TC_ESCR1                0x3c5
-#define MSR_P4_U2L_ESCR0               0x3b0
-#define MSR_P4_U2L_ESCR1               0x3b1
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/nmi.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/nmi.h
deleted file mode 100644 (file)
index 8fff33f..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  linux/include/asm-i386/nmi.h
- */
-#ifndef ASM_NMI_H
-#define ASM_NMI_H
-
-#include <linux/pm.h>
-#include <asm/io.h>
-
-#include <xen/interface/nmi.h>
-
-struct pt_regs;
-
-typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu);
-
-/**
- * set_nmi_callback
- *
- * Set a handler for an NMI. Only one handler may be
- * set. Return 1 if the NMI was handled.
- */
-void set_nmi_callback(nmi_callback_t callback);
-
-/**
- * unset_nmi_callback
- *
- * Remove the handler previously set.
- */
-void unset_nmi_callback(void);
-
-#ifdef CONFIG_PM
-/** Replace the PM callback routine for NMI. */
-struct pm_dev * set_nmi_pm_callback(pm_callback callback);
-
-/** Unset the PM callback routine back to the default. */
-void unset_nmi_pm_callback(struct pm_dev * dev);
-
-#else
-
-static inline struct pm_dev * set_nmi_pm_callback(pm_callback callback)
-{
-       return 0;
-} 
-static inline void unset_nmi_pm_callback(struct pm_dev * dev)
-{
-}
-
-#endif /* CONFIG_PM */
-extern void default_do_nmi(struct pt_regs *);
-extern void die_nmi(char *str, struct pt_regs *regs);
-
-static inline unsigned char get_nmi_reason(void)
-{
-        shared_info_t *s = HYPERVISOR_shared_info;
-        unsigned char reason = 0;
-
-        /* construct a value which looks like it came from
-         * port 0x61.
-         */
-        if (test_bit(_XEN_NMIREASON_io_error, &s->arch.nmi_reason))
-                reason |= 0x40;
-        if (test_bit(_XEN_NMIREASON_parity_error, &s->arch.nmi_reason))
-                reason |= 0x80;
-
-        return reason;
-}
-
-extern int panic_on_timeout;
-extern int unknown_nmi_panic;
-
-extern int check_nmi_watchdog(void);
-extern void setup_apic_nmi_watchdog (void);
-extern int reserve_lapic_nmi(void);
-extern void release_lapic_nmi(void);
-extern void disable_timer_nmi_watchdog(void);
-extern void enable_timer_nmi_watchdog(void);
-extern void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason);
-
-extern void nmi_watchdog_default(void);
-extern int setup_nmi_watchdog(char *);
-
-extern unsigned int nmi_watchdog;
-#define NMI_DEFAULT    -1
-#define NMI_NONE       0
-#define NMI_IO_APIC    1
-#define NMI_LOCAL_APIC 2
-#define NMI_INVALID    3
-
-#endif /* ASM_NMI_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h
deleted file mode 100644 (file)
index 965effd..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-#ifndef _X86_64_PAGE_H
-#define _X86_64_PAGE_H
-
-/* #include <linux/string.h> */
-#ifndef __ASSEMBLY__
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <asm/bug.h>
-#endif
-#include <xen/interface/xen.h> 
-
-/*
- * Need to repeat this here in order to not include pgtable.h (which in turn
- * depends on definitions made here), but to be able to use the symbolic
- * below. The preprocessor will warn if the two definitions aren't identical.
- */
-#define _PAGE_PRESENT  0x001
-
-#define arch_free_page(_page,_order)           \
-({     int foreign = PageForeign(_page);       \
-       if (foreign)                            \
-               PageForeignDestructor(_page);   \
-       foreign;                                \
-})
-#define HAVE_ARCH_FREE_PAGE
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT     12
-#ifdef __ASSEMBLY__
-#define PAGE_SIZE      (0x1 << PAGE_SHIFT)
-#else
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#endif
-#define PAGE_MASK      (~(PAGE_SIZE-1))
-
-/* See Documentation/x86_64/mm.txt for a description of the memory map. */
-#define __PHYSICAL_MASK_SHIFT  46
-#define __PHYSICAL_MASK                ((1UL << __PHYSICAL_MASK_SHIFT) - 1)
-#define __VIRTUAL_MASK_SHIFT   48
-#define __VIRTUAL_MASK         ((1UL << __VIRTUAL_MASK_SHIFT) - 1)
-
-#define PHYSICAL_PAGE_MASK     (~(PAGE_SIZE-1) & __PHYSICAL_MASK)
-
-#define THREAD_ORDER 1 
-#define THREAD_SIZE  (PAGE_SIZE << THREAD_ORDER)
-#define CURRENT_MASK (~(THREAD_SIZE-1))
-
-#define EXCEPTION_STACK_ORDER 0
-#define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
-
-#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1)
-#define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
-
-#define IRQSTACK_ORDER 2
-#define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
-
-#define STACKFAULT_STACK 1
-#define DOUBLEFAULT_STACK 2
-#define NMI_STACK 3
-#define DEBUG_STACK 4
-#define MCE_STACK 5
-#define N_EXCEPTION_STACKS 5  /* hw limit: 7 */
-
-#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
-#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
-
-#define HPAGE_SHIFT PMD_SHIFT
-#define HPAGE_SIZE     ((1UL) << HPAGE_SHIFT)
-#define HPAGE_MASK     (~(HPAGE_SIZE - 1))
-#define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
-extern unsigned long end_pfn;
-
-#include <asm/maddr.h>
-
-void clear_page(void *);
-void copy_page(void *, void *);
-
-#define clear_user_page(page, vaddr, pg)       clear_page(page)
-#define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
-
-#define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr)
-#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-/*
- * These are used to make use of C type-checking..
- */
-typedef struct { unsigned long pte; } pte_t;
-typedef struct { unsigned long pmd; } pmd_t;
-typedef struct { unsigned long pud; } pud_t;
-typedef struct { unsigned long pgd; } pgd_t;
-#define PTE_MASK       PHYSICAL_PAGE_MASK
-
-typedef struct { unsigned long pgprot; } pgprot_t;
-
-#define __pte_val(x) ((x).pte)
-#define pte_val(x) ((__pte_val(x) & _PAGE_PRESENT) ? \
-                    pte_machine_to_phys(__pte_val(x)) : \
-                    __pte_val(x))
-
-#define __pmd_val(x) ((x).pmd)
-static inline unsigned long pmd_val(pmd_t x)
-{
-       unsigned long ret = __pmd_val(x);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret) ret = pte_machine_to_phys(ret) | _PAGE_PRESENT;
-#else
-       if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-#endif
-       return ret;
-}
-
-#define __pud_val(x) ((x).pud)
-static inline unsigned long pud_val(pud_t x)
-{
-       unsigned long ret = __pud_val(x);
-       if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-       return ret;
-}
-
-#define __pgd_val(x) ((x).pgd)
-static inline unsigned long pgd_val(pgd_t x)
-{
-       unsigned long ret = __pgd_val(x);
-       if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-       return ret;
-}
-
-#define pgprot_val(x)  ((x).pgprot)
-
-static inline pte_t __pte(unsigned long x)
-{
-       if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-       return ((pte_t) { (x) });
-}
-
-static inline pmd_t __pmd(unsigned long x)
-{
-       if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-       return ((pmd_t) { (x) });
-}
-
-static inline pud_t __pud(unsigned long x)
-{
-       if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-       return ((pud_t) { (x) });
-}
-
-static inline pgd_t __pgd(unsigned long x)
-{
-       if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-       return ((pgd_t) { (x) });
-}
-
-#define __pgprot(x)    ((pgprot_t) { (x) } )
-
-#define __PHYSICAL_START       ((unsigned long)CONFIG_PHYSICAL_START)
-#define __START_KERNEL         (__START_KERNEL_map + __PHYSICAL_START)
-#define __START_KERNEL_map     0xffffffff80000000UL
-#define __PAGE_OFFSET           0xffff880000000000UL   
-
-#else
-#define __PHYSICAL_START       CONFIG_PHYSICAL_START
-#define __START_KERNEL         (__START_KERNEL_map + __PHYSICAL_START)
-#define __START_KERNEL_map     0xffffffff80000000
-#define __PAGE_OFFSET           0xffff880000000000
-#endif /* !__ASSEMBLY__ */
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-#undef LOAD_OFFSET
-#define LOAD_OFFSET            0
-#endif
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-#define KERNEL_TEXT_SIZE  (40UL*1024*1024)
-#define KERNEL_TEXT_START 0xffffffff80000000UL 
-
-#define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
-
-/* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol.
-   Otherwise you risk miscompilation. */ 
-#define __pa(x)                        (((unsigned long)(x)>=__START_KERNEL_map)?(unsigned long)(x) - (unsigned long)__START_KERNEL_map:(unsigned long)(x) - PAGE_OFFSET)
-/* __pa_symbol should be used for C visible symbols.
-   This seems to be the official gcc blessed way to do such arithmetic. */ 
-#define __pa_symbol(x)         \
-       ({unsigned long v;  \
-         asm("" : "=r" (v) : "0" (x)); \
-         __pa(v); })
-
-#define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
-#define __boot_va(x)           __va(x)
-#define __boot_pa(x)           __pa(x)
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)         ((pfn) < end_pfn)
-#endif
-
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-
-#define VM_DATA_DEFAULT_FLAGS \
-       (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
-        VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#define __HAVE_ARCH_GATE_AREA 1        
-
-#include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
-
-#endif /* __KERNEL__ */
-
-#endif /* _X86_64_PAGE_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h
deleted file mode 100644 (file)
index 764270f..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-#ifndef __x8664_PCI_H
-#define __x8664_PCI_H
-
-#include <asm/io.h>
-
-#ifdef __KERNEL__
-
-#include <linux/mm.h> /* for struct page */
-
-/* Can be used to override the logic in pci_scan_bus for skipping
-   already-configured bus numbers - to be used for buggy BIOSes
-   or architectures with incomplete PCI setup by the loader */
-
-#ifdef CONFIG_PCI
-extern unsigned int pcibios_assign_all_busses(void);
-#else
-#define pcibios_assign_all_busses()    0
-#endif
-#define pcibios_scan_all_fns(a, b)     0
-
-extern unsigned long pci_mem_start;
-#define PCIBIOS_MIN_IO         0x1000
-#define PCIBIOS_MIN_MEM                (pci_mem_start)
-
-#define PCIBIOS_MIN_CARDBUS_IO 0x4000
-
-void pcibios_config_init(void);
-struct pci_bus * pcibios_scan_root(int bus);
-extern int (*pci_config_read)(int seg, int bus, int dev, int fn, int reg, int len, u32 *value);
-extern int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int len, u32 value);
-
-void pcibios_set_master(struct pci_dev *dev);
-void pcibios_penalize_isa_irq(int irq, int active);
-struct irq_routing_table *pcibios_get_irq_routing_table(void);
-int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
-
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <asm/scatterlist.h>
-#include <linux/string.h>
-#include <asm/page.h>
-
-extern void pci_iommu_alloc(void);
-extern int iommu_setup(char *opt);
-
-/* The PCI address space does equal the physical memory
- * address space.  The networking and block device layers use
- * this boolean for bounce buffer decisions
- *
- * On AMD64 it mostly equals, but we set it to zero if a hardware
- * IOMMU (gart) of sotware IOMMU (swiotlb) is available.
- */
-#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
-
-#if defined(CONFIG_IOMMU) || defined(CONFIG_CALGARY_IOMMU)
-
-/*
- * x86-64 always supports DAC, but sometimes it is useful to force
- * devices through the IOMMU to get automatic sg list merging.
- * Optional right now.
- */
-extern int iommu_sac_force;
-#define pci_dac_dma_supported(pci_dev, mask)   (!iommu_sac_force)
-
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
-       dma_addr_t ADDR_NAME;
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
-       __u32 LEN_NAME;
-#define pci_unmap_addr(PTR, ADDR_NAME)                 \
-       ((PTR)->ADDR_NAME)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
-       (((PTR)->ADDR_NAME) = (VAL))
-#define pci_unmap_len(PTR, LEN_NAME)                   \
-       ((PTR)->LEN_NAME)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
-       (((PTR)->LEN_NAME) = (VAL))
-
-#elif defined(CONFIG_SWIOTLB)
-
-#define pci_dac_dma_supported(pci_dev, mask)    1
-
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
-       dma_addr_t ADDR_NAME;
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
-       __u32 LEN_NAME;
-#define pci_unmap_addr(PTR, ADDR_NAME)                 \
-       ((PTR)->ADDR_NAME)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
-       (((PTR)->ADDR_NAME) = (VAL))
-#define pci_unmap_len(PTR, LEN_NAME)                   \
-       ((PTR)->LEN_NAME)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
-       (((PTR)->LEN_NAME) = (VAL))
-
-#else
-/* No IOMMU */
-
-#define pci_dac_dma_supported(pci_dev, mask)    1
-
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-#define pci_unmap_addr(PTR, ADDR_NAME)         (0)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)        do { } while (0)
-#define pci_unmap_len(PTR, LEN_NAME)           (0)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)  do { } while (0)
-
-#endif
-
-#include <asm-generic/pci-dma-compat.h>
-
-static inline dma64_addr_t
-pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction)
-{
-       return ((dma64_addr_t) page_to_phys(page) +
-               (dma64_addr_t) offset);
-}
-
-static inline struct page *
-pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
-{
-       return virt_to_page(__va(dma_addr));    
-}
-
-static inline unsigned long
-pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr)
-{
-       return (dma_addr & ~PAGE_MASK);
-}
-
-static inline void
-pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-{
-}
-
-static inline void
-pci_dac_dma_sync_single_for_device(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-{
-       flush_write_buffers();
-}
-
-#ifdef CONFIG_PCI
-static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-                                       enum pci_dma_burst_strategy *strat,
-                                       unsigned long *strategy_parameter)
-{
-       *strat = PCI_DMA_BURST_INFINITY;
-       *strategy_parameter = ~0UL;
-}
-#endif
-
-#define HAVE_PCI_MMAP
-extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
-                              enum pci_mmap_state mmap_state, int write_combine);
-
-static inline void pcibios_add_platform_entries(struct pci_dev *dev)
-{
-}
-
-#endif /* __KERNEL__ */
-
-/* generic pci stuff */
-#ifdef CONFIG_PCI
-#include <asm-generic/pci.h>
-#endif
-
-#endif /* __x8664_PCI_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgalloc.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgalloc.h
deleted file mode 100644 (file)
index 482efb3..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-#ifndef _X86_64_PGALLOC_H
-#define _X86_64_PGALLOC_H
-
-#include <asm/fixmap.h>
-#include <asm/pda.h>
-#include <linux/threads.h>
-#include <linux/mm.h>
-#include <asm/io.h>            /* for phys_to_virt and page_to_pseudophys */
-
-#include <xen/features.h>
-void make_page_readonly(void *va, unsigned int feature);
-void make_page_writable(void *va, unsigned int feature);
-void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
-void make_pages_writable(void *va, unsigned int nr, unsigned int feature);
-
-#define __user_pgd(pgd) ((pgd) + PTRS_PER_PGD)
-
-static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
-{
-       set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)));
-}
-
-static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
-{
-       if (unlikely((mm)->context.pinned)) {
-               BUG_ON(HYPERVISOR_update_va_mapping(
-                              (unsigned long)__va(page_to_pfn(pte) << PAGE_SHIFT),
-                              pfn_pte(page_to_pfn(pte), PAGE_KERNEL_RO), 0));
-               set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT)));
-       } else {
-               *(pmd) = __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT));
-       }
-}
-
-static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
-{
-       if (unlikely((mm)->context.pinned)) {
-               BUG_ON(HYPERVISOR_update_va_mapping(
-                              (unsigned long)pmd,
-                              pfn_pte(virt_to_phys(pmd)>>PAGE_SHIFT, 
-                                      PAGE_KERNEL_RO), 0));
-               set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd)));
-       } else {
-               *(pud) =  __pud(_PAGE_TABLE | __pa(pmd));
-       }
-}
-
-/*
- * We need to use the batch mode here, but pgd_pupulate() won't be
- * be called frequently.
- */
-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
-{
-       if (unlikely((mm)->context.pinned)) {
-               BUG_ON(HYPERVISOR_update_va_mapping(
-                              (unsigned long)pud,
-                              pfn_pte(virt_to_phys(pud)>>PAGE_SHIFT, 
-                                      PAGE_KERNEL_RO), 0));
-               set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud)));
-               set_pgd(__user_pgd(pgd), __pgd(_PAGE_TABLE | __pa(pud)));
-       } else {
-               *(pgd) =  __pgd(_PAGE_TABLE | __pa(pud));
-               *(__user_pgd(pgd)) = *(pgd);
-       }
-}
-
-extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr);
-extern void pte_free(struct page *pte);
-
-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       struct page *pg;
-
-       pg = pte_alloc_one(mm, addr);
-       return pg ? page_address(pg) : NULL;
-}
-
-static inline void pmd_free(pmd_t *pmd)
-{
-       BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
-       pte_free(virt_to_page(pmd));
-}
-
-static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       struct page *pg;
-
-       pg = pte_alloc_one(mm, addr);
-       return pg ? page_address(pg) : NULL;
-}
-
-static inline void pud_free(pud_t *pud)
-{
-       BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
-       pte_free(virt_to_page(pud));
-}
-
-static inline void pgd_list_add(pgd_t *pgd)
-{
-       struct page *page = virt_to_page(pgd);
-
-       spin_lock(&pgd_lock);
-       page->index = (pgoff_t)pgd_list;
-       if (pgd_list)
-               pgd_list->private = (unsigned long)&page->index;
-       pgd_list = page;
-       page->private = (unsigned long)&pgd_list;
-       spin_unlock(&pgd_lock);
-}
-
-static inline void pgd_list_del(pgd_t *pgd)
-{
-       struct page *next, **pprev, *page = virt_to_page(pgd);
-
-       spin_lock(&pgd_lock);
-       next = (struct page *)page->index;
-       pprev = (struct page **)page->private;
-       *pprev = next;
-       if (next)
-               next->private = (unsigned long)pprev;
-       spin_unlock(&pgd_lock);
-}
-
-static inline pgd_t *pgd_alloc(struct mm_struct *mm)
-{
-       /*
-        * We allocate two contiguous pages for kernel and user.
-        */
-       unsigned boundary;
-       pgd_t *pgd = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT, 1);
-       if (!pgd)
-               return NULL;
-       pgd_list_add(pgd);
-       /*
-        * Copy kernel pointers in from init.
-        * Could keep a freelist or slab cache of those because the kernel
-        * part never changes.
-        */
-       boundary = pgd_index(__PAGE_OFFSET);
-       memset(pgd, 0, boundary * sizeof(pgd_t));
-       memcpy(pgd + boundary,
-              init_level4_pgt + boundary,
-              (PTRS_PER_PGD - boundary) * sizeof(pgd_t));
-
-       memset(__user_pgd(pgd), 0, PAGE_SIZE); /* clean up user pgd */
-       /*
-        * Set level3_user_pgt for vsyscall area
-        */
-       set_pgd(__user_pgd(pgd) + pgd_index(VSYSCALL_START),
-               __pgd(__pa_symbol(level3_user_pgt) | _PAGE_TABLE));
-       return pgd;
-}
-
-static inline void pgd_free(pgd_t *pgd)
-{
-       pte_t *ptep = virt_to_ptep(pgd);
-
-       if (!pte_write(*ptep)) {
-               xen_pgd_unpin(__pa(pgd));
-               BUG_ON(HYPERVISOR_update_va_mapping(
-                              (unsigned long)pgd,
-                              pfn_pte(virt_to_phys(pgd)>>PAGE_SHIFT, PAGE_KERNEL),
-                              0));
-       }
-
-       ptep = virt_to_ptep(__user_pgd(pgd));
-
-       if (!pte_write(*ptep)) {
-               xen_pgd_unpin(__pa(__user_pgd(pgd)));
-               BUG_ON(HYPERVISOR_update_va_mapping(
-                              (unsigned long)__user_pgd(pgd),
-                              pfn_pte(virt_to_phys(__user_pgd(pgd))>>PAGE_SHIFT, 
-                                      PAGE_KERNEL),
-                              0));
-       }
-
-       pgd_list_del(pgd);
-       free_pages((unsigned long)pgd, 1);
-}
-
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
-{
-       pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
-       if (pte)
-               make_page_readonly(pte, XENFEAT_writable_page_tables);
-
-       return pte;
-}
-
-/* Should really implement gc for free page table pages. This could be
-   done with a reference count in struct page. */
-
-static inline void pte_free_kernel(pte_t *pte)
-{
-       BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
-       make_page_writable(pte, XENFEAT_writable_page_tables);
-       free_page((unsigned long)pte); 
-}
-
-#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
-#define __pmd_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
-#define __pud_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
-
-#endif /* _X86_64_PGALLOC_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h
deleted file mode 100644 (file)
index 47f483f..0000000
+++ /dev/null
@@ -1,575 +0,0 @@
-#ifndef _X86_64_PGTABLE_H
-#define _X86_64_PGTABLE_H
-
-/*
- * This file contains the functions and defines necessary to modify and use
- * the x86-64 page table tree.
- */
-#include <asm/processor.h>
-#include <asm/fixmap.h>
-#include <asm/bitops.h>
-#include <linux/threads.h>
-#include <linux/sched.h>
-#include <asm/pda.h>
-#ifdef CONFIG_XEN
-#include <asm/hypervisor.h>
-
-extern pud_t level3_user_pgt[512];
-extern pud_t init_level4_user_pgt[];
-
-extern void xen_init_pt(void);
-
-#define virt_to_ptep(__va)                                             \
-({                                                                     \
-       pgd_t *__pgd = pgd_offset_k((unsigned long)(__va));             \
-       pud_t *__pud = pud_offset(__pgd, (unsigned long)(__va));        \
-       pmd_t *__pmd = pmd_offset(__pud, (unsigned long)(__va));        \
-       pte_offset_kernel(__pmd, (unsigned long)(__va));                \
-})
-
-#define arbitrary_virt_to_machine(__va)                                        \
-({                                                                     \
-       maddr_t m = (maddr_t)pte_mfn(*virt_to_ptep(__va)) << PAGE_SHIFT;\
-       m | ((unsigned long)(__va) & (PAGE_SIZE-1));                    \
-})
-#endif
-
-extern pud_t level3_kernel_pgt[512];
-extern pud_t level3_physmem_pgt[512];
-extern pud_t level3_ident_pgt[512];
-extern pmd_t level2_kernel_pgt[512];
-extern pgd_t init_level4_pgt[];
-extern pgd_t boot_level4_pgt[];
-extern unsigned long __supported_pte_mask;
-
-#define swapper_pg_dir init_level4_pgt
-
-extern int nonx_setup(char *str);
-extern void paging_init(void);
-extern void clear_kernel_mapping(unsigned long addr, unsigned long size);
-
-extern unsigned long pgkern_mask;
-
-/*
- * ZERO_PAGE is a global shared page that is always zero: used
- * for zero-mapped memory areas etc..
- */
-extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-
-/*
- * PGDIR_SHIFT determines what a top-level page table entry can map
- */
-#define PGDIR_SHIFT    39
-#define PTRS_PER_PGD   512
-
-/*
- * 3rd level page
- */
-#define PUD_SHIFT      30
-#define PTRS_PER_PUD   512
-
-/*
- * PMD_SHIFT determines the size of the area a middle-level
- * page table can map
- */
-#define PMD_SHIFT      21
-#define PTRS_PER_PMD   512
-
-/*
- * entries per page directory level
- */
-#define PTRS_PER_PTE   512
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-              &(e), __pte_val(e), pte_pfn(e))
-#define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-              &(e), __pmd_val(e), pmd_pfn(e))
-#define pud_ERROR(e) \
-       printk("%s:%d: bad pud %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-              &(e), __pud_val(e), (pud_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-              &(e), __pgd_val(e), (pgd_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-
-#define pgd_none(x)    (!__pgd_val(x))
-#define pud_none(x)    (!__pud_val(x))
-
-static inline void set_pte(pte_t *dst, pte_t val)
-{
-       *dst = val;
-}
-
-#define set_pmd(pmdptr, pmdval) xen_l2_entry_update(pmdptr, (pmdval))
-#define set_pud(pudptr, pudval) xen_l3_entry_update(pudptr, (pudval))
-#define set_pgd(pgdptr, pgdval) xen_l4_entry_update(pgdptr, (pgdval))
-
-static inline void pud_clear (pud_t * pud)
-{
-       set_pud(pud, __pud(0));
-}
-
-#define __user_pgd(pgd) ((pgd) + PTRS_PER_PGD)
-
-static inline void pgd_clear (pgd_t * pgd)
-{
-        set_pgd(pgd, __pgd(0));
-        set_pgd(__user_pgd(pgd), __pgd(0));
-}
-
-#define pud_page(pud) \
-    ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK))
-
-#define pte_same(a, b)         ((a).pte == (b).pte)
-
-#define pte_pgprot(a)  (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK))
-
-#define PMD_SIZE       (1UL << PMD_SHIFT)
-#define PMD_MASK       (~(PMD_SIZE-1))
-#define PUD_SIZE       (1UL << PUD_SHIFT)
-#define PUD_MASK       (~(PUD_SIZE-1))
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-#define USER_PTRS_PER_PGD      ((TASK_SIZE-1)/PGDIR_SIZE+1)
-#define FIRST_USER_ADDRESS     0
-
-#ifndef __ASSEMBLY__
-#define MAXMEM          0x3fffffffffffUL
-#define VMALLOC_START    0xffffc20000000000UL
-#define VMALLOC_END      0xffffe1ffffffffffUL
-#define MODULES_VADDR    0xffffffff88000000UL
-#define MODULES_END      0xfffffffffff00000UL
-#define MODULES_LEN   (MODULES_END - MODULES_VADDR)
-
-#define _PAGE_BIT_PRESENT      0
-#define _PAGE_BIT_RW           1
-#define _PAGE_BIT_USER         2
-#define _PAGE_BIT_PWT          3
-#define _PAGE_BIT_PCD          4
-#define _PAGE_BIT_ACCESSED     5
-#define _PAGE_BIT_DIRTY                6
-#define _PAGE_BIT_PSE          7       /* 4 MB (or 2MB) page */
-#define _PAGE_BIT_GLOBAL       8       /* Global TLB entry PPro+ */
-#define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */
-
-#define _PAGE_PRESENT  0x001
-#define _PAGE_RW       0x002
-#define _PAGE_USER     0x004
-#define _PAGE_PWT      0x008
-#define _PAGE_PCD      0x010
-#define _PAGE_ACCESSED 0x020
-#define _PAGE_DIRTY    0x040
-#define _PAGE_PSE      0x080   /* 2MB page */
-#define _PAGE_FILE     0x040   /* nonlinear file mapping, saved PTE; unset:swap */
-#define _PAGE_GLOBAL   0x100   /* Global TLB entry */
-
-#define _PAGE_PROTNONE 0x080   /* If not present */
-#define _PAGE_NX        (1UL<<_PAGE_BIT_NX)
-
-#if CONFIG_XEN_COMPAT <= 0x030002
-extern unsigned int __kernel_page_user;
-#else
-#define __kernel_page_user 0
-#endif
-
-#define _PAGE_TABLE    (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-#define _KERNPG_TABLE  (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY | __kernel_page_user)
-
-#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
-
-#define PAGE_NONE      __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-#define PAGE_SHARED    __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-#define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-#define PAGE_COPY PAGE_COPY_NOEXEC
-#define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_READONLY  __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-#define __PAGE_KERNEL \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-#define __PAGE_KERNEL_EXEC \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | __kernel_page_user)
-#define __PAGE_KERNEL_NOCACHE \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-#define __PAGE_KERNEL_RO \
-       (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-#define __PAGE_KERNEL_VSYSCALL \
-       (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-#define __PAGE_KERNEL_VSYSCALL_NOCACHE \
-       (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
-#define __PAGE_KERNEL_LARGE \
-       (__PAGE_KERNEL | _PAGE_PSE)
-#define __PAGE_KERNEL_LARGE_EXEC \
-       (__PAGE_KERNEL_EXEC | _PAGE_PSE)
-
-/*
- * We don't support GLOBAL page in xenolinux64
- */
-#define MAKE_GLOBAL(x) __pgprot((x))
-
-#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
-#define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)
-#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
-#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
-#define PAGE_KERNEL_VSYSCALL32 __pgprot(__PAGE_KERNEL_VSYSCALL)
-#define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
-#define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
-#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
-
-/*         xwr */
-#define __P000 PAGE_NONE
-#define __P001 PAGE_READONLY
-#define __P010 PAGE_COPY
-#define __P011 PAGE_COPY
-#define __P100 PAGE_READONLY_EXEC
-#define __P101 PAGE_READONLY_EXEC
-#define __P110 PAGE_COPY_EXEC
-#define __P111 PAGE_COPY_EXEC
-
-#define __S000 PAGE_NONE
-#define __S001 PAGE_READONLY
-#define __S010 PAGE_SHARED
-#define __S011 PAGE_SHARED
-#define __S100 PAGE_READONLY_EXEC
-#define __S101 PAGE_READONLY_EXEC
-#define __S110 PAGE_SHARED_EXEC
-#define __S111 PAGE_SHARED_EXEC
-
-static inline unsigned long pgd_bad(pgd_t pgd)
-{
-       unsigned long val = __pgd_val(pgd);
-       val &= ~PTE_MASK;
-       val &= ~(_PAGE_USER | _PAGE_DIRTY);
-       return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);
-}
-
-static inline unsigned long pud_bad(pud_t pud) 
-{ 
-       unsigned long val = __pud_val(pud);
-       val &= ~PTE_MASK; 
-       val &= ~(_PAGE_USER | _PAGE_DIRTY); 
-       return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);      
-} 
-
-#define set_pte_at(_mm,addr,ptep,pteval) do {                          \
-       if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-           HYPERVISOR_update_va_mapping((addr), (pteval), 0))          \
-               set_pte((ptep), (pteval));                              \
-} while (0)
-
-#define pte_none(x)    (!(x).pte)
-#define pte_present(x) ((x).pte & (_PAGE_PRESENT | _PAGE_PROTNONE))
-#define pte_clear(mm,addr,xp)  do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
-
-#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-
-#define __pte_mfn(_pte) (((_pte).pte & PTE_MASK) >> PAGE_SHIFT)
-#define pte_mfn(_pte) ((_pte).pte & _PAGE_PRESENT ? \
-       __pte_mfn(_pte) : pfn_to_mfn(__pte_mfn(_pte)))
-#define pte_pfn(_pte) ((_pte).pte & _PAGE_PRESENT ? \
-       mfn_to_local_pfn(__pte_mfn(_pte)) : __pte_mfn(_pte))
-
-#define pte_page(x)    pfn_to_page(pte_pfn(x))
-
-static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
-{
-       unsigned long pte = page_nr << PAGE_SHIFT;
-       pte |= pgprot_val(pgprot);
-       pte &= __supported_pte_mask;
-       return __pte(pte);
-}
-
-static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-       if (!pte_none(pte)) {
-               if (mm != &init_mm)
-                       pte = __pte_ma(xchg(&ptep->pte, 0));
-               else
-                       HYPERVISOR_update_va_mapping(addr, __pte(0), 0);
-       }
-       return pte;
-}
-
-static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full)
-{
-       if (full) {
-               pte_t pte = *ptep;
-               if (mm->context.pinned)
-                       xen_l1_entry_update(ptep, __pte(0));
-               else
-                       *ptep = __pte(0);
-               return pte;
-       }
-       return ptep_get_and_clear(mm, addr, ptep);
-}
-
-#define ptep_clear_flush(vma, addr, ptep)                      \
-({                                                             \
-       pte_t *__ptep = (ptep);                                 \
-       pte_t __res = *__ptep;                                  \
-       if (!pte_none(__res) &&                                 \
-           ((vma)->vm_mm != current->mm ||                     \
-            HYPERVISOR_update_va_mapping(addr, __pte(0),       \
-                       (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-                               UVMF_INVLPG|UVMF_MULTI))) {     \
-               __ptep->pte = 0;                                \
-               flush_tlb_page(vma, addr);                      \
-       }                                                       \
-       __res;                                                  \
-})
-
-/*
- * The following only work if pte_present() is true.
- * Undefined behaviour if not..
- */
-#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
-static inline int pte_user(pte_t pte)          { return __pte_val(pte) & _PAGE_USER; }
-static inline int pte_read(pte_t pte)          { return __pte_val(pte) & _PAGE_USER; }
-static inline int pte_exec(pte_t pte)          { return __pte_val(pte) & _PAGE_USER; }
-static inline int pte_dirty(pte_t pte)         { return __pte_val(pte) & _PAGE_DIRTY; }
-static inline int pte_young(pte_t pte)         { return __pte_val(pte) & _PAGE_ACCESSED; }
-static inline int pte_write(pte_t pte)         { return __pte_val(pte) & _PAGE_RW; }
-static inline int pte_file(pte_t pte)          { return __pte_val(pte) & _PAGE_FILE; }
-static inline int pte_huge(pte_t pte)          { return __pte_val(pte) & _PAGE_PSE; }
-
-static inline pte_t pte_rdprotect(pte_t pte)   { __pte_val(pte) &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { __pte_val(pte) &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_mkclean(pte_t pte)     { __pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkold(pte_t pte)       { __pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_wrprotect(pte_t pte)   { __pte_val(pte) &= ~_PAGE_RW; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { __pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { __pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkdirty(pte_t pte)     { __pte_val(pte) |= _PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkyoung(pte_t pte)     { __pte_val(pte) |= _PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkwrite(pte_t pte)     { __pte_val(pte) |= _PAGE_RW; return pte; }
-static inline pte_t pte_mkhuge(pte_t pte)      { __pte_val(pte) |= _PAGE_PSE; return pte; }
-
-#define ptep_test_and_clear_dirty(vma, addr, ptep)                     \
-({                                                                     \
-       pte_t __pte = *(ptep);                                          \
-       int __ret = pte_dirty(__pte);                                   \
-       if (__ret)                                                      \
-               set_pte_at((vma)->vm_mm, addr, ptep, pte_mkclean(__pte)); \
-       __ret;                                                          \
-})
-
-#define ptep_test_and_clear_young(vma, addr, ptep)                     \
-({                                                                     \
-       pte_t __pte = *(ptep);                                          \
-       int __ret = pte_young(__pte);                                   \
-       if (__ret)                                                      \
-               set_pte_at((vma)->vm_mm, addr, ptep, pte_mkold(__pte)); \
-       __ret;                                                          \
-})
-
-static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-       if (pte_write(pte))
-               set_pte_at(mm, addr, ptep, pte_wrprotect(pte));
-}
-
-/*
- * Macro to mark a page protection value as "uncacheable".
- */
-#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
-
-static inline int pmd_large(pmd_t pte) { 
-       return (__pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE;
-}      
-
-
-/*
- * Conversion functions: convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- */
-
-/*
- * Level 4 access.
- * Never use these in the common code.
- */
-#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PTE_MASK))
-#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
-#define pgd_offset_k(address) (pgd_t *)(init_level4_pgt + pgd_index(address))
-#define pgd_present(pgd) (__pgd_val(pgd) & _PAGE_PRESENT)
-#define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE)
-
-/* PUD - Level3 access */
-/* to find an entry in a page-table-directory. */
-#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
-#define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + pud_index(address))
-#define pud_present(pud) (__pud_val(pud) & _PAGE_PRESENT)
-
-/* PMD  - Level 2 access */
-#define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK))
-#define pmd_page(pmd)          (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-
-#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-#define pmd_offset(dir, address) ((pmd_t *) pud_page(*(dir)) + \
-                                  pmd_index(address))
-#define pmd_none(x)    (!__pmd_val(x))
-#if CONFIG_XEN_COMPAT <= 0x030002
-/* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
-   can temporarily clear it. */
-#define pmd_present(x) (__pmd_val(x))
-#else
-#define pmd_present(x) (__pmd_val(x) & _PAGE_PRESENT)
-#endif
-#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
-#define pmd_bad(x) ((__pmd_val(x) & ~(PTE_MASK | _PAGE_USER | _PAGE_PRESENT)) \
-                   != (_KERNPG_TABLE & ~(_PAGE_USER | _PAGE_PRESENT)))
-#define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
-#define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-
-#define pte_to_pgoff(pte) ((__pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
-#define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
-#define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT
-
-/* PTE - Level 1 access. */
-
-/* page, protection -> pte */
-#define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
-#define mk_pte_huge(entry) (__pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
-/* physical address -> PTE */
-static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
-{ 
-       unsigned long pteval;
-       pteval = physpage | pgprot_val(pgprot);
-       return __pte(pteval);
-}
-/* Change flags of a PTE */
-static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-{ 
-       /*
-        * Since this might change the present bit (which controls whether
-        * a pte_t object has undergone p2m translation), we must use
-        * pte_val() on the input pte and __pte() for the return value.
-        */
-       unsigned long pteval = pte_val(pte);
-
-       pteval &= _PAGE_CHG_MASK;
-       pteval |= pgprot_val(newprot);
-       pteval &= __supported_pte_mask;
-       return __pte(pteval);
-}
-
-#define pte_index(address) \
-               (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-#define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_kernel(*(dir)) + \
-                       pte_index(address))
-
-/* x86-64 always has all page tables mapped. */
-#define pte_offset_map(dir,address) pte_offset_kernel(dir,address)
-#define pte_offset_map_nested(dir,address) pte_offset_kernel(dir,address)
-#define pte_unmap(pte) /* NOP */
-#define pte_unmap_nested(pte) /* NOP */ 
-
-#define update_mmu_cache(vma,address,pte) do { } while (0)
-
-/*
- * Rules for using ptep_establish: the pte MUST be a user pte, and
- * must be a present->present transition.
- */
-#define __HAVE_ARCH_PTEP_ESTABLISH
-#define ptep_establish(vma, address, ptep, pteval)                     \
-       do {                                                            \
-               if ( likely((vma)->vm_mm == current->mm) ) {            \
-                       BUG_ON(HYPERVISOR_update_va_mapping(address,    \
-                               pteval,                                 \
-                               (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-                                       UVMF_INVLPG|UVMF_MULTI));       \
-               } else {                                                \
-                       xen_l1_entry_update(ptep, pteval);              \
-                       flush_tlb_page(vma, address);                   \
-               }                                                       \
-       } while (0)
-
-/* We only update the dirty/accessed state if we set
- * the dirty bit by hand in the kernel, since the hardware
- * will do the accessed bit for us, and we don't want to
- * race with other CPU's that might be updating the dirty
- * bit at the same time. */
-#define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
-#define ptep_set_access_flags(vma, address, ptep, entry, dirty)                \
-       do {                                                            \
-               if (dirty)                                              \
-                       ptep_establish(vma, address, ptep, entry);      \
-       } while (0)
-
-/* Encode and de-code a swap entry */
-#define __swp_type(x)                  (((x).val >> 1) & 0x3f)
-#define __swp_offset(x)                        ((x).val >> 8)
-#define __swp_entry(type, offset)      ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
-#define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
-#define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
-
-extern spinlock_t pgd_lock;
-extern struct page *pgd_list;
-void vmalloc_sync_all(void);
-
-#endif /* !__ASSEMBLY__ */
-
-extern int kern_addr_valid(unsigned long addr); 
-
-#define DOMID_LOCAL (0xFFFFU)
-
-struct vm_area_struct;
-
-int direct_remap_pfn_range(struct vm_area_struct *vma,
-                            unsigned long address,
-                            unsigned long mfn,
-                            unsigned long size,
-                            pgprot_t prot,
-                            domid_t  domid);
-
-int direct_kernel_remap_pfn_range(unsigned long address, 
-                                 unsigned long mfn,
-                                 unsigned long size, 
-                                 pgprot_t prot,
-                                 domid_t  domid);
-
-int create_lookup_pte_addr(struct mm_struct *mm,
-                           unsigned long address,
-                           uint64_t *ptep);
-
-int touch_pte_range(struct mm_struct *mm,
-                    unsigned long address,
-                    unsigned long size);
-
-#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)                \
-               direct_remap_pfn_range(vma,vaddr,pfn,size,prot,DOMID_IO)
-
-#define MK_IOSPACE_PFN(space, pfn)     (pfn)
-#define GET_IOSPACE(pfn)               0
-#define GET_PFN(pfn)                   (pfn)
-
-#define HAVE_ARCH_UNMAPPED_AREA
-
-#define pgtable_cache_init()   do { } while (0)
-#define check_pgt_cache()      do { } while (0)
-
-#define PAGE_AGP    PAGE_KERNEL_NOCACHE
-#define HAVE_PAGE_AGP 1
-
-/* fs/proc/kcore.c */
-#define        kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK)
-#define        kc_offset_to_vaddr(o) \
-   (((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o))
-
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
-#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
-#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-#define __HAVE_ARCH_PTE_SAME
-#include <asm-generic/pgtable.h>
-
-#endif /* _X86_64_PGTABLE_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h
deleted file mode 100644 (file)
index 794efcb..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * include/asm-x86_64/processor.h
- *
- * Copyright (C) 1994 Linus Torvalds
- */
-
-#ifndef __ASM_X86_64_PROCESSOR_H
-#define __ASM_X86_64_PROCESSOR_H
-
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/types.h>
-#include <asm/sigcontext.h>
-#include <asm/cpufeature.h>
-#include <linux/threads.h>
-#include <asm/msr.h>
-#include <asm/current.h>
-#include <asm/system.h>
-#include <asm/mmsegment.h>
-#include <asm/percpu.h>
-#include <linux/personality.h>
-#include <linux/cpumask.h>
-
-#define TF_MASK                0x00000100
-#define IF_MASK                0x00000200
-#define IOPL_MASK      0x00003000
-#define NT_MASK                0x00004000
-#define VM_MASK                0x00020000
-#define AC_MASK                0x00040000
-#define VIF_MASK       0x00080000      /* virtual interrupt flag */
-#define VIP_MASK       0x00100000      /* virtual interrupt pending */
-#define ID_MASK                0x00200000
-
-#define desc_empty(desc) \
-               (!((desc)->a | (desc)->b))
-
-#define desc_equal(desc1, desc2) \
-               (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
-
-/*
- * Default implementation of macro that returns current
- * instruction pointer ("program counter").
- */
-#define current_text_addr() ({ void *pc; asm volatile("leaq 1f(%%rip),%0\n1:":"=r"(pc)); pc; })
-
-/*
- *  CPU type and hardware bug flags. Kept separately for each CPU.
- */
-
-struct cpuinfo_x86 {
-       __u8    x86;            /* CPU family */
-       __u8    x86_vendor;     /* CPU vendor */
-       __u8    x86_model;
-       __u8    x86_mask;
-       int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
-       __u32   x86_capability[NCAPINTS];
-       char    x86_vendor_id[16];
-       char    x86_model_id[64];
-       int     x86_cache_size;  /* in KB */
-       int     x86_clflush_size;
-       int     x86_cache_alignment;
-       int     x86_tlbsize;    /* number of 4K pages in DTLB/ITLB combined(in pages)*/
-        __u8    x86_virt_bits, x86_phys_bits;
-       __u8    x86_max_cores;  /* cpuid returned max cores value */
-        __u32   x86_power;     
-       __u32   extended_cpuid_level;   /* Max extended CPUID function supported */
-       unsigned long loops_per_jiffy;
-#ifdef CONFIG_SMP
-       cpumask_t llc_shared_map;       /* cpus sharing the last level cache */
-#endif
-       __u8    apicid;
-#ifdef CONFIG_SMP
-       __u8    booted_cores;   /* number of cores as seen by OS */
-       __u8    phys_proc_id;   /* Physical Processor id. */
-       __u8    cpu_core_id;    /* Core id. */
-#endif
-} ____cacheline_aligned;
-
-#define X86_VENDOR_INTEL 0
-#define X86_VENDOR_CYRIX 1
-#define X86_VENDOR_AMD 2
-#define X86_VENDOR_UMC 3
-#define X86_VENDOR_NEXGEN 4
-#define X86_VENDOR_CENTAUR 5
-#define X86_VENDOR_RISE 6
-#define X86_VENDOR_TRANSMETA 7
-#define X86_VENDOR_NUM 8
-#define X86_VENDOR_UNKNOWN 0xff
-
-#ifdef CONFIG_SMP
-extern struct cpuinfo_x86 cpu_data[];
-#define current_cpu_data cpu_data[smp_processor_id()]
-#else
-#define cpu_data (&boot_cpu_data)
-#define current_cpu_data boot_cpu_data
-#endif
-
-extern char ignore_irq13;
-
-extern void identify_cpu(struct cpuinfo_x86 *);
-extern void print_cpu_info(struct cpuinfo_x86 *);
-extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
-extern unsigned short num_cache_leaves;
-
-/*
- * EFLAGS bits
- */
-#define X86_EFLAGS_CF  0x00000001 /* Carry Flag */
-#define X86_EFLAGS_PF  0x00000004 /* Parity Flag */
-#define X86_EFLAGS_AF  0x00000010 /* Auxillary carry Flag */
-#define X86_EFLAGS_ZF  0x00000040 /* Zero Flag */
-#define X86_EFLAGS_SF  0x00000080 /* Sign Flag */
-#define X86_EFLAGS_TF  0x00000100 /* Trap Flag */
-#define X86_EFLAGS_IF  0x00000200 /* Interrupt Flag */
-#define X86_EFLAGS_DF  0x00000400 /* Direction Flag */
-#define X86_EFLAGS_OF  0x00000800 /* Overflow Flag */
-#define X86_EFLAGS_IOPL        0x00003000 /* IOPL mask */
-#define X86_EFLAGS_NT  0x00004000 /* Nested Task */
-#define X86_EFLAGS_RF  0x00010000 /* Resume Flag */
-#define X86_EFLAGS_VM  0x00020000 /* Virtual Mode */
-#define X86_EFLAGS_AC  0x00040000 /* Alignment Check */
-#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
-#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
-#define X86_EFLAGS_ID  0x00200000 /* CPUID detection flag */
-
-/*
- * Intel CPU features in CR4
- */
-#define X86_CR4_VME            0x0001  /* enable vm86 extensions */
-#define X86_CR4_PVI            0x0002  /* virtual interrupts flag enable */
-#define X86_CR4_TSD            0x0004  /* disable time stamp at ipl 3 */
-#define X86_CR4_DE             0x0008  /* enable debugging extensions */
-#define X86_CR4_PSE            0x0010  /* enable page size extensions */
-#define X86_CR4_PAE            0x0020  /* enable physical address extensions */
-#define X86_CR4_MCE            0x0040  /* Machine check enable */
-#define X86_CR4_PGE            0x0080  /* enable global pages */
-#define X86_CR4_PCE            0x0100  /* enable performance counters at ipl 3 */
-#define X86_CR4_OSFXSR         0x0200  /* enable fast FPU save and restore */
-#define X86_CR4_OSXMMEXCPT     0x0400  /* enable unmasked SSE exceptions */
-
-/*
- * Save the cr4 feature set we're using (ie
- * Pentium 4MB enable and PPro Global page
- * enable), so that any CPU's that boot up
- * after us can get the correct flags.
- */
-extern unsigned long mmu_cr4_features;
-
-static inline void set_in_cr4 (unsigned long mask)
-{
-       mmu_cr4_features |= mask;
-       __asm__("movq %%cr4,%%rax\n\t"
-               "orq %0,%%rax\n\t"
-               "movq %%rax,%%cr4\n"
-               : : "irg" (mask)
-               :"ax");
-}
-
-static inline void clear_in_cr4 (unsigned long mask)
-{
-       mmu_cr4_features &= ~mask;
-       __asm__("movq %%cr4,%%rax\n\t"
-               "andq %0,%%rax\n\t"
-               "movq %%rax,%%cr4\n"
-               : : "irg" (~mask)
-               :"ax");
-}
-
-
-/*
- * Bus types
- */
-#define MCA_bus 0
-#define MCA_bus__is_a_macro
-
-/*
- * User space process size. 47bits minus one guard page.
- */
-#define TASK_SIZE64    (0x800000000000UL - 4096)
-
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000)
-
-#define TASK_SIZE              (test_thread_flag(TIF_IA32) ? IA32_PAGE_OFFSET : TASK_SIZE64)
-#define TASK_SIZE_OF(child)    ((test_tsk_thread_flag(child, TIF_IA32)) ? IA32_PAGE_OFFSET : TASK_SIZE64)
-
-#define TASK_UNMAPPED_BASE     PAGE_ALIGN(TASK_SIZE/3)
-
-/*
- * Size of io_bitmap.
- */
-#define IO_BITMAP_BITS  65536
-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
-#ifndef CONFIG_X86_NO_TSS
-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
-#endif
-#define INVALID_IO_BITMAP_OFFSET 0x8000
-
-struct i387_fxsave_struct {
-       u16     cwd;
-       u16     swd;
-       u16     twd;
-       u16     fop;
-       u64     rip;
-       u64     rdp; 
-       u32     mxcsr;
-       u32     mxcsr_mask;
-       u32     st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-       u32     xmm_space[64];  /* 16*16 bytes for each XMM-reg = 128 bytes */
-       u32     padding[24];
-} __attribute__ ((aligned (16)));
-
-union i387_union {
-       struct i387_fxsave_struct       fxsave;
-};
-
-#ifndef CONFIG_X86_NO_TSS
-struct tss_struct {
-       u32 reserved1;
-       u64 rsp0;       
-       u64 rsp1;
-       u64 rsp2;
-       u64 reserved2;
-       u64 ist[7];
-       u32 reserved3;
-       u32 reserved4;
-       u16 reserved5;
-       u16 io_bitmap_base;
-       /*
-        * The extra 1 is there because the CPU will access an
-        * additional byte beyond the end of the IO permission
-        * bitmap. The extra byte must be all 1 bits, and must
-        * be within the limit. Thus we have:
-        *
-        * 128 bytes, the bitmap itself, for ports 0..0x3ff
-        * 8 bytes, for an extra "long" of ~0UL
-        */
-       unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
-} __attribute__((packed)) ____cacheline_aligned;
-
-DECLARE_PER_CPU(struct tss_struct,init_tss);
-#endif
-
-
-extern struct cpuinfo_x86 boot_cpu_data;
-#ifndef CONFIG_X86_NO_TSS
-/* Save the original ist values for checking stack pointers during debugging */
-struct orig_ist {
-       unsigned long ist[7];
-};
-DECLARE_PER_CPU(struct orig_ist, orig_ist);
-#endif
-
-#ifdef CONFIG_X86_VSMP
-#define ARCH_MIN_TASKALIGN     (1 << INTERNODE_CACHE_SHIFT)
-#define ARCH_MIN_MMSTRUCT_ALIGN        (1 << INTERNODE_CACHE_SHIFT)
-#else
-#define ARCH_MIN_TASKALIGN     16
-#define ARCH_MIN_MMSTRUCT_ALIGN        0
-#endif
-
-struct thread_struct {
-       unsigned long   rsp0;
-       unsigned long   rsp;
-       unsigned long   userrsp;        /* Copy from PDA */ 
-       unsigned long   fs;
-       unsigned long   gs;
-       unsigned short  es, ds, fsindex, gsindex;       
-/* Hardware debugging registers */
-       unsigned long   debugreg0;  
-       unsigned long   debugreg1;  
-       unsigned long   debugreg2;  
-       unsigned long   debugreg3;  
-       unsigned long   debugreg6;  
-       unsigned long   debugreg7;  
-/* fault info */
-       unsigned long   cr2, trap_no, error_code;
-/* floating point info */
-       union i387_union        i387  __attribute__((aligned(16)));
-/* IO permissions. the bitmap could be moved into the GDT, that would make
-   switch faster for a limited number of ioperm using tasks. -AK */
-       int             ioperm;
-       unsigned long   *io_bitmap_ptr;
-       unsigned io_bitmap_max;
-/* cached TLS descriptors. */
-       u64 tls_array[GDT_ENTRY_TLS_ENTRIES];
-       unsigned int    iopl;
-} __attribute__((aligned(16)));
-
-#define INIT_THREAD  { \
-       .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
-}
-
-#ifndef CONFIG_X86_NO_TSS
-#define INIT_TSS  { \
-       .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
-}
-#endif
-
-#define INIT_MMAP \
-{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL }
-
-#define start_thread(regs,new_rip,new_rsp) do { \
-       asm volatile("movl %0,%%fs; movl %0,%%es; movl %0,%%ds": :"r" (0));      \
-       load_gs_index(0);                                                       \
-       (regs)->rip = (new_rip);                                                 \
-       (regs)->rsp = (new_rsp);                                                 \
-       write_pda(oldrsp, (new_rsp));                                            \
-       (regs)->cs = __USER_CS;                                                  \
-       (regs)->ss = __USER_DS;                                                  \
-       (regs)->eflags = 0x200;                                                  \
-       set_fs(USER_DS);                                                         \
-} while(0) 
-
-#define get_debugreg(var, register)                            \
-       var = HYPERVISOR_get_debugreg(register)
-#define set_debugreg(value, register)                  \
-       HYPERVISOR_set_debugreg(register, value)
-
-struct task_struct;
-struct mm_struct;
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-
-/* Prepare to copy thread state - unlazy all lazy status */
-extern void prepare_to_copy(struct task_struct *tsk);
-
-/*
- * create a kernel thread without removing it from tasklists
- */
-extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
-/*
- * Return saved PC of a blocked thread.
- * What is this good for? it will be always the scheduler or ret_from_fork.
- */
-#define thread_saved_pc(t) (*(unsigned long *)((t)->thread.rsp - 8))
-
-extern unsigned long get_wchan(struct task_struct *p);
-#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.rsp0 - 1)
-#define KSTK_EIP(tsk) (task_pt_regs(tsk)->rip)
-#define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */
-
-
-struct microcode_header {
-       unsigned int hdrver;
-       unsigned int rev;
-       unsigned int date;
-       unsigned int sig;
-       unsigned int cksum;
-       unsigned int ldrver;
-       unsigned int pf;
-       unsigned int datasize;
-       unsigned int totalsize;
-       unsigned int reserved[3];
-};
-
-struct microcode {
-       struct microcode_header hdr;
-       unsigned int bits[0];
-};
-
-typedef struct microcode microcode_t;
-typedef struct microcode_header microcode_header_t;
-
-/* microcode format is extended from prescott processors */
-struct extended_signature {
-       unsigned int sig;
-       unsigned int pf;
-       unsigned int cksum;
-};
-
-struct extended_sigtable {
-       unsigned int count;
-       unsigned int cksum;
-       unsigned int reserved[3];
-       struct extended_signature sigs[0];
-};
-
-
-#define ASM_NOP1 K8_NOP1
-#define ASM_NOP2 K8_NOP2
-#define ASM_NOP3 K8_NOP3
-#define ASM_NOP4 K8_NOP4
-#define ASM_NOP5 K8_NOP5
-#define ASM_NOP6 K8_NOP6
-#define ASM_NOP7 K8_NOP7
-#define ASM_NOP8 K8_NOP8
-
-/* Opteron nops */
-#define K8_NOP1 ".byte 0x90\n"
-#define K8_NOP2        ".byte 0x66,0x90\n" 
-#define K8_NOP3        ".byte 0x66,0x66,0x90\n" 
-#define K8_NOP4        ".byte 0x66,0x66,0x66,0x90\n" 
-#define K8_NOP5        K8_NOP3 K8_NOP2 
-#define K8_NOP6        K8_NOP3 K8_NOP3
-#define K8_NOP7        K8_NOP4 K8_NOP3
-#define K8_NOP8        K8_NOP4 K8_NOP4
-
-#define ASM_NOP_MAX 8
-
-/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
-static inline void rep_nop(void)
-{
-       __asm__ __volatile__("rep;nop": : :"memory");
-}
-
-/* Stop speculative execution */
-static inline void sync_core(void)
-{ 
-       int tmp;
-       asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
-} 
-
-#define cpu_has_fpu 1
-
-#define ARCH_HAS_PREFETCH
-static inline void prefetch(void *x) 
-{ 
-       asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
-} 
-
-#define ARCH_HAS_PREFETCHW 1
-static inline void prefetchw(void *x) 
-{ 
-       alternative_input("prefetcht0 (%1)",
-                         "prefetchw (%1)",
-                         X86_FEATURE_3DNOW,
-                         "r" (x));
-} 
-
-#define ARCH_HAS_SPINLOCK_PREFETCH 1
-
-#define spin_lock_prefetch(x)  prefetchw(x)
-
-#define cpu_relax()   rep_nop()
-
-/*
- *      NSC/Cyrix CPU configuration register indexes
- */
-#define CX86_CCR0 0xc0
-#define CX86_CCR1 0xc1
-#define CX86_CCR2 0xc2
-#define CX86_CCR3 0xc3
-#define CX86_CCR4 0xe8
-#define CX86_CCR5 0xe9
-#define CX86_CCR6 0xea
-#define CX86_CCR7 0xeb
-#define CX86_DIR0 0xfe
-#define CX86_DIR1 0xff
-#define CX86_ARR_BASE 0xc4
-#define CX86_RCR_BASE 0xdc
-
-/*
- *      NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
-       outb((reg), 0x22); \
-       outb((data), 0x23); \
-} while (0)
-
-static inline void serialize_cpu(void)
-{
-       __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
-}
-
-static inline void __monitor(const void *eax, unsigned long ecx,
-               unsigned long edx)
-{
-       /* "monitor %eax,%ecx,%edx;" */
-       asm volatile(
-               ".byte 0x0f,0x01,0xc8;"
-               : :"a" (eax), "c" (ecx), "d"(edx));
-}
-
-static inline void __mwait(unsigned long eax, unsigned long ecx)
-{
-       /* "mwait %eax,%ecx;" */
-       asm volatile(
-               ".byte 0x0f,0x01,0xc9;"
-               : :"a" (eax), "c" (ecx));
-}
-
-#define stack_current() \
-({                                                             \
-       struct thread_info *ti;                                 \
-       asm("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK));  \
-       ti->task;                                       \
-})
-
-#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
-
-extern unsigned long boot_option_idle_override;
-/* Boot loader type from the setup header */
-extern int bootloader_type;
-
-#define HAVE_ARCH_PICK_MMAP_LAYOUT 1
-
-#endif /* __ASM_X86_64_PROCESSOR_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/ptrace.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/ptrace.h
deleted file mode 100644 (file)
index e6801fa..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef _X86_64_PTRACE_H
-#define _X86_64_PTRACE_H
-
-#if defined(__ASSEMBLY__) || defined(__FRAME_OFFSETS) 
-#define R15 0
-#define R14 8
-#define R13 16
-#define R12 24
-#define RBP 32
-#define RBX 40
-/* arguments: interrupts/non tracing syscalls only save upto here*/
-#define R11 48
-#define R10 56 
-#define R9 64
-#define R8 72
-#define RAX 80
-#define RCX 88
-#define RDX 96
-#define RSI 104
-#define RDI 112
-#define ORIG_RAX 120       /* = ERROR */ 
-/* end of arguments */         
-/* cpu exception frame or undefined in case of fast syscall. */
-#define RIP 128
-#define CS 136
-#define EFLAGS 144
-#define RSP 152
-#define SS 160
-#define ARGOFFSET R11
-#endif /* __ASSEMBLY__ */
-
-/* top of stack page */ 
-#define FRAME_SIZE 168
-
-#define PTRACE_OLDSETOPTIONS         21
-
-#ifndef __ASSEMBLY__ 
-
-struct pt_regs {
-       unsigned long r15;
-       unsigned long r14;
-       unsigned long r13;
-       unsigned long r12;
-       unsigned long rbp;
-       unsigned long rbx;
-/* arguments: non interrupts/non tracing syscalls only save upto here*/
-       unsigned long r11;
-       unsigned long r10;      
-       unsigned long r9;
-       unsigned long r8;
-       unsigned long rax;
-       unsigned long rcx;
-       unsigned long rdx;
-       unsigned long rsi;
-       unsigned long rdi;
-       unsigned long orig_rax;
-/* end of arguments */         
-/* cpu exception frame or undefined */
-       unsigned long rip;
-       unsigned long cs;
-       unsigned long eflags; 
-       unsigned long rsp; 
-       unsigned long ss;
-/* top of stack page */ 
-};
-
-#endif
-
-/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
-#define PTRACE_GETREGS            12
-#define PTRACE_SETREGS            13
-#define PTRACE_GETFPREGS          14
-#define PTRACE_SETFPREGS          15
-#define PTRACE_GETFPXREGS         18
-#define PTRACE_SETFPXREGS         19
-
-/* only useful for access 32bit programs */
-#define PTRACE_GET_THREAD_AREA    25
-#define PTRACE_SET_THREAD_AREA    26
-
-#define PTRACE_ARCH_PRCTL        30    /* arch_prctl for child */
-
-#if defined(__KERNEL__) && !defined(__ASSEMBLY__) 
-#define user_mode(regs) (!!((regs)->cs & 3))
-#define user_mode_vm(regs) user_mode(regs)
-#define instruction_pointer(regs) ((regs)->rip)
-#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
-extern unsigned long profile_pc(struct pt_regs *regs);
-#else
-#define profile_pc(regs) instruction_pointer(regs)
-#endif
-
-#include <linux/compiler.h>
-
-void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
-
-struct task_struct;
-
-extern unsigned long
-convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs);
-
-enum {
-        EF_CF   = 0x00000001,
-        EF_PF   = 0x00000004,
-        EF_AF   = 0x00000010,
-        EF_ZF   = 0x00000040,
-        EF_SF   = 0x00000080,
-        EF_TF   = 0x00000100,
-        EF_IE   = 0x00000200,
-        EF_DF   = 0x00000400,
-        EF_OF   = 0x00000800,
-        EF_IOPL = 0x00003000,
-        EF_IOPL_RING0 = 0x00000000,
-        EF_IOPL_RING1 = 0x00001000,
-        EF_IOPL_RING2 = 0x00002000,
-        EF_NT   = 0x00004000,   /* nested task */
-        EF_RF   = 0x00010000,   /* resume */
-        EF_VM   = 0x00020000,   /* virtual mode */
-        EF_AC   = 0x00040000,   /* alignment */
-        EF_VIF  = 0x00080000,   /* virtual interrupt */
-        EF_VIP  = 0x00100000,   /* virtual interrupt pending */
-        EF_ID   = 0x00200000,   /* id */
-};
-
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/smp.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/smp.h
deleted file mode 100644 (file)
index 33b0fbe..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-#ifndef __ASM_SMP_H
-#define __ASM_SMP_H
-
-/*
- * We need the APIC definitions automatically as part of 'smp.h'
- */
-#ifndef __ASSEMBLY__
-#include <linux/threads.h>
-#include <linux/cpumask.h>
-#include <linux/bitops.h>
-extern int disable_apic;
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#ifndef __ASSEMBLY__
-#include <asm/fixmap.h>
-#include <asm/mpspec.h>
-#ifdef CONFIG_X86_IO_APIC
-#include <asm/io_apic.h>
-#endif
-#include <asm/apic.h>
-#include <asm/thread_info.h>
-#endif
-#endif
-
-#ifdef CONFIG_SMP
-#ifndef ASSEMBLY
-
-#include <asm/pda.h>
-
-struct pt_regs;
-
-extern cpumask_t cpu_present_mask;
-extern cpumask_t cpu_possible_map;
-extern cpumask_t cpu_online_map;
-extern cpumask_t cpu_initialized;
-
-/*
- * Private routines/data
- */
-extern void smp_alloc_memory(void);
-extern volatile unsigned long smp_invalidate_needed;
-extern int pic_mode;
-extern void lock_ipi_call_lock(void);
-extern void unlock_ipi_call_lock(void);
-extern int smp_num_siblings;
-extern void smp_send_reschedule(int cpu);
-void smp_stop_cpu(void);
-extern int smp_call_function_single(int cpuid, void (*func) (void *info),
-                               void *info, int retry, int wait);
-
-extern cpumask_t cpu_sibling_map[NR_CPUS];
-extern cpumask_t cpu_core_map[NR_CPUS];
-extern u8 cpu_llc_id[NR_CPUS];
-
-#define SMP_TRAMPOLINE_BASE 0x6000
-
-/*
- * On x86 all CPUs are mapped 1:1 to the APIC space.
- * This simplifies scheduling and IPI sending and
- * compresses data structures.
- */
-
-static inline int num_booting_cpus(void)
-{
-       return cpus_weight(cpu_possible_map);
-}
-
-#define raw_smp_processor_id() read_pda(cpunumber)
-
-#ifdef CONFIG_X86_LOCAL_APIC
-static inline int hard_smp_processor_id(void)
-{
-       /* we don't want to mark this access volatile - bad code generation */
-       return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID));
-}
-#endif
-
-extern int safe_smp_processor_id(void);
-extern int __cpu_disable(void);
-extern void __cpu_die(unsigned int cpu);
-extern void prefill_possible_map(void);
-extern unsigned num_processors;
-extern unsigned disabled_cpus;
-
-#endif /* !ASSEMBLY */
-
-#define NO_PROC_ID             0xFF            /* No processor magic marker */
-
-#endif
-
-#ifndef ASSEMBLY
-/*
- * Some lowlevel functions might want to know about
- * the real APIC ID <-> CPU # mapping.
- */
-extern u8 x86_cpu_to_apicid[NR_CPUS];  /* physical ID */
-extern u8 x86_cpu_to_log_apicid[NR_CPUS];
-extern u8 bios_cpu_apicid[];
-
-#ifdef CONFIG_X86_LOCAL_APIC
-static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
-{
-       return cpus_addr(cpumask)[0];
-}
-
-static inline int cpu_present_to_apicid(int mps_cpu)
-{
-       if (mps_cpu < NR_CPUS)
-               return (int)bios_cpu_apicid[mps_cpu];
-       else
-               return BAD_APICID;
-}
-#endif
-
-#endif /* !ASSEMBLY */
-
-#ifndef CONFIG_SMP
-#define stack_smp_processor_id() 0
-#define safe_smp_processor_id() 0
-#define cpu_logical_map(x) (x)
-#else
-#include <asm/thread_info.h>
-#define stack_smp_processor_id() \
-({                                                             \
-       struct thread_info *ti;                                 \
-       __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK));      \
-       ti->cpu;                                                \
-})
-#endif
-
-#ifndef __ASSEMBLY__
-#ifdef CONFIG_X86_LOCAL_APIC
-static __inline int logical_smp_processor_id(void)
-{
-       /* we don't want to mark this access volatile - bad code generation */
-       return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
-}
-#endif
-#endif
-
-#ifdef CONFIG_SMP
-#define cpu_physical_id(cpu)           x86_cpu_to_apicid[cpu]
-#else
-#define cpu_physical_id(cpu)           boot_cpu_id
-#endif
-
-#endif
-
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/synch_bitops.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/synch_bitops.h
deleted file mode 100644 (file)
index ab71cd1..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#include <asm-i386/mach-xen/asm/synch_bitops.h>
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h
deleted file mode 100644 (file)
index 0568010..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-#ifndef __ASM_SYSTEM_H
-#define __ASM_SYSTEM_H
-
-#include <linux/kernel.h>
-#include <asm/segment.h>
-#include <asm/alternative.h>
-
-#include <asm/synch_bitops.h>
-#include <asm/hypervisor.h>
-#include <xen/interface/arch-x86_64.h>
-
-#ifdef __KERNEL__
-
-#ifdef CONFIG_SMP
-#define __vcpu_id smp_processor_id()
-#else
-#define __vcpu_id 0
-#endif
-
-#define __STR(x) #x
-#define STR(x) __STR(x)
-
-#define __SAVE(reg,offset) "movq %%" #reg ",(14-" #offset ")*8(%%rsp)\n\t"
-#define __RESTORE(reg,offset) "movq (14-" #offset ")*8(%%rsp),%%" #reg "\n\t"
-
-/* frame pointer must be last for get_wchan */
-#define SAVE_CONTEXT    "pushq %%rbp ; movq %%rsi,%%rbp\n\t"
-#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\n\t"
-
-#define __EXTRA_CLOBBER  \
-       ,"rcx","rbx","rdx","r8","r9","r10","r11","r12","r13","r14","r15"
-
-#define switch_to(prev,next,last) \
-       asm volatile(SAVE_CONTEXT                                                   \
-                    "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */       \
-                    "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */    \
-                    "call __switch_to\n\t"                                       \
-                    ".globl thread_return\n"                                   \
-                    "thread_return:\n\t"                                           \
-                    "movq %%gs:%P[pda_pcurrent],%%rsi\n\t"                       \
-                    "movq %P[thread_info](%%rsi),%%r8\n\t"                       \
-                    LOCK_PREFIX "btr  %[tif_fork],%P[ti_flags](%%r8)\n\t"        \
-                    "movq %%rax,%%rdi\n\t"                                       \
-                    "jc   ret_from_fork\n\t"                                     \
-                    RESTORE_CONTEXT                                                \
-                    : "=a" (last)                                                \
-                    : [next] "S" (next), [prev] "D" (prev),                      \
-                      [threadrsp] "i" (offsetof(struct task_struct, thread.rsp)), \
-                      [ti_flags] "i" (offsetof(struct thread_info, flags)),\
-                      [tif_fork] "i" (TIF_FORK),                         \
-                      [thread_info] "i" (offsetof(struct task_struct, thread_info)), \
-                      [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent))   \
-                    : "memory", "cc" __EXTRA_CLOBBER)
-    
-extern void load_gs_index(unsigned); 
-
-/*
- * Load a segment. Fall back on loading the zero
- * segment if something goes wrong..
- */
-#define loadsegment(seg,value) \
-       asm volatile("\n"                       \
-               "1:\t"                          \
-               "movl %k0,%%" #seg "\n"         \
-               "2:\n"                          \
-               ".section .fixup,\"ax\"\n"      \
-               "3:\t"                          \
-               "movl %1,%%" #seg "\n\t"        \
-               "jmp 2b\n"                      \
-               ".previous\n"                   \
-               ".section __ex_table,\"a\"\n\t" \
-               ".align 8\n\t"                  \
-               ".quad 1b,3b\n"                 \
-               ".previous"                     \
-               : :"r" (value), "r" (0))
-
-/*
- * Clear and set 'TS' bit respectively
- */
-#define clts() (HYPERVISOR_fpu_taskswitch(0))
-
-static inline unsigned long read_cr0(void)
-{ 
-       unsigned long cr0;
-       asm volatile("movq %%cr0,%0" : "=r" (cr0));
-       return cr0;
-} 
-
-static inline void write_cr0(unsigned long val) 
-{ 
-       asm volatile("movq %0,%%cr0" :: "r" (val));
-} 
-
-#define read_cr3() ({ \
-       unsigned long __dummy; \
-       asm("movq %%cr3,%0" : "=r" (__dummy)); \
-       machine_to_phys(__dummy); \
-})
-
-static inline unsigned long read_cr4(void)
-{ 
-       unsigned long cr4;
-       asm("movq %%cr4,%0" : "=r" (cr4));
-       return cr4;
-} 
-
-static inline void write_cr4(unsigned long val)
-{ 
-       asm volatile("movq %0,%%cr4" :: "r" (val));
-} 
-
-#define stts() (HYPERVISOR_fpu_taskswitch(1))
-
-#define wbinvd() \
-       __asm__ __volatile__ ("wbinvd": : :"memory");
-
-/*
- * On SMP systems, when the scheduler does migration-cost autodetection,
- * it needs a way to flush as much of the CPU's caches as possible.
- */
-static inline void sched_cacheflush(void)
-{
-       wbinvd();
-}
-
-#endif /* __KERNEL__ */
-
-#define nop() __asm__ __volatile__ ("nop")
-
-#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-
-#define tas(ptr) (xchg((ptr),1))
-
-#define __xg(x) ((volatile long *)(x))
-
-static inline void set_64bit(volatile unsigned long *ptr, unsigned long val)
-{
-       *ptr = val;
-}
-
-#define _set_64bit set_64bit
-
-/*
- * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
- * Note 2: xchg has side effect, so that attribute volatile is necessary,
- *       but generally the primitive is invalid, *ptr is output argument. --ANK
- */
-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-{
-       switch (size) {
-               case 1:
-                       __asm__ __volatile__("xchgb %b0,%1"
-                               :"=q" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 2:
-                       __asm__ __volatile__("xchgw %w0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 4:
-                       __asm__ __volatile__("xchgl %k0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 8:
-                       __asm__ __volatile__("xchgq %0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-       }
-       return x;
-}
-
-/*
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- */
-
-#define __HAVE_ARCH_CMPXCHG 1
-
-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-                                     unsigned long new, int size)
-{
-       unsigned long prev;
-       switch (size) {
-       case 1:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 2:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 4:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %k1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 8:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       }
-       return old;
-}
-
-#define cmpxchg(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-                                       (unsigned long)(n),sizeof(*(ptr))))
-
-#ifdef CONFIG_SMP
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      wmb()
-#define smp_read_barrier_depends()     do {} while(0)
-#else
-#define smp_mb()       barrier()
-#define smp_rmb()      barrier()
-#define smp_wmb()      barrier()
-#define smp_read_barrier_depends()     do {} while(0)
-#endif
-
-    
-/*
- * Force strict CPU ordering.
- * And yes, this is required on UP too when we're talking
- * to devices.
- */
-#define mb()   asm volatile("mfence":::"memory")
-#define rmb()  asm volatile("lfence":::"memory")
-
-#ifdef CONFIG_UNORDERED_IO
-#define wmb()  asm volatile("sfence" ::: "memory")
-#else
-#define wmb()  asm volatile("" ::: "memory")
-#endif
-#define read_barrier_depends() do {} while(0)
-#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-
-#define warn_if_not_ulong(x) do { unsigned long foo; (void) (&(x) == &foo); } while (0)
-
-#include <linux/irqflags.h>
-
-void cpu_idle_wait(void);
-
-extern unsigned long arch_align_stack(unsigned long sp);
-extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/timer.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/timer.h
deleted file mode 100644 (file)
index 58140c3..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _ASMi386_TIMER_H
-#define _ASMi386_TIMER_H
-#include <linux/init.h>
-
-/**
- * struct timer_ops - used to define a timer source
- *
- * @name: name of the timer.
- * @init: Probes and initializes the timer. Takes clock= override 
- *        string as an argument. Returns 0 on success, anything else
- *        on failure.
- * @mark_offset: called by the timer interrupt.
- * @get_offset:  called by gettimeofday(). Returns the number of microseconds
- *               since the last timer interupt.
- * @monotonic_clock: returns the number of nanoseconds since the init of the
- *                   timer.
- * @delay: delays this many clock cycles.
- */
-struct timer_opts {
-       char* name;
-       void (*mark_offset)(void);
-       unsigned long (*get_offset)(void);
-       unsigned long long (*monotonic_clock)(void);
-       void (*delay)(unsigned long);
-       unsigned long (*read_timer)(void);
-       int (*suspend)(pm_message_t state);
-       int (*resume)(void);
-};
-
-struct init_timer_opts {
-       int (*init)(char *override);
-       struct timer_opts *opts;
-};
-
-#define TICK_SIZE (tick_nsec / 1000)
-
-extern struct timer_opts* __init select_timer(void);
-extern void clock_fallback(void);
-void setup_pit_timer(void);
-
-/* Modifiers for buggy PIT handling */
-
-extern int pit_latch_buggy;
-
-extern struct timer_opts *cur_timer;
-extern int timer_ack;
-
-/* list of externed timers */
-extern struct timer_opts timer_none;
-extern struct timer_opts timer_pit;
-extern struct init_timer_opts timer_pit_init;
-extern struct init_timer_opts timer_tsc_init;
-#ifdef CONFIG_X86_CYCLONE_TIMER
-extern struct init_timer_opts timer_cyclone_init;
-#endif
-
-extern unsigned long calibrate_tsc(void);
-extern void init_cpu_khz(void);
-#ifdef CONFIG_HPET_TIMER
-extern struct init_timer_opts timer_hpet_init;
-extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr);
-#endif
-
-#ifdef CONFIG_X86_PM_TIMER
-extern struct init_timer_opts timer_pmtmr_init;
-#endif
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/tlbflush.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/tlbflush.h
deleted file mode 100644 (file)
index 3a81774..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef _X8664_TLBFLUSH_H
-#define _X8664_TLBFLUSH_H
-
-#include <linux/mm.h>
-#include <asm/processor.h>
-
-#define __flush_tlb()  xen_tlb_flush()
-
-/*
- * Global pages have to be flushed a bit differently. Not a real
- * performance problem because this does not happen often.
- */
-#define __flush_tlb_global()   xen_tlb_flush()
-
-
-extern unsigned long pgkern_mask;
-
-#define __flush_tlb_all() __flush_tlb_global()
-
-#define __flush_tlb_one(addr)  xen_invlpg((unsigned long)addr)
-
-
-/*
- * TLB flushing:
- *
- *  - flush_tlb() flushes the current mm struct TLBs
- *  - flush_tlb_all() flushes all processes TLBs
- *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
- *  - flush_tlb_page(vma, vmaddr) flushes one page
- *  - flush_tlb_range(vma, start, end) flushes a range of pages
- *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
- *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
- *
- * x86-64 can only flush individual pages or full VMs. For a range flush
- * we always do the full VM. Might be worth trying if for a small
- * range a few INVLPGs in a row are a win.
- */
-
-#ifndef CONFIG_SMP
-
-#define flush_tlb() __flush_tlb()
-#define flush_tlb_all() __flush_tlb_all()
-#define local_flush_tlb() __flush_tlb()
-
-static inline void flush_tlb_mm(struct mm_struct *mm)
-{
-       if (mm == current->active_mm)
-               __flush_tlb();
-}
-
-static inline void flush_tlb_page(struct vm_area_struct *vma,
-       unsigned long addr)
-{
-       if (vma->vm_mm == current->active_mm)
-               __flush_tlb_one(addr);
-}
-
-static inline void flush_tlb_range(struct vm_area_struct *vma,
-       unsigned long start, unsigned long end)
-{
-       if (vma->vm_mm == current->active_mm)
-               __flush_tlb();
-}
-
-#else
-
-#include <asm/smp.h>
-
-#define local_flush_tlb() \
-       __flush_tlb()
-
-extern void flush_tlb_all(void);
-extern void flush_tlb_current_task(void);
-extern void flush_tlb_mm(struct mm_struct *);
-extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-
-#define flush_tlb()    flush_tlb_current_task()
-
-static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
-{
-       flush_tlb_mm(vma->vm_mm);
-}
-
-#define TLBSTATE_OK    1
-#define TLBSTATE_LAZY  2
-
-/* Roughly an IPI every 20MB with 4k pages for freeing page table
-   ranges. Cost is about 42k of memory for each CPU. */
-#define ARCH_FREE_PTE_NR 5350  
-
-#endif
-
-#define flush_tlb_kernel_range(start, end) flush_tlb_all()
-
-static inline void flush_tlb_pgtables(struct mm_struct *mm,
-                                     unsigned long start, unsigned long end)
-{
-       /* x86_64 does not keep any page table caches in a software TLB.
-          The CPUs do in their hardware TLBs, but they are handled
-          by the normal TLB flushing algorithms. */
-}
-
-#endif /* _X8664_TLBFLUSH_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/vga.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/vga.h
deleted file mode 100644 (file)
index ffec7fa..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *     Access to VGA videoram
- *
- *     (c) 1998 Martin Mares <mj@ucw.cz>
- */
-
-#ifndef _LINUX_ASM_VGA_H_
-#define _LINUX_ASM_VGA_H_
-
-/*
- *     On the PC, we can just recalculate addresses and then
- *     access the videoram directly without any black magic.
- */
-
-#define VGA_MAP_MEM(x,s) (unsigned long)isa_bus_to_virt(x)
-
-#define vga_readb(x) (*(x))
-#define vga_writeb(x,y) (*(y) = (x))
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xenoprof.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xenoprof.h
deleted file mode 100644 (file)
index 47b3650..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-i386/mach-xen/asm/xenoprof.h>
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xor.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/xor.h
deleted file mode 100644 (file)
index 6ec68fd..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * x86-64 changes / gcc fixes from Andi Kleen. 
- * Copyright 2002 Andi Kleen, SuSE Labs.
- *
- * This hasn't been optimized for the hammer yet, but there are likely
- * no advantages to be gotten from x86-64 here anyways.
- */
-
-typedef struct { unsigned long a,b; } __attribute__((aligned(16))) xmm_store_t;
-
-/* Doesn't use gcc to save the XMM registers, because there is no easy way to 
-   tell it to do a clts before the register saving. */
-#define XMMS_SAVE do {                         \
-       preempt_disable();                      \
-       if (!(current_thread_info()->status & TS_USEDFPU))      \
-               clts();                         \
-       __asm__ __volatile__ (                  \
-               "movups %%xmm0,(%1)     ;\n\t"  \
-               "movups %%xmm1,0x10(%1) ;\n\t"  \
-               "movups %%xmm2,0x20(%1) ;\n\t"  \
-               "movups %%xmm3,0x30(%1) ;\n\t"  \
-               : "=&r" (cr0)                   \
-               : "r" (xmm_save)                \
-               : "memory");                    \
-} while(0)
-
-#define XMMS_RESTORE do {                      \
-       asm volatile (                          \
-               "sfence                 ;\n\t"  \
-               "movups (%1),%%xmm0     ;\n\t"  \
-               "movups 0x10(%1),%%xmm1 ;\n\t"  \
-               "movups 0x20(%1),%%xmm2 ;\n\t"  \
-               "movups 0x30(%1),%%xmm3 ;\n\t"  \
-               :                               \
-               : "r" (cr0), "r" (xmm_save)     \
-               : "memory");                    \
-       if (!(current_thread_info()->status & TS_USEDFPU))      \
-               stts();                         \
-       preempt_enable();                       \
-} while(0)
-
-#define OFFS(x)                "16*("#x")"
-#define PF_OFFS(x)     "256+16*("#x")"
-#define        PF0(x)          "       prefetchnta "PF_OFFS(x)"(%[p1])         ;\n"
-#define LD(x,y)                "       movaps   "OFFS(x)"(%[p1]), %%xmm"#y"    ;\n"
-#define ST(x,y)                "       movaps %%xmm"#y",   "OFFS(x)"(%[p1])    ;\n"
-#define PF1(x)         "       prefetchnta "PF_OFFS(x)"(%[p2])         ;\n"
-#define PF2(x)         "       prefetchnta "PF_OFFS(x)"(%[p3])         ;\n"
-#define PF3(x)         "       prefetchnta "PF_OFFS(x)"(%[p4])         ;\n"
-#define PF4(x)         "       prefetchnta "PF_OFFS(x)"(%[p5])         ;\n"
-#define PF5(x)         "       prefetchnta "PF_OFFS(x)"(%[p6])         ;\n"
-#define XO1(x,y)       "       xorps   "OFFS(x)"(%[p2]), %%xmm"#y"     ;\n"
-#define XO2(x,y)       "       xorps   "OFFS(x)"(%[p3]), %%xmm"#y"     ;\n"
-#define XO3(x,y)       "       xorps   "OFFS(x)"(%[p4]), %%xmm"#y"     ;\n"
-#define XO4(x,y)       "       xorps   "OFFS(x)"(%[p5]), %%xmm"#y"     ;\n"
-#define XO5(x,y)       "       xorps   "OFFS(x)"(%[p6]), %%xmm"#y"     ;\n"
-
-
-static void
-xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
-{
-        unsigned int lines = bytes >> 8;
-       unsigned long cr0;
-       xmm_store_t xmm_save[4];
-
-       XMMS_SAVE;
-
-        asm volatile (
-#undef BLOCK
-#define BLOCK(i) \
-               LD(i,0)                                 \
-                       LD(i+1,1)                       \
-               PF1(i)                                  \
-                               PF1(i+2)                \
-                               LD(i+2,2)               \
-                                       LD(i+3,3)       \
-               PF0(i+4)                                \
-                               PF0(i+6)                \
-               XO1(i,0)                                \
-                       XO1(i+1,1)                      \
-                               XO1(i+2,2)              \
-                                       XO1(i+3,3)      \
-               ST(i,0)                                 \
-                       ST(i+1,1)                       \
-                               ST(i+2,2)               \
-                                       ST(i+3,3)       \
-
-
-               PF0(0)
-                               PF0(2)
-
-       " .align 32                     ;\n"
-        " 1:                            ;\n"
-
-               BLOCK(0)
-               BLOCK(4)
-               BLOCK(8)
-               BLOCK(12)
-
-        "       addq %[inc], %[p1]           ;\n"
-        "       addq %[inc], %[p2]           ;\n"
-               "               decl %[cnt] ; jnz 1b"
-       : [p1] "+r" (p1), [p2] "+r" (p2), [cnt] "+r" (lines)
-       : [inc] "r" (256UL) 
-        : "memory");
-
-       XMMS_RESTORE;
-}
-
-static void
-xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-         unsigned long *p3)
-{
-       unsigned int lines = bytes >> 8;
-       xmm_store_t xmm_save[4];
-       unsigned long cr0;
-
-       XMMS_SAVE;
-
-        __asm__ __volatile__ (
-#undef BLOCK
-#define BLOCK(i) \
-               PF1(i)                                  \
-                               PF1(i+2)                \
-               LD(i,0)                                 \
-                       LD(i+1,1)                       \
-                               LD(i+2,2)               \
-                                       LD(i+3,3)       \
-               PF2(i)                                  \
-                               PF2(i+2)                \
-               PF0(i+4)                                \
-                               PF0(i+6)                \
-               XO1(i,0)                                \
-                       XO1(i+1,1)                      \
-                               XO1(i+2,2)              \
-                                       XO1(i+3,3)      \
-               XO2(i,0)                                \
-                       XO2(i+1,1)                      \
-                               XO2(i+2,2)              \
-                                       XO2(i+3,3)      \
-               ST(i,0)                                 \
-                       ST(i+1,1)                       \
-                               ST(i+2,2)               \
-                                       ST(i+3,3)       \
-
-
-               PF0(0)
-                               PF0(2)
-
-       " .align 32                     ;\n"
-        " 1:                            ;\n"
-
-               BLOCK(0)
-               BLOCK(4)
-               BLOCK(8)
-               BLOCK(12)
-
-        "       addq %[inc], %[p1]           ;\n"
-        "       addq %[inc], %[p2]          ;\n"
-        "       addq %[inc], %[p3]           ;\n"
-               "               decl %[cnt] ; jnz 1b"
-       : [cnt] "+r" (lines),
-         [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3)
-       : [inc] "r" (256UL)
-       : "memory"); 
-       XMMS_RESTORE;
-}
-
-static void
-xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-         unsigned long *p3, unsigned long *p4)
-{
-       unsigned int lines = bytes >> 8;
-       xmm_store_t xmm_save[4]; 
-       unsigned long cr0;
-
-       XMMS_SAVE;
-
-        __asm__ __volatile__ (
-#undef BLOCK
-#define BLOCK(i) \
-               PF1(i)                                  \
-                               PF1(i+2)                \
-               LD(i,0)                                 \
-                       LD(i+1,1)                       \
-                               LD(i+2,2)               \
-                                       LD(i+3,3)       \
-               PF2(i)                                  \
-                               PF2(i+2)                \
-               XO1(i,0)                                \
-                       XO1(i+1,1)                      \
-                               XO1(i+2,2)              \
-                                       XO1(i+3,3)      \
-               PF3(i)                                  \
-                               PF3(i+2)                \
-               PF0(i+4)                                \
-                               PF0(i+6)                \
-               XO2(i,0)                                \
-                       XO2(i+1,1)                      \
-                               XO2(i+2,2)              \
-                                       XO2(i+3,3)      \
-               XO3(i,0)                                \
-                       XO3(i+1,1)                      \
-                               XO3(i+2,2)              \
-                                       XO3(i+3,3)      \
-               ST(i,0)                                 \
-                       ST(i+1,1)                       \
-                               ST(i+2,2)               \
-                                       ST(i+3,3)       \
-
-
-               PF0(0)
-                               PF0(2)
-
-       " .align 32                     ;\n"
-        " 1:                            ;\n"
-
-               BLOCK(0)
-               BLOCK(4)
-               BLOCK(8)
-               BLOCK(12)
-
-        "       addq %[inc], %[p1]           ;\n"
-        "       addq %[inc], %[p2]           ;\n"
-        "       addq %[inc], %[p3]           ;\n"
-        "       addq %[inc], %[p4]           ;\n"
-       "       decl %[cnt] ; jnz 1b"
-       : [cnt] "+c" (lines),
-         [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4)
-       : [inc] "r" (256UL)
-        : "memory" );
-
-       XMMS_RESTORE;
-}
-
-static void
-xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-         unsigned long *p3, unsigned long *p4, unsigned long *p5)
-{
-        unsigned int lines = bytes >> 8;
-       xmm_store_t xmm_save[4];
-       unsigned long cr0;
-
-       XMMS_SAVE;
-
-        __asm__ __volatile__ (
-#undef BLOCK
-#define BLOCK(i) \
-               PF1(i)                                  \
-                               PF1(i+2)                \
-               LD(i,0)                                 \
-                       LD(i+1,1)                       \
-                               LD(i+2,2)               \
-                                       LD(i+3,3)       \
-               PF2(i)                                  \
-                               PF2(i+2)                \
-               XO1(i,0)                                \
-                       XO1(i+1,1)                      \
-                               XO1(i+2,2)              \
-                                       XO1(i+3,3)      \
-               PF3(i)                                  \
-                               PF3(i+2)                \
-               XO2(i,0)                                \
-                       XO2(i+1,1)                      \
-                               XO2(i+2,2)              \
-                                       XO2(i+3,3)      \
-               PF4(i)                                  \
-                               PF4(i+2)                \
-               PF0(i+4)                                \
-                               PF0(i+6)                \
-               XO3(i,0)                                \
-                       XO3(i+1,1)                      \
-                               XO3(i+2,2)              \
-                                       XO3(i+3,3)      \
-               XO4(i,0)                                \
-                       XO4(i+1,1)                      \
-                               XO4(i+2,2)              \
-                                       XO4(i+3,3)      \
-               ST(i,0)                                 \
-                       ST(i+1,1)                       \
-                               ST(i+2,2)               \
-                                       ST(i+3,3)       \
-
-
-               PF0(0)
-                               PF0(2)
-
-       " .align 32                     ;\n"
-        " 1:                            ;\n"
-
-               BLOCK(0)
-               BLOCK(4)
-               BLOCK(8)
-               BLOCK(12)
-
-        "       addq %[inc], %[p1]           ;\n"
-        "       addq %[inc], %[p2]           ;\n"
-        "       addq %[inc], %[p3]           ;\n"
-        "       addq %[inc], %[p4]           ;\n"
-        "       addq %[inc], %[p5]           ;\n"
-       "       decl %[cnt] ; jnz 1b"
-       : [cnt] "+c" (lines),
-         [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4), 
-         [p5] "+r" (p5)
-       : [inc] "r" (256UL)
-       : "memory");
-
-       XMMS_RESTORE;
-}
-
-static struct xor_block_template xor_block_sse = {
-        .name = "generic_sse",
-        .do_2 = xor_sse_2,
-        .do_3 = xor_sse_3,
-        .do_4 = xor_sse_4,
-        .do_5 = xor_sse_5,
-};
-
-#undef XOR_TRY_TEMPLATES
-#define XOR_TRY_TEMPLATES                              \
-       do {                                            \
-               xor_speed(&xor_block_sse);      \
-       } while (0)
-
-/* We force the use of the SSE xor block because it can write around L2.
-   We may also be able to load into the L1 only depending on how the cpu
-   deals with a load to a line that is being prefetched.  */
-#define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse)
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/irq_vectors.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/irq_vectors.h
deleted file mode 100644 (file)
index c7d85b1..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * This file should contain #defines for all of the interrupt vector
- * numbers used by this architecture.
- *
- * In addition, there are some standard defines:
- *
- *     FIRST_EXTERNAL_VECTOR:
- *             The first free place for external interrupts
- *
- *     SYSCALL_VECTOR:
- *             The IRQ vector a syscall makes the user to kernel transition
- *             under.
- *
- *     TIMER_IRQ:
- *             The IRQ number the timer interrupt comes in at.
- *
- *     NR_IRQS:
- *             The total number of interrupt vectors (including all the
- *             architecture specific interrupts) needed.
- *
- */                    
-#ifndef _ASM_IRQ_VECTORS_H
-#define _ASM_IRQ_VECTORS_H
-
-/*
- * IDT vectors usable for external interrupt sources start
- * at 0x20:
- */
-#define FIRST_EXTERNAL_VECTOR  0x20
-
-#define SYSCALL_VECTOR         0x80
-
-/*
- * Vectors 0x20-0x2f are used for ISA interrupts.
- */
-
-#if 0
-/*
- * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
- *
- *  some of the following vectors are 'rare', they are merged
- *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
- *  TLB, reschedule and local APIC vectors are performance-critical.
- *
- *  Vectors 0xf0-0xfa are free (reserved for future Linux use).
- */
-#define INVALIDATE_TLB_VECTOR  0xfd
-#define RESCHEDULE_VECTOR      0xfc
-#define CALL_FUNCTION_VECTOR   0xfb
-
-#define THERMAL_APIC_VECTOR    0xf0
-/*
- * Local APIC timer IRQ vector is on a different priority level,
- * to work around the 'lost local interrupt if more than 2 IRQ
- * sources per level' errata.
- */
-#define LOCAL_TIMER_VECTOR     0xef
-#endif
-
-#define SPURIOUS_APIC_VECTOR   0xff
-#define ERROR_APIC_VECTOR      0xfe
-
-/*
- * First APIC vector available to drivers: (vectors 0x30-0xee)
- * we start at 0x31 to spread out vectors evenly between priority
- * levels. (0x80 is the syscall vector)
- */
-#define FIRST_DEVICE_VECTOR    0x31
-#define FIRST_SYSTEM_VECTOR    0xef
-
-/*
- * 16 8259A IRQ's, 208 potential APIC interrupt sources.
- * Right now the APIC is mostly only used for SMP.
- * 256 vectors is an architectural limit. (we can have
- * more than 256 devices theoretically, but they will
- * have to use shared interrupts)
- * Since vectors 0x00-0x1f are used/reserved for the CPU,
- * the usable vector space is 0x20-0xff (224 vectors)
- */
-
-#define RESCHEDULE_VECTOR      0
-#define CALL_FUNCTION_VECTOR   1
-#define NR_IPIS                        2
-
-/*
- * The maximum number of vectors supported by i386 processors
- * is limited to 256. For processors other than i386, NR_VECTORS
- * should be changed accordingly.
- */
-#define NR_VECTORS 256
-
-#define FPU_IRQ                        13
-
-#define        FIRST_VM86_IRQ          3
-#define LAST_VM86_IRQ          15
-#define invalid_vm86_irq(irq)  ((irq) < 3 || (irq) > 15)
-
-/*
- * The flat IRQ space is divided into two regions:
- *  1. A one-to-one mapping of real physical IRQs. This space is only used
- *     if we have physical device-access privilege. This region is at the 
- *     start of the IRQ space so that existing device drivers do not need
- *     to be modified to translate physical IRQ numbers into our IRQ space.
- *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
- *     are bound using the provided bind/unbind functions.
- */
-
-#define PIRQ_BASE              0
-#define NR_PIRQS               256
-
-#define DYNIRQ_BASE            (PIRQ_BASE + NR_PIRQS)
-#define NR_DYNIRQS             256
-
-#define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
-#define NR_IRQ_VECTORS         NR_IRQS
-
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
-#endif /* _ASM_IRQ_VECTORS_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_time.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_time.h
deleted file mode 100644 (file)
index 2fbd606..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  include/asm-i386/mach-default/mach_time.h
- *
- *  Machine specific set RTC function for generic.
- *  Split out from time.c by Osamu Tomita <tomita@cinet.co.jp>
- */
-#ifndef _MACH_TIME_H
-#define _MACH_TIME_H
-
-#include <asm-i386/mc146818rtc.h>
-
-/* for check timing call set_rtc_mmss() 500ms     */
-/* used in arch/i386/time.c::do_timer_interrupt() */
-#define USEC_AFTER     500000
-#define USEC_BEFORE    500000
-
-/*
- * In order to set the CMOS clock precisely, set_rtc_mmss has to be
- * called 500 ms after the second nowtime has started, because when
- * nowtime is written into the registers of the CMOS clock, it will
- * jump to the next second precisely 500 ms later. Check the Motorola
- * MC146818A or Dallas DS12887 data sheet for details.
- *
- * BUG: This routine does not handle hour overflow properly; it just
- *      sets the minutes. Usually you'll only notice that after reboot!
- */
-static inline int mach_set_rtc_mmss(unsigned long nowtime)
-{
-       int retval = 0;
-       int real_seconds, real_minutes, cmos_minutes;
-       unsigned char save_control, save_freq_select;
-
-       save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
-       CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
-
-       save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
-       CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
-
-       cmos_minutes = CMOS_READ(RTC_MINUTES);
-       if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
-               BCD_TO_BIN(cmos_minutes);
-
-       /*
-        * since we're only adjusting minutes and seconds,
-        * don't interfere with hour overflow. This avoids
-        * messing with unknown time zones but requires your
-        * RTC not to be off by more than 15 minutes
-        */
-       real_seconds = nowtime % 60;
-       real_minutes = nowtime / 60;
-       if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
-               real_minutes += 30;             /* correct for half hour time zone */
-       real_minutes %= 60;
-
-       if (abs(real_minutes - cmos_minutes) < 30) {
-               if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-                       BIN_TO_BCD(real_seconds);
-                       BIN_TO_BCD(real_minutes);
-               }
-               CMOS_WRITE(real_seconds,RTC_SECONDS);
-               CMOS_WRITE(real_minutes,RTC_MINUTES);
-       } else {
-               printk(KERN_WARNING
-                      "set_rtc_mmss: can't update from %d to %d\n",
-                      cmos_minutes, real_minutes);
-               retval = -1;
-       }
-
-       /* The following flags have to be released exactly in this order,
-        * otherwise the DS12887 (popular MC146818A clone with integrated
-        * battery and quartz) will not reset the oscillator and will not
-        * update precisely 500 ms later. You won't find this mentioned in
-        * the Dallas Semiconductor data sheets, but who believes data
-        * sheets anyway ...                           -- Markus Kuhn
-        */
-       CMOS_WRITE(save_control, RTC_CONTROL);
-       CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-
-       return retval;
-}
-
-static inline unsigned long mach_get_cmos_time(void)
-{
-       unsigned int year, mon, day, hour, min, sec;
-
-       do {
-               sec = CMOS_READ(RTC_SECONDS);
-               min = CMOS_READ(RTC_MINUTES);
-               hour = CMOS_READ(RTC_HOURS);
-               day = CMOS_READ(RTC_DAY_OF_MONTH);
-               mon = CMOS_READ(RTC_MONTH);
-               year = CMOS_READ(RTC_YEAR);
-       } while (sec != CMOS_READ(RTC_SECONDS));
-
-       if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-               BCD_TO_BIN(sec);
-               BCD_TO_BIN(min);
-               BCD_TO_BIN(hour);
-               BCD_TO_BIN(day);
-               BCD_TO_BIN(mon);
-               BCD_TO_BIN(year);
-       }
-
-       year += 1900;
-       if (year < 1970)
-               year += 100;
-
-       return mktime(year, mon, day, hour, min, sec);
-}
-
-#endif /* !_MACH_TIME_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_timer.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/mach_timer.h
deleted file mode 100644 (file)
index 807992f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  include/asm-i386/mach-default/mach_timer.h
- *
- *  Machine specific calibrate_tsc() for generic.
- *  Split out from timer_tsc.c by Osamu Tomita <tomita@cinet.co.jp>
- */
-/* ------ Calibrate the TSC ------- 
- * Return 2^32 * (1 / (TSC clocks per usec)) for do_fast_gettimeoffset().
- * Too much 64-bit arithmetic here to do this cleanly in C, and for
- * accuracy's sake we want to keep the overhead on the CTC speaker (channel 2)
- * output busy loop as low as possible. We avoid reading the CTC registers
- * directly because of the awkward 8-bit access mechanism of the 82C54
- * device.
- */
-#ifndef _MACH_TIMER_H
-#define _MACH_TIMER_H
-
-#define CALIBRATE_TIME_MSEC 30 /* 30 msecs */
-#define CALIBRATE_LATCH        \
-       ((CLOCK_TICK_RATE * CALIBRATE_TIME_MSEC + 1000/2)/1000)
-
-static inline void mach_prepare_counter(void)
-{
-       /* Set the Gate high, disable speaker */
-       outb((inb(0x61) & ~0x02) | 0x01, 0x61);
-
-       /*
-        * Now let's take care of CTC channel 2
-        *
-        * Set the Gate high, program CTC channel 2 for mode 0,
-        * (interrupt on terminal count mode), binary count,
-        * load 5 * LATCH count, (LSB and MSB) to begin countdown.
-        *
-        * Some devices need a delay here.
-        */
-       outb(0xb0, 0x43);                       /* binary, mode 0, LSB/MSB, Ch 2 */
-       outb_p(CALIBRATE_LATCH & 0xff, 0x42);   /* LSB of count */
-       outb_p(CALIBRATE_LATCH >> 8, 0x42);       /* MSB of count */
-}
-
-static inline void mach_countup(unsigned long *count_p)
-{
-       unsigned long count = 0;
-       do {
-               count++;
-       } while ((inb_p(0x61) & 0x20) == 0);
-       *count_p = count;
-}
-
-#endif /* !_MACH_TIMER_H */
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h
deleted file mode 100644 (file)
index 064c202..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * machine_specific_* - Hooks for machine specific setup.
- *
- * Description:
- *     This is included late in kernel/setup.c so that it can make
- *     use of all of the static functions.
- **/
-
-#include <xen/interface/callback.h>
-
-extern void hypervisor_callback(void);
-extern void failsafe_callback(void);
-extern void nmi(void);
-
-static void __init machine_specific_arch_setup(void)
-{
-       int ret;
-       static struct callback_register __initdata event = {
-               .type = CALLBACKTYPE_event,
-               .address = (unsigned long) hypervisor_callback,
-       };
-       static struct callback_register __initdata failsafe = {
-               .type = CALLBACKTYPE_failsafe,
-               .address = (unsigned long)failsafe_callback,
-       };
-       static struct callback_register __initdata syscall = {
-               .type = CALLBACKTYPE_syscall,
-               .address = (unsigned long)system_call,
-       };
-#ifdef CONFIG_X86_LOCAL_APIC
-       static struct callback_register __initdata nmi_cb = {
-               .type = CALLBACKTYPE_nmi,
-               .address = (unsigned long)nmi,
-       };
-#endif
-
-       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-       if (ret == 0)
-               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-       if (ret == 0)
-               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret == -ENOSYS)
-               ret = HYPERVISOR_set_callbacks(
-                       event.address,
-                       failsafe.address,
-                       syscall.address);
-#endif
-       BUG_ON(ret);
-
-#ifdef CONFIG_X86_LOCAL_APIC
-       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb);
-#if CONFIG_XEN_COMPAT <= 0x030002
-       if (ret == -ENOSYS) {
-               static struct xennmi_callback __initdata cb = {
-                       .handler_address = (unsigned long)nmi
-               };
-
-               HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
-       }
-#endif
-#endif
-}
diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_pre.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_pre.h
deleted file mode 100644 (file)
index b18df68..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Hook to call BIOS initialisation function */
-
-#define ARCH_SETUP machine_specific_arch_setup();
-
-static void __init machine_specific_arch_setup(void);
diff --git a/linux-2.6-xen-sparse/include/linux/gfp.h b/linux-2.6-xen-sparse/include/linux/gfp.h
deleted file mode 100644 (file)
index f24dcf4..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-#ifndef __LINUX_GFP_H
-#define __LINUX_GFP_H
-
-#include <linux/mmzone.h>
-#include <linux/stddef.h>
-#include <linux/linkage.h>
-
-struct vm_area_struct;
-
-/*
- * GFP bitmasks..
- */
-/* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low three bits) */
-#define __GFP_DMA      ((__force gfp_t)0x01u)
-#define __GFP_HIGHMEM  ((__force gfp_t)0x02u)
-#ifdef CONFIG_DMA_IS_DMA32
-#define __GFP_DMA32    ((__force gfp_t)0x01)   /* ZONE_DMA is ZONE_DMA32 */
-#elif BITS_PER_LONG < 64
-#define __GFP_DMA32    ((__force gfp_t)0x00)   /* ZONE_NORMAL is ZONE_DMA32 */
-#else
-#define __GFP_DMA32    ((__force gfp_t)0x04)   /* Has own ZONE_DMA32 */
-#endif
-
-/*
- * Action modifiers - doesn't change the zoning
- *
- * __GFP_REPEAT: Try hard to allocate the memory, but the allocation attempt
- * _might_ fail.  This depends upon the particular VM implementation.
- *
- * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller
- * cannot handle allocation failures.
- *
- * __GFP_NORETRY: The VM implementation must not retry indefinitely.
- */
-#define __GFP_WAIT     ((__force gfp_t)0x10u)  /* Can wait and reschedule? */
-#define __GFP_HIGH     ((__force gfp_t)0x20u)  /* Should access emergency pools? */
-#define __GFP_IO       ((__force gfp_t)0x40u)  /* Can start physical IO? */
-#define __GFP_FS       ((__force gfp_t)0x80u)  /* Can call down to low-level FS? */
-#define __GFP_COLD     ((__force gfp_t)0x100u) /* Cache-cold page required */
-#define __GFP_NOWARN   ((__force gfp_t)0x200u) /* Suppress page allocation failure warning */
-#define __GFP_REPEAT   ((__force gfp_t)0x400u) /* Retry the allocation.  Might fail */
-#define __GFP_NOFAIL   ((__force gfp_t)0x800u) /* Retry for ever.  Cannot fail */
-#define __GFP_NORETRY  ((__force gfp_t)0x1000u)/* Do not retry.  Might fail */
-#define __GFP_NO_GROW  ((__force gfp_t)0x2000u)/* Slab internal usage */
-#define __GFP_COMP     ((__force gfp_t)0x4000u)/* Add compound page metadata */
-#define __GFP_ZERO     ((__force gfp_t)0x8000u)/* Return zeroed page on success */
-#define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */
-#define __GFP_HARDWALL   ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */
-
-#define __GFP_BITS_SHIFT 20    /* Room for 20 __GFP_FOO bits */
-#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
-
-/* if you forget to add the bitmask here kernel will crash, period */
-#define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
-                       __GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \
-                       __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \
-                       __GFP_NOMEMALLOC|__GFP_HARDWALL)
-
-/* This equals 0, but use constants in case they ever change */
-#define GFP_NOWAIT     (GFP_ATOMIC & ~__GFP_HIGH)
-/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */
-#define GFP_ATOMIC     (__GFP_HIGH)
-#define GFP_NOIO       (__GFP_WAIT)
-#define GFP_NOFS       (__GFP_WAIT | __GFP_IO)
-#define GFP_KERNEL     (__GFP_WAIT | __GFP_IO | __GFP_FS)
-#define GFP_USER       (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
-#define GFP_HIGHUSER   (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \
-                        __GFP_HIGHMEM)
-
-/* Flag - indicates that the buffer will be suitable for DMA.  Ignored on some
-   platforms, used as appropriate on others */
-
-#define GFP_DMA                __GFP_DMA
-
-/* 4GB DMA on some platforms */
-#define GFP_DMA32      __GFP_DMA32
-
-
-static inline int gfp_zone(gfp_t gfp)
-{
-       int zone = GFP_ZONEMASK & (__force int) gfp;
-       BUG_ON(zone >= GFP_ZONETYPES);
-       return zone;
-}
-
-/*
- * There is only one page-allocator function, and two main namespaces to
- * it. The alloc_page*() variants return 'struct page *' and as such
- * can allocate highmem pages, the *get*page*() variants return
- * virtual kernel addresses to the allocated page(s).
- */
-
-/*
- * We get the zone list from the current node and the gfp_mask.
- * This zone list contains a maximum of MAXNODES*MAX_NR_ZONES zones.
- *
- * For the normal case of non-DISCONTIGMEM systems the NODE_DATA() gets
- * optimized to &contig_page_data at compile-time.
- */
-
-#ifndef HAVE_ARCH_FREE_PAGE
-/*
- * If arch_free_page returns non-zero then the generic free_page code can
- * immediately bail: the arch-specific function has done all the work.
- */
-static inline int arch_free_page(struct page *page, int order) { return 0; }
-#endif
-
-extern struct page *
-FASTCALL(__alloc_pages(gfp_t, unsigned int, struct zonelist *));
-
-static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
-                                               unsigned int order)
-{
-       if (unlikely(order >= MAX_ORDER))
-               return NULL;
-
-       /* Unknown node is current node */
-       if (nid < 0)
-               nid = numa_node_id();
-
-       return __alloc_pages(gfp_mask, order,
-               NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_mask));
-}
-
-#ifdef CONFIG_NUMA
-extern struct page *alloc_pages_current(gfp_t gfp_mask, unsigned order);
-
-static inline struct page *
-alloc_pages(gfp_t gfp_mask, unsigned int order)
-{
-       if (unlikely(order >= MAX_ORDER))
-               return NULL;
-
-       return alloc_pages_current(gfp_mask, order);
-}
-extern struct page *alloc_page_vma(gfp_t gfp_mask,
-                       struct vm_area_struct *vma, unsigned long addr);
-#else
-#define alloc_pages(gfp_mask, order) \
-               alloc_pages_node(numa_node_id(), gfp_mask, order)
-#define alloc_page_vma(gfp_mask, vma, addr) alloc_pages(gfp_mask, 0)
-#endif
-#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
-
-extern unsigned long FASTCALL(__get_free_pages(gfp_t gfp_mask, unsigned int order));
-extern unsigned long FASTCALL(get_zeroed_page(gfp_t gfp_mask));
-
-#define __get_free_page(gfp_mask) \
-               __get_free_pages((gfp_mask),0)
-
-#define __get_dma_pages(gfp_mask, order) \
-               __get_free_pages((gfp_mask) | GFP_DMA,(order))
-
-extern void FASTCALL(__free_pages(struct page *page, unsigned int order));
-extern void FASTCALL(free_pages(unsigned long addr, unsigned int order));
-extern void FASTCALL(free_hot_page(struct page *page));
-extern void FASTCALL(free_cold_page(struct page *page));
-
-#define __free_page(page) __free_pages((page), 0)
-#define free_page(addr) free_pages((addr),0)
-
-void page_alloc_init(void);
-#ifdef CONFIG_NUMA
-void drain_node_pages(int node);
-#else
-static inline void drain_node_pages(int node) { };
-#endif
-
-#endif /* __LINUX_GFP_H */
diff --git a/linux-2.6-xen-sparse/include/linux/highmem.h b/linux-2.6-xen-sparse/include/linux/highmem.h
deleted file mode 100644 (file)
index a7a0d2a..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef _LINUX_HIGHMEM_H
-#define _LINUX_HIGHMEM_H
-
-#include <linux/fs.h>
-#include <linux/mm.h>
-
-#include <asm/cacheflush.h>
-
-#ifndef ARCH_HAS_FLUSH_ANON_PAGE
-static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
-{
-}
-#endif
-
-#ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
-static inline void flush_kernel_dcache_page(struct page *page)
-{
-}
-#endif
-
-#ifdef CONFIG_HIGHMEM
-
-#include <asm/highmem.h>
-
-/* declarations for linux/mm/highmem.c */
-unsigned int nr_free_highpages(void);
-#ifdef CONFIG_XEN
-void kmap_flush_unused(void);
-#endif
-
-#else /* CONFIG_HIGHMEM */
-
-static inline unsigned int nr_free_highpages(void) { return 0; }
-#ifdef CONFIG_XEN
-static inline void kmap_flush_unused(void) { }
-#endif
-
-static inline void *kmap(struct page *page)
-{
-       might_sleep();
-       return page_address(page);
-}
-
-#define kunmap(page) do { (void) (page); } while (0)
-
-#define kmap_atomic(page, idx)         page_address(page)
-#define kunmap_atomic(addr, idx)       do { } while (0)
-#define kmap_atomic_pfn(pfn, idx)      page_address(pfn_to_page(pfn))
-#define kmap_atomic_to_page(ptr)       virt_to_page(ptr)
-
-#endif /* CONFIG_HIGHMEM */
-
-/* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
-static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
-{
-       void *addr = kmap_atomic(page, KM_USER0);
-       clear_user_page(addr, vaddr, page);
-       kunmap_atomic(addr, KM_USER0);
-       /* Make sure this page is cleared on other CPU's too before using it */
-       smp_wmb();
-}
-
-#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-static inline struct page *
-alloc_zeroed_user_highpage(struct vm_area_struct *vma, unsigned long vaddr)
-{
-       struct page *page = alloc_page_vma(GFP_HIGHUSER, vma, vaddr);
-
-       if (page)
-               clear_user_highpage(page, vaddr);
-
-       return page;
-}
-#endif
-
-static inline void clear_highpage(struct page *page)
-{
-       void *kaddr = kmap_atomic(page, KM_USER0);
-       clear_page(kaddr);
-       kunmap_atomic(kaddr, KM_USER0);
-}
-
-/*
- * Same but also flushes aliased cache contents to RAM.
- */
-static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size)
-{
-       void *kaddr;
-
-       BUG_ON(offset + size > PAGE_SIZE);
-
-       kaddr = kmap_atomic(page, KM_USER0);
-       memset((char *)kaddr + offset, 0, size);
-       flush_dcache_page(page);
-       kunmap_atomic(kaddr, KM_USER0);
-}
-
-static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr)
-{
-       char *vfrom, *vto;
-
-       vfrom = kmap_atomic(from, KM_USER0);
-       vto = kmap_atomic(to, KM_USER1);
-       copy_user_page(vto, vfrom, vaddr, to);
-       kunmap_atomic(vfrom, KM_USER0);
-       kunmap_atomic(vto, KM_USER1);
-       /* Make sure this page is cleared on other CPU's too before using it */
-       smp_wmb();
-}
-
-static inline void copy_highpage(struct page *to, struct page *from)
-{
-       char *vfrom, *vto;
-
-       vfrom = kmap_atomic(from, KM_USER0);
-       vto = kmap_atomic(to, KM_USER1);
-       copy_page(vto, vfrom);
-       kunmap_atomic(vfrom, KM_USER0);
-       kunmap_atomic(vto, KM_USER1);
-}
-
-#endif /* _LINUX_HIGHMEM_H */
diff --git a/linux-2.6-xen-sparse/include/linux/interrupt.h b/linux-2.6-xen-sparse/include/linux/interrupt.h
deleted file mode 100644 (file)
index 1463c09..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/* interrupt.h */
-#ifndef _LINUX_INTERRUPT_H
-#define _LINUX_INTERRUPT_H
-
-#include <linux/kernel.h>
-#include <linux/linkage.h>
-#include <linux/bitops.h>
-#include <linux/preempt.h>
-#include <linux/cpumask.h>
-#include <linux/irqreturn.h>
-#include <linux/hardirq.h>
-#include <linux/sched.h>
-#include <linux/irqflags.h>
-#include <asm/atomic.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-
-/*
- * These correspond to the IORESOURCE_IRQ_* defines in
- * linux/ioport.h to select the interrupt line behaviour.  When
- * requesting an interrupt without specifying a IRQF_TRIGGER, the
- * setting should be assumed to be "as already configured", which
- * may be as per machine or firmware initialisation.
- */
-#define IRQF_TRIGGER_NONE      0x00000000
-#define IRQF_TRIGGER_RISING    0x00000001
-#define IRQF_TRIGGER_FALLING   0x00000002
-#define IRQF_TRIGGER_HIGH      0x00000004
-#define IRQF_TRIGGER_LOW       0x00000008
-#define IRQF_TRIGGER_MASK      (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
-                                IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
-#define IRQF_TRIGGER_PROBE     0x00000010
-
-/*
- * These flags used only by the kernel as part of the
- * irq handling routines.
- *
- * IRQF_DISABLED - keep irqs disabled when calling the action handler
- * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator
- * IRQF_SHARED - allow sharing the irq among several devices
- * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
- * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
- */
-#define IRQF_DISABLED          0x00000020
-#define IRQF_SAMPLE_RANDOM     0x00000040
-#define IRQF_SHARED            0x00000080
-#define IRQF_PROBE_SHARED      0x00000100
-#define IRQF_TIMER             0x00000200
-#define IRQF_PERCPU            0x00000400
-
-/*
- * Migration helpers. Scheduled for removal in 1/2007
- * Do not use for new code !
- */
-#define SA_INTERRUPT           IRQF_DISABLED
-#define SA_SAMPLE_RANDOM       IRQF_SAMPLE_RANDOM
-#define SA_SHIRQ               IRQF_SHARED
-#define SA_PROBEIRQ            IRQF_PROBE_SHARED
-#define SA_PERCPU              IRQF_PERCPU
-
-#define SA_TRIGGER_LOW         IRQF_TRIGGER_LOW
-#define SA_TRIGGER_HIGH                IRQF_TRIGGER_HIGH
-#define SA_TRIGGER_FALLING     IRQF_TRIGGER_FALLING
-#define SA_TRIGGER_RISING      IRQF_TRIGGER_RISING
-#define SA_TRIGGER_MASK                IRQF_TRIGGER_MASK
-
-struct irqaction {
-       irqreturn_t (*handler)(int, void *, struct pt_regs *);
-       unsigned long flags;
-       cpumask_t mask;
-       const char *name;
-       void *dev_id;
-       struct irqaction *next;
-       int irq;
-       struct proc_dir_entry *dir;
-};
-
-extern irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs);
-extern int request_irq(unsigned int,
-                      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-                      unsigned long, const char *, void *);
-extern void free_irq(unsigned int, void *);
-
-/*
- * On lockdep we dont want to enable hardirqs in hardirq
- * context. Use local_irq_enable_in_hardirq() to annotate
- * kernel code that has to do this nevertheless (pretty much
- * the only valid case is for old/broken hardware that is
- * insanely slow).
- *
- * NOTE: in theory this might break fragile code that relies
- * on hardirq delivery - in practice we dont seem to have such
- * places left. So the only effect should be slightly increased
- * irqs-off latencies.
- */
-#ifdef CONFIG_LOCKDEP
-# define local_irq_enable_in_hardirq() do { } while (0)
-#else
-# define local_irq_enable_in_hardirq() local_irq_enable()
-#endif
-
-#ifdef CONFIG_GENERIC_HARDIRQS
-extern void disable_irq_nosync(unsigned int irq);
-extern void disable_irq(unsigned int irq);
-extern void enable_irq(unsigned int irq);
-
-/*
- * Special lockdep variants of irq disabling/enabling.
- * These should be used for locking constructs that
- * know that a particular irq context which is disabled,
- * and which is the only irq-context user of a lock,
- * that it's safe to take the lock in the irq-disabled
- * section without disabling hardirqs.
- *
- * On !CONFIG_LOCKDEP they are equivalent to the normal
- * irq disable/enable methods.
- */
-static inline void disable_irq_nosync_lockdep(unsigned int irq)
-{
-       disable_irq_nosync(irq);
-#ifdef CONFIG_LOCKDEP
-       local_irq_disable();
-#endif
-}
-
-static inline void disable_irq_lockdep(unsigned int irq)
-{
-       disable_irq(irq);
-#ifdef CONFIG_LOCKDEP
-       local_irq_disable();
-#endif
-}
-
-static inline void enable_irq_lockdep(unsigned int irq)
-{
-#ifdef CONFIG_LOCKDEP
-       local_irq_enable();
-#endif
-       enable_irq(irq);
-}
-
-/* IRQ wakeup (PM) control: */
-extern int set_irq_wake(unsigned int irq, unsigned int on);
-
-static inline int enable_irq_wake(unsigned int irq)
-{
-       return set_irq_wake(irq, 1);
-}
-
-static inline int disable_irq_wake(unsigned int irq)
-{
-       return set_irq_wake(irq, 0);
-}
-
-#else /* !CONFIG_GENERIC_HARDIRQS */
-/*
- * NOTE: non-genirq architectures, if they want to support the lock
- * validator need to define the methods below in their asm/irq.h
- * files, under an #ifdef CONFIG_LOCKDEP section.
- */
-# ifndef CONFIG_LOCKDEP
-#  define disable_irq_nosync_lockdep(irq)      disable_irq_nosync(irq)
-#  define disable_irq_lockdep(irq)             disable_irq(irq)
-#  define enable_irq_lockdep(irq)              enable_irq(irq)
-# endif
-
-#endif /* CONFIG_GENERIC_HARDIRQS */
-
-#ifdef CONFIG_HAVE_IRQ_IGNORE_UNHANDLED
-int irq_ignore_unhandled(unsigned int irq);
-#else
-#define irq_ignore_unhandled(irq) 0
-#endif
-
-#ifndef __ARCH_SET_SOFTIRQ_PENDING
-#define set_softirq_pending(x) (local_softirq_pending() = (x))
-#define or_softirq_pending(x)  (local_softirq_pending() |= (x))
-#endif
-
-/*
- * Temporary defines for UP kernels, until all code gets fixed.
- */
-#ifndef CONFIG_SMP
-static inline void __deprecated cli(void)
-{
-       local_irq_disable();
-}
-static inline void __deprecated sti(void)
-{
-       local_irq_enable();
-}
-static inline void __deprecated save_flags(unsigned long *x)
-{
-       local_save_flags(*x);
-}
-#define save_flags(x) save_flags(&x)
-static inline void __deprecated restore_flags(unsigned long x)
-{
-       local_irq_restore(x);
-}
-
-static inline void __deprecated save_and_cli(unsigned long *x)
-{
-       local_irq_save(*x);
-}
-#define save_and_cli(x)        save_and_cli(&x)
-#endif /* CONFIG_SMP */
-
-extern void local_bh_disable(void);
-extern void __local_bh_enable(void);
-extern void _local_bh_enable(void);
-extern void local_bh_enable(void);
-extern void local_bh_enable_ip(unsigned long ip);
-
-/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
-   frequency threaded job scheduling. For almost all the purposes
-   tasklets are more than enough. F.e. all serial device BHs et
-   al. should be converted to tasklets, not to softirqs.
- */
-
-enum
-{
-       HI_SOFTIRQ=0,
-       TIMER_SOFTIRQ,
-       NET_TX_SOFTIRQ,
-       NET_RX_SOFTIRQ,
-       BLOCK_SOFTIRQ,
-       TASKLET_SOFTIRQ
-};
-
-/* softirq mask and active fields moved to irq_cpustat_t in
- * asm/hardirq.h to get better cache usage.  KAO
- */
-
-struct softirq_action
-{
-       void    (*action)(struct softirq_action *);
-       void    *data;
-};
-
-asmlinkage void do_softirq(void);
-extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
-extern void softirq_init(void);
-#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
-extern void FASTCALL(raise_softirq_irqoff(unsigned int nr));
-extern void FASTCALL(raise_softirq(unsigned int nr));
-
-
-/* Tasklets --- multithreaded analogue of BHs.
-
-   Main feature differing them of generic softirqs: tasklet
-   is running only on one CPU simultaneously.
-
-   Main feature differing them of BHs: different tasklets
-   may be run simultaneously on different CPUs.
-
-   Properties:
-   * If tasklet_schedule() is called, then tasklet is guaranteed
-     to be executed on some cpu at least once after this.
-   * If the tasklet is already scheduled, but its excecution is still not
-     started, it will be executed only once.
-   * If this tasklet is already running on another CPU (or schedule is called
-     from tasklet itself), it is rescheduled for later.
-   * Tasklet is strictly serialized wrt itself, but not
-     wrt another tasklets. If client needs some intertask synchronization,
-     he makes it with spinlocks.
- */
-
-struct tasklet_struct
-{
-       struct tasklet_struct *next;
-       unsigned long state;
-       atomic_t count;
-       void (*func)(unsigned long);
-       unsigned long data;
-};
-
-#define DECLARE_TASKLET(name, func, data) \
-struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
-
-#define DECLARE_TASKLET_DISABLED(name, func, data) \
-struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
-
-
-enum
-{
-       TASKLET_STATE_SCHED,    /* Tasklet is scheduled for execution */
-       TASKLET_STATE_RUN       /* Tasklet is running (SMP only) */
-};
-
-#ifdef CONFIG_SMP
-static inline int tasklet_trylock(struct tasklet_struct *t)
-{
-       return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
-}
-
-static inline void tasklet_unlock(struct tasklet_struct *t)
-{
-       smp_mb__before_clear_bit(); 
-       clear_bit(TASKLET_STATE_RUN, &(t)->state);
-}
-
-static inline void tasklet_unlock_wait(struct tasklet_struct *t)
-{
-       while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
-}
-#else
-#define tasklet_trylock(t) 1
-#define tasklet_unlock_wait(t) do { } while (0)
-#define tasklet_unlock(t) do { } while (0)
-#endif
-
-extern void FASTCALL(__tasklet_schedule(struct tasklet_struct *t));
-
-static inline void tasklet_schedule(struct tasklet_struct *t)
-{
-       if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
-               __tasklet_schedule(t);
-}
-
-extern void FASTCALL(__tasklet_hi_schedule(struct tasklet_struct *t));
-
-static inline void tasklet_hi_schedule(struct tasklet_struct *t)
-{
-       if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
-               __tasklet_hi_schedule(t);
-}
-
-
-static inline void tasklet_disable_nosync(struct tasklet_struct *t)
-{
-       atomic_inc(&t->count);
-       smp_mb__after_atomic_inc();
-}
-
-static inline void tasklet_disable(struct tasklet_struct *t)
-{
-       tasklet_disable_nosync(t);
-       tasklet_unlock_wait(t);
-       smp_mb();
-}
-
-static inline void tasklet_enable(struct tasklet_struct *t)
-{
-       smp_mb__before_atomic_dec();
-       atomic_dec(&t->count);
-}
-
-static inline void tasklet_hi_enable(struct tasklet_struct *t)
-{
-       smp_mb__before_atomic_dec();
-       atomic_dec(&t->count);
-}
-
-extern void tasklet_kill(struct tasklet_struct *t);
-extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
-extern void tasklet_init(struct tasklet_struct *t,
-                        void (*func)(unsigned long), unsigned long data);
-
-/*
- * Autoprobing for irqs:
- *
- * probe_irq_on() and probe_irq_off() provide robust primitives
- * for accurate IRQ probing during kernel initialization.  They are
- * reasonably simple to use, are not "fooled" by spurious interrupts,
- * and, unlike other attempts at IRQ probing, they do not get hung on
- * stuck interrupts (such as unused PS2 mouse interfaces on ASUS boards).
- *
- * For reasonably foolproof probing, use them as follows:
- *
- * 1. clear and/or mask the device's internal interrupt.
- * 2. sti();
- * 3. irqs = probe_irq_on();      // "take over" all unassigned idle IRQs
- * 4. enable the device and cause it to trigger an interrupt.
- * 5. wait for the device to interrupt, using non-intrusive polling or a delay.
- * 6. irq = probe_irq_off(irqs);  // get IRQ number, 0=none, negative=multiple
- * 7. service the device to clear its pending interrupt.
- * 8. loop again if paranoia is required.
- *
- * probe_irq_on() returns a mask of allocated irq's.
- *
- * probe_irq_off() takes the mask as a parameter,
- * and returns the irq number which occurred,
- * or zero if none occurred, or a negative irq number
- * if more than one irq occurred.
- */
-
-#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE) 
-static inline unsigned long probe_irq_on(void)
-{
-       return 0;
-}
-static inline int probe_irq_off(unsigned long val)
-{
-       return 0;
-}
-static inline unsigned int probe_irq_mask(unsigned long val)
-{
-       return 0;
-}
-#else
-extern unsigned long probe_irq_on(void);       /* returns 0 on failure */
-extern int probe_irq_off(unsigned long);       /* returns 0 or negative on failure */
-extern unsigned int probe_irq_mask(unsigned long);     /* returns mask of ISA interrupts */
-#endif
-
-#endif
diff --git a/linux-2.6-xen-sparse/include/linux/kexec.h b/linux-2.6-xen-sparse/include/linux/kexec.h
deleted file mode 100644 (file)
index 07ae7bd..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef LINUX_KEXEC_H
-#define LINUX_KEXEC_H
-
-#ifdef CONFIG_KEXEC
-#include <linux/types.h>
-#include <linux/list.h>
-#include <linux/linkage.h>
-#include <linux/compat.h>
-#include <linux/ioport.h>
-#include <asm/kexec.h>
-
-/* Verify architecture specific macros are defined */
-
-#ifndef KEXEC_SOURCE_MEMORY_LIMIT
-#error KEXEC_SOURCE_MEMORY_LIMIT not defined
-#endif
-
-#ifndef KEXEC_DESTINATION_MEMORY_LIMIT
-#error KEXEC_DESTINATION_MEMORY_LIMIT not defined
-#endif
-
-#ifndef KEXEC_CONTROL_MEMORY_LIMIT
-#error KEXEC_CONTROL_MEMORY_LIMIT not defined
-#endif
-
-#ifndef KEXEC_CONTROL_CODE_SIZE
-#error KEXEC_CONTROL_CODE_SIZE not defined
-#endif
-
-#ifndef KEXEC_ARCH
-#error KEXEC_ARCH not defined
-#endif
-
-#ifndef KEXEC_ARCH_HAS_PAGE_MACROS
-#define kexec_page_to_pfn(page)  page_to_pfn(page)
-#define kexec_pfn_to_page(pfn)   pfn_to_page(pfn)
-#define kexec_virt_to_phys(addr) virt_to_phys(addr)
-#define kexec_phys_to_virt(addr) phys_to_virt(addr)
-#endif
-
-/*
- * This structure is used to hold the arguments that are used when loading
- * kernel binaries.
- */
-
-typedef unsigned long kimage_entry_t;
-#define IND_DESTINATION  0x1
-#define IND_INDIRECTION  0x2
-#define IND_DONE         0x4
-#define IND_SOURCE       0x8
-
-#define KEXEC_SEGMENT_MAX 16
-struct kexec_segment {
-       void __user *buf;
-       size_t bufsz;
-       unsigned long mem;      /* User space sees this as a (void *) ... */
-       size_t memsz;
-};
-
-#ifdef CONFIG_COMPAT
-struct compat_kexec_segment {
-       compat_uptr_t buf;
-       compat_size_t bufsz;
-       compat_ulong_t mem;     /* User space sees this as a (void *) ... */
-       compat_size_t memsz;
-};
-#endif
-
-struct kimage {
-       kimage_entry_t head;
-       kimage_entry_t *entry;
-       kimage_entry_t *last_entry;
-
-       unsigned long destination;
-
-       unsigned long start;
-       struct page *control_code_page;
-
-       unsigned long nr_segments;
-       struct kexec_segment segment[KEXEC_SEGMENT_MAX];
-
-       struct list_head control_pages;
-       struct list_head dest_pages;
-       struct list_head unuseable_pages;
-
-       /* Address of next control page to allocate for crash kernels. */
-       unsigned long control_page;
-
-       /* Flags to indicate special processing */
-       unsigned int type : 1;
-#define KEXEC_TYPE_DEFAULT 0
-#define KEXEC_TYPE_CRASH   1
-};
-
-
-
-/* kexec interface functions */
-extern NORET_TYPE void machine_kexec(struct kimage *image) ATTRIB_NORET;
-extern int machine_kexec_prepare(struct kimage *image);
-extern void machine_kexec_cleanup(struct kimage *image);
-#ifdef CONFIG_XEN
-extern int xen_machine_kexec_load(struct kimage *image);
-extern void xen_machine_kexec_unload(struct kimage *image);
-extern void xen_machine_kexec_setup_resources(void);
-extern void xen_machine_kexec_register_resources(struct resource *res);
-#endif
-extern asmlinkage long sys_kexec_load(unsigned long entry,
-                                       unsigned long nr_segments,
-                                       struct kexec_segment __user *segments,
-                                       unsigned long flags);
-#ifdef CONFIG_COMPAT
-extern asmlinkage long compat_sys_kexec_load(unsigned long entry,
-                               unsigned long nr_segments,
-                               struct compat_kexec_segment __user *segments,
-                               unsigned long flags);
-#endif
-extern struct page *kimage_alloc_control_pages(struct kimage *image,
-                                               unsigned int order);
-extern void crash_kexec(struct pt_regs *);
-int kexec_should_crash(struct task_struct *);
-extern struct kimage *kexec_image;
-extern struct kimage *kexec_crash_image;
-
-#define KEXEC_ON_CRASH  0x00000001
-#define KEXEC_ARCH_MASK 0xffff0000
-
-/* These values match the ELF architecture values.
- * Unless there is a good reason that should continue to be the case.
- */
-#define KEXEC_ARCH_DEFAULT ( 0 << 16)
-#define KEXEC_ARCH_386     ( 3 << 16)
-#define KEXEC_ARCH_X86_64  (62 << 16)
-#define KEXEC_ARCH_PPC     (20 << 16)
-#define KEXEC_ARCH_PPC64   (21 << 16)
-#define KEXEC_ARCH_IA_64   (50 << 16)
-#define KEXEC_ARCH_S390    (22 << 16)
-#define KEXEC_ARCH_SH      (42 << 16)
-
-#define KEXEC_FLAGS    (KEXEC_ON_CRASH)  /* List of defined/legal kexec flags */
-
-/* Location of a reserved region to hold the crash kernel.
- */
-extern struct resource crashk_res;
-typedef u32 note_buf_t[MAX_NOTE_BYTES/4];
-extern note_buf_t *crash_notes;
-
-#else /* !CONFIG_KEXEC */
-struct pt_regs;
-struct task_struct;
-static inline void crash_kexec(struct pt_regs *regs) { }
-static inline int kexec_should_crash(struct task_struct *p) { return 0; }
-#endif /* CONFIG_KEXEC */
-#endif /* LINUX_KEXEC_H */
diff --git a/linux-2.6-xen-sparse/include/linux/mm.h b/linux-2.6-xen-sparse/include/linux/mm.h
deleted file mode 100644 (file)
index b46a658..0000000
+++ /dev/null
@@ -1,1091 +0,0 @@
-#ifndef _LINUX_MM_H
-#define _LINUX_MM_H
-
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/capability.h>
-
-#ifdef __KERNEL__
-
-#include <linux/gfp.h>
-#include <linux/list.h>
-#include <linux/mmzone.h>
-#include <linux/rbtree.h>
-#include <linux/prio_tree.h>
-#include <linux/fs.h>
-#include <linux/mutex.h>
-#include <linux/debug_locks.h>
-
-struct mempolicy;
-struct anon_vma;
-
-#ifndef CONFIG_DISCONTIGMEM          /* Don't use mapnrs, do it properly */
-extern unsigned long max_mapnr;
-#endif
-
-extern unsigned long num_physpages;
-extern void * high_memory;
-extern unsigned long vmalloc_earlyreserve;
-extern int page_cluster;
-
-#ifdef CONFIG_SYSCTL
-extern int sysctl_legacy_va_layout;
-#else
-#define sysctl_legacy_va_layout 0
-#endif
-
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-
-#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
-
-/*
- * Linux kernel virtual memory manager primitives.
- * The idea being to have a "virtual" mm in the same way
- * we have a virtual fs - giving a cleaner interface to the
- * mm details, and allowing different kinds of memory mappings
- * (from shared memory to executable loading to arbitrary
- * mmap() functions).
- */
-
-/*
- * This struct defines a memory VMM memory area. There is one of these
- * per VM-area/task.  A VM area is any part of the process virtual memory
- * space that has a special rule for the page-fault handlers (ie a shared
- * library, the executable area etc).
- */
-struct vm_area_struct {
-       struct mm_struct * vm_mm;       /* The address space we belong to. */
-       unsigned long vm_start;         /* Our start address within vm_mm. */
-       unsigned long vm_end;           /* The first byte after our end address
-                                          within vm_mm. */
-
-       /* linked list of VM areas per task, sorted by address */
-       struct vm_area_struct *vm_next;
-
-       pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
-       unsigned long vm_flags;         /* Flags, listed below. */
-
-       struct rb_node vm_rb;
-
-       /*
-        * For areas with an address space and backing store,
-        * linkage into the address_space->i_mmap prio tree, or
-        * linkage to the list of like vmas hanging off its node, or
-        * linkage of vma in the address_space->i_mmap_nonlinear list.
-        */
-       union {
-               struct {
-                       struct list_head list;
-                       void *parent;   /* aligns with prio_tree_node parent */
-                       struct vm_area_struct *head;
-               } vm_set;
-
-               struct raw_prio_tree_node prio_tree_node;
-       } shared;
-
-       /*
-        * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
-        * list, after a COW of one of the file pages.  A MAP_SHARED vma
-        * can only be in the i_mmap tree.  An anonymous MAP_PRIVATE, stack
-        * or brk vma (with NULL file) can only be in an anon_vma list.
-        */
-       struct list_head anon_vma_node; /* Serialized by anon_vma->lock */
-       struct anon_vma *anon_vma;      /* Serialized by page_table_lock */
-
-       /* Function pointers to deal with this struct. */
-       struct vm_operations_struct * vm_ops;
-
-       /* Information about our backing store: */
-       unsigned long vm_pgoff;         /* Offset (within vm_file) in PAGE_SIZE
-                                          units, *not* PAGE_CACHE_SIZE */
-       struct file * vm_file;          /* File we map to (can be NULL). */
-       void * vm_private_data;         /* was vm_pte (shared mem) */
-       unsigned long vm_truncate_count;/* truncate_count or restart_addr */
-
-#ifndef CONFIG_MMU
-       atomic_t vm_usage;              /* refcount (VMAs shared if !MMU) */
-#endif
-#ifdef CONFIG_NUMA
-       struct mempolicy *vm_policy;    /* NUMA policy for the VMA */
-#endif
-};
-
-/*
- * This struct defines the per-mm list of VMAs for uClinux. If CONFIG_MMU is
- * disabled, then there's a single shared list of VMAs maintained by the
- * system, and mm's subscribe to these individually
- */
-struct vm_list_struct {
-       struct vm_list_struct   *next;
-       struct vm_area_struct   *vma;
-};
-
-#ifndef CONFIG_MMU
-extern struct rb_root nommu_vma_tree;
-extern struct rw_semaphore nommu_vma_sem;
-
-extern unsigned int kobjsize(const void *objp);
-#endif
-
-/*
- * vm_flags..
- */
-#define VM_READ                0x00000001      /* currently active flags */
-#define VM_WRITE       0x00000002
-#define VM_EXEC                0x00000004
-#define VM_SHARED      0x00000008
-
-/* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */
-#define VM_MAYREAD     0x00000010      /* limits for mprotect() etc */
-#define VM_MAYWRITE    0x00000020
-#define VM_MAYEXEC     0x00000040
-#define VM_MAYSHARE    0x00000080
-
-#define VM_GROWSDOWN   0x00000100      /* general info on the segment */
-#define VM_GROWSUP     0x00000200
-#define VM_PFNMAP      0x00000400      /* Page-ranges managed without "struct page", just pure PFN */
-#define VM_DENYWRITE   0x00000800      /* ETXTBSY on write attempts.. */
-
-#define VM_EXECUTABLE  0x00001000
-#define VM_LOCKED      0x00002000
-#define VM_IO           0x00004000     /* Memory mapped I/O or similar */
-
-                                       /* Used by sys_madvise() */
-#define VM_SEQ_READ    0x00008000      /* App will access data sequentially */
-#define VM_RAND_READ   0x00010000      /* App will not benefit from clustered reads */
-
-#define VM_DONTCOPY    0x00020000      /* Do not copy this vma on fork */
-#define VM_DONTEXPAND  0x00040000      /* Cannot expand with mremap() */
-#define VM_RESERVED    0x00080000      /* Count as reserved_vm like IO */
-#define VM_ACCOUNT     0x00100000      /* Is a VM accounted object */
-#define VM_HUGETLB     0x00400000      /* Huge TLB Page VM */
-#define VM_NONLINEAR   0x00800000      /* Is non-linear (remap_file_pages) */
-#define VM_MAPPED_COPY 0x01000000      /* T if mapped copy of data (nommu mmap) */
-#define VM_INSERTPAGE  0x02000000      /* The vma has had "vm_insert_page()" done on it */
-#ifdef CONFIG_XEN
-#define VM_FOREIGN     0x04000000      /* Has pages belonging to another VM */
-#endif
-
-#ifndef VM_STACK_DEFAULT_FLAGS         /* arch can override this */
-#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
-#endif
-
-#ifdef CONFIG_STACK_GROWSUP
-#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
-#else
-#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
-#endif
-
-#define VM_READHINTMASK                        (VM_SEQ_READ | VM_RAND_READ)
-#define VM_ClearReadHint(v)            (v)->vm_flags &= ~VM_READHINTMASK
-#define VM_NormalReadHint(v)           (!((v)->vm_flags & VM_READHINTMASK))
-#define VM_SequentialReadHint(v)       ((v)->vm_flags & VM_SEQ_READ)
-#define VM_RandomReadHint(v)           ((v)->vm_flags & VM_RAND_READ)
-
-/*
- * mapping from the currently active vm_flags protection bits (the
- * low four bits) to a page protection mask..
- */
-extern pgprot_t protection_map[16];
-
-
-/*
- * These are the virtual MM functions - opening of an area, closing and
- * unmapping it (needed to keep files on disk up-to-date etc), pointer
- * to the functions called when a no-page or a wp-page exception occurs. 
- */
-struct vm_operations_struct {
-       void (*open)(struct vm_area_struct * area);
-       void (*close)(struct vm_area_struct * area);
-       struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type);
-       int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
-
-       /* notification that a previously read-only page is about to become
-        * writable, if an error is returned it will cause a SIGBUS */
-       int (*page_mkwrite)(struct vm_area_struct *vma, struct page *page);
-       /* Area-specific function for clearing the PTE at @ptep. Returns the
-        * original value of @ptep. */
-       pte_t (*zap_pte)(struct vm_area_struct *vma, 
-                        unsigned long addr, pte_t *ptep, int is_fullmm);
-#ifdef CONFIG_NUMA
-       int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
-       struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
-                                       unsigned long addr);
-       int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from,
-               const nodemask_t *to, unsigned long flags);
-#endif
-};
-
-struct mmu_gather;
-struct inode;
-
-/*
- * Each physical page in the system has a struct page associated with
- * it to keep track of whatever it is we are using the page for at the
- * moment. Note that we have no way to track which tasks are using
- * a page.
- */
-struct page {
-       unsigned long flags;            /* Atomic flags, some possibly
-                                        * updated asynchronously */
-       atomic_t _count;                /* Usage count, see below. */
-       atomic_t _mapcount;             /* Count of ptes mapped in mms,
-                                        * to show when page is mapped
-                                        * & limit reverse map searches.
-                                        */
-       union {
-           struct {
-               unsigned long private;          /* Mapping-private opaque data:
-                                                * usually used for buffer_heads
-                                                * if PagePrivate set; used for
-                                                * swp_entry_t if PageSwapCache;
-                                                * indicates order in the buddy
-                                                * system if PG_buddy is set.
-                                                */
-               struct address_space *mapping;  /* If low bit clear, points to
-                                                * inode address_space, or NULL.
-                                                * If page mapped as anonymous
-                                                * memory, low bit is set, and
-                                                * it points to anon_vma object:
-                                                * see PAGE_MAPPING_ANON below.
-                                                */
-           };
-#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
-           spinlock_t ptl;
-#endif
-       };
-       pgoff_t index;                  /* Our offset within mapping. */
-       struct list_head lru;           /* Pageout list, eg. active_list
-                                        * protected by zone->lru_lock !
-                                        */
-       /*
-        * On machines where all RAM is mapped into kernel address space,
-        * we can simply calculate the virtual address. On machines with
-        * highmem some memory is mapped into kernel virtual memory
-        * dynamically, so we need a place to store that address.
-        * Note that this field could be 16 bits on x86 ... ;)
-        *
-        * Architectures with slow multiplication can define
-        * WANT_PAGE_VIRTUAL in asm/page.h
-        */
-#if defined(WANT_PAGE_VIRTUAL)
-       void *virtual;                  /* Kernel virtual address (NULL if
-                                          not kmapped, ie. highmem) */
-#endif /* WANT_PAGE_VIRTUAL */
-};
-
-#define page_private(page)             ((page)->private)
-#define set_page_private(page, v)      ((page)->private = (v))
-
-/*
- * FIXME: take this include out, include page-flags.h in
- * files which need it (119 of them)
- */
-#include <linux/page-flags.h>
-
-/*
- * Methods to modify the page usage count.
- *
- * What counts for a page usage:
- * - cache mapping   (page->mapping)
- * - private data    (page->private)
- * - page mapped in a task's page tables, each mapping
- *   is counted separately
- *
- * Also, many kernel routines increase the page count before a critical
- * routine so they can be sure the page doesn't go away from under them.
- */
-
-/*
- * Drop a ref, return true if the logical refcount fell to zero (the page has
- * no users)
- */
-static inline int put_page_testzero(struct page *page)
-{
-       BUG_ON(atomic_read(&page->_count) == 0);
-       return atomic_dec_and_test(&page->_count);
-}
-
-/*
- * Try to grab a ref unless the page has a refcount of zero, return false if
- * that is the case.
- */
-static inline int get_page_unless_zero(struct page *page)
-{
-       return atomic_inc_not_zero(&page->_count);
-}
-
-extern void FASTCALL(__page_cache_release(struct page *));
-
-static inline int page_count(struct page *page)
-{
-       if (unlikely(PageCompound(page)))
-               page = (struct page *)page_private(page);
-       return atomic_read(&page->_count);
-}
-
-static inline void get_page(struct page *page)
-{
-       if (unlikely(PageCompound(page)))
-               page = (struct page *)page_private(page);
-       atomic_inc(&page->_count);
-}
-
-/*
- * Setup the page count before being freed into the page allocator for
- * the first time (boot or memory hotplug)
- */
-static inline void init_page_count(struct page *page)
-{
-       atomic_set(&page->_count, 1);
-}
-
-void put_page(struct page *page);
-void put_pages_list(struct list_head *pages);
-
-void split_page(struct page *page, unsigned int order);
-
-/*
- * Multiple processes may "see" the same page. E.g. for untouched
- * mappings of /dev/null, all processes see the same page full of
- * zeroes, and text pages of executables and shared libraries have
- * only one copy in memory, at most, normally.
- *
- * For the non-reserved pages, page_count(page) denotes a reference count.
- *   page_count() == 0 means the page is free. page->lru is then used for
- *   freelist management in the buddy allocator.
- *   page_count() == 1 means the page is used for exactly one purpose
- *   (e.g. a private data page of one process).
- *
- * A page may be used for kmalloc() or anyone else who does a
- * __get_free_page(). In this case the page_count() is at least 1, and
- * all other fields are unused but should be 0 or NULL. The
- * management of this page is the responsibility of the one who uses
- * it.
- *
- * The other pages (we may call them "process pages") are completely
- * managed by the Linux memory manager: I/O, buffers, swapping etc.
- * The following discussion applies only to them.
- *
- * A page may belong to an inode's memory mapping. In this case,
- * page->mapping is the pointer to the inode, and page->index is the
- * file offset of the page, in units of PAGE_CACHE_SIZE.
- *
- * A page contains an opaque `private' member, which belongs to the
- * page's address_space.  Usually, this is the address of a circular
- * list of the page's disk buffers.
- *
- * For pages belonging to inodes, the page_count() is the number of
- * attaches, plus 1 if `private' contains something, plus one for
- * the page cache itself.
- *
- * Instead of keeping dirty/clean pages in per address-space lists, we instead
- * now tag pages as dirty/under writeback in the radix tree.
- *
- * There is also a per-mapping radix tree mapping index to the page
- * in memory if present. The tree is rooted at mapping->root.  
- *
- * All process pages can do I/O:
- * - inode pages may need to be read from disk,
- * - inode pages which have been modified and are MAP_SHARED may need
- *   to be written to disk,
- * - private pages which have been modified may need to be swapped out
- *   to swap space and (later) to be read back into memory.
- */
-
-/*
- * The zone field is never updated after free_area_init_core()
- * sets it, so none of the operations on it need to be atomic.
- */
-
-
-/*
- * page->flags layout:
- *
- * There are three possibilities for how page->flags get
- * laid out.  The first is for the normal case, without
- * sparsemem.  The second is for sparsemem when there is
- * plenty of space for node and section.  The last is when
- * we have run out of space and have to fall back to an
- * alternate (slower) way of determining the node.
- *
- *        No sparsemem: |       NODE     | ZONE | ... | FLAGS |
- * with space for node: | SECTION | NODE | ZONE | ... | FLAGS |
- *   no space for node: | SECTION |     ZONE    | ... | FLAGS |
- */
-#ifdef CONFIG_SPARSEMEM
-#define SECTIONS_WIDTH         SECTIONS_SHIFT
-#else
-#define SECTIONS_WIDTH         0
-#endif
-
-#define ZONES_WIDTH            ZONES_SHIFT
-
-#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED
-#define NODES_WIDTH            NODES_SHIFT
-#else
-#define NODES_WIDTH            0
-#endif
-
-/* Page flags: | [SECTION] | [NODE] | ZONE | ... | FLAGS | */
-#define SECTIONS_PGOFF         ((sizeof(unsigned long)*8) - SECTIONS_WIDTH)
-#define NODES_PGOFF            (SECTIONS_PGOFF - NODES_WIDTH)
-#define ZONES_PGOFF            (NODES_PGOFF - ZONES_WIDTH)
-
-/*
- * We are going to use the flags for the page to node mapping if its in
- * there.  This includes the case where there is no node, so it is implicit.
- */
-#define FLAGS_HAS_NODE         (NODES_WIDTH > 0 || NODES_SHIFT == 0)
-
-#ifndef PFN_SECTION_SHIFT
-#define PFN_SECTION_SHIFT 0
-#endif
-
-/*
- * Define the bit shifts to access each section.  For non-existant
- * sections we define the shift as 0; that plus a 0 mask ensures
- * the compiler will optimise away reference to them.
- */
-#define SECTIONS_PGSHIFT       (SECTIONS_PGOFF * (SECTIONS_WIDTH != 0))
-#define NODES_PGSHIFT          (NODES_PGOFF * (NODES_WIDTH != 0))
-#define ZONES_PGSHIFT          (ZONES_PGOFF * (ZONES_WIDTH != 0))
-
-/* NODE:ZONE or SECTION:ZONE is used to lookup the zone from a page. */
-#if FLAGS_HAS_NODE
-#define ZONETABLE_SHIFT                (NODES_SHIFT + ZONES_SHIFT)
-#else
-#define ZONETABLE_SHIFT                (SECTIONS_SHIFT + ZONES_SHIFT)
-#endif
-#define ZONETABLE_PGSHIFT      ZONES_PGSHIFT
-
-#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
-#error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
-#endif
-
-#define ZONES_MASK             ((1UL << ZONES_WIDTH) - 1)
-#define NODES_MASK             ((1UL << NODES_WIDTH) - 1)
-#define SECTIONS_MASK          ((1UL << SECTIONS_WIDTH) - 1)
-#define ZONETABLE_MASK         ((1UL << ZONETABLE_SHIFT) - 1)
-
-static inline unsigned long page_zonenum(struct page *page)
-{
-       return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK;
-}
-
-struct zone;
-extern struct zone *zone_table[];
-
-static inline int page_zone_id(struct page *page)
-{
-       return (page->flags >> ZONETABLE_PGSHIFT) & ZONETABLE_MASK;
-}
-static inline struct zone *page_zone(struct page *page)
-{
-       return zone_table[page_zone_id(page)];
-}
-
-static inline unsigned long page_to_nid(struct page *page)
-{
-       if (FLAGS_HAS_NODE)
-               return (page->flags >> NODES_PGSHIFT) & NODES_MASK;
-       else
-               return page_zone(page)->zone_pgdat->node_id;
-}
-static inline unsigned long page_to_section(struct page *page)
-{
-       return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
-}
-
-static inline void set_page_zone(struct page *page, unsigned long zone)
-{
-       page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT);
-       page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT;
-}
-static inline void set_page_node(struct page *page, unsigned long node)
-{
-       page->flags &= ~(NODES_MASK << NODES_PGSHIFT);
-       page->flags |= (node & NODES_MASK) << NODES_PGSHIFT;
-}
-static inline void set_page_section(struct page *page, unsigned long section)
-{
-       page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT);
-       page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT;
-}
-
-static inline void set_page_links(struct page *page, unsigned long zone,
-       unsigned long node, unsigned long pfn)
-{
-       set_page_zone(page, zone);
-       set_page_node(page, node);
-       set_page_section(page, pfn_to_section_nr(pfn));
-}
-
-/*
- * Some inline functions in vmstat.h depend on page_zone()
- */
-#include <linux/vmstat.h>
-
-#ifndef CONFIG_DISCONTIGMEM
-/* The array of struct pages - for discontigmem use pgdat->lmem_map */
-extern struct page *mem_map;
-#endif
-
-static __always_inline void *lowmem_page_address(struct page *page)
-{
-       return __va(page_to_pfn(page) << PAGE_SHIFT);
-}
-
-#if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL)
-#define HASHED_PAGE_VIRTUAL
-#endif
-
-#if defined(WANT_PAGE_VIRTUAL)
-#define page_address(page) ((page)->virtual)
-#define set_page_address(page, address)                        \
-       do {                                            \
-               (page)->virtual = (address);            \
-       } while(0)
-#define page_address_init()  do { } while(0)
-#endif
-
-#if defined(HASHED_PAGE_VIRTUAL)
-void *page_address(struct page *page);
-void set_page_address(struct page *page, void *virtual);
-void page_address_init(void);
-#endif
-
-#if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
-#define page_address(page) lowmem_page_address(page)
-#define set_page_address(page, address)  do { } while(0)
-#define page_address_init()  do { } while(0)
-#endif
-
-/*
- * On an anonymous page mapped into a user virtual memory area,
- * page->mapping points to its anon_vma, not to a struct address_space;
- * with the PAGE_MAPPING_ANON bit set to distinguish it.
- *
- * Please note that, confusingly, "page_mapping" refers to the inode
- * address_space which maps the page from disk; whereas "page_mapped"
- * refers to user virtual address space into which the page is mapped.
- */
-#define PAGE_MAPPING_ANON      1
-
-extern struct address_space swapper_space;
-static inline struct address_space *page_mapping(struct page *page)
-{
-       struct address_space *mapping = page->mapping;
-
-       if (unlikely(PageSwapCache(page)))
-               mapping = &swapper_space;
-       else if (unlikely((unsigned long)mapping & PAGE_MAPPING_ANON))
-               mapping = NULL;
-       return mapping;
-}
-
-static inline int PageAnon(struct page *page)
-{
-       return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0;
-}
-
-/*
- * Return the pagecache index of the passed page.  Regular pagecache pages
- * use ->index whereas swapcache pages use ->private
- */
-static inline pgoff_t page_index(struct page *page)
-{
-       if (unlikely(PageSwapCache(page)))
-               return page_private(page);
-       return page->index;
-}
-
-/*
- * The atomic page->_mapcount, like _count, starts from -1:
- * so that transitions both from it and to it can be tracked,
- * using atomic_inc_and_test and atomic_add_negative(-1).
- */
-static inline void reset_page_mapcount(struct page *page)
-{
-       atomic_set(&(page)->_mapcount, -1);
-}
-
-static inline int page_mapcount(struct page *page)
-{
-       return atomic_read(&(page)->_mapcount) + 1;
-}
-
-/*
- * Return true if this page is mapped into pagetables.
- */
-static inline int page_mapped(struct page *page)
-{
-       return atomic_read(&(page)->_mapcount) >= 0;
-}
-
-/*
- * Error return values for the *_nopage functions
- */
-#define NOPAGE_SIGBUS  (NULL)
-#define NOPAGE_OOM     ((struct page *) (-1))
-
-/*
- * Different kinds of faults, as returned by handle_mm_fault().
- * Used to decide whether a process gets delivered SIGBUS or
- * just gets major/minor fault counters bumped up.
- */
-#define VM_FAULT_OOM   0x00
-#define VM_FAULT_SIGBUS        0x01
-#define VM_FAULT_MINOR 0x02
-#define VM_FAULT_MAJOR 0x03
-
-/* 
- * Special case for get_user_pages.
- * Must be in a distinct bit from the above VM_FAULT_ flags.
- */
-#define VM_FAULT_WRITE 0x10
-
-#define offset_in_page(p)      ((unsigned long)(p) & ~PAGE_MASK)
-
-extern void show_free_areas(void);
-
-#ifdef CONFIG_SHMEM
-struct page *shmem_nopage(struct vm_area_struct *vma,
-                       unsigned long address, int *type);
-int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new);
-struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
-                                       unsigned long addr);
-int shmem_lock(struct file *file, int lock, struct user_struct *user);
-#else
-#define shmem_nopage filemap_nopage
-
-static inline int shmem_lock(struct file *file, int lock,
-                            struct user_struct *user)
-{
-       return 0;
-}
-
-static inline int shmem_set_policy(struct vm_area_struct *vma,
-                                  struct mempolicy *new)
-{
-       return 0;
-}
-
-static inline struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
-                                                unsigned long addr)
-{
-       return NULL;
-}
-#endif
-struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags);
-extern int shmem_mmap(struct file *file, struct vm_area_struct *vma);
-
-int shmem_zero_setup(struct vm_area_struct *);
-
-#ifndef CONFIG_MMU
-extern unsigned long shmem_get_unmapped_area(struct file *file,
-                                            unsigned long addr,
-                                            unsigned long len,
-                                            unsigned long pgoff,
-                                            unsigned long flags);
-#endif
-
-static inline int can_do_mlock(void)
-{
-       if (capable(CAP_IPC_LOCK))
-               return 1;
-       if (current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur != 0)
-               return 1;
-       return 0;
-}
-extern int user_shm_lock(size_t, struct user_struct *);
-extern void user_shm_unlock(size_t, struct user_struct *);
-
-/*
- * Parameter block passed down to zap_pte_range in exceptional cases.
- */
-struct zap_details {
-       struct vm_area_struct *nonlinear_vma;   /* Check page->index if set */
-       struct address_space *check_mapping;    /* Check page->mapping if set */
-       pgoff_t first_index;                    /* Lowest page->index to unmap */
-       pgoff_t last_index;                     /* Highest page->index to unmap */
-       spinlock_t *i_mmap_lock;                /* For unmap_mapping_range: */
-       unsigned long truncate_count;           /* Compare vm_truncate_count */
-};
-
-struct page *vm_normal_page(struct vm_area_struct *, unsigned long, pte_t);
-unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
-               unsigned long size, struct zap_details *);
-unsigned long unmap_vmas(struct mmu_gather **tlb,
-               struct vm_area_struct *start_vma, unsigned long start_addr,
-               unsigned long end_addr, unsigned long *nr_accounted,
-               struct zap_details *);
-void free_pgd_range(struct mmu_gather **tlb, unsigned long addr,
-               unsigned long end, unsigned long floor, unsigned long ceiling);
-void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *start_vma,
-               unsigned long floor, unsigned long ceiling);
-int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
-                       struct vm_area_struct *vma);
-int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
-                       unsigned long size, pgprot_t prot);
-void unmap_mapping_range(struct address_space *mapping,
-               loff_t const holebegin, loff_t const holelen, int even_cows);
-
-static inline void unmap_shared_mapping_range(struct address_space *mapping,
-               loff_t const holebegin, loff_t const holelen)
-{
-       unmap_mapping_range(mapping, holebegin, holelen, 0);
-}
-
-extern int vmtruncate(struct inode * inode, loff_t offset);
-extern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end);
-extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
-extern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot);
-
-#ifdef CONFIG_MMU
-extern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma,
-                       unsigned long address, int write_access);
-
-static inline int handle_mm_fault(struct mm_struct *mm,
-                       struct vm_area_struct *vma, unsigned long address,
-                       int write_access)
-{
-       return __handle_mm_fault(mm, vma, address, write_access) &
-                               (~VM_FAULT_WRITE);
-}
-#else
-static inline int handle_mm_fault(struct mm_struct *mm,
-                       struct vm_area_struct *vma, unsigned long address,
-                       int write_access)
-{
-       /* should never happen if there's no MMU */
-       BUG();
-       return VM_FAULT_SIGBUS;
-}
-#endif
-
-extern int make_pages_present(unsigned long addr, unsigned long end);
-extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
-void install_arg_page(struct vm_area_struct *, struct page *, unsigned long);
-
-int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
-               int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
-void print_bad_pte(struct vm_area_struct *, pte_t, unsigned long);
-
-int __set_page_dirty_buffers(struct page *page);
-int __set_page_dirty_nobuffers(struct page *page);
-int redirty_page_for_writepage(struct writeback_control *wbc,
-                               struct page *page);
-int FASTCALL(set_page_dirty(struct page *page));
-int set_page_dirty_lock(struct page *page);
-int clear_page_dirty_for_io(struct page *page);
-
-extern unsigned long do_mremap(unsigned long addr,
-                              unsigned long old_len, unsigned long new_len,
-                              unsigned long flags, unsigned long new_addr);
-
-/*
- * Prototype to add a shrinker callback for ageable caches.
- * 
- * These functions are passed a count `nr_to_scan' and a gfpmask.  They should
- * scan `nr_to_scan' objects, attempting to free them.
- *
- * The callback must return the number of objects which remain in the cache.
- *
- * The callback will be passed nr_to_scan == 0 when the VM is querying the
- * cache size, so a fastpath for that case is appropriate.
- */
-typedef int (*shrinker_t)(int nr_to_scan, gfp_t gfp_mask);
-
-/*
- * Add an aging callback.  The int is the number of 'seeks' it takes
- * to recreate one of the objects that these functions age.
- */
-
-#define DEFAULT_SEEKS 2
-struct shrinker;
-extern struct shrinker *set_shrinker(int, shrinker_t);
-extern void remove_shrinker(struct shrinker *shrinker);
-
-extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl));
-
-int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
-int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
-int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
-int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
-
-/*
- * The following ifdef needed to get the 4level-fixup.h header to work.
- * Remove it when 4level-fixup.h has been removed.
- */
-#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
-static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
-{
-       return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
-               NULL: pud_offset(pgd, address);
-}
-
-static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
-{
-       return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
-               NULL: pmd_offset(pud, address);
-}
-#endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
-
-#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
-/*
- * We tuck a spinlock to guard each pagetable page into its struct page,
- * at page->private, with BUILD_BUG_ON to make sure that this will not
- * overflow into the next struct page (as it might with DEBUG_SPINLOCK).
- * When freeing, reset page->mapping so free_pages_check won't complain.
- */
-#define __pte_lockptr(page)    &((page)->ptl)
-#define pte_lock_init(_page)   do {                                    \
-       spin_lock_init(__pte_lockptr(_page));                           \
-} while (0)
-#define pte_lock_deinit(page)  ((page)->mapping = NULL)
-#define pte_lockptr(mm, pmd)   ({(void)(mm); __pte_lockptr(pmd_page(*(pmd)));})
-#else
-/*
- * We use mm->page_table_lock to guard all pagetable pages of the mm.
- */
-#define pte_lock_init(page)    do {} while (0)
-#define pte_lock_deinit(page)  do {} while (0)
-#define pte_lockptr(mm, pmd)   ({(void)(pmd); &(mm)->page_table_lock;})
-#endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */
-
-#define pte_offset_map_lock(mm, pmd, address, ptlp)    \
-({                                                     \
-       spinlock_t *__ptl = pte_lockptr(mm, pmd);       \
-       pte_t *__pte = pte_offset_map(pmd, address);    \
-       *(ptlp) = __ptl;                                \
-       spin_lock(__ptl);                               \
-       __pte;                                          \
-})
-
-#define pte_unmap_unlock(pte, ptl)     do {            \
-       spin_unlock(ptl);                               \
-       pte_unmap(pte);                                 \
-} while (0)
-
-#define pte_alloc_map(mm, pmd, address)                        \
-       ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
-               NULL: pte_offset_map(pmd, address))
-
-#define pte_alloc_map_lock(mm, pmd, address, ptlp)     \
-       ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
-               NULL: pte_offset_map_lock(mm, pmd, address, ptlp))
-
-#define pte_alloc_kernel(pmd, address)                 \
-       ((unlikely(!pmd_present(*(pmd))) && __pte_alloc_kernel(pmd, address))? \
-               NULL: pte_offset_kernel(pmd, address))
-
-extern void free_area_init(unsigned long * zones_size);
-extern void free_area_init_node(int nid, pg_data_t *pgdat,
-       unsigned long * zones_size, unsigned long zone_start_pfn, 
-       unsigned long *zholes_size);
-extern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long);
-extern void setup_per_zone_pages_min(void);
-extern void mem_init(void);
-extern void show_mem(void);
-extern void si_meminfo(struct sysinfo * val);
-extern void si_meminfo_node(struct sysinfo *val, int nid);
-
-#ifdef CONFIG_NUMA
-extern void setup_per_cpu_pageset(void);
-#else
-static inline void setup_per_cpu_pageset(void) {}
-#endif
-
-/* prio_tree.c */
-void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old);
-void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *);
-void vma_prio_tree_remove(struct vm_area_struct *, struct prio_tree_root *);
-struct vm_area_struct *vma_prio_tree_next(struct vm_area_struct *vma,
-       struct prio_tree_iter *iter);
-
-#define vma_prio_tree_foreach(vma, iter, root, begin, end)     \
-       for (prio_tree_iter_init(iter, root, begin, end), vma = NULL;   \
-               (vma = vma_prio_tree_next(vma, iter)); )
-
-static inline void vma_nonlinear_insert(struct vm_area_struct *vma,
-                                       struct list_head *list)
-{
-       vma->shared.vm_set.parent = NULL;
-       list_add_tail(&vma->shared.vm_set.list, list);
-}
-
-/* mmap.c */
-extern int __vm_enough_memory(long pages, int cap_sys_admin);
-extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
-       unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
-extern struct vm_area_struct *vma_merge(struct mm_struct *,
-       struct vm_area_struct *prev, unsigned long addr, unsigned long end,
-       unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
-       struct mempolicy *);
-extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
-extern int split_vma(struct mm_struct *,
-       struct vm_area_struct *, unsigned long addr, int new_below);
-extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
-extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
-       struct rb_node **, struct rb_node *);
-extern void unlink_file_vma(struct vm_area_struct *);
-extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
-       unsigned long addr, unsigned long len, pgoff_t pgoff);
-extern void exit_mmap(struct mm_struct *);
-extern int may_expand_vm(struct mm_struct *mm, unsigned long npages);
-
-extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
-
-extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
-       unsigned long len, unsigned long prot,
-       unsigned long flag, unsigned long pgoff);
-
-static inline unsigned long do_mmap(struct file *file, unsigned long addr,
-       unsigned long len, unsigned long prot,
-       unsigned long flag, unsigned long offset)
-{
-       unsigned long ret = -EINVAL;
-       if ((offset + PAGE_ALIGN(len)) < offset)
-               goto out;
-       if (!(offset & ~PAGE_MASK))
-               ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
-out:
-       return ret;
-}
-
-extern int do_munmap(struct mm_struct *, unsigned long, size_t);
-
-extern unsigned long do_brk(unsigned long, unsigned long);
-
-/* filemap.c */
-extern unsigned long page_unuse(struct page *);
-extern void truncate_inode_pages(struct address_space *, loff_t);
-extern void truncate_inode_pages_range(struct address_space *,
-                                      loff_t lstart, loff_t lend);
-
-/* generic vm_area_ops exported for stackable file systems */
-extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *);
-extern int filemap_populate(struct vm_area_struct *, unsigned long,
-               unsigned long, pgprot_t, unsigned long, int);
-
-/* mm/page-writeback.c */
-int write_one_page(struct page *page, int wait);
-
-/* readahead.c */
-#define VM_MAX_READAHEAD       128     /* kbytes */
-#define VM_MIN_READAHEAD       16      /* kbytes (includes current page) */
-#define VM_MAX_CACHE_HIT       256     /* max pages in a row in cache before
-                                        * turning readahead off */
-
-int do_page_cache_readahead(struct address_space *mapping, struct file *filp,
-                       pgoff_t offset, unsigned long nr_to_read);
-int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
-                       pgoff_t offset, unsigned long nr_to_read);
-unsigned long page_cache_readahead(struct address_space *mapping,
-                         struct file_ra_state *ra,
-                         struct file *filp,
-                         pgoff_t offset,
-                         unsigned long size);
-void handle_ra_miss(struct address_space *mapping, 
-                   struct file_ra_state *ra, pgoff_t offset);
-unsigned long max_sane_readahead(unsigned long nr);
-
-/* Do stack extension */
-extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
-#ifdef CONFIG_IA64
-extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
-#endif
-
-/* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
-extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
-extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
-                                            struct vm_area_struct **pprev);
-
-/* Look up the first VMA which intersects the interval start_addr..end_addr-1,
-   NULL if none.  Assume start_addr < end_addr. */
-static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
-{
-       struct vm_area_struct * vma = find_vma(mm,start_addr);
-
-       if (vma && end_addr <= vma->vm_start)
-               vma = NULL;
-       return vma;
-}
-
-static inline unsigned long vma_pages(struct vm_area_struct *vma)
-{
-       return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-}
-
-struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
-struct page *vmalloc_to_page(void *addr);
-unsigned long vmalloc_to_pfn(void *addr);
-int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
-                       unsigned long pfn, unsigned long size, pgprot_t);
-int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
-
-struct page *follow_page(struct vm_area_struct *, unsigned long address,
-                       unsigned int foll_flags);
-#define FOLL_WRITE     0x01    /* check pte is writable */
-#define FOLL_TOUCH     0x02    /* mark page accessed */
-#define FOLL_GET       0x04    /* do get_page on page */
-#define FOLL_ANON      0x08    /* give ZERO_PAGE if no pgtable */
-
-#ifdef CONFIG_XEN
-typedef int (*pte_fn_t)(pte_t *pte, struct page *pmd_page, unsigned long addr,
-                       void *data);
-extern int apply_to_page_range(struct mm_struct *mm, unsigned long address,
-                              unsigned long size, pte_fn_t fn, void *data);
-#endif
-
-#ifdef CONFIG_PROC_FS
-void vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);
-#else
-static inline void vm_stat_account(struct mm_struct *mm,
-                       unsigned long flags, struct file *file, long pages)
-{
-}
-#endif /* CONFIG_PROC_FS */
-
-#ifndef CONFIG_DEBUG_PAGEALLOC
-static inline void
-kernel_map_pages(struct page *page, int numpages, int enable)
-{
-       if (!PageHighMem(page) && !enable)
-               debug_check_no_locks_freed(page_address(page),
-                                          numpages * PAGE_SIZE);
-}
-#endif
-
-extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk);
-#ifdef __HAVE_ARCH_GATE_AREA
-int in_gate_area_no_task(unsigned long addr);
-int in_gate_area(struct task_struct *task, unsigned long addr);
-#else
-int in_gate_area_no_task(unsigned long addr);
-#define in_gate_area(task, addr) ({(void)task; in_gate_area_no_task(addr);})
-#endif /* __HAVE_ARCH_GATE_AREA */
-
-/* /proc/<pid>/oom_adj set to -17 protects from the oom-killer */
-#define OOM_DISABLE -17
-
-int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
-                                       void __user *, size_t *, loff_t *);
-unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
-                       unsigned long lru_pages);
-void drop_pagecache(void);
-void drop_slab(void);
-
-#ifndef CONFIG_MMU
-#define randomize_va_space 0
-#else
-extern int randomize_va_space;
-#endif
-
-const char *arch_vma_name(struct vm_area_struct *vma);
-
-#endif /* __KERNEL__ */
-#endif /* _LINUX_MM_H */
diff --git a/linux-2.6-xen-sparse/include/linux/page-flags.h b/linux-2.6-xen-sparse/include/linux/page-flags.h
deleted file mode 100644 (file)
index f50f655..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Macros for manipulating and testing page->flags
- */
-
-#ifndef PAGE_FLAGS_H
-#define PAGE_FLAGS_H
-
-#include <linux/types.h>
-
-/*
- * Various page->flags bits:
- *
- * PG_reserved is set for special pages, which can never be swapped out. Some
- * of them might not even exist (eg empty_bad_page)...
- *
- * The PG_private bitflag is set if page->private contains a valid value.
- *
- * During disk I/O, PG_locked is used. This bit is set before I/O and
- * reset when I/O completes. page_waitqueue(page) is a wait queue of all tasks
- * waiting for the I/O on this page to complete.
- *
- * PG_uptodate tells whether the page's contents is valid.  When a read
- * completes, the page becomes uptodate, unless a disk I/O error happened.
- *
- * For choosing which pages to swap out, inode pages carry a PG_referenced bit,
- * which is set any time the system accesses that page through the (mapping,
- * index) hash table.  This referenced bit, together with the referenced bit
- * in the page tables, is used to manipulate page->age and move the page across
- * the active, inactive_dirty and inactive_clean lists.
- *
- * Note that the referenced bit, the page->lru list_head and the active,
- * inactive_dirty and inactive_clean lists are protected by the
- * zone->lru_lock, and *NOT* by the usual PG_locked bit!
- *
- * PG_error is set to indicate that an I/O error occurred on this page.
- *
- * PG_arch_1 is an architecture specific page state bit.  The generic code
- * guarantees that this bit is cleared for a page when it first is entered into
- * the page cache.
- *
- * PG_highmem pages are not permanently mapped into the kernel virtual address
- * space, they need to be kmapped separately for doing IO on the pages.  The
- * struct page (these bits with information) are always mapped into kernel
- * address space...
- */
-
-/*
- * Don't use the *_dontuse flags.  Use the macros.  Otherwise you'll break
- * locked- and dirty-page accounting.
- *
- * The page flags field is split into two parts, the main flags area
- * which extends from the low bits upwards, and the fields area which
- * extends from the high bits downwards.
- *
- *  | FIELD | ... | FLAGS |
- *  N-1     ^             0
- *          (N-FLAGS_RESERVED)
- *
- * The fields area is reserved for fields mapping zone, node and SPARSEMEM
- * section.  The boundry between these two areas is defined by
- * FLAGS_RESERVED which defines the width of the fields section
- * (see linux/mmzone.h).  New flags must _not_ overlap with this area.
- */
-#define PG_locked               0      /* Page is locked. Don't touch. */
-#define PG_error                1
-#define PG_referenced           2
-#define PG_uptodate             3
-
-#define PG_dirty                4
-#define PG_lru                  5
-#define PG_active               6
-#define PG_slab                         7      /* slab debug (Suparna wants this) */
-
-#define PG_checked              8      /* kill me in 2.5.<early>. */
-#define PG_arch_1               9
-#define PG_reserved            10
-#define PG_private             11      /* Has something at ->private */
-
-#define PG_writeback           12      /* Page is under writeback */
-#define PG_nosave              13      /* Used for system suspend/resume */
-#define PG_compound            14      /* Part of a compound page */
-#define PG_swapcache           15      /* Swap page: swp_entry_t in private */
-
-#define PG_mappedtodisk                16      /* Has blocks allocated on-disk */
-#define PG_reclaim             17      /* To be reclaimed asap */
-#define PG_nosave_free         18      /* Free, should not be written */
-#define PG_buddy               19      /* Page is free, on buddy lists */
-
-
-#if (BITS_PER_LONG > 32)
-/*
- * 64-bit-only flags build down from bit 31
- *
- * 32 bit  -------------------------------| FIELDS |       FLAGS         |
- * 64 bit  |           FIELDS             | ??????         FLAGS         |
- *         63                            32                              0
- */
-#define PG_uncached            31      /* Page has been mapped as uncached */
-#endif
-
-#define PG_foreign             20      /* Page is owned by foreign allocator. */
-
-/*
- * Manipulation of page state flags
- */
-#define PageLocked(page)               \
-               test_bit(PG_locked, &(page)->flags)
-#define SetPageLocked(page)            \
-               set_bit(PG_locked, &(page)->flags)
-#define TestSetPageLocked(page)                \
-               test_and_set_bit(PG_locked, &(page)->flags)
-#define ClearPageLocked(page)          \
-               clear_bit(PG_locked, &(page)->flags)
-#define TestClearPageLocked(page)      \
-               test_and_clear_bit(PG_locked, &(page)->flags)
-
-#define PageError(page)                test_bit(PG_error, &(page)->flags)
-#define SetPageError(page)     set_bit(PG_error, &(page)->flags)
-#define ClearPageError(page)   clear_bit(PG_error, &(page)->flags)
-
-#define PageReferenced(page)   test_bit(PG_referenced, &(page)->flags)
-#define SetPageReferenced(page)        set_bit(PG_referenced, &(page)->flags)
-#define ClearPageReferenced(page)      clear_bit(PG_referenced, &(page)->flags)
-#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)
-
-#define PageUptodate(page)     test_bit(PG_uptodate, &(page)->flags)
-#ifdef CONFIG_S390
-#define SetPageUptodate(_page) \
-       do {                                                                  \
-               struct page *__page = (_page);                                \
-               if (!test_and_set_bit(PG_uptodate, &__page->flags))           \
-                       page_test_and_clear_dirty(_page);                     \
-       } while (0)
-#else
-#define SetPageUptodate(page)  set_bit(PG_uptodate, &(page)->flags)
-#endif
-#define ClearPageUptodate(page)        clear_bit(PG_uptodate, &(page)->flags)
-
-#define PageDirty(page)                test_bit(PG_dirty, &(page)->flags)
-#define SetPageDirty(page)     set_bit(PG_dirty, &(page)->flags)
-#define TestSetPageDirty(page) test_and_set_bit(PG_dirty, &(page)->flags)
-#define ClearPageDirty(page)   clear_bit(PG_dirty, &(page)->flags)
-#define __ClearPageDirty(page) __clear_bit(PG_dirty, &(page)->flags)
-#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
-
-#define PageLRU(page)          test_bit(PG_lru, &(page)->flags)
-#define SetPageLRU(page)       set_bit(PG_lru, &(page)->flags)
-#define ClearPageLRU(page)     clear_bit(PG_lru, &(page)->flags)
-#define __ClearPageLRU(page)   __clear_bit(PG_lru, &(page)->flags)
-
-#define PageActive(page)       test_bit(PG_active, &(page)->flags)
-#define SetPageActive(page)    set_bit(PG_active, &(page)->flags)
-#define ClearPageActive(page)  clear_bit(PG_active, &(page)->flags)
-#define __ClearPageActive(page)        __clear_bit(PG_active, &(page)->flags)
-
-#define PageSlab(page)         test_bit(PG_slab, &(page)->flags)
-#define __SetPageSlab(page)    __set_bit(PG_slab, &(page)->flags)
-#define __ClearPageSlab(page)  __clear_bit(PG_slab, &(page)->flags)
-
-#ifdef CONFIG_HIGHMEM
-#define PageHighMem(page)      is_highmem(page_zone(page))
-#else
-#define PageHighMem(page)      0 /* needed to optimize away at compile time */
-#endif
-
-#define PageChecked(page)      test_bit(PG_checked, &(page)->flags)
-#define SetPageChecked(page)   set_bit(PG_checked, &(page)->flags)
-#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags)
-
-#define PageReserved(page)     test_bit(PG_reserved, &(page)->flags)
-#define SetPageReserved(page)  set_bit(PG_reserved, &(page)->flags)
-#define ClearPageReserved(page)        clear_bit(PG_reserved, &(page)->flags)
-#define __ClearPageReserved(page)      __clear_bit(PG_reserved, &(page)->flags)
-
-#define SetPagePrivate(page)   set_bit(PG_private, &(page)->flags)
-#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)
-#define PagePrivate(page)      test_bit(PG_private, &(page)->flags)
-#define __SetPagePrivate(page)  __set_bit(PG_private, &(page)->flags)
-#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)
-
-#define PageWriteback(page)    test_bit(PG_writeback, &(page)->flags)
-#define SetPageWriteback(page)                                         \
-       do {                                                            \
-               if (!test_and_set_bit(PG_writeback,                     \
-                               &(page)->flags))                        \
-                       inc_zone_page_state(page, NR_WRITEBACK);        \
-       } while (0)
-#define TestSetPageWriteback(page)                                     \
-       ({                                                              \
-               int ret;                                                \
-               ret = test_and_set_bit(PG_writeback,                    \
-                                       &(page)->flags);                \
-               if (!ret)                                               \
-                       inc_zone_page_state(page, NR_WRITEBACK);        \
-               ret;                                                    \
-       })
-#define ClearPageWriteback(page)                                       \
-       do {                                                            \
-               if (test_and_clear_bit(PG_writeback,                    \
-                               &(page)->flags))                        \
-                       dec_zone_page_state(page, NR_WRITEBACK);        \
-       } while (0)
-#define TestClearPageWriteback(page)                                   \
-       ({                                                              \
-               int ret;                                                \
-               ret = test_and_clear_bit(PG_writeback,                  \
-                               &(page)->flags);                        \
-               if (ret)                                                \
-                       dec_zone_page_state(page, NR_WRITEBACK);        \
-               ret;                                                    \
-       })
-
-#define PageNosave(page)       test_bit(PG_nosave, &(page)->flags)
-#define SetPageNosave(page)    set_bit(PG_nosave, &(page)->flags)
-#define TestSetPageNosave(page)        test_and_set_bit(PG_nosave, &(page)->flags)
-#define ClearPageNosave(page)          clear_bit(PG_nosave, &(page)->flags)
-#define TestClearPageNosave(page)      test_and_clear_bit(PG_nosave, &(page)->flags)
-
-#define PageNosaveFree(page)   test_bit(PG_nosave_free, &(page)->flags)
-#define SetPageNosaveFree(page)        set_bit(PG_nosave_free, &(page)->flags)
-#define ClearPageNosaveFree(page)              clear_bit(PG_nosave_free, &(page)->flags)
-
-#define PageBuddy(page)                test_bit(PG_buddy, &(page)->flags)
-#define __SetPageBuddy(page)   __set_bit(PG_buddy, &(page)->flags)
-#define __ClearPageBuddy(page) __clear_bit(PG_buddy, &(page)->flags)
-
-#define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags)
-#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
-#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
-
-#define PageReclaim(page)      test_bit(PG_reclaim, &(page)->flags)
-#define SetPageReclaim(page)   set_bit(PG_reclaim, &(page)->flags)
-#define ClearPageReclaim(page) clear_bit(PG_reclaim, &(page)->flags)
-#define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, &(page)->flags)
-
-#define PageCompound(page)     test_bit(PG_compound, &(page)->flags)
-#define __SetPageCompound(page)        __set_bit(PG_compound, &(page)->flags)
-#define __ClearPageCompound(page) __clear_bit(PG_compound, &(page)->flags)
-
-#ifdef CONFIG_SWAP
-#define PageSwapCache(page)    test_bit(PG_swapcache, &(page)->flags)
-#define SetPageSwapCache(page) set_bit(PG_swapcache, &(page)->flags)
-#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)
-#else
-#define PageSwapCache(page)    0
-#endif
-
-#define PageUncached(page)     test_bit(PG_uncached, &(page)->flags)
-#define SetPageUncached(page)  set_bit(PG_uncached, &(page)->flags)
-#define ClearPageUncached(page)        clear_bit(PG_uncached, &(page)->flags)
-
-#define PageForeign(page)      test_bit(PG_foreign, &(page)->flags)
-#define SetPageForeign(page, dtor) do {                \
-       set_bit(PG_foreign, &(page)->flags);    \
-       (page)->index = (long)(dtor);           \
-} while (0)
-#define ClearPageForeign(page) do {            \
-       clear_bit(PG_foreign, &(page)->flags);  \
-       (page)->index = 0;                      \
-} while (0)
-#define PageForeignDestructor(page)            \
-       ( (void (*) (struct page *)) (page)->index )(page)
-
-struct page;   /* forward declaration */
-
-int test_clear_page_dirty(struct page *page);
-int test_clear_page_writeback(struct page *page);
-int test_set_page_writeback(struct page *page);
-
-static inline void clear_page_dirty(struct page *page)
-{
-       test_clear_page_dirty(page);
-}
-
-static inline void set_page_writeback(struct page *page)
-{
-       test_set_page_writeback(page);
-}
-
-#endif /* PAGE_FLAGS_H */
diff --git a/linux-2.6-xen-sparse/include/linux/skbuff.h b/linux-2.6-xen-sparse/include/linux/skbuff.h
deleted file mode 100644 (file)
index 46ad73c..0000000
+++ /dev/null
@@ -1,1510 +0,0 @@
-/*
- *     Definitions for the 'struct sk_buff' memory handlers.
- *
- *     Authors:
- *             Alan Cox, <gw4pts@gw4pts.ampr.org>
- *             Florian La Roche, <rzsfl@rz.uni-sb.de>
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License
- *     as published by the Free Software Foundation; either version
- *     2 of the License, or (at your option) any later version.
- */
-
-#ifndef _LINUX_SKBUFF_H
-#define _LINUX_SKBUFF_H
-
-#include <linux/kernel.h>
-#include <linux/compiler.h>
-#include <linux/time.h>
-#include <linux/cache.h>
-
-#include <asm/atomic.h>
-#include <asm/types.h>
-#include <linux/spinlock.h>
-#include <linux/mm.h>
-#include <linux/highmem.h>
-#include <linux/poll.h>
-#include <linux/net.h>
-#include <linux/textsearch.h>
-#include <net/checksum.h>
-#include <linux/dmaengine.h>
-
-#define HAVE_ALLOC_SKB         /* For the drivers to know */
-#define HAVE_ALIGNABLE_SKB     /* Ditto 8)                */
-
-#define CHECKSUM_NONE 0
-#define CHECKSUM_HW 1
-#define CHECKSUM_UNNECESSARY 2
-
-#define SKB_DATA_ALIGN(X)      (((X) + (SMP_CACHE_BYTES - 1)) & \
-                                ~(SMP_CACHE_BYTES - 1))
-#define SKB_MAX_ORDER(X, ORDER)        (((PAGE_SIZE << (ORDER)) - (X) - \
-                                 sizeof(struct skb_shared_info)) & \
-                                 ~(SMP_CACHE_BYTES - 1))
-#define SKB_MAX_HEAD(X)                (SKB_MAX_ORDER((X), 0))
-#define SKB_MAX_ALLOC          (SKB_MAX_ORDER(0, 2))
-
-/* A. Checksumming of received packets by device.
- *
- *     NONE: device failed to checksum this packet.
- *             skb->csum is undefined.
- *
- *     UNNECESSARY: device parsed packet and wouldbe verified checksum.
- *             skb->csum is undefined.
- *           It is bad option, but, unfortunately, many of vendors do this.
- *           Apparently with secret goal to sell you new device, when you
- *           will add new protocol to your host. F.e. IPv6. 8)
- *
- *     HW: the most generic way. Device supplied checksum of _all_
- *         the packet as seen by netif_rx in skb->csum.
- *         NOTE: Even if device supports only some protocols, but
- *         is able to produce some skb->csum, it MUST use HW,
- *         not UNNECESSARY.
- *
- * B. Checksumming on output.
- *
- *     NONE: skb is checksummed by protocol or csum is not required.
- *
- *     HW: device is required to csum packet as seen by hard_start_xmit
- *     from skb->h.raw to the end and to record the checksum
- *     at skb->h.raw+skb->csum.
- *
- *     Device must show its capabilities in dev->features, set
- *     at device setup time.
- *     NETIF_F_HW_CSUM - it is clever device, it is able to checksum
- *                       everything.
- *     NETIF_F_NO_CSUM - loopback or reliable single hop media.
- *     NETIF_F_IP_CSUM - device is dumb. It is able to csum only
- *                       TCP/UDP over IPv4. Sigh. Vendors like this
- *                       way by an unknown reason. Though, see comment above
- *                       about CHECKSUM_UNNECESSARY. 8)
- *
- *     Any questions? No questions, good.              --ANK
- */
-
-struct net_device;
-
-#ifdef CONFIG_NETFILTER
-struct nf_conntrack {
-       atomic_t use;
-       void (*destroy)(struct nf_conntrack *);
-};
-
-#ifdef CONFIG_BRIDGE_NETFILTER
-struct nf_bridge_info {
-       atomic_t use;
-       struct net_device *physindev;
-       struct net_device *physoutdev;
-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
-       struct net_device *netoutdev;
-#endif
-       unsigned int mask;
-       unsigned long data[32 / sizeof(unsigned long)];
-};
-#endif
-
-#endif
-
-struct sk_buff_head {
-       /* These two members must be first. */
-       struct sk_buff  *next;
-       struct sk_buff  *prev;
-
-       __u32           qlen;
-       spinlock_t      lock;
-};
-
-struct sk_buff;
-
-/* To allow 64K frame to be packed as single skb without frag_list */
-#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
-
-typedef struct skb_frag_struct skb_frag_t;
-
-struct skb_frag_struct {
-       struct page *page;
-       __u16 page_offset;
-       __u16 size;
-};
-
-/* This data is invariant across clones and lives at
- * the end of the header data, ie. at skb->end.
- */
-struct skb_shared_info {
-       atomic_t        dataref;
-       unsigned short  nr_frags;
-       unsigned short  gso_size;
-       /* Warning: this field is not always filled in (UFO)! */
-       unsigned short  gso_segs;
-       unsigned short  gso_type;
-       unsigned int    ip6_frag_id;
-       struct sk_buff  *frag_list;
-       skb_frag_t      frags[MAX_SKB_FRAGS];
-};
-
-/* We divide dataref into two halves.  The higher 16 bits hold references
- * to the payload part of skb->data.  The lower 16 bits hold references to
- * the entire skb->data.  It is up to the users of the skb to agree on
- * where the payload starts.
- *
- * All users must obey the rule that the skb->data reference count must be
- * greater than or equal to the payload reference count.
- *
- * Holding a reference to the payload part means that the user does not
- * care about modifications to the header part of skb->data.
- */
-#define SKB_DATAREF_SHIFT 16
-#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
-
-struct skb_timeval {
-       u32     off_sec;
-       u32     off_usec;
-};
-
-
-enum {
-       SKB_FCLONE_UNAVAILABLE,
-       SKB_FCLONE_ORIG,
-       SKB_FCLONE_CLONE,
-};
-
-enum {
-       SKB_GSO_TCPV4 = 1 << 0,
-       SKB_GSO_UDP = 1 << 1,
-
-       /* This indicates the skb is from an untrusted source. */
-       SKB_GSO_DODGY = 1 << 2,
-
-       /* This indicates the tcp segment has CWR set. */
-       SKB_GSO_TCP_ECN = 1 << 3,
-
-       SKB_GSO_TCPV6 = 1 << 4,
-};
-
-/** 
- *     struct sk_buff - socket buffer
- *     @next: Next buffer in list
- *     @prev: Previous buffer in list
- *     @sk: Socket we are owned by
- *     @tstamp: Time we arrived
- *     @dev: Device we arrived on/are leaving by
- *     @input_dev: Device we arrived on
- *     @h: Transport layer header
- *     @nh: Network layer header
- *     @mac: Link layer header
- *     @dst: destination entry
- *     @sp: the security path, used for xfrm
- *     @cb: Control buffer. Free for use by every layer. Put private vars here
- *     @len: Length of actual data
- *     @data_len: Data length
- *     @mac_len: Length of link layer header
- *     @csum: Checksum
- *     @local_df: allow local fragmentation
- *     @cloned: Head may be cloned (check refcnt to be sure)
- *     @nohdr: Payload reference only, must not modify header
- *     @proto_data_valid: Protocol data validated since arriving at localhost
- *     @proto_csum_blank: Protocol csum must be added before leaving localhost
- *     @pkt_type: Packet class
- *     @fclone: skbuff clone status
- *     @ip_summed: Driver fed us an IP checksum
- *     @priority: Packet queueing priority
- *     @users: User count - see {datagram,tcp}.c
- *     @protocol: Packet protocol from driver
- *     @truesize: Buffer size 
- *     @head: Head of buffer
- *     @data: Data head pointer
- *     @tail: Tail pointer
- *     @end: End pointer
- *     @destructor: Destruct function
- *     @nfmark: Can be used for communication between hooks
- *     @nfct: Associated connection, if any
- *     @ipvs_property: skbuff is owned by ipvs
- *     @nfctinfo: Relationship of this skb to the connection
- *     @nfct_reasm: netfilter conntrack re-assembly pointer
- *     @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
- *     @tc_index: Traffic control index
- *     @tc_verd: traffic control verdict
- *     @dma_cookie: a cookie to one of several possible DMA operations
- *             done by skb DMA functions
- *     @secmark: security marking
- */
-
-struct sk_buff {
-       /* These two members must be first. */
-       struct sk_buff          *next;
-       struct sk_buff          *prev;
-
-       struct sock             *sk;
-       struct skb_timeval      tstamp;
-       struct net_device       *dev;
-       struct net_device       *input_dev;
-
-       union {
-               struct tcphdr   *th;
-               struct udphdr   *uh;
-               struct icmphdr  *icmph;
-               struct igmphdr  *igmph;
-               struct iphdr    *ipiph;
-               struct ipv6hdr  *ipv6h;
-               unsigned char   *raw;
-       } h;
-
-       union {
-               struct iphdr    *iph;
-               struct ipv6hdr  *ipv6h;
-               struct arphdr   *arph;
-               unsigned char   *raw;
-       } nh;
-
-       union {
-               unsigned char   *raw;
-       } mac;
-
-       struct  dst_entry       *dst;
-       struct  sec_path        *sp;
-
-       /*
-        * This is the control buffer. It is free to use for every
-        * layer. Please put your private variables there. If you
-        * want to keep them across layers you have to do a skb_clone()
-        * first. This is owned by whoever has the skb queued ATM.
-        */
-       char                    cb[48];
-
-       unsigned int            len,
-                               data_len,
-                               mac_len,
-                               csum;
-       __u32                   priority;
-       __u8                    local_df:1,
-                               cloned:1,
-                               ip_summed:2,
-                               nohdr:1,
-                               nfctinfo:3;
-       __u8                    pkt_type:3,
-                               fclone:2,
-#ifndef CONFIG_XEN
-                               ipvs_property:1;
-#else
-                               ipvs_property:1,
-                               proto_data_valid:1,
-                               proto_csum_blank:1;
-#endif
-       __be16                  protocol;
-
-       void                    (*destructor)(struct sk_buff *skb);
-#ifdef CONFIG_NETFILTER
-       struct nf_conntrack     *nfct;
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-       struct sk_buff          *nfct_reasm;
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-       struct nf_bridge_info   *nf_bridge;
-#endif
-       __u32                   nfmark;
-#endif /* CONFIG_NETFILTER */
-#ifdef CONFIG_NET_SCHED
-       __u16                   tc_index;       /* traffic control index */
-#ifdef CONFIG_NET_CLS_ACT
-       __u16                   tc_verd;        /* traffic control verdict */
-#endif
-#endif
-#ifdef CONFIG_NET_DMA
-       dma_cookie_t            dma_cookie;
-#endif
-#ifdef CONFIG_NETWORK_SECMARK
-       __u32                   secmark;
-#endif
-
-
-       /* These elements must be at the end, see alloc_skb() for details.  */
-       unsigned int            truesize;
-       atomic_t                users;
-       unsigned char           *head,
-                               *data,
-                               *tail,
-                               *end;
-};
-
-#ifdef __KERNEL__
-/*
- *     Handling routines are only of interest to the kernel
- */
-#include <linux/slab.h>
-
-#include <asm/system.h>
-
-extern void kfree_skb(struct sk_buff *skb);
-extern void           __kfree_skb(struct sk_buff *skb);
-extern struct sk_buff *__alloc_skb(unsigned int size,
-                                  gfp_t priority, int fclone);
-static inline struct sk_buff *alloc_skb(unsigned int size,
-                                       gfp_t priority)
-{
-       return __alloc_skb(size, priority, 0);
-}
-
-static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
-                                              gfp_t priority)
-{
-       return __alloc_skb(size, priority, 1);
-}
-
-extern struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
-                                           unsigned int size,
-                                           gfp_t priority);
-extern void           kfree_skbmem(struct sk_buff *skb);
-extern struct sk_buff *skb_clone(struct sk_buff *skb,
-                                gfp_t priority);
-extern struct sk_buff *skb_copy(const struct sk_buff *skb,
-                               gfp_t priority);
-extern struct sk_buff *pskb_copy(struct sk_buff *skb,
-                                gfp_t gfp_mask);
-extern int            pskb_expand_head(struct sk_buff *skb,
-                                       int nhead, int ntail,
-                                       gfp_t gfp_mask);
-extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
-                                           unsigned int headroom);
-extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
-                                      int newheadroom, int newtailroom,
-                                      gfp_t priority);
-extern int            skb_pad(struct sk_buff *skb, int pad);
-#define dev_kfree_skb(a)       kfree_skb(a)
-extern void          skb_over_panic(struct sk_buff *skb, int len,
-                                    void *here);
-extern void          skb_under_panic(struct sk_buff *skb, int len,
-                                     void *here);
-extern void          skb_truesize_bug(struct sk_buff *skb);
-
-static inline void skb_truesize_check(struct sk_buff *skb)
-{
-       if (unlikely((int)skb->truesize < sizeof(struct sk_buff) + skb->len))
-               skb_truesize_bug(skb);
-}
-
-extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
-                       int getfrag(void *from, char *to, int offset,
-                       int len,int odd, struct sk_buff *skb),
-                       void *from, int length);
-
-struct skb_seq_state
-{
-       __u32           lower_offset;
-       __u32           upper_offset;
-       __u32           frag_idx;
-       __u32           stepped_offset;
-       struct sk_buff  *root_skb;
-       struct sk_buff  *cur_skb;
-       __u8            *frag_data;
-};
-
-extern void          skb_prepare_seq_read(struct sk_buff *skb,
-                                          unsigned int from, unsigned int to,
-                                          struct skb_seq_state *st);
-extern unsigned int   skb_seq_read(unsigned int consumed, const u8 **data,
-                                  struct skb_seq_state *st);
-extern void          skb_abort_seq_read(struct skb_seq_state *st);
-
-extern unsigned int   skb_find_text(struct sk_buff *skb, unsigned int from,
-                                   unsigned int to, struct ts_config *config,
-                                   struct ts_state *state);
-
-/* Internal */
-#define skb_shinfo(SKB)                ((struct skb_shared_info *)((SKB)->end))
-
-/**
- *     skb_queue_empty - check if a queue is empty
- *     @list: queue head
- *
- *     Returns true if the queue is empty, false otherwise.
- */
-static inline int skb_queue_empty(const struct sk_buff_head *list)
-{
-       return list->next == (struct sk_buff *)list;
-}
-
-/**
- *     skb_get - reference buffer
- *     @skb: buffer to reference
- *
- *     Makes another reference to a socket buffer and returns a pointer
- *     to the buffer.
- */
-static inline struct sk_buff *skb_get(struct sk_buff *skb)
-{
-       atomic_inc(&skb->users);
-       return skb;
-}
-
-/*
- * If users == 1, we are the only owner and are can avoid redundant
- * atomic change.
- */
-
-/**
- *     skb_cloned - is the buffer a clone
- *     @skb: buffer to check
- *
- *     Returns true if the buffer was generated with skb_clone() and is
- *     one of multiple shared copies of the buffer. Cloned buffers are
- *     shared data so must not be written to under normal circumstances.
- */
-static inline int skb_cloned(const struct sk_buff *skb)
-{
-       return skb->cloned &&
-              (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
-}
-
-/**
- *     skb_header_cloned - is the header a clone
- *     @skb: buffer to check
- *
- *     Returns true if modifying the header part of the buffer requires
- *     the data to be copied.
- */
-static inline int skb_header_cloned(const struct sk_buff *skb)
-{
-       int dataref;
-
-       if (!skb->cloned)
-               return 0;
-
-       dataref = atomic_read(&skb_shinfo(skb)->dataref);
-       dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
-       return dataref != 1;
-}
-
-/**
- *     skb_header_release - release reference to header
- *     @skb: buffer to operate on
- *
- *     Drop a reference to the header part of the buffer.  This is done
- *     by acquiring a payload reference.  You must not read from the header
- *     part of skb->data after this.
- */
-static inline void skb_header_release(struct sk_buff *skb)
-{
-       BUG_ON(skb->nohdr);
-       skb->nohdr = 1;
-       atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
-}
-
-/**
- *     skb_shared - is the buffer shared
- *     @skb: buffer to check
- *
- *     Returns true if more than one person has a reference to this
- *     buffer.
- */
-static inline int skb_shared(const struct sk_buff *skb)
-{
-       return atomic_read(&skb->users) != 1;
-}
-
-/**
- *     skb_share_check - check if buffer is shared and if so clone it
- *     @skb: buffer to check
- *     @pri: priority for memory allocation
- *
- *     If the buffer is shared the buffer is cloned and the old copy
- *     drops a reference. A new clone with a single reference is returned.
- *     If the buffer is not shared the original buffer is returned. When
- *     being called from interrupt status or with spinlocks held pri must
- *     be GFP_ATOMIC.
- *
- *     NULL is returned on a memory allocation failure.
- */
-static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
-                                             gfp_t pri)
-{
-       might_sleep_if(pri & __GFP_WAIT);
-       if (skb_shared(skb)) {
-               struct sk_buff *nskb = skb_clone(skb, pri);
-               kfree_skb(skb);
-               skb = nskb;
-       }
-       return skb;
-}
-
-/*
- *     Copy shared buffers into a new sk_buff. We effectively do COW on
- *     packets to handle cases where we have a local reader and forward
- *     and a couple of other messy ones. The normal one is tcpdumping
- *     a packet thats being forwarded.
- */
-
-/**
- *     skb_unshare - make a copy of a shared buffer
- *     @skb: buffer to check
- *     @pri: priority for memory allocation
- *
- *     If the socket buffer is a clone then this function creates a new
- *     copy of the data, drops a reference count on the old copy and returns
- *     the new copy with the reference count at 1. If the buffer is not a clone
- *     the original buffer is returned. When called with a spinlock held or
- *     from interrupt state @pri must be %GFP_ATOMIC
- *
- *     %NULL is returned on a memory allocation failure.
- */
-static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
-                                         gfp_t pri)
-{
-       might_sleep_if(pri & __GFP_WAIT);
-       if (skb_cloned(skb)) {
-               struct sk_buff *nskb = skb_copy(skb, pri);
-               kfree_skb(skb); /* Free our shared copy */
-               skb = nskb;
-       }
-       return skb;
-}
-
-/**
- *     skb_peek
- *     @list_: list to peek at
- *
- *     Peek an &sk_buff. Unlike most other operations you _MUST_
- *     be careful with this one. A peek leaves the buffer on the
- *     list and someone else may run off with it. You must hold
- *     the appropriate locks or have a private queue to do this.
- *
- *     Returns %NULL for an empty list or a pointer to the head element.
- *     The reference count is not incremented and the reference is therefore
- *     volatile. Use with caution.
- */
-static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
-{
-       struct sk_buff *list = ((struct sk_buff *)list_)->next;
-       if (list == (struct sk_buff *)list_)
-               list = NULL;
-       return list;
-}
-
-/**
- *     skb_peek_tail
- *     @list_: list to peek at
- *
- *     Peek an &sk_buff. Unlike most other operations you _MUST_
- *     be careful with this one. A peek leaves the buffer on the
- *     list and someone else may run off with it. You must hold
- *     the appropriate locks or have a private queue to do this.
- *
- *     Returns %NULL for an empty list or a pointer to the tail element.
- *     The reference count is not incremented and the reference is therefore
- *     volatile. Use with caution.
- */
-static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
-{
-       struct sk_buff *list = ((struct sk_buff *)list_)->prev;
-       if (list == (struct sk_buff *)list_)
-               list = NULL;
-       return list;
-}
-
-/**
- *     skb_queue_len   - get queue length
- *     @list_: list to measure
- *
- *     Return the length of an &sk_buff queue.
- */
-static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
-{
-       return list_->qlen;
-}
-
-/*
- * This function creates a split out lock class for each invocation;
- * this is needed for now since a whole lot of users of the skb-queue
- * infrastructure in drivers have different locking usage (in hardirq)
- * than the networking core (in softirq only). In the long run either the
- * network layer or drivers should need annotation to consolidate the
- * main types of usage into 3 classes.
- */
-static inline void skb_queue_head_init(struct sk_buff_head *list)
-{
-       spin_lock_init(&list->lock);
-       list->prev = list->next = (struct sk_buff *)list;
-       list->qlen = 0;
-}
-
-/*
- *     Insert an sk_buff at the start of a list.
- *
- *     The "__skb_xxxx()" functions are the non-atomic ones that
- *     can only be called with interrupts disabled.
- */
-
-/**
- *     __skb_queue_after - queue a buffer at the list head
- *     @list: list to use
- *     @prev: place after this buffer
- *     @newsk: buffer to queue
- *
- *     Queue a buffer int the middle of a list. This function takes no locks
- *     and you must therefore hold required locks before calling it.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-static inline void __skb_queue_after(struct sk_buff_head *list,
-                                    struct sk_buff *prev,
-                                    struct sk_buff *newsk)
-{
-       struct sk_buff *next;
-       list->qlen++;
-
-       next = prev->next;
-       newsk->next = next;
-       newsk->prev = prev;
-       next->prev  = prev->next = newsk;
-}
-
-/**
- *     __skb_queue_head - queue a buffer at the list head
- *     @list: list to use
- *     @newsk: buffer to queue
- *
- *     Queue a buffer at the start of a list. This function takes no locks
- *     and you must therefore hold required locks before calling it.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
-static inline void __skb_queue_head(struct sk_buff_head *list,
-                                   struct sk_buff *newsk)
-{
-       __skb_queue_after(list, (struct sk_buff *)list, newsk);
-}
-
-/**
- *     __skb_queue_tail - queue a buffer at the list tail
- *     @list: list to use
- *     @newsk: buffer to queue
- *
- *     Queue a buffer at the end of a list. This function takes no locks
- *     and you must therefore hold required locks before calling it.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
-static inline void __skb_queue_tail(struct sk_buff_head *list,
-                                  struct sk_buff *newsk)
-{
-       struct sk_buff *prev, *next;
-
-       list->qlen++;
-       next = (struct sk_buff *)list;
-       prev = next->prev;
-       newsk->next = next;
-       newsk->prev = prev;
-       next->prev  = prev->next = newsk;
-}
-
-
-/**
- *     __skb_dequeue - remove from the head of the queue
- *     @list: list to dequeue from
- *
- *     Remove the head of the list. This function does not take any locks
- *     so must be used with appropriate locks held only. The head item is
- *     returned or %NULL if the list is empty.
- */
-extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
-static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
-{
-       struct sk_buff *next, *prev, *result;
-
-       prev = (struct sk_buff *) list;
-       next = prev->next;
-       result = NULL;
-       if (next != prev) {
-               result       = next;
-               next         = next->next;
-               list->qlen--;
-               next->prev   = prev;
-               prev->next   = next;
-               result->next = result->prev = NULL;
-       }
-       return result;
-}
-
-
-/*
- *     Insert a packet on a list.
- */
-extern void        skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
-static inline void __skb_insert(struct sk_buff *newsk,
-                               struct sk_buff *prev, struct sk_buff *next,
-                               struct sk_buff_head *list)
-{
-       newsk->next = next;
-       newsk->prev = prev;
-       next->prev  = prev->next = newsk;
-       list->qlen++;
-}
-
-/*
- *     Place a packet after a given packet in a list.
- */
-extern void       skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
-static inline void __skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list)
-{
-       __skb_insert(newsk, old, old->next, list);
-}
-
-/*
- * remove sk_buff from list. _Must_ be called atomically, and with
- * the list known..
- */
-extern void       skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
-static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
-{
-       struct sk_buff *next, *prev;
-
-       list->qlen--;
-       next       = skb->next;
-       prev       = skb->prev;
-       skb->next  = skb->prev = NULL;
-       next->prev = prev;
-       prev->next = next;
-}
-
-
-/* XXX: more streamlined implementation */
-
-/**
- *     __skb_dequeue_tail - remove from the tail of the queue
- *     @list: list to dequeue from
- *
- *     Remove the tail of the list. This function does not take any locks
- *     so must be used with appropriate locks held only. The tail item is
- *     returned or %NULL if the list is empty.
- */
-extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
-static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
-{
-       struct sk_buff *skb = skb_peek_tail(list);
-       if (skb)
-               __skb_unlink(skb, list);
-       return skb;
-}
-
-
-static inline int skb_is_nonlinear(const struct sk_buff *skb)
-{
-       return skb->data_len;
-}
-
-static inline unsigned int skb_headlen(const struct sk_buff *skb)
-{
-       return skb->len - skb->data_len;
-}
-
-static inline int skb_pagelen(const struct sk_buff *skb)
-{
-       int i, len = 0;
-
-       for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
-               len += skb_shinfo(skb)->frags[i].size;
-       return len + skb_headlen(skb);
-}
-
-static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
-                                     struct page *page, int off, int size)
-{
-       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
-       frag->page                = page;
-       frag->page_offset         = off;
-       frag->size                = size;
-       skb_shinfo(skb)->nr_frags = i + 1;
-}
-
-#define SKB_PAGE_ASSERT(skb)   BUG_ON(skb_shinfo(skb)->nr_frags)
-#define SKB_FRAG_ASSERT(skb)   BUG_ON(skb_shinfo(skb)->frag_list)
-#define SKB_LINEAR_ASSERT(skb)  BUG_ON(skb_is_nonlinear(skb))
-
-/*
- *     Add data to an sk_buff
- */
-static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
-{
-       unsigned char *tmp = skb->tail;
-       SKB_LINEAR_ASSERT(skb);
-       skb->tail += len;
-       skb->len  += len;
-       return tmp;
-}
-
-/**
- *     skb_put - add data to a buffer
- *     @skb: buffer to use
- *     @len: amount of data to add
- *
- *     This function extends the used data area of the buffer. If this would
- *     exceed the total buffer size the kernel will panic. A pointer to the
- *     first byte of the extra data is returned.
- */
-static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
-{
-       unsigned char *tmp = skb->tail;
-       SKB_LINEAR_ASSERT(skb);
-       skb->tail += len;
-       skb->len  += len;
-       if (unlikely(skb->tail>skb->end))
-               skb_over_panic(skb, len, current_text_addr());
-       return tmp;
-}
-
-static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
-{
-       skb->data -= len;
-       skb->len  += len;
-       return skb->data;
-}
-
-/**
- *     skb_push - add data to the start of a buffer
- *     @skb: buffer to use
- *     @len: amount of data to add
- *
- *     This function extends the used data area of the buffer at the buffer
- *     start. If this would exceed the total buffer headroom the kernel will
- *     panic. A pointer to the first byte of the extra data is returned.
- */
-static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
-{
-       skb->data -= len;
-       skb->len  += len;
-       if (unlikely(skb->data<skb->head))
-               skb_under_panic(skb, len, current_text_addr());
-       return skb->data;
-}
-
-static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
-{
-       skb->len -= len;
-       BUG_ON(skb->len < skb->data_len);
-       return skb->data += len;
-}
-
-/**
- *     skb_pull - remove data from the start of a buffer
- *     @skb: buffer to use
- *     @len: amount of data to remove
- *
- *     This function removes data from the start of a buffer, returning
- *     the memory to the headroom. A pointer to the next data in the buffer
- *     is returned. Once the data has been pulled future pushes will overwrite
- *     the old data.
- */
-static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
-{
-       return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
-}
-
-extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
-
-static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
-{
-       if (len > skb_headlen(skb) &&
-           !__pskb_pull_tail(skb, len-skb_headlen(skb)))
-               return NULL;
-       skb->len -= len;
-       return skb->data += len;
-}
-
-static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
-{
-       return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
-}
-
-static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
-{
-       if (likely(len <= skb_headlen(skb)))
-               return 1;
-       if (unlikely(len > skb->len))
-               return 0;
-       return __pskb_pull_tail(skb, len-skb_headlen(skb)) != NULL;
-}
-
-/**
- *     skb_headroom - bytes at buffer head
- *     @skb: buffer to check
- *
- *     Return the number of bytes of free space at the head of an &sk_buff.
- */
-static inline int skb_headroom(const struct sk_buff *skb)
-{
-       return skb->data - skb->head;
-}
-
-/**
- *     skb_tailroom - bytes at buffer end
- *     @skb: buffer to check
- *
- *     Return the number of bytes of free space at the tail of an sk_buff
- */
-static inline int skb_tailroom(const struct sk_buff *skb)
-{
-       return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
-}
-
-/**
- *     skb_reserve - adjust headroom
- *     @skb: buffer to alter
- *     @len: bytes to move
- *
- *     Increase the headroom of an empty &sk_buff by reducing the tail
- *     room. This is only allowed for an empty buffer.
- */
-static inline void skb_reserve(struct sk_buff *skb, int len)
-{
-       skb->data += len;
-       skb->tail += len;
-}
-
-/*
- * CPUs often take a performance hit when accessing unaligned memory
- * locations. The actual performance hit varies, it can be small if the
- * hardware handles it or large if we have to take an exception and fix it
- * in software.
- *
- * Since an ethernet header is 14 bytes network drivers often end up with
- * the IP header at an unaligned offset. The IP header can be aligned by
- * shifting the start of the packet by 2 bytes. Drivers should do this
- * with:
- *
- * skb_reserve(NET_IP_ALIGN);
- *
- * The downside to this alignment of the IP header is that the DMA is now
- * unaligned. On some architectures the cost of an unaligned DMA is high
- * and this cost outweighs the gains made by aligning the IP header.
- * 
- * Since this trade off varies between architectures, we allow NET_IP_ALIGN
- * to be overridden.
- */
-#ifndef NET_IP_ALIGN
-#define NET_IP_ALIGN   2
-#endif
-
-/*
- * The networking layer reserves some headroom in skb data (via
- * dev_alloc_skb). This is used to avoid having to reallocate skb data when
- * the header has to grow. In the default case, if the header has to grow
- * 16 bytes or less we avoid the reallocation.
- *
- * Unfortunately this headroom changes the DMA alignment of the resulting
- * network packet. As for NET_IP_ALIGN, this unaligned DMA is expensive
- * on some architectures. An architecture can override this value,
- * perhaps setting it to a cacheline in size (since that will maintain
- * cacheline alignment of the DMA). It must be a power of 2.
- *
- * Various parts of the networking layer expect at least 16 bytes of
- * headroom, you should not reduce this.
- */
-#ifndef NET_SKB_PAD
-#define NET_SKB_PAD    16
-#endif
-
-extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
-
-static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
-{
-       if (unlikely(skb->data_len)) {
-               WARN_ON(1);
-               return;
-       }
-       skb->len  = len;
-       skb->tail = skb->data + len;
-}
-
-/**
- *     skb_trim - remove end from a buffer
- *     @skb: buffer to alter
- *     @len: new length
- *
- *     Cut the length of a buffer down by removing data from the tail. If
- *     the buffer is already under the length specified it is not modified.
- *     The skb must be linear.
- */
-static inline void skb_trim(struct sk_buff *skb, unsigned int len)
-{
-       if (skb->len > len)
-               __skb_trim(skb, len);
-}
-
-
-static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
-{
-       if (skb->data_len)
-               return ___pskb_trim(skb, len);
-       __skb_trim(skb, len);
-       return 0;
-}
-
-static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
-{
-       return (len < skb->len) ? __pskb_trim(skb, len) : 0;
-}
-
-/**
- *     pskb_trim_unique - remove end from a paged unique (not cloned) buffer
- *     @skb: buffer to alter
- *     @len: new length
- *
- *     This is identical to pskb_trim except that the caller knows that
- *     the skb is not cloned so we should never get an error due to out-
- *     of-memory.
- */
-static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
-{
-       int err = pskb_trim(skb, len);
-       BUG_ON(err);
-}
-
-/**
- *     skb_orphan - orphan a buffer
- *     @skb: buffer to orphan
- *
- *     If a buffer currently has an owner then we call the owner's
- *     destructor function and make the @skb unowned. The buffer continues
- *     to exist but is no longer charged to its former owner.
- */
-static inline void skb_orphan(struct sk_buff *skb)
-{
-       if (skb->destructor)
-               skb->destructor(skb);
-       skb->destructor = NULL;
-       skb->sk         = NULL;
-}
-
-/**
- *     __skb_queue_purge - empty a list
- *     @list: list to empty
- *
- *     Delete all buffers on an &sk_buff list. Each buffer is removed from
- *     the list and one reference dropped. This function does not take the
- *     list lock and the caller must hold the relevant locks to use it.
- */
-extern void skb_queue_purge(struct sk_buff_head *list);
-static inline void __skb_queue_purge(struct sk_buff_head *list)
-{
-       struct sk_buff *skb;
-       while ((skb = __skb_dequeue(list)) != NULL)
-               kfree_skb(skb);
-}
-
-/**
- *     __dev_alloc_skb - allocate an skbuff for receiving
- *     @length: length to allocate
- *     @gfp_mask: get_free_pages mask, passed to alloc_skb
- *
- *     Allocate a new &sk_buff and assign it a usage count of one. The
- *     buffer has unspecified headroom built in. Users should allocate
- *     the headroom they think they need without accounting for the
- *     built in space. The built in space is used for optimisations.
- *
- *     %NULL is returned if there is no free memory.
- */
-static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
-                                             gfp_t gfp_mask)
-{
-       struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
-       if (likely(skb))
-               skb_reserve(skb, NET_SKB_PAD);
-       return skb;
-}
-
-/**
- *     dev_alloc_skb - allocate an skbuff for receiving
- *     @length: length to allocate
- *
- *     Allocate a new &sk_buff and assign it a usage count of one. The
- *     buffer has unspecified headroom built in. Users should allocate
- *     the headroom they think they need without accounting for the
- *     built in space. The built in space is used for optimisations.
- *
- *     %NULL is returned if there is no free memory. Although this function
- *     allocates memory it can be called from an interrupt.
- */
-static inline struct sk_buff *dev_alloc_skb(unsigned int length)
-{
-       return __dev_alloc_skb(length, GFP_ATOMIC);
-}
-
-extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
-               unsigned int length, gfp_t gfp_mask);
-
-/**
- *     netdev_alloc_skb - allocate an skbuff for rx on a specific device
- *     @dev: network device to receive on
- *     @length: length to allocate
- *
- *     Allocate a new &sk_buff and assign it a usage count of one. The
- *     buffer has unspecified headroom built in. Users should allocate
- *     the headroom they think they need without accounting for the
- *     built in space. The built in space is used for optimisations.
- *
- *     %NULL is returned if there is no free memory. Although this function
- *     allocates memory it can be called from an interrupt.
- */
-static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
-               unsigned int length)
-{
-       return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
-}
-
-/**
- *     skb_cow - copy header of skb when it is required
- *     @skb: buffer to cow
- *     @headroom: needed headroom
- *
- *     If the skb passed lacks sufficient headroom or its data part
- *     is shared, data is reallocated. If reallocation fails, an error
- *     is returned and original skb is not changed.
- *
- *     The result is skb with writable area skb->head...skb->tail
- *     and at least @headroom of space at head.
- */
-static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
-{
-       int delta = (headroom > NET_SKB_PAD ? headroom : NET_SKB_PAD) -
-                       skb_headroom(skb);
-
-       if (delta < 0)
-               delta = 0;
-
-       if (delta || skb_cloned(skb))
-               return pskb_expand_head(skb, (delta + (NET_SKB_PAD-1)) &
-                               ~(NET_SKB_PAD-1), 0, GFP_ATOMIC);
-       return 0;
-}
-
-/**
- *     skb_padto       - pad an skbuff up to a minimal size
- *     @skb: buffer to pad
- *     @len: minimal length
- *
- *     Pads up a buffer to ensure the trailing bytes exist and are
- *     blanked. If the buffer already contains sufficient data it
- *     is untouched. Otherwise it is extended. Returns zero on
- *     success. The skb is freed on error.
- */
-static inline int skb_padto(struct sk_buff *skb, unsigned int len)
-{
-       unsigned int size = skb->len;
-       if (likely(size >= len))
-               return 0;
-       return skb_pad(skb, len-size);
-}
-
-static inline int skb_add_data(struct sk_buff *skb,
-                              char __user *from, int copy)
-{
-       const int off = skb->len;
-
-       if (skb->ip_summed == CHECKSUM_NONE) {
-               int err = 0;
-               unsigned int csum = csum_and_copy_from_user(from,
-                                                           skb_put(skb, copy),
-                                                           copy, 0, &err);
-               if (!err) {
-                       skb->csum = csum_block_add(skb->csum, csum, off);
-                       return 0;
-               }
-       } else if (!copy_from_user(skb_put(skb, copy), from, copy))
-               return 0;
-
-       __skb_trim(skb, off);
-       return -EFAULT;
-}
-
-static inline int skb_can_coalesce(struct sk_buff *skb, int i,
-                                  struct page *page, int off)
-{
-       if (i) {
-               struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
-
-               return page == frag->page &&
-                      off == frag->page_offset + frag->size;
-       }
-       return 0;
-}
-
-static inline int __skb_linearize(struct sk_buff *skb)
-{
-       return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
-}
-
-/**
- *     skb_linearize - convert paged skb to linear one
- *     @skb: buffer to linarize
- *
- *     If there is no free memory -ENOMEM is returned, otherwise zero
- *     is returned and the old skb data released.
- */
-static inline int skb_linearize(struct sk_buff *skb)
-{
-       return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
-}
-
-/**
- *     skb_linearize_cow - make sure skb is linear and writable
- *     @skb: buffer to process
- *
- *     If there is no free memory -ENOMEM is returned, otherwise zero
- *     is returned and the old skb data released.
- */
-static inline int skb_linearize_cow(struct sk_buff *skb)
-{
-       return skb_is_nonlinear(skb) || skb_cloned(skb) ?
-              __skb_linearize(skb) : 0;
-}
-
-/**
- *     skb_postpull_rcsum - update checksum for received skb after pull
- *     @skb: buffer to update
- *     @start: start of data before pull
- *     @len: length of data pulled
- *
- *     After doing a pull on a received packet, you need to call this to
- *     update the CHECKSUM_HW checksum, or set ip_summed to CHECKSUM_NONE
- *     so that it can be recomputed from scratch.
- */
-
-static inline void skb_postpull_rcsum(struct sk_buff *skb,
-                                     const void *start, unsigned int len)
-{
-       if (skb->ip_summed == CHECKSUM_HW)
-               skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
-}
-
-unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
-
-/**
- *     pskb_trim_rcsum - trim received skb and update checksum
- *     @skb: buffer to trim
- *     @len: new length
- *
- *     This is exactly the same as pskb_trim except that it ensures the
- *     checksum of received packets are still valid after the operation.
- */
-
-static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
-{
-       if (likely(len >= skb->len))
-               return 0;
-       if (skb->ip_summed == CHECKSUM_HW)
-               skb->ip_summed = CHECKSUM_NONE;
-       return __pskb_trim(skb, len);
-}
-
-static inline void *kmap_skb_frag(const skb_frag_t *frag)
-{
-#ifdef CONFIG_HIGHMEM
-       BUG_ON(in_irq());
-
-       local_bh_disable();
-#endif
-       return kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ);
-}
-
-static inline void kunmap_skb_frag(void *vaddr)
-{
-       kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
-#ifdef CONFIG_HIGHMEM
-       local_bh_enable();
-#endif
-}
-
-#define skb_queue_walk(queue, skb) \
-               for (skb = (queue)->next;                                       \
-                    prefetch(skb->next), (skb != (struct sk_buff *)(queue));   \
-                    skb = skb->next)
-
-#define skb_queue_reverse_walk(queue, skb) \
-               for (skb = (queue)->prev;                                       \
-                    prefetch(skb->prev), (skb != (struct sk_buff *)(queue));   \
-                    skb = skb->prev)
-
-
-extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
-                                        int noblock, int *err);
-extern unsigned int    datagram_poll(struct file *file, struct socket *sock,
-                                    struct poll_table_struct *wait);
-extern int            skb_copy_datagram_iovec(const struct sk_buff *from,
-                                              int offset, struct iovec *to,
-                                              int size);
-extern int            skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
-                                                       int hlen,
-                                                       struct iovec *iov);
-extern void           skb_free_datagram(struct sock *sk, struct sk_buff *skb);
-extern void           skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
-                                        unsigned int flags);
-extern unsigned int    skb_checksum(const struct sk_buff *skb, int offset,
-                                   int len, unsigned int csum);
-extern int            skb_copy_bits(const struct sk_buff *skb, int offset,
-                                    void *to, int len);
-extern int            skb_store_bits(const struct sk_buff *skb, int offset,
-                                     void *from, int len);
-extern unsigned int    skb_copy_and_csum_bits(const struct sk_buff *skb,
-                                             int offset, u8 *to, int len,
-                                             unsigned int csum);
-extern void           skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
-extern void           skb_split(struct sk_buff *skb,
-                                struct sk_buff *skb1, const u32 len);
-
-extern struct sk_buff *skb_segment(struct sk_buff *skb, int features);
-
-static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
-                                      int len, void *buffer)
-{
-       int hlen = skb_headlen(skb);
-
-       if (hlen - offset >= len)
-               return skb->data + offset;
-
-       if (skb_copy_bits(skb, offset, buffer, len) < 0)
-               return NULL;
-
-       return buffer;
-}
-
-extern void skb_init(void);
-extern void skb_add_mtu(int mtu);
-
-/**
- *     skb_get_timestamp - get timestamp from a skb
- *     @skb: skb to get stamp from
- *     @stamp: pointer to struct timeval to store stamp in
- *
- *     Timestamps are stored in the skb as offsets to a base timestamp.
- *     This function converts the offset back to a struct timeval and stores
- *     it in stamp.
- */
-static inline void skb_get_timestamp(const struct sk_buff *skb, struct timeval *stamp)
-{
-       stamp->tv_sec  = skb->tstamp.off_sec;
-       stamp->tv_usec = skb->tstamp.off_usec;
-}
-
-/**
- *     skb_set_timestamp - set timestamp of a skb
- *     @skb: skb to set stamp of
- *     @stamp: pointer to struct timeval to get stamp from
- *
- *     Timestamps are stored in the skb as offsets to a base timestamp.
- *     This function converts a struct timeval to an offset and stores
- *     it in the skb.
- */
-static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *stamp)
-{
-       skb->tstamp.off_sec  = stamp->tv_sec;
-       skb->tstamp.off_usec = stamp->tv_usec;
-}
-
-extern void __net_timestamp(struct sk_buff *skb);
-
-extern unsigned int __skb_checksum_complete(struct sk_buff *skb);
-
-/**
- *     skb_checksum_complete - Calculate checksum of an entire packet
- *     @skb: packet to process
- *
- *     This function calculates the checksum over the entire packet plus
- *     the value of skb->csum.  The latter can be used to supply the
- *     checksum of a pseudo header as used by TCP/UDP.  It returns the
- *     checksum.
- *
- *     For protocols that contain complete checksums such as ICMP/TCP/UDP,
- *     this function can be used to verify that checksum on received
- *     packets.  In that case the function should return zero if the
- *     checksum is correct.  In particular, this function will return zero
- *     if skb->ip_summed is CHECKSUM_UNNECESSARY which indicates that the
- *     hardware has already verified the correctness of the checksum.
- */
-static inline unsigned int skb_checksum_complete(struct sk_buff *skb)
-{
-       return skb->ip_summed != CHECKSUM_UNNECESSARY &&
-               __skb_checksum_complete(skb);
-}
-
-#ifdef CONFIG_NETFILTER
-static inline void nf_conntrack_put(struct nf_conntrack *nfct)
-{
-       if (nfct && atomic_dec_and_test(&nfct->use))
-               nfct->destroy(nfct);
-}
-static inline void nf_conntrack_get(struct nf_conntrack *nfct)
-{
-       if (nfct)
-               atomic_inc(&nfct->use);
-}
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
-{
-       if (skb)
-               atomic_inc(&skb->users);
-}
-static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
-{
-       if (skb)
-               kfree_skb(skb);
-}
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
-{
-       if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
-               kfree(nf_bridge);
-}
-static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
-{
-       if (nf_bridge)
-               atomic_inc(&nf_bridge->use);
-}
-#endif /* CONFIG_BRIDGE_NETFILTER */
-static inline void nf_reset(struct sk_buff *skb)
-{
-       nf_conntrack_put(skb->nfct);
-       skb->nfct = NULL;
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-       nf_conntrack_put_reasm(skb->nfct_reasm);
-       skb->nfct_reasm = NULL;
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-       nf_bridge_put(skb->nf_bridge);
-       skb->nf_bridge = NULL;
-#endif
-}
-
-#else /* CONFIG_NETFILTER */
-static inline void nf_reset(struct sk_buff *skb) {}
-#endif /* CONFIG_NETFILTER */
-
-#ifdef CONFIG_NETWORK_SECMARK
-static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
-{
-       to->secmark = from->secmark;
-}
-
-static inline void skb_init_secmark(struct sk_buff *skb)
-{
-       skb->secmark = 0;
-}
-#else
-static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
-{ }
-
-static inline void skb_init_secmark(struct sk_buff *skb)
-{ }
-#endif
-
-static inline int skb_is_gso(const struct sk_buff *skb)
-{
-       return skb_shinfo(skb)->gso_size;
-}
-
-#endif /* __KERNEL__ */
-#endif /* _LINUX_SKBUFF_H */
diff --git a/linux-2.6-xen-sparse/include/xen/balloon.h b/linux-2.6-xen-sparse/include/xen/balloon.h
deleted file mode 100644 (file)
index d26c62b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/******************************************************************************
- * balloon.h
- *
- * Xen balloon driver - enables returning/claiming memory to/from Xen.
- *
- * Copyright (c) 2003, B Dragovic
- * Copyright (c) 2003-2004, M Williamson, K Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __ASM_BALLOON_H__
-#define __ASM_BALLOON_H__
-
-/*
- * Inform the balloon driver that it should allow some slop for device-driver
- * memory activities.
- */
-void balloon_update_driver_allowance(long delta);
-
-/* Allocate/free a set of empty pages in low memory (i.e., no RAM mapped). */
-struct page **alloc_empty_pages_and_pagevec(int nr_pages);
-void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages);
-
-void balloon_release_driver_page(struct page *page);
-
-/*
- * Prevent the balloon driver from changing the memory reservation during
- * a driver critical region.
- */
-extern spinlock_t balloon_lock;
-#define balloon_lock(__flags)   spin_lock_irqsave(&balloon_lock, __flags)
-#define balloon_unlock(__flags) spin_unlock_irqrestore(&balloon_lock, __flags)
-
-#endif /* __ASM_BALLOON_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/blkif.h b/linux-2.6-xen-sparse/include/xen/blkif.h
deleted file mode 100644 (file)
index 4d6c663..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef __XEN_BLKIF_H__
-#define __XEN_BLKIF_H__
-
-#include <xen/interface/io/ring.h>
-#include <xen/interface/io/blkif.h>
-#include <xen/interface/io/protocols.h>
-
-/* Not a real protocol.  Used to generate ring structs which contain
- * the elements common to all protocols only.  This way we get a
- * compiler-checkable way to use common struct elements, so we can
- * avoid using switch(protocol) in a number of places.  */
-struct blkif_common_request {
-       char dummy;
-};
-struct blkif_common_response {
-       char dummy;
-};
-
-/* i386 protocol version */
-#pragma pack(push, 4)
-struct blkif_x86_32_request {
-       uint8_t        operation;    /* BLKIF_OP_???                         */
-       uint8_t        nr_segments;  /* number of segments                   */
-       blkif_vdev_t   handle;       /* only for read/write requests         */
-       uint64_t       id;           /* private guest value, echoed in resp  */
-       blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-       struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-};
-struct blkif_x86_32_response {
-       uint64_t        id;              /* copied from request */
-       uint8_t         operation;       /* copied from request */
-       int16_t         status;          /* BLKIF_RSP_???       */
-};
-typedef struct blkif_x86_32_request blkif_x86_32_request_t;
-typedef struct blkif_x86_32_response blkif_x86_32_response_t;
-#pragma pack(pop)
-
-/* x86_64 protocol version */
-struct blkif_x86_64_request {
-       uint8_t        operation;    /* BLKIF_OP_???                         */
-       uint8_t        nr_segments;  /* number of segments                   */
-       blkif_vdev_t   handle;       /* only for read/write requests         */
-       uint64_t       __attribute__((__aligned__(8))) id;
-       blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-       struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-};
-struct blkif_x86_64_response {
-       uint64_t       __attribute__((__aligned__(8))) id;
-       uint8_t         operation;       /* copied from request */
-       int16_t         status;          /* BLKIF_RSP_???       */
-};
-typedef struct blkif_x86_64_request blkif_x86_64_request_t;
-typedef struct blkif_x86_64_response blkif_x86_64_response_t;
-
-DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response);
-DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response);
-DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response);
-
-union blkif_back_rings {
-       blkif_back_ring_t        native;
-       blkif_common_back_ring_t common;
-       blkif_x86_32_back_ring_t x86_32;
-       blkif_x86_64_back_ring_t x86_64;
-};
-typedef union blkif_back_rings blkif_back_rings_t;
-
-enum blkif_protocol {
-       BLKIF_PROTOCOL_NATIVE = 1,
-       BLKIF_PROTOCOL_X86_32 = 2,
-       BLKIF_PROTOCOL_X86_64 = 3,
-};
-
-static void inline blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src)
-{
-       int i;
-       dst->operation = src->operation;
-       dst->nr_segments = src->nr_segments;
-       dst->handle = src->handle;
-       dst->id = src->id;
-       dst->sector_number = src->sector_number;
-       for (i = 0; i < src->nr_segments; i++)
-               dst->seg[i] = src->seg[i];
-}
-
-static void inline blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src)
-{
-       int i;
-       dst->operation = src->operation;
-       dst->nr_segments = src->nr_segments;
-       dst->handle = src->handle;
-       dst->id = src->id;
-       dst->sector_number = src->sector_number;
-       for (i = 0; i < src->nr_segments; i++)
-               dst->seg[i] = src->seg[i];
-}
-
-#endif /* __XEN_BLKIF_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/cpu_hotplug.h b/linux-2.6-xen-sparse/include/xen/cpu_hotplug.h
deleted file mode 100644 (file)
index abf8d52..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef __XEN_CPU_HOTPLUG_H__
-#define __XEN_CPU_HOTPLUG_H__
-
-#include <linux/kernel.h>
-#include <linux/cpumask.h>
-
-#if defined(CONFIG_X86) && defined(CONFIG_SMP)
-extern cpumask_t cpu_initialized_map;
-#define cpu_set_initialized(cpu) cpu_set(cpu, cpu_initialized_map)
-#else
-#define cpu_set_initialized(cpu) ((void)0)
-#endif
-
-#if defined(CONFIG_HOTPLUG_CPU)
-
-int cpu_up_check(unsigned int cpu);
-void init_xenbus_allowed_cpumask(void);
-int smp_suspend(void);
-void smp_resume(void);
-
-void cpu_bringup(void);
-
-#else /* !defined(CONFIG_HOTPLUG_CPU) */
-
-#define cpu_up_check(cpu)              (0)
-#define init_xenbus_allowed_cpumask()  ((void)0)
-
-static inline int smp_suspend(void)
-{
-       if (num_online_cpus() > 1) {
-               printk(KERN_WARNING "Can't suspend SMP guests "
-                      "without CONFIG_HOTPLUG_CPU\n");
-               return -EOPNOTSUPP;
-       }
-       return 0;
-}
-
-static inline void smp_resume(void)
-{
-}
-
-#endif /* !defined(CONFIG_HOTPLUG_CPU) */
-
-#endif /* __XEN_CPU_HOTPLUG_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/driver_util.h b/linux-2.6-xen-sparse/include/xen/driver_util.h
deleted file mode 100644 (file)
index 1c3bdd2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-
-#ifndef __ASM_XEN_DRIVER_UTIL_H__
-#define __ASM_XEN_DRIVER_UTIL_H__
-
-#include <linux/vmalloc.h>
-#include <linux/device.h>
-
-/* Allocate/destroy a 'vmalloc' VM area. */
-extern struct vm_struct *alloc_vm_area(unsigned long size);
-extern void free_vm_area(struct vm_struct *area);
-
-extern struct class *get_xen_class(void);
-
-#endif /* __ASM_XEN_DRIVER_UTIL_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/evtchn.h b/linux-2.6-xen-sparse/include/xen/evtchn.h
deleted file mode 100644 (file)
index 7c4dd5c..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/******************************************************************************
- * evtchn.h
- * 
- * Communication via Xen event channels.
- * Also definitions for the device that demuxes notifications to userspace.
- * 
- * Copyright (c) 2004-2005, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __ASM_EVTCHN_H__
-#define __ASM_EVTCHN_H__
-
-#include <linux/interrupt.h>
-#include <asm/hypervisor.h>
-#include <asm/ptrace.h>
-#include <asm/synch_bitops.h>
-#include <xen/interface/event_channel.h>
-#include <linux/smp.h>
-
-/*
- * LOW-LEVEL DEFINITIONS
- */
-
-/*
- * Dynamically bind an event source to an IRQ-like callback handler.
- * On some platforms this may not be implemented via the Linux IRQ subsystem.
- * The IRQ argument passed to the callback handler is the same as returned
- * from the bind call. It may not correspond to a Linux IRQ number.
- * Returns IRQ or negative errno.
- */
-int bind_caller_port_to_irqhandler(
-       unsigned int caller_port,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id);
-int bind_listening_port_to_irqhandler(
-       unsigned int remote_domain,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id);
-int bind_interdomain_evtchn_to_irqhandler(
-       unsigned int remote_domain,
-       unsigned int remote_port,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id);
-int bind_virq_to_irqhandler(
-       unsigned int virq,
-       unsigned int cpu,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id);
-int bind_ipi_to_irqhandler(
-       unsigned int ipi,
-       unsigned int cpu,
-       irqreturn_t (*handler)(int, void *, struct pt_regs *),
-       unsigned long irqflags,
-       const char *devname,
-       void *dev_id);
-
-/*
- * Common unbind function for all event sources. Takes IRQ to unbind from.
- * Automatically closes the underlying event channel (except for bindings
- * made with bind_caller_port_to_irqhandler()).
- */
-void unbind_from_irqhandler(unsigned int irq, void *dev_id);
-
-void irq_resume(void);
-
-/* Entry point for notifications into Linux subsystems. */
-asmlinkage void evtchn_do_upcall(struct pt_regs *regs);
-
-/* Entry point for notifications into the userland character device. */
-void evtchn_device_upcall(int port);
-
-void mask_evtchn(int port);
-void unmask_evtchn(int port);
-
-static inline void clear_evtchn(int port)
-{
-       shared_info_t *s = HYPERVISOR_shared_info;
-       synch_clear_bit(port, s->evtchn_pending);
-}
-
-static inline void notify_remote_via_evtchn(int port)
-{
-       struct evtchn_send send = { .port = port };
-       (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
-}
-
-/*
- * Use these to access the event channel underlying the IRQ handle returned
- * by bind_*_to_irqhandler().
- */
-void notify_remote_via_irq(int irq);
-int irq_to_evtchn_port(int irq);
-
-#endif /* __ASM_EVTCHN_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/features.h b/linux-2.6-xen-sparse/include/xen/features.h
deleted file mode 100644 (file)
index fd47bef..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/******************************************************************************
- * features.h
- *
- * Query the features reported by Xen.
- *
- * Copyright (c) 2006, Ian Campbell
- */
-
-#ifndef __ASM_XEN_FEATURES_H__
-#define __ASM_XEN_FEATURES_H__
-
-#include <xen/interface/version.h>
-
-extern void setup_xen_features(void);
-
-extern u8 xen_features[XENFEAT_NR_SUBMAPS * 32];
-
-#define xen_feature(flag)      (xen_features[flag])
-
-#endif /* __ASM_XEN_FEATURES_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/gnttab.h b/linux-2.6-xen-sparse/include/xen/gnttab.h
deleted file mode 100644 (file)
index c590004..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/******************************************************************************
- * gnttab.h
- * 
- * Two sets of functionality:
- * 1. Granting foreign access to our memory reservation.
- * 2. Accessing others' memory reservations via grant references.
- * (i.e., mechanisms for both sender and recipient of grant references)
- * 
- * Copyright (c) 2004-2005, K A Fraser
- * Copyright (c) 2005, Christopher Clark
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __ASM_GNTTAB_H__
-#define __ASM_GNTTAB_H__
-
-#include <asm/hypervisor.h>
-#include <asm/maddr.h> /* maddr_t */
-#include <linux/mm.h>
-#include <xen/interface/grant_table.h>
-#include <xen/features.h>
-
-struct gnttab_free_callback {
-       struct gnttab_free_callback *next;
-       void (*fn)(void *);
-       void *arg;
-       u16 count;
-};
-
-int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
-                               int readonly);
-
-/*
- * End access through the given grant reference, iff the grant entry is no
- * longer in use.  Return 1 if the grant entry was freed, 0 if it is still in
- * use.
- */
-int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly);
-
-/*
- * Eventually end access through the given grant reference, and once that
- * access has been ended, free the given page too.  Access will be ended
- * immediately iff the grant entry is not in use, otherwise it will happen
- * some time later.  page may be 0, in which case no freeing will occur.
- */
-void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
-                              unsigned long page);
-
-int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn);
-
-unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref);
-unsigned long gnttab_end_foreign_transfer(grant_ref_t ref);
-
-int gnttab_query_foreign_access(grant_ref_t ref);
-
-/*
- * operations on reserved batches of grant references
- */
-int gnttab_alloc_grant_references(u16 count, grant_ref_t *pprivate_head);
-
-void gnttab_free_grant_reference(grant_ref_t ref);
-
-void gnttab_free_grant_references(grant_ref_t head);
-
-int gnttab_empty_grant_references(const grant_ref_t *pprivate_head);
-
-int gnttab_claim_grant_reference(grant_ref_t *pprivate_head);
-
-void gnttab_release_grant_reference(grant_ref_t *private_head,
-                                   grant_ref_t release);
-
-void gnttab_request_free_callback(struct gnttab_free_callback *callback,
-                                 void (*fn)(void *), void *arg, u16 count);
-void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
-
-void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
-                                    unsigned long frame, int readonly);
-
-void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
-                                      unsigned long pfn);
-
-int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep);
-maddr_t gnttab_dma_map_page(struct page *page);
-
-static inline void gnttab_dma_unmap_page(maddr_t mfn)
-{
-}
-
-static inline void gnttab_reset_grant_page(struct page *page)
-{
-       init_page_count(page);
-       reset_page_mapcount(page);
-}
-
-int gnttab_suspend(void);
-int gnttab_resume(void);
-
-static inline void
-gnttab_set_map_op(struct gnttab_map_grant_ref *map, maddr_t addr,
-                 uint32_t flags, grant_ref_t ref, domid_t domid)
-{
-       if (flags & GNTMAP_contains_pte)
-               map->host_addr = addr;
-       else if (xen_feature(XENFEAT_auto_translated_physmap))
-               map->host_addr = __pa(addr);
-       else
-               map->host_addr = addr;
-
-       map->flags = flags;
-       map->ref = ref;
-       map->dom = domid;
-}
-
-static inline void
-gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, maddr_t addr,
-                   uint32_t flags, grant_handle_t handle)
-{
-       if (flags & GNTMAP_contains_pte)
-               unmap->host_addr = addr;
-       else if (xen_feature(XENFEAT_auto_translated_physmap))
-               unmap->host_addr = __pa(addr);
-       else
-               unmap->host_addr = addr;
-
-       unmap->handle = handle;
-       unmap->dev_bus_addr = 0;
-}
-
-static inline void
-gnttab_set_replace_op(struct gnttab_unmap_and_replace *unmap, maddr_t addr,
-                     maddr_t new_addr, grant_handle_t handle)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               unmap->host_addr = __pa(addr);
-               unmap->new_addr = __pa(new_addr);
-       } else {
-               unmap->host_addr = addr;
-               unmap->new_addr = new_addr;
-       }
-
-       unmap->handle = handle;
-}
-
-#endif /* __ASM_GNTTAB_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/hvm.h b/linux-2.6-xen-sparse/include/xen/hvm.h
deleted file mode 100644 (file)
index 4ea8887..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Simple wrappers around HVM functions */
-#ifndef XEN_HVM_H__
-#define XEN_HVM_H__
-
-#include <xen/interface/hvm/params.h>
-
-static inline unsigned long hvm_get_parameter(int idx)
-{
-       struct xen_hvm_param xhv;
-       int r;
-
-       xhv.domid = DOMID_SELF;
-       xhv.index = idx;
-       r = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
-       if (r < 0) {
-               printk(KERN_ERR "cannot get hvm parameter %d: %d.\n",
-                      idx, r);
-               return 0;
-       }
-       return xhv.value;
-}
-
-#endif /* XEN_HVM_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/hypercall.h b/linux-2.6-xen-sparse/include/xen/hypercall.h
deleted file mode 100644 (file)
index decb883..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __XEN_HYPERCALL_H__
-#define __XEN_HYPERCALL_H__
-
-#include <asm/hypercall.h>
-
-static inline int
-HYPERVISOR_multicall_check(
-       multicall_entry_t *call_list, int nr_calls,
-       const unsigned long *rc_list)
-{
-       int rc = HYPERVISOR_multicall(call_list, nr_calls);
-
-       if (unlikely(rc < 0))
-               return rc;
-       BUG_ON(rc);
-
-       for ( ; nr_calls > 0; --nr_calls, ++call_list)
-               if (unlikely(call_list->result != (rc_list ? *rc_list++ : 0)))
-                       return nr_calls;
-
-       return 0;
-}
-
-#endif /* __XEN_HYPERCALL_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/hypervisor_sysfs.h b/linux-2.6-xen-sparse/include/xen/hypervisor_sysfs.h
deleted file mode 100644 (file)
index 706fb7f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  copyright (c) 2006 IBM Corporation
- *  Authored by: Mike D. Day <ncmike@us.ibm.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 as
- *  published by the Free Software Foundation.
- */
-
-#ifndef _HYP_SYSFS_H_
-#define _HYP_SYSFS_H_
-
-#include <linux/kobject.h>
-#include <linux/sysfs.h>
-
-#define HYPERVISOR_ATTR_RO(_name) \
-static struct hyp_sysfs_attr  _name##_attr = __ATTR_RO(_name)
-
-#define HYPERVISOR_ATTR_RW(_name) \
-static struct hyp_sysfs_attr _name##_attr = \
-       __ATTR(_name, 0644, _name##_show, _name##_store)
-
-extern struct subsystem hypervisor_subsys;
-
-struct hyp_sysfs_attr {
-       struct attribute attr;
-       ssize_t (*show)(struct hyp_sysfs_attr *, char *);
-       ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t);
-       void *hyp_attr_data;
-};
-
-#endif /* _HYP_SYSFS_H_ */
diff --git a/linux-2.6-xen-sparse/include/xen/pcifront.h b/linux-2.6-xen-sparse/include/xen/pcifront.h
deleted file mode 100644 (file)
index 39acea7..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * PCI Frontend - arch-dependendent declarations
- *
- *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
- */
-#ifndef __XEN_ASM_PCIFRONT_H__
-#define __XEN_ASM_PCIFRONT_H__
-
-#include <linux/spinlock.h>
-
-#ifdef __KERNEL__
-
-#ifndef __ia64__
-
-struct pcifront_device;
-struct pci_bus;
-
-struct pcifront_sd {
-       int domain;
-       struct pcifront_device *pdev;
-};
-
-static inline struct pcifront_device *
-pcifront_get_pdev(struct pcifront_sd *sd)
-{
-       return sd->pdev;
-}
-
-static inline void pcifront_init_sd(struct pcifront_sd *sd, int domain,
-                                   struct pcifront_device *pdev)
-{
-       sd->domain = domain;
-       sd->pdev = pdev;
-}
-
-#if defined(CONFIG_PCI_DOMAINS)
-static inline int pci_domain_nr(struct pci_bus *bus)
-{
-       struct pcifront_sd *sd = bus->sysdata;
-       return sd->domain;
-}
-static inline int pci_proc_domain(struct pci_bus *bus)
-{
-       return pci_domain_nr(bus);
-}
-#endif /* CONFIG_PCI_DOMAINS */
-
-#else /* __ia64__ */
-
-#include <asm/pci.h>
-#define pcifront_sd pci_controller
-
-static inline struct pcifront_device *
-pcifront_get_pdev(struct pcifront_sd *sd)
-{
-       return (struct pcifront_device *)sd->platform_data;
-}
-
-static inline void pcifront_init_sd(struct pcifront_sd *sd, int domain,
-                                   struct pcifront_device *pdev)
-{
-       sd->segment = domain;
-       sd->acpi_handle = NULL;
-       sd->iommu = NULL;
-       sd->node = -1;
-       sd->windows = 0;
-       sd->window = NULL;
-       sd->platform_data = pdev;
-}
-
-#endif /* __ia64__ */
-
-extern struct rw_semaphore pci_bus_sem;
-
-#endif /* __KERNEL__ */
-
-#endif /* __XEN_ASM_PCIFRONT_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/public/evtchn.h b/linux-2.6-xen-sparse/include/xen/public/evtchn.h
deleted file mode 100644 (file)
index 938d4da..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/******************************************************************************
- * evtchn.h
- * 
- * Interface to /dev/xen/evtchn.
- * 
- * Copyright (c) 2003-2005, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __LINUX_PUBLIC_EVTCHN_H__
-#define __LINUX_PUBLIC_EVTCHN_H__
-
-/*
- * Bind a fresh port to VIRQ @virq.
- * Return allocated port.
- */
-#define IOCTL_EVTCHN_BIND_VIRQ                         \
-       _IOC(_IOC_NONE, 'E', 0, sizeof(struct ioctl_evtchn_bind_virq))
-struct ioctl_evtchn_bind_virq {
-       unsigned int virq;
-};
-
-/*
- * Bind a fresh port to remote <@remote_domain, @remote_port>.
- * Return allocated port.
- */
-#define IOCTL_EVTCHN_BIND_INTERDOMAIN                  \
-       _IOC(_IOC_NONE, 'E', 1, sizeof(struct ioctl_evtchn_bind_interdomain))
-struct ioctl_evtchn_bind_interdomain {
-       unsigned int remote_domain, remote_port;
-};
-
-/*
- * Allocate a fresh port for binding to @remote_domain.
- * Return allocated port.
- */
-#define IOCTL_EVTCHN_BIND_UNBOUND_PORT                 \
-       _IOC(_IOC_NONE, 'E', 2, sizeof(struct ioctl_evtchn_bind_unbound_port))
-struct ioctl_evtchn_bind_unbound_port {
-       unsigned int remote_domain;
-};
-
-/*
- * Unbind previously allocated @port.
- */
-#define IOCTL_EVTCHN_UNBIND                            \
-       _IOC(_IOC_NONE, 'E', 3, sizeof(struct ioctl_evtchn_unbind))
-struct ioctl_evtchn_unbind {
-       unsigned int port;
-};
-
-/*
- * Unbind previously allocated @port.
- */
-#define IOCTL_EVTCHN_NOTIFY                            \
-       _IOC(_IOC_NONE, 'E', 4, sizeof(struct ioctl_evtchn_notify))
-struct ioctl_evtchn_notify {
-       unsigned int port;
-};
-
-/* Clear and reinitialise the event buffer. Clear error condition. */
-#define IOCTL_EVTCHN_RESET                             \
-       _IOC(_IOC_NONE, 'E', 5, 0)
-
-#endif /* __LINUX_PUBLIC_EVTCHN_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/public/gntdev.h b/linux-2.6-xen-sparse/include/xen/public/gntdev.h
deleted file mode 100644 (file)
index c95e46b..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/******************************************************************************
- * gntdev.h
- * 
- * Interface to /dev/xen/gntdev.
- * 
- * Copyright (c) 2007, D G Murray
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __LINUX_PUBLIC_GNTDEV_H__
-#define __LINUX_PUBLIC_GNTDEV_H__
-
-struct ioctl_gntdev_grant_ref {
-       /* The domain ID of the grant to be mapped. */
-       uint32_t domid;
-       /* The grant reference of the grant to be mapped. */
-       uint32_t ref;
-};
-
-/*
- * Inserts the grant references into the mapping table of an instance
- * of gntdev. N.B. This does not perform the mapping, which is deferred
- * until mmap() is called with @index as the offset.
- */
-#define IOCTL_GNTDEV_MAP_GRANT_REF \
-_IOC(_IOC_NONE, 'G', 0, sizeof(struct ioctl_gntdev_map_grant_ref))
-struct ioctl_gntdev_map_grant_ref {
-       /* IN parameters */
-       /* The number of grants to be mapped. */
-       uint32_t count;
-       uint32_t pad;
-       /* OUT parameters */
-       /* The offset to be used on a subsequent call to mmap(). */
-       uint64_t index;
-       /* Variable IN parameter. */
-       /* Array of grant references, of size @count. */
-       struct ioctl_gntdev_grant_ref refs[1];
-};
-
-/*
- * Removes the grant references from the mapping table of an instance of
- * of gntdev. N.B. munmap() must be called on the relevant virtual address(es)
- * before this ioctl is called, or an error will result.
- */
-#define IOCTL_GNTDEV_UNMAP_GRANT_REF \
-_IOC(_IOC_NONE, 'G', 1, sizeof(struct ioctl_gntdev_unmap_grant_ref))       
-struct ioctl_gntdev_unmap_grant_ref {
-       /* IN parameters */
-       /* The offset was returned by the corresponding map operation. */
-       uint64_t index;
-       /* The number of pages to be unmapped. */
-       uint32_t count;
-       uint32_t pad;
-};
-
-/*
- * Returns the offset in the driver's address space that corresponds
- * to @vaddr. This can be used to perform a munmap(), followed by an
- * UNMAP_GRANT_REF ioctl, where no state about the offset is retained by
- * the caller. The number of pages that were allocated at the same time as
- * @vaddr is returned in @count.
- *
- * N.B. Where more than one page has been mapped into a contiguous range, the
- *      supplied @vaddr must correspond to the start of the range; otherwise
- *      an error will result. It is only possible to munmap() the entire
- *      contiguously-allocated range at once, and not any subrange thereof.
- */
-#define IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR \
-_IOC(_IOC_NONE, 'G', 2, sizeof(struct ioctl_gntdev_get_offset_for_vaddr))
-struct ioctl_gntdev_get_offset_for_vaddr {
-       /* IN parameters */
-       /* The virtual address of the first mapped page in a range. */
-       uint64_t vaddr;
-       /* OUT parameters */
-       /* The offset that was used in the initial mmap() operation. */
-       uint64_t offset;
-       /* The number of pages mapped in the VM area that begins at @vaddr. */
-       uint32_t count;
-       uint32_t pad;
-};
-
-#endif /* __LINUX_PUBLIC_GNTDEV_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/public/privcmd.h b/linux-2.6-xen-sparse/include/xen/public/privcmd.h
deleted file mode 100644 (file)
index d1162ee..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/******************************************************************************
- * privcmd.h
- * 
- * Interface to /proc/xen/privcmd.
- * 
- * Copyright (c) 2003-2005, K A Fraser
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __LINUX_PUBLIC_PRIVCMD_H__
-#define __LINUX_PUBLIC_PRIVCMD_H__
-
-#include <linux/types.h>
-
-#ifndef __user
-#define __user
-#endif
-
-typedef struct privcmd_hypercall
-{
-       __u64 op;
-       __u64 arg[5];
-} privcmd_hypercall_t;
-
-typedef struct privcmd_mmap_entry {
-       __u64 va;
-       __u64 mfn;
-       __u64 npages;
-} privcmd_mmap_entry_t; 
-
-typedef struct privcmd_mmap {
-       int num;
-       domid_t dom; /* target domain */
-       privcmd_mmap_entry_t __user *entry;
-} privcmd_mmap_t; 
-
-typedef struct privcmd_mmapbatch {
-       int num;     /* number of pages to populate */
-       domid_t dom; /* target domain */
-       __u64 addr;  /* virtual address */
-       xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */
-} privcmd_mmapbatch_t; 
-
-/*
- * @cmd: IOCTL_PRIVCMD_HYPERCALL
- * @arg: &privcmd_hypercall_t
- * Return: Value returned from execution of the specified hypercall.
- */
-#define IOCTL_PRIVCMD_HYPERCALL                                        \
-       _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t))
-#define IOCTL_PRIVCMD_MMAP                                     \
-       _IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t))
-#define IOCTL_PRIVCMD_MMAPBATCH                                        \
-       _IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
-
-#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/xen_proc.h b/linux-2.6-xen-sparse/include/xen/xen_proc.h
deleted file mode 100644 (file)
index 44af17c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#ifndef __ASM_XEN_PROC_H__
-#define __ASM_XEN_PROC_H__
-
-#include <linux/proc_fs.h>
-
-extern struct proc_dir_entry *create_xen_proc_entry(
-       const char *name, mode_t mode);
-extern void remove_xen_proc_entry(
-       const char *name);
-
-#endif /* __ASM_XEN_PROC_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/xenbus.h b/linux-2.6-xen-sparse/include/xen/xenbus.h
deleted file mode 100644 (file)
index f4873b2..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-/******************************************************************************
- * xenbus.h
- *
- * Talks to Xen Store to figure out what devices we have.
- *
- * Copyright (C) 2005 Rusty Russell, IBM Corporation
- * Copyright (C) 2005 XenSource Ltd.
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation; or, when distributed
- * separately from the Linux kernel or incorporated into other
- * software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef _XEN_XENBUS_H
-#define _XEN_XENBUS_H
-
-#include <linux/device.h>
-#include <linux/notifier.h>
-#include <linux/mutex.h>
-#include <linux/completion.h>
-#include <linux/init.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/io/xenbus.h>
-#include <xen/interface/io/xs_wire.h>
-
-/* Register callback to watch this node. */
-struct xenbus_watch
-{
-       struct list_head list;
-
-       /* Path being watched. */
-       const char *node;
-
-       /* Callback (executed in a process context with no locks held). */
-       void (*callback)(struct xenbus_watch *,
-                        const char **vec, unsigned int len);
-
-       /* See XBWF_ definitions below. */
-       unsigned long flags;
-};
-
-/*
- * Execute callback in its own kthread. Useful if the callback is long
- * running or heavily serialised, to avoid taking out the main xenwatch thread
- * for a long period of time (or even unwittingly causing a deadlock).
- */
-#define XBWF_new_thread        1
-
-/* A xenbus device. */
-struct xenbus_device {
-       const char *devicetype;
-       const char *nodename;
-       const char *otherend;
-       int otherend_id;
-       struct xenbus_watch otherend_watch;
-       struct device dev;
-       enum xenbus_state state;
-       struct completion down;
-};
-
-static inline struct xenbus_device *to_xenbus_device(struct device *dev)
-{
-       return container_of(dev, struct xenbus_device, dev);
-}
-
-struct xenbus_device_id
-{
-       /* .../device/<device_type>/<identifier> */
-       char devicetype[32];    /* General class of device. */
-};
-
-/* A xenbus driver. */
-struct xenbus_driver {
-       char *name;
-       struct module *owner;
-       const struct xenbus_device_id *ids;
-       int (*probe)(struct xenbus_device *dev,
-                    const struct xenbus_device_id *id);
-       void (*otherend_changed)(struct xenbus_device *dev,
-                                enum xenbus_state backend_state);
-       int (*remove)(struct xenbus_device *dev);
-       int (*suspend)(struct xenbus_device *dev);
-       int (*suspend_cancel)(struct xenbus_device *dev);
-       int (*resume)(struct xenbus_device *dev);
-       int (*uevent)(struct xenbus_device *, char **, int, char *, int);
-       struct device_driver driver;
-       int (*read_otherend_details)(struct xenbus_device *dev);
-};
-
-static inline struct xenbus_driver *to_xenbus_driver(struct device_driver *drv)
-{
-       return container_of(drv, struct xenbus_driver, driver);
-}
-
-int xenbus_register_frontend(struct xenbus_driver *drv);
-int xenbus_register_backend(struct xenbus_driver *drv);
-void xenbus_unregister_driver(struct xenbus_driver *drv);
-
-struct xenbus_transaction
-{
-       u32 id;
-};
-
-/* Nil transaction ID. */
-#define XBT_NIL ((struct xenbus_transaction) { 0 })
-
-char **xenbus_directory(struct xenbus_transaction t,
-                       const char *dir, const char *node, unsigned int *num);
-void *xenbus_read(struct xenbus_transaction t,
-                 const char *dir, const char *node, unsigned int *len);
-int xenbus_write(struct xenbus_transaction t,
-                const char *dir, const char *node, const char *string);
-int xenbus_mkdir(struct xenbus_transaction t,
-                const char *dir, const char *node);
-int xenbus_exists(struct xenbus_transaction t,
-                 const char *dir, const char *node);
-int xenbus_rm(struct xenbus_transaction t, const char *dir, const char *node);
-int xenbus_transaction_start(struct xenbus_transaction *t);
-int xenbus_transaction_end(struct xenbus_transaction t, int abort);
-
-/* Single read and scanf: returns -errno or num scanned if > 0. */
-int xenbus_scanf(struct xenbus_transaction t,
-                const char *dir, const char *node, const char *fmt, ...)
-       __attribute__((format(scanf, 4, 5)));
-
-/* Single printf and write: returns -errno or 0. */
-int xenbus_printf(struct xenbus_transaction t,
-                 const char *dir, const char *node, const char *fmt, ...)
-       __attribute__((format(printf, 4, 5)));
-
-/* Generic read function: NULL-terminated triples of name,
- * sprintf-style type string, and pointer. Returns 0 or errno.*/
-int xenbus_gather(struct xenbus_transaction t, const char *dir, ...);
-
-/* notifer routines for when the xenstore comes up */
-int register_xenstore_notifier(struct notifier_block *nb);
-void unregister_xenstore_notifier(struct notifier_block *nb);
-
-int register_xenbus_watch(struct xenbus_watch *watch);
-void unregister_xenbus_watch(struct xenbus_watch *watch);
-void xs_suspend(void);
-void xs_resume(void);
-void xs_suspend_cancel(void);
-
-/* Used by xenbus_dev to borrow kernel's store connection. */
-void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg);
-
-/* Prepare for domain suspend: then resume or cancel the suspend. */
-void xenbus_suspend(void);
-void xenbus_resume(void);
-void xenbus_suspend_cancel(void);
-
-#define XENBUS_IS_ERR_READ(str) ({                     \
-       if (!IS_ERR(str) && strlen(str) == 0) {         \
-               kfree(str);                             \
-               str = ERR_PTR(-ERANGE);                 \
-       }                                               \
-       IS_ERR(str);                                    \
-})
-
-#define XENBUS_EXIST_ERR(err) ((err) == -ENOENT || (err) == -ERANGE)
-
-
-/**
- * Register a watch on the given path, using the given xenbus_watch structure
- * for storage, and the given callback function as the callback.  Return 0 on
- * success, or -errno on error.  On success, the given path will be saved as
- * watch->node, and remains the caller's to free.  On error, watch->node will
- * be NULL, the device will switch to XenbusStateClosing, and the error will
- * be saved in the store.
- */
-int xenbus_watch_path(struct xenbus_device *dev, const char *path,
-                     struct xenbus_watch *watch,
-                     void (*callback)(struct xenbus_watch *,
-                                      const char **, unsigned int));
-
-
-/**
- * Register a watch on the given path/path2, using the given xenbus_watch
- * structure for storage, and the given callback function as the callback.
- * Return 0 on success, or -errno on error.  On success, the watched path
- * (path/path2) will be saved as watch->node, and becomes the caller's to
- * kfree().  On error, watch->node will be NULL, so the caller has nothing to
- * free, the device will switch to XenbusStateClosing, and the error will be
- * saved in the store.
- */
-int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
-                      const char *path2, struct xenbus_watch *watch,
-                      void (*callback)(struct xenbus_watch *,
-                                       const char **, unsigned int));
-
-
-/**
- * Advertise in the store a change of the given driver to the given new_state.
- * Return 0 on success, or -errno on error.  On error, the device will switch
- * to XenbusStateClosing, and the error will be saved in the store.
- */
-int xenbus_switch_state(struct xenbus_device *dev, enum xenbus_state new_state);
-
-
-/**
- * Grant access to the given ring_mfn to the peer of the given device.  Return
- * 0 on success, or -errno on error.  On error, the device will switch to
- * XenbusStateClosing, and the error will be saved in the store.
- */
-int xenbus_grant_ring(struct xenbus_device *dev, unsigned long ring_mfn);
-
-
-/**
- * Map a page of memory into this domain from another domain's grant table.
- * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
- * page to that address, and sets *vaddr to that address.
- * xenbus_map_ring does not allocate the virtual address space (you must do
- * this yourself!). It only maps in the page to the specified address.
- * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
- * or -ENOMEM on error. If an error is returned, device will switch to
- * XenbusStateClosing and the error message will be saved in XenStore.
- */
-struct vm_struct *xenbus_map_ring_valloc(struct xenbus_device *dev,
-                                        int gnt_ref);
-int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
-                          grant_handle_t *handle, void *vaddr);
-
-
-/**
- * Unmap a page of memory in this domain that was imported from another domain.
- * Use xenbus_unmap_ring_vfree if you mapped in your memory with
- * xenbus_map_ring_valloc (it will free the virtual address space).
- * Returns 0 on success and returns GNTST_* on error
- * (see xen/include/interface/grant_table.h).
- */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, struct vm_struct *);
-int xenbus_unmap_ring(struct xenbus_device *dev,
-                     grant_handle_t handle, void *vaddr);
-
-
-/**
- * Allocate an event channel for the given xenbus_device, assigning the newly
- * created local port to *port.  Return 0 on success, or -errno on error.  On
- * error, the device will switch to XenbusStateClosing, and the error will be
- * saved in the store.
- */
-int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port);
-
-
-/**
- * Free an existing event channel. Returns 0 on success or -errno on error.
- */
-int xenbus_free_evtchn(struct xenbus_device *dev, int port);
-
-
-/**
- * Return the state of the driver rooted at the given store path, or
- * XenbusStateUnknown if no state can be read.
- */
-enum xenbus_state xenbus_read_driver_state(const char *path);
-
-
-/***
- * Report the given negative errno into the store, along with the given
- * formatted message.
- */
-void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt,
-                     ...);
-
-
-/***
- * Equivalent to xenbus_dev_error(dev, err, fmt, args), followed by
- * xenbus_switch_state(dev, NULL, XenbusStateClosing) to schedule an orderly
- * closedown of this driver and its peer.
- */
-void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt,
-                     ...);
-
-int xenbus_dev_init(void);
-
-const char *xenbus_strstate(enum xenbus_state state);
-int xenbus_dev_is_online(struct xenbus_device *dev);
-int xenbus_frontend_closed(struct xenbus_device *dev);
-
-#endif /* _XEN_XENBUS_H */
diff --git a/linux-2.6-xen-sparse/include/xen/xencons.h b/linux-2.6-xen-sparse/include/xen/xencons.h
deleted file mode 100644 (file)
index 9f280c5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __ASM_XENCONS_H__
-#define __ASM_XENCONS_H__
-
-struct dom0_vga_console_info;
-void dom0_init_screen_info(const struct dom0_vga_console_info *info);
-
-void xencons_force_flush(void);
-void xencons_resume(void);
-
-/* Interrupt work hooks. Receive data, or kick data out. */
-void xencons_rx(char *buf, unsigned len, struct pt_regs *regs);
-void xencons_tx(void);
-
-int xencons_ring_init(void);
-int xencons_ring_send(const char *data, unsigned len);
-
-void xencons_early_setup(void);
-
-#endif /* __ASM_XENCONS_H__ */
diff --git a/linux-2.6-xen-sparse/include/xen/xenoprof.h b/linux-2.6-xen-sparse/include/xen/xenoprof.h
deleted file mode 100644 (file)
index 4c3ab0f..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/******************************************************************************
- * xen/xenoprof.h
- *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#ifndef __XEN_XENOPROF_H__
-#define __XEN_XENOPROF_H__
-#ifdef CONFIG_XEN
-
-#include <asm/xenoprof.h>
-
-struct oprofile_operations;
-int xenoprofile_init(struct oprofile_operations * ops);
-void xenoprofile_exit(void);
-
-struct xenoprof_shared_buffer {
-       char                                    *buffer;
-       struct xenoprof_arch_shared_buffer      arch;
-};
-#else
-#define xenoprofile_init(ops)  (-ENOSYS)
-#define xenoprofile_exit()     do { } while (0)
-
-#endif /* CONFIG_XEN */
-#endif /* __XEN_XENOPROF_H__ */
diff --git a/linux-2.6-xen-sparse/kernel/Kconfig.preempt b/linux-2.6-xen-sparse/kernel/Kconfig.preempt
deleted file mode 100644 (file)
index 17ab322..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-
-choice
-       prompt "Preemption Model"
-       default PREEMPT_NONE
-
-config PREEMPT_NONE
-       bool "No Forced Preemption (Server)"
-       help
-         This is the traditional Linux preemption model, geared towards
-         throughput. It will still provide good latencies most of the
-         time, but there are no guarantees and occasional longer delays
-         are possible.
-
-         Select this option if you are building a kernel for a server or
-         scientific/computation system, or if you want to maximize the
-         raw processing power of the kernel, irrespective of scheduling
-         latencies.
-
-config PREEMPT_VOLUNTARY
-       bool "Voluntary Kernel Preemption (Desktop)"
-       help
-         This option reduces the latency of the kernel by adding more
-         "explicit preemption points" to the kernel code. These new
-         preemption points have been selected to reduce the maximum
-         latency of rescheduling, providing faster application reactions,
-         at the cost of slighly lower throughput.
-
-         This allows reaction to interactive events by allowing a
-         low priority process to voluntarily preempt itself even if it
-         is in kernel mode executing a system call. This allows
-         applications to run more 'smoothly' even when the system is
-         under load.
-
-         Select this if you are building a kernel for a desktop system.
-
-config PREEMPT
-       bool "Preemptible Kernel (Low-Latency Desktop)"
-       depends on !XEN
-       help
-         This option reduces the latency of the kernel by making
-         all kernel code (that is not executing in a critical section)
-         preemptible.  This allows reaction to interactive events by
-         permitting a low priority process to be preempted involuntarily
-         even if it is in kernel mode executing a system call and would
-         otherwise not be about to reach a natural preemption point.
-         This allows applications to run more 'smoothly' even when the
-         system is under load, at the cost of slighly lower throughput
-         and a slight runtime overhead to kernel code.
-
-         Select this if you are building a kernel for a desktop or
-         embedded system with latency requirements in the milliseconds
-         range.
-
-endchoice
-
-config PREEMPT_BKL
-       bool "Preempt The Big Kernel Lock"
-       depends on SMP || PREEMPT
-       default y
-       help
-         This option reduces the latency of the kernel by making the
-         big kernel lock preemptible.
-
-         Say Y here if you are building a kernel for a desktop system.
-         Say N if you are unsure.
-
diff --git a/linux-2.6-xen-sparse/kernel/fork.c b/linux-2.6-xen-sparse/kernel/fork.c
deleted file mode 100644 (file)
index e43f54f..0000000
+++ /dev/null
@@ -1,1691 +0,0 @@
-/*
- *  linux/kernel/fork.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- *  'fork.c' contains the help-routines for the 'fork' system call
- * (see also entry.S and others).
- * Fork is rather simple, once you get the hang of it, but the memory
- * management can be a bitch. See 'mm/memory.c': 'copy_page_range()'
- */
-
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/unistd.h>
-#include <linux/smp_lock.h>
-#include <linux/module.h>
-#include <linux/vmalloc.h>
-#include <linux/completion.h>
-#include <linux/namespace.h>
-#include <linux/personality.h>
-#include <linux/mempolicy.h>
-#include <linux/sem.h>
-#include <linux/file.h>
-#include <linux/key.h>
-#include <linux/binfmts.h>
-#include <linux/mman.h>
-#include <linux/fs.h>
-#include <linux/capability.h>
-#include <linux/cpu.h>
-#include <linux/cpuset.h>
-#include <linux/security.h>
-#include <linux/swap.h>
-#include <linux/syscalls.h>
-#include <linux/jiffies.h>
-#include <linux/futex.h>
-#include <linux/rcupdate.h>
-#include <linux/ptrace.h>
-#include <linux/mount.h>
-#include <linux/audit.h>
-#include <linux/profile.h>
-#include <linux/rmap.h>
-#include <linux/acct.h>
-#include <linux/cn_proc.h>
-#include <linux/delayacct.h>
-#include <linux/taskstats_kern.h>
-
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/uaccess.h>
-#include <asm/mmu_context.h>
-#include <asm/cacheflush.h>
-#include <asm/tlbflush.h>
-
-/*
- * Protected counters by write_lock_irq(&tasklist_lock)
- */
-unsigned long total_forks;     /* Handle normal Linux uptimes. */
-int nr_threads;                /* The idle threads do not count.. */
-
-int max_threads;               /* tunable limit on nr_threads */
-
-DEFINE_PER_CPU(unsigned long, process_counts) = 0;
-
-__cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */
-
-int nr_processes(void)
-{
-       int cpu;
-       int total = 0;
-
-       for_each_online_cpu(cpu)
-               total += per_cpu(process_counts, cpu);
-
-       return total;
-}
-
-#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
-# define alloc_task_struct()   kmem_cache_alloc(task_struct_cachep, GFP_KERNEL)
-# define free_task_struct(tsk) kmem_cache_free(task_struct_cachep, (tsk))
-static kmem_cache_t *task_struct_cachep;
-#endif
-
-/* SLAB cache for signal_struct structures (tsk->signal) */
-static kmem_cache_t *signal_cachep;
-
-/* SLAB cache for sighand_struct structures (tsk->sighand) */
-kmem_cache_t *sighand_cachep;
-
-/* SLAB cache for files_struct structures (tsk->files) */
-kmem_cache_t *files_cachep;
-
-/* SLAB cache for fs_struct structures (tsk->fs) */
-kmem_cache_t *fs_cachep;
-
-/* SLAB cache for vm_area_struct structures */
-kmem_cache_t *vm_area_cachep;
-
-/* SLAB cache for mm_struct structures (tsk->mm) */
-static kmem_cache_t *mm_cachep;
-
-void free_task(struct task_struct *tsk)
-{
-       free_thread_info(tsk->thread_info);
-       rt_mutex_debug_task_free(tsk);
-       free_task_struct(tsk);
-}
-EXPORT_SYMBOL(free_task);
-
-void __put_task_struct(struct task_struct *tsk)
-{
-       WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE)));
-       WARN_ON(atomic_read(&tsk->usage));
-       WARN_ON(tsk == current);
-
-       security_task_free(tsk);
-       free_uid(tsk->user);
-       put_group_info(tsk->group_info);
-       delayacct_tsk_free(tsk);
-
-       if (!profile_handoff_task(tsk))
-               free_task(tsk);
-}
-
-void __init fork_init(unsigned long mempages)
-{
-#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
-#ifndef ARCH_MIN_TASKALIGN
-#define ARCH_MIN_TASKALIGN     L1_CACHE_BYTES
-#endif
-       /* create a slab on which task_structs can be allocated */
-       task_struct_cachep =
-               kmem_cache_create("task_struct", sizeof(struct task_struct),
-                       ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);
-#endif
-
-       /*
-        * The default maximum number of threads is set to a safe
-        * value: the thread structures can take up at most half
-        * of memory.
-        */
-       max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
-
-       /*
-        * we need to allow at least 20 threads to boot a system
-        */
-       if(max_threads < 20)
-               max_threads = 20;
-
-       init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
-       init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
-       init_task.signal->rlim[RLIMIT_SIGPENDING] =
-               init_task.signal->rlim[RLIMIT_NPROC];
-}
-
-static struct task_struct *dup_task_struct(struct task_struct *orig)
-{
-       struct task_struct *tsk;
-       struct thread_info *ti;
-
-       prepare_to_copy(orig);
-
-       tsk = alloc_task_struct();
-       if (!tsk)
-               return NULL;
-
-       ti = alloc_thread_info(tsk);
-       if (!ti) {
-               free_task_struct(tsk);
-               return NULL;
-       }
-
-       *tsk = *orig;
-       tsk->thread_info = ti;
-       setup_thread_stack(tsk, orig);
-
-       /* One for us, one for whoever does the "release_task()" (usually parent) */
-       atomic_set(&tsk->usage,2);
-       atomic_set(&tsk->fs_excl, 0);
-       tsk->btrace_seq = 0;
-       tsk->splice_pipe = NULL;
-       return tsk;
-}
-
-#ifdef CONFIG_MMU
-static inline int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
-{
-       struct vm_area_struct *mpnt, *tmp, **pprev;
-       struct rb_node **rb_link, *rb_parent;
-       int retval;
-       unsigned long charge;
-       struct mempolicy *pol;
-
-       down_write(&oldmm->mmap_sem);
-       flush_cache_mm(oldmm);
-       /*
-        * Not linked in yet - no deadlock potential:
-        */
-       down_write_nested(&mm->mmap_sem, SINGLE_DEPTH_NESTING);
-
-       mm->locked_vm = 0;
-       mm->mmap = NULL;
-       mm->mmap_cache = NULL;
-       mm->free_area_cache = oldmm->mmap_base;
-       mm->cached_hole_size = ~0UL;
-       mm->map_count = 0;
-       cpus_clear(mm->cpu_vm_mask);
-       mm->mm_rb = RB_ROOT;
-       rb_link = &mm->mm_rb.rb_node;
-       rb_parent = NULL;
-       pprev = &mm->mmap;
-
-       for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) {
-               struct file *file;
-
-               if (mpnt->vm_flags & VM_DONTCOPY) {
-                       long pages = vma_pages(mpnt);
-                       mm->total_vm -= pages;
-                       vm_stat_account(mm, mpnt->vm_flags, mpnt->vm_file,
-                                                               -pages);
-                       continue;
-               }
-               charge = 0;
-               if (mpnt->vm_flags & VM_ACCOUNT) {
-                       unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
-                       if (security_vm_enough_memory(len))
-                               goto fail_nomem;
-                       charge = len;
-               }
-               tmp = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-               if (!tmp)
-                       goto fail_nomem;
-               *tmp = *mpnt;
-               pol = mpol_copy(vma_policy(mpnt));
-               retval = PTR_ERR(pol);
-               if (IS_ERR(pol))
-                       goto fail_nomem_policy;
-               vma_set_policy(tmp, pol);
-               tmp->vm_flags &= ~VM_LOCKED;
-               tmp->vm_mm = mm;
-               tmp->vm_next = NULL;
-               anon_vma_link(tmp);
-               file = tmp->vm_file;
-               if (file) {
-                       struct inode *inode = file->f_dentry->d_inode;
-                       get_file(file);
-                       if (tmp->vm_flags & VM_DENYWRITE)
-                               atomic_dec(&inode->i_writecount);
-      
-                       /* insert tmp into the share list, just after mpnt */
-                       spin_lock(&file->f_mapping->i_mmap_lock);
-                       tmp->vm_truncate_count = mpnt->vm_truncate_count;
-                       flush_dcache_mmap_lock(file->f_mapping);
-                       vma_prio_tree_add(tmp, mpnt);
-                       flush_dcache_mmap_unlock(file->f_mapping);
-                       spin_unlock(&file->f_mapping->i_mmap_lock);
-               }
-
-               /*
-                * Link in the new vma and copy the page table entries.
-                */
-               *pprev = tmp;
-               pprev = &tmp->vm_next;
-
-               __vma_link_rb(mm, tmp, rb_link, rb_parent);
-               rb_link = &tmp->vm_rb.rb_right;
-               rb_parent = &tmp->vm_rb;
-
-               mm->map_count++;
-               retval = copy_page_range(mm, oldmm, mpnt);
-
-               if (tmp->vm_ops && tmp->vm_ops->open)
-                       tmp->vm_ops->open(tmp);
-
-               if (retval)
-                       goto out;
-       }
-#ifdef arch_dup_mmap
-       arch_dup_mmap(mm, oldmm);
-#endif
-       retval = 0;
-out:
-       up_write(&mm->mmap_sem);
-       flush_tlb_mm(oldmm);
-       up_write(&oldmm->mmap_sem);
-       return retval;
-fail_nomem_policy:
-       kmem_cache_free(vm_area_cachep, tmp);
-fail_nomem:
-       retval = -ENOMEM;
-       vm_unacct_memory(charge);
-       goto out;
-}
-
-static inline int mm_alloc_pgd(struct mm_struct * mm)
-{
-       mm->pgd = pgd_alloc(mm);
-       if (unlikely(!mm->pgd))
-               return -ENOMEM;
-       return 0;
-}
-
-static inline void mm_free_pgd(struct mm_struct * mm)
-{
-       pgd_free(mm->pgd);
-}
-#else
-#define dup_mmap(mm, oldmm)    (0)
-#define mm_alloc_pgd(mm)       (0)
-#define mm_free_pgd(mm)
-#endif /* CONFIG_MMU */
-
- __cacheline_aligned_in_smp DEFINE_SPINLOCK(mmlist_lock);
-
-#define allocate_mm()  (kmem_cache_alloc(mm_cachep, SLAB_KERNEL))
-#define free_mm(mm)    (kmem_cache_free(mm_cachep, (mm)))
-
-#include <linux/init_task.h>
-
-static struct mm_struct * mm_init(struct mm_struct * mm)
-{
-       atomic_set(&mm->mm_users, 1);
-       atomic_set(&mm->mm_count, 1);
-       init_rwsem(&mm->mmap_sem);
-       INIT_LIST_HEAD(&mm->mmlist);
-       mm->core_waiters = 0;
-       mm->nr_ptes = 0;
-       set_mm_counter(mm, file_rss, 0);
-       set_mm_counter(mm, anon_rss, 0);
-       spin_lock_init(&mm->page_table_lock);
-       rwlock_init(&mm->ioctx_list_lock);
-       mm->ioctx_list = NULL;
-       mm->free_area_cache = TASK_UNMAPPED_BASE;
-       mm->cached_hole_size = ~0UL;
-
-       if (likely(!mm_alloc_pgd(mm))) {
-               mm->def_flags = 0;
-               return mm;
-       }
-       free_mm(mm);
-       return NULL;
-}
-
-/*
- * Allocate and initialize an mm_struct.
- */
-struct mm_struct * mm_alloc(void)
-{
-       struct mm_struct * mm;
-
-       mm = allocate_mm();
-       if (mm) {
-               memset(mm, 0, sizeof(*mm));
-               mm = mm_init(mm);
-       }
-       return mm;
-}
-
-/*
- * Called when the last reference to the mm
- * is dropped: either by a lazy thread or by
- * mmput. Free the page directory and the mm.
- */
-void fastcall __mmdrop(struct mm_struct *mm)
-{
-       BUG_ON(mm == &init_mm);
-       mm_free_pgd(mm);
-       destroy_context(mm);
-       free_mm(mm);
-}
-
-/*
- * Decrement the use count and release all resources for an mm.
- */
-void mmput(struct mm_struct *mm)
-{
-       might_sleep();
-
-       if (atomic_dec_and_test(&mm->mm_users)) {
-               exit_aio(mm);
-               exit_mmap(mm);
-               if (!list_empty(&mm->mmlist)) {
-                       spin_lock(&mmlist_lock);
-                       list_del(&mm->mmlist);
-                       spin_unlock(&mmlist_lock);
-               }
-               put_swap_token(mm);
-               mmdrop(mm);
-       }
-}
-EXPORT_SYMBOL_GPL(mmput);
-
-/**
- * get_task_mm - acquire a reference to the task's mm
- *
- * Returns %NULL if the task has no mm.  Checks PF_BORROWED_MM (meaning
- * this kernel workthread has transiently adopted a user mm with use_mm,
- * to do its AIO) is not set and if so returns a reference to it, after
- * bumping up the use count.  User must release the mm via mmput()
- * after use.  Typically used by /proc and ptrace.
- */
-struct mm_struct *get_task_mm(struct task_struct *task)
-{
-       struct mm_struct *mm;
-
-       task_lock(task);
-       mm = task->mm;
-       if (mm) {
-               if (task->flags & PF_BORROWED_MM)
-                       mm = NULL;
-               else
-                       atomic_inc(&mm->mm_users);
-       }
-       task_unlock(task);
-       return mm;
-}
-EXPORT_SYMBOL_GPL(get_task_mm);
-
-/* Please note the differences between mmput and mm_release.
- * mmput is called whenever we stop holding onto a mm_struct,
- * error success whatever.
- *
- * mm_release is called after a mm_struct has been removed
- * from the current process.
- *
- * This difference is important for error handling, when we
- * only half set up a mm_struct for a new process and need to restore
- * the old one.  Because we mmput the new mm_struct before
- * restoring the old one. . .
- * Eric Biederman 10 January 1998
- */
-void mm_release(struct task_struct *tsk, struct mm_struct *mm)
-{
-       struct completion *vfork_done = tsk->vfork_done;
-
-       /* Get rid of any cached register state */
-       deactivate_mm(tsk, mm);
-
-       /* notify parent sleeping on vfork() */
-       if (vfork_done) {
-               tsk->vfork_done = NULL;
-               complete(vfork_done);
-       }
-       if (tsk->clear_child_tid && atomic_read(&mm->mm_users) > 1) {
-               u32 __user * tidptr = tsk->clear_child_tid;
-               tsk->clear_child_tid = NULL;
-
-               /*
-                * We don't check the error code - if userspace has
-                * not set up a proper pointer then tough luck.
-                */
-               put_user(0, tidptr);
-               sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0);
-       }
-}
-
-/*
- * Allocate a new mm structure and copy contents from the
- * mm structure of the passed in task structure.
- */
-static struct mm_struct *dup_mm(struct task_struct *tsk)
-{
-       struct mm_struct *mm, *oldmm = current->mm;
-       int err;
-
-       if (!oldmm)
-               return NULL;
-
-       mm = allocate_mm();
-       if (!mm)
-               goto fail_nomem;
-
-       memcpy(mm, oldmm, sizeof(*mm));
-
-       if (!mm_init(mm))
-               goto fail_nomem;
-
-       if (init_new_context(tsk, mm))
-               goto fail_nocontext;
-
-       err = dup_mmap(mm, oldmm);
-       if (err)
-               goto free_pt;
-
-       mm->hiwater_rss = get_mm_rss(mm);
-       mm->hiwater_vm = mm->total_vm;
-
-       return mm;
-
-free_pt:
-       mmput(mm);
-
-fail_nomem:
-       return NULL;
-
-fail_nocontext:
-       /*
-        * If init_new_context() failed, we cannot use mmput() to free the mm
-        * because it calls destroy_context()
-        */
-       mm_free_pgd(mm);
-       free_mm(mm);
-       return NULL;
-}
-
-static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
-{
-       struct mm_struct * mm, *oldmm;
-       int retval;
-
-       tsk->min_flt = tsk->maj_flt = 0;
-       tsk->nvcsw = tsk->nivcsw = 0;
-
-       tsk->mm = NULL;
-       tsk->active_mm = NULL;
-
-       /*
-        * Are we cloning a kernel thread?
-        *
-        * We need to steal a active VM for that..
-        */
-       oldmm = current->mm;
-       if (!oldmm)
-               return 0;
-
-       if (clone_flags & CLONE_VM) {
-               atomic_inc(&oldmm->mm_users);
-               mm = oldmm;
-               goto good_mm;
-       }
-
-       retval = -ENOMEM;
-       mm = dup_mm(tsk);
-       if (!mm)
-               goto fail_nomem;
-
-good_mm:
-       tsk->mm = mm;
-       tsk->active_mm = mm;
-       return 0;
-
-fail_nomem:
-       return retval;
-}
-
-static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old)
-{
-       struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL);
-       /* We don't need to lock fs - think why ;-) */
-       if (fs) {
-               atomic_set(&fs->count, 1);
-               rwlock_init(&fs->lock);
-               fs->umask = old->umask;
-               read_lock(&old->lock);
-               fs->rootmnt = mntget(old->rootmnt);
-               fs->root = dget(old->root);
-               fs->pwdmnt = mntget(old->pwdmnt);
-               fs->pwd = dget(old->pwd);
-               if (old->altroot) {
-                       fs->altrootmnt = mntget(old->altrootmnt);
-                       fs->altroot = dget(old->altroot);
-               } else {
-                       fs->altrootmnt = NULL;
-                       fs->altroot = NULL;
-               }
-               read_unlock(&old->lock);
-       }
-       return fs;
-}
-
-struct fs_struct *copy_fs_struct(struct fs_struct *old)
-{
-       return __copy_fs_struct(old);
-}
-
-EXPORT_SYMBOL_GPL(copy_fs_struct);
-
-static inline int copy_fs(unsigned long clone_flags, struct task_struct * tsk)
-{
-       if (clone_flags & CLONE_FS) {
-               atomic_inc(&current->fs->count);
-               return 0;
-       }
-       tsk->fs = __copy_fs_struct(current->fs);
-       if (!tsk->fs)
-               return -ENOMEM;
-       return 0;
-}
-
-static int count_open_files(struct fdtable *fdt)
-{
-       int size = fdt->max_fdset;
-       int i;
-
-       /* Find the last open fd */
-       for (i = size/(8*sizeof(long)); i > 0; ) {
-               if (fdt->open_fds->fds_bits[--i])
-                       break;
-       }
-       i = (i+1) * 8 * sizeof(long);
-       return i;
-}
-
-static struct files_struct *alloc_files(void)
-{
-       struct files_struct *newf;
-       struct fdtable *fdt;
-
-       newf = kmem_cache_alloc(files_cachep, SLAB_KERNEL);
-       if (!newf)
-               goto out;
-
-       atomic_set(&newf->count, 1);
-
-       spin_lock_init(&newf->file_lock);
-       newf->next_fd = 0;
-       fdt = &newf->fdtab;
-       fdt->max_fds = NR_OPEN_DEFAULT;
-       fdt->max_fdset = EMBEDDED_FD_SET_SIZE;
-       fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
-       fdt->open_fds = (fd_set *)&newf->open_fds_init;
-       fdt->fd = &newf->fd_array[0];
-       INIT_RCU_HEAD(&fdt->rcu);
-       fdt->free_files = NULL;
-       fdt->next = NULL;
-       rcu_assign_pointer(newf->fdt, fdt);
-out:
-       return newf;
-}
-
-/*
- * Allocate a new files structure and copy contents from the
- * passed in files structure.
- * errorp will be valid only when the returned files_struct is NULL.
- */
-static struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
-{
-       struct files_struct *newf;
-       struct file **old_fds, **new_fds;
-       int open_files, size, i, expand;
-       struct fdtable *old_fdt, *new_fdt;
-
-       *errorp = -ENOMEM;
-       newf = alloc_files();
-       if (!newf)
-               goto out;
-
-       spin_lock(&oldf->file_lock);
-       old_fdt = files_fdtable(oldf);
-       new_fdt = files_fdtable(newf);
-       size = old_fdt->max_fdset;
-       open_files = count_open_files(old_fdt);
-       expand = 0;
-
-       /*
-        * Check whether we need to allocate a larger fd array or fd set.
-        * Note: we're not a clone task, so the open count won't  change.
-        */
-       if (open_files > new_fdt->max_fdset) {
-               new_fdt->max_fdset = 0;
-               expand = 1;
-       }
-       if (open_files > new_fdt->max_fds) {
-               new_fdt->max_fds = 0;
-               expand = 1;
-       }
-
-       /* if the old fdset gets grown now, we'll only copy up to "size" fds */
-       if (expand) {
-               spin_unlock(&oldf->file_lock);
-               spin_lock(&newf->file_lock);
-               *errorp = expand_files(newf, open_files-1);
-               spin_unlock(&newf->file_lock);
-               if (*errorp < 0)
-                       goto out_release;
-               new_fdt = files_fdtable(newf);
-               /*
-                * Reacquire the oldf lock and a pointer to its fd table
-                * who knows it may have a new bigger fd table. We need
-                * the latest pointer.
-                */
-               spin_lock(&oldf->file_lock);
-               old_fdt = files_fdtable(oldf);
-       }
-
-       old_fds = old_fdt->fd;
-       new_fds = new_fdt->fd;
-
-       memcpy(new_fdt->open_fds->fds_bits, old_fdt->open_fds->fds_bits, open_files/8);
-       memcpy(new_fdt->close_on_exec->fds_bits, old_fdt->close_on_exec->fds_bits, open_files/8);
-
-       for (i = open_files; i != 0; i--) {
-               struct file *f = *old_fds++;
-               if (f) {
-                       get_file(f);
-               } else {
-                       /*
-                        * The fd may be claimed in the fd bitmap but not yet
-                        * instantiated in the files array if a sibling thread
-                        * is partway through open().  So make sure that this
-                        * fd is available to the new process.
-                        */
-                       FD_CLR(open_files - i, new_fdt->open_fds);
-               }
-               rcu_assign_pointer(*new_fds++, f);
-       }
-       spin_unlock(&oldf->file_lock);
-
-       /* compute the remainder to be cleared */
-       size = (new_fdt->max_fds - open_files) * sizeof(struct file *);
-
-       /* This is long word aligned thus could use a optimized version */ 
-       memset(new_fds, 0, size); 
-
-       if (new_fdt->max_fdset > open_files) {
-               int left = (new_fdt->max_fdset-open_files)/8;
-               int start = open_files / (8 * sizeof(unsigned long));
-
-               memset(&new_fdt->open_fds->fds_bits[start], 0, left);
-               memset(&new_fdt->close_on_exec->fds_bits[start], 0, left);
-       }
-
-out:
-       return newf;
-
-out_release:
-       free_fdset (new_fdt->close_on_exec, new_fdt->max_fdset);
-       free_fdset (new_fdt->open_fds, new_fdt->max_fdset);
-       free_fd_array(new_fdt->fd, new_fdt->max_fds);
-       kmem_cache_free(files_cachep, newf);
-       return NULL;
-}
-
-static int copy_files(unsigned long clone_flags, struct task_struct * tsk)
-{
-       struct files_struct *oldf, *newf;
-       int error = 0;
-
-       /*
-        * A background process may not have any files ...
-        */
-       oldf = current->files;
-       if (!oldf)
-               goto out;
-
-       if (clone_flags & CLONE_FILES) {
-               atomic_inc(&oldf->count);
-               goto out;
-       }
-
-       /*
-        * Note: we may be using current for both targets (See exec.c)
-        * This works because we cache current->files (old) as oldf. Don't
-        * break this.
-        */
-       tsk->files = NULL;
-       newf = dup_fd(oldf, &error);
-       if (!newf)
-               goto out;
-
-       tsk->files = newf;
-       error = 0;
-out:
-       return error;
-}
-
-/*
- *     Helper to unshare the files of the current task.
- *     We don't want to expose copy_files internals to
- *     the exec layer of the kernel.
- */
-
-int unshare_files(void)
-{
-       struct files_struct *files  = current->files;
-       int rc;
-
-       BUG_ON(!files);
-
-       /* This can race but the race causes us to copy when we don't
-          need to and drop the copy */
-       if(atomic_read(&files->count) == 1)
-       {
-               atomic_inc(&files->count);
-               return 0;
-       }
-       rc = copy_files(0, current);
-       if(rc)
-               current->files = files;
-       return rc;
-}
-
-EXPORT_SYMBOL(unshare_files);
-
-static inline int copy_sighand(unsigned long clone_flags, struct task_struct * tsk)
-{
-       struct sighand_struct *sig;
-
-       if (clone_flags & (CLONE_SIGHAND | CLONE_THREAD)) {
-               atomic_inc(&current->sighand->count);
-               return 0;
-       }
-       sig = kmem_cache_alloc(sighand_cachep, GFP_KERNEL);
-       rcu_assign_pointer(tsk->sighand, sig);
-       if (!sig)
-               return -ENOMEM;
-       atomic_set(&sig->count, 1);
-       memcpy(sig->action, current->sighand->action, sizeof(sig->action));
-       return 0;
-}
-
-void __cleanup_sighand(struct sighand_struct *sighand)
-{
-       if (atomic_dec_and_test(&sighand->count))
-               kmem_cache_free(sighand_cachep, sighand);
-}
-
-static inline int copy_signal(unsigned long clone_flags, struct task_struct * tsk)
-{
-       struct signal_struct *sig;
-       int ret;
-
-       if (clone_flags & CLONE_THREAD) {
-               atomic_inc(&current->signal->count);
-               atomic_inc(&current->signal->live);
-               taskstats_tgid_alloc(current->signal);
-               return 0;
-       }
-       sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
-       tsk->signal = sig;
-       if (!sig)
-               return -ENOMEM;
-
-       ret = copy_thread_group_keys(tsk);
-       if (ret < 0) {
-               kmem_cache_free(signal_cachep, sig);
-               return ret;
-       }
-
-       atomic_set(&sig->count, 1);
-       atomic_set(&sig->live, 1);
-       init_waitqueue_head(&sig->wait_chldexit);
-       sig->flags = 0;
-       sig->group_exit_code = 0;
-       sig->group_exit_task = NULL;
-       sig->group_stop_count = 0;
-       sig->curr_target = NULL;
-       init_sigpending(&sig->shared_pending);
-       INIT_LIST_HEAD(&sig->posix_timers);
-
-       hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_REL);
-       sig->it_real_incr.tv64 = 0;
-       sig->real_timer.function = it_real_fn;
-       sig->tsk = tsk;
-
-       sig->it_virt_expires = cputime_zero;
-       sig->it_virt_incr = cputime_zero;
-       sig->it_prof_expires = cputime_zero;
-       sig->it_prof_incr = cputime_zero;
-
-       sig->leader = 0;        /* session leadership doesn't inherit */
-       sig->tty_old_pgrp = 0;
-
-       sig->utime = sig->stime = sig->cutime = sig->cstime = cputime_zero;
-       sig->nvcsw = sig->nivcsw = sig->cnvcsw = sig->cnivcsw = 0;
-       sig->min_flt = sig->maj_flt = sig->cmin_flt = sig->cmaj_flt = 0;
-       sig->sched_time = 0;
-       INIT_LIST_HEAD(&sig->cpu_timers[0]);
-       INIT_LIST_HEAD(&sig->cpu_timers[1]);
-       INIT_LIST_HEAD(&sig->cpu_timers[2]);
-       taskstats_tgid_init(sig);
-
-       task_lock(current->group_leader);
-       memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim);
-       task_unlock(current->group_leader);
-
-       if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) {
-               /*
-                * New sole thread in the process gets an expiry time
-                * of the whole CPU time limit.
-                */
-               tsk->it_prof_expires =
-                       secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur);
-       }
-       acct_init_pacct(&sig->pacct);
-
-       return 0;
-}
-
-void __cleanup_signal(struct signal_struct *sig)
-{
-       exit_thread_group_keys(sig);
-       taskstats_tgid_free(sig);
-       kmem_cache_free(signal_cachep, sig);
-}
-
-static inline void cleanup_signal(struct task_struct *tsk)
-{
-       struct signal_struct *sig = tsk->signal;
-
-       atomic_dec(&sig->live);
-
-       if (atomic_dec_and_test(&sig->count))
-               __cleanup_signal(sig);
-}
-
-static inline void copy_flags(unsigned long clone_flags, struct task_struct *p)
-{
-       unsigned long new_flags = p->flags;
-
-       new_flags &= ~(PF_SUPERPRIV | PF_NOFREEZE);
-       new_flags |= PF_FORKNOEXEC;
-       if (!(clone_flags & CLONE_PTRACE))
-               p->ptrace = 0;
-       p->flags = new_flags;
-}
-
-asmlinkage long sys_set_tid_address(int __user *tidptr)
-{
-       current->clear_child_tid = tidptr;
-
-       return current->pid;
-}
-
-static inline void rt_mutex_init_task(struct task_struct *p)
-{
-#ifdef CONFIG_RT_MUTEXES
-       spin_lock_init(&p->pi_lock);
-       plist_head_init(&p->pi_waiters, &p->pi_lock);
-       p->pi_blocked_on = NULL;
-#endif
-}
-
-/*
- * This creates a new process as a copy of the old one,
- * but does not actually start it yet.
- *
- * It copies the registers, and all the appropriate
- * parts of the process environment (as per the clone
- * flags). The actual kick-off is left to the caller.
- */
-static struct task_struct *copy_process(unsigned long clone_flags,
-                                       unsigned long stack_start,
-                                       struct pt_regs *regs,
-                                       unsigned long stack_size,
-                                       int __user *parent_tidptr,
-                                       int __user *child_tidptr,
-                                       int pid)
-{
-       int retval;
-       struct task_struct *p = NULL;
-
-       if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
-               return ERR_PTR(-EINVAL);
-
-       /*
-        * Thread groups must share signals as well, and detached threads
-        * can only be started up within the thread group.
-        */
-       if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
-               return ERR_PTR(-EINVAL);
-
-       /*
-        * Shared signal handlers imply shared VM. By way of the above,
-        * thread groups also imply shared VM. Blocking this case allows
-        * for various simplifications in other code.
-        */
-       if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
-               return ERR_PTR(-EINVAL);
-
-       retval = security_task_create(clone_flags);
-       if (retval)
-               goto fork_out;
-
-       retval = -ENOMEM;
-       p = dup_task_struct(current);
-       if (!p)
-               goto fork_out;
-
-#ifdef CONFIG_TRACE_IRQFLAGS
-       DEBUG_LOCKS_WARN_ON(!p->hardirqs_enabled);
-       DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled);
-#endif
-       retval = -EAGAIN;
-       if (atomic_read(&p->user->processes) >=
-                       p->signal->rlim[RLIMIT_NPROC].rlim_cur) {
-               if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
-                               p->user != &root_user)
-                       goto bad_fork_free;
-       }
-
-       atomic_inc(&p->user->__count);
-       atomic_inc(&p->user->processes);
-       get_group_info(p->group_info);
-
-       /*
-        * If multiple threads are within copy_process(), then this check
-        * triggers too late. This doesn't hurt, the check is only there
-        * to stop root fork bombs.
-        */
-       if (nr_threads >= max_threads)
-               goto bad_fork_cleanup_count;
-
-       if (!try_module_get(task_thread_info(p)->exec_domain->module))
-               goto bad_fork_cleanup_count;
-
-       if (p->binfmt && !try_module_get(p->binfmt->module))
-               goto bad_fork_cleanup_put_domain;
-
-       p->did_exec = 0;
-       delayacct_tsk_init(p);  /* Must remain after dup_task_struct() */
-       copy_flags(clone_flags, p);
-       p->pid = pid;
-       retval = -EFAULT;
-       if (clone_flags & CLONE_PARENT_SETTID)
-               if (put_user(p->pid, parent_tidptr))
-                       goto bad_fork_cleanup_delays_binfmt;
-
-       INIT_LIST_HEAD(&p->children);
-       INIT_LIST_HEAD(&p->sibling);
-       p->vfork_done = NULL;
-       spin_lock_init(&p->alloc_lock);
-
-       clear_tsk_thread_flag(p, TIF_SIGPENDING);
-       init_sigpending(&p->pending);
-
-       p->utime = cputime_zero;
-       p->stime = cputime_zero;
-       p->sched_time = 0;
-       p->rchar = 0;           /* I/O counter: bytes read */
-       p->wchar = 0;           /* I/O counter: bytes written */
-       p->syscr = 0;           /* I/O counter: read syscalls */
-       p->syscw = 0;           /* I/O counter: write syscalls */
-       acct_clear_integrals(p);
-
-       p->it_virt_expires = cputime_zero;
-       p->it_prof_expires = cputime_zero;
-       p->it_sched_expires = 0;
-       INIT_LIST_HEAD(&p->cpu_timers[0]);
-       INIT_LIST_HEAD(&p->cpu_timers[1]);
-       INIT_LIST_HEAD(&p->cpu_timers[2]);
-
-       p->lock_depth = -1;             /* -1 = no lock */
-       do_posix_clock_monotonic_gettime(&p->start_time);
-       p->security = NULL;
-       p->io_context = NULL;
-       p->io_wait = NULL;
-       p->audit_context = NULL;
-       cpuset_fork(p);
-#ifdef CONFIG_NUMA
-       p->mempolicy = mpol_copy(p->mempolicy);
-       if (IS_ERR(p->mempolicy)) {
-               retval = PTR_ERR(p->mempolicy);
-               p->mempolicy = NULL;
-               goto bad_fork_cleanup_cpuset;
-       }
-       mpol_fix_fork_child_flag(p);
-#endif
-#ifdef CONFIG_TRACE_IRQFLAGS
-       p->irq_events = 0;
-       p->hardirqs_enabled = 0;
-       p->hardirq_enable_ip = 0;
-       p->hardirq_enable_event = 0;
-       p->hardirq_disable_ip = _THIS_IP_;
-       p->hardirq_disable_event = 0;
-       p->softirqs_enabled = 1;
-       p->softirq_enable_ip = _THIS_IP_;
-       p->softirq_enable_event = 0;
-       p->softirq_disable_ip = 0;
-       p->softirq_disable_event = 0;
-       p->hardirq_context = 0;
-       p->softirq_context = 0;
-#endif
-#ifdef CONFIG_LOCKDEP
-       p->lockdep_depth = 0; /* no locks held yet */
-       p->curr_chain_key = 0;
-       p->lockdep_recursion = 0;
-#endif
-
-       rt_mutex_init_task(p);
-
-#ifdef CONFIG_DEBUG_MUTEXES
-       p->blocked_on = NULL; /* not blocked yet */
-#endif
-
-       p->tgid = p->pid;
-       if (clone_flags & CLONE_THREAD)
-               p->tgid = current->tgid;
-
-       if ((retval = security_task_alloc(p)))
-               goto bad_fork_cleanup_policy;
-       if ((retval = audit_alloc(p)))
-               goto bad_fork_cleanup_security;
-       /* copy all the process information */
-       if ((retval = copy_semundo(clone_flags, p)))
-               goto bad_fork_cleanup_audit;
-       if ((retval = copy_files(clone_flags, p)))
-               goto bad_fork_cleanup_semundo;
-       if ((retval = copy_fs(clone_flags, p)))
-               goto bad_fork_cleanup_files;
-       if ((retval = copy_sighand(clone_flags, p)))
-               goto bad_fork_cleanup_fs;
-       if ((retval = copy_signal(clone_flags, p)))
-               goto bad_fork_cleanup_sighand;
-       if ((retval = copy_mm(clone_flags, p)))
-               goto bad_fork_cleanup_signal;
-       if ((retval = copy_keys(clone_flags, p)))
-               goto bad_fork_cleanup_mm;
-       if ((retval = copy_namespace(clone_flags, p)))
-               goto bad_fork_cleanup_keys;
-       retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
-       if (retval)
-               goto bad_fork_cleanup_namespace;
-
-       p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
-       /*
-        * Clear TID on mm_release()?
-        */
-       p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL;
-       p->robust_list = NULL;
-#ifdef CONFIG_COMPAT
-       p->compat_robust_list = NULL;
-#endif
-       INIT_LIST_HEAD(&p->pi_state_list);
-       p->pi_state_cache = NULL;
-
-       /*
-        * sigaltstack should be cleared when sharing the same VM
-        */
-       if ((clone_flags & (CLONE_VM|CLONE_VFORK)) == CLONE_VM)
-               p->sas_ss_sp = p->sas_ss_size = 0;
-
-       /*
-        * Syscall tracing should be turned off in the child regardless
-        * of CLONE_PTRACE.
-        */
-       clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE);
-#ifdef TIF_SYSCALL_EMU
-       clear_tsk_thread_flag(p, TIF_SYSCALL_EMU);
-#endif
-
-       /* Our parent execution domain becomes current domain
-          These must match for thread signalling to apply */
-          
-       p->parent_exec_id = p->self_exec_id;
-
-       /* ok, now we should be set up.. */
-       p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
-       p->pdeath_signal = 0;
-       p->exit_state = 0;
-
-       /*
-        * Ok, make it visible to the rest of the system.
-        * We dont wake it up yet.
-        */
-       p->group_leader = p;
-       INIT_LIST_HEAD(&p->thread_group);
-       INIT_LIST_HEAD(&p->ptrace_children);
-       INIT_LIST_HEAD(&p->ptrace_list);
-
-       /* Perform scheduler related setup. Assign this task to a CPU. */
-       sched_fork(p, clone_flags);
-
-       /* Need tasklist lock for parent etc handling! */
-       write_lock_irq(&tasklist_lock);
-
-       /*
-        * The task hasn't been attached yet, so its cpus_allowed mask will
-        * not be changed, nor will its assigned CPU.
-        *
-        * The cpus_allowed mask of the parent may have changed after it was
-        * copied first time - so re-copy it here, then check the child's CPU
-        * to ensure it is on a valid CPU (and if not, just force it back to
-        * parent's CPU). This avoids alot of nasty races.
-        */
-       p->cpus_allowed = current->cpus_allowed;
-       if (unlikely(!cpu_isset(task_cpu(p), p->cpus_allowed) ||
-                       !cpu_online(task_cpu(p))))
-               set_task_cpu(p, smp_processor_id());
-
-       /* CLONE_PARENT re-uses the old parent */
-       if (clone_flags & (CLONE_PARENT|CLONE_THREAD))
-               p->real_parent = current->real_parent;
-       else
-               p->real_parent = current;
-       p->parent = p->real_parent;
-
-       spin_lock(&current->sighand->siglock);
-
-       /*
-        * Process group and session signals need to be delivered to just the
-        * parent before the fork or both the parent and the child after the
-        * fork. Restart if a signal comes in before we add the new process to
-        * it's process group.
-        * A fatal signal pending means that current will exit, so the new
-        * thread can't slip out of an OOM kill (or normal SIGKILL).
-        */
-       recalc_sigpending();
-       if (signal_pending(current)) {
-               spin_unlock(&current->sighand->siglock);
-               write_unlock_irq(&tasklist_lock);
-               retval = -ERESTARTNOINTR;
-               goto bad_fork_cleanup_namespace;
-       }
-
-       if (clone_flags & CLONE_THREAD) {
-               p->group_leader = current->group_leader;
-               list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
-
-               if (!cputime_eq(current->signal->it_virt_expires,
-                               cputime_zero) ||
-                   !cputime_eq(current->signal->it_prof_expires,
-                               cputime_zero) ||
-                   current->signal->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY ||
-                   !list_empty(&current->signal->cpu_timers[0]) ||
-                   !list_empty(&current->signal->cpu_timers[1]) ||
-                   !list_empty(&current->signal->cpu_timers[2])) {
-                       /*
-                        * Have child wake up on its first tick to check
-                        * for process CPU timers.
-                        */
-                       p->it_prof_expires = jiffies_to_cputime(1);
-               }
-       }
-
-       /*
-        * inherit ioprio
-        */
-       p->ioprio = current->ioprio;
-
-       if (likely(p->pid)) {
-               add_parent(p);
-               if (unlikely(p->ptrace & PT_PTRACED))
-                       __ptrace_link(p, current->parent);
-
-               if (thread_group_leader(p)) {
-                       p->signal->tty = current->signal->tty;
-                       p->signal->pgrp = process_group(current);
-                       p->signal->session = current->signal->session;
-                       attach_pid(p, PIDTYPE_PGID, process_group(p));
-                       attach_pid(p, PIDTYPE_SID, p->signal->session);
-
-                       list_add_tail_rcu(&p->tasks, &init_task.tasks);
-                       __get_cpu_var(process_counts)++;
-               }
-               attach_pid(p, PIDTYPE_PID, p->pid);
-               nr_threads++;
-       }
-
-       total_forks++;
-       spin_unlock(&current->sighand->siglock);
-       write_unlock_irq(&tasklist_lock);
-       proc_fork_connector(p);
-       return p;
-
-bad_fork_cleanup_namespace:
-       exit_namespace(p);
-bad_fork_cleanup_keys:
-       exit_keys(p);
-bad_fork_cleanup_mm:
-       if (p->mm)
-               mmput(p->mm);
-bad_fork_cleanup_signal:
-       cleanup_signal(p);
-bad_fork_cleanup_sighand:
-       __cleanup_sighand(p->sighand);
-bad_fork_cleanup_fs:
-       exit_fs(p); /* blocking */
-bad_fork_cleanup_files:
-       exit_files(p); /* blocking */
-bad_fork_cleanup_semundo:
-       exit_sem(p);
-bad_fork_cleanup_audit:
-       audit_free(p);
-bad_fork_cleanup_security:
-       security_task_free(p);
-bad_fork_cleanup_policy:
-#ifdef CONFIG_NUMA
-       mpol_free(p->mempolicy);
-bad_fork_cleanup_cpuset:
-#endif
-       cpuset_exit(p);
-bad_fork_cleanup_delays_binfmt:
-       delayacct_tsk_free(p);
-       if (p->binfmt)
-               module_put(p->binfmt->module);
-bad_fork_cleanup_put_domain:
-       module_put(task_thread_info(p)->exec_domain->module);
-bad_fork_cleanup_count:
-       put_group_info(p->group_info);
-       atomic_dec(&p->user->processes);
-       free_uid(p->user);
-bad_fork_free:
-       free_task(p);
-fork_out:
-       return ERR_PTR(retval);
-}
-
-struct pt_regs * __devinit __attribute__((weak)) idle_regs(struct pt_regs *regs)
-{
-       memset(regs, 0, sizeof(struct pt_regs));
-       return regs;
-}
-
-struct task_struct * __devinit fork_idle(int cpu)
-{
-       struct task_struct *task;
-       struct pt_regs regs;
-
-       task = copy_process(CLONE_VM, 0, idle_regs(&regs), 0, NULL, NULL, 0);
-       if (!task)
-               return ERR_PTR(-ENOMEM);
-       init_idle(task, cpu);
-
-       return task;
-}
-
-static inline int fork_traceflag (unsigned clone_flags)
-{
-       if (clone_flags & CLONE_UNTRACED)
-               return 0;
-       else if (clone_flags & CLONE_VFORK) {
-               if (current->ptrace & PT_TRACE_VFORK)
-                       return PTRACE_EVENT_VFORK;
-       } else if ((clone_flags & CSIGNAL) != SIGCHLD) {
-               if (current->ptrace & PT_TRACE_CLONE)
-                       return PTRACE_EVENT_CLONE;
-       } else if (current->ptrace & PT_TRACE_FORK)
-               return PTRACE_EVENT_FORK;
-
-       return 0;
-}
-
-/*
- *  Ok, this is the main fork-routine.
- *
- * It copies the process, and if successful kick-starts
- * it and waits for it to finish using the VM if required.
- */
-long do_fork(unsigned long clone_flags,
-             unsigned long stack_start,
-             struct pt_regs *regs,
-             unsigned long stack_size,
-             int __user *parent_tidptr,
-             int __user *child_tidptr)
-{
-       struct task_struct *p;
-       int trace = 0;
-       struct pid *pid = alloc_pid();
-       long nr;
-
-       if (!pid)
-               return -EAGAIN;
-       nr = pid->nr;
-       if (unlikely(current->ptrace)) {
-               trace = fork_traceflag (clone_flags);
-               if (trace)
-                       clone_flags |= CLONE_PTRACE;
-       }
-
-       p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, nr);
-       /*
-        * Do this prior waking up the new thread - the thread pointer
-        * might get invalid after that point, if the thread exits quickly.
-        */
-       if (!IS_ERR(p)) {
-               struct completion vfork;
-
-               if (clone_flags & CLONE_VFORK) {
-                       p->vfork_done = &vfork;
-                       init_completion(&vfork);
-               }
-
-               if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) {
-                       /*
-                        * We'll start up with an immediate SIGSTOP.
-                        */
-                       sigaddset(&p->pending.signal, SIGSTOP);
-                       set_tsk_thread_flag(p, TIF_SIGPENDING);
-               }
-
-               if (!(clone_flags & CLONE_STOPPED))
-                       wake_up_new_task(p, clone_flags);
-               else
-                       p->state = TASK_STOPPED;
-
-               if (unlikely (trace)) {
-                       current->ptrace_message = nr;
-                       ptrace_notify ((trace << 8) | SIGTRAP);
-               }
-
-               if (clone_flags & CLONE_VFORK) {
-                       wait_for_completion(&vfork);
-                       if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE)) {
-                               current->ptrace_message = nr;
-                               ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP);
-                       }
-               }
-       } else {
-               free_pid(pid);
-               nr = PTR_ERR(p);
-       }
-       return nr;
-}
-
-#ifndef ARCH_MIN_MMSTRUCT_ALIGN
-#define ARCH_MIN_MMSTRUCT_ALIGN 0
-#endif
-
-static void sighand_ctor(void *data, kmem_cache_t *cachep, unsigned long flags)
-{
-       struct sighand_struct *sighand = data;
-
-       if ((flags & (SLAB_CTOR_VERIFY | SLAB_CTOR_CONSTRUCTOR)) ==
-                                       SLAB_CTOR_CONSTRUCTOR)
-               spin_lock_init(&sighand->siglock);
-}
-
-void __init proc_caches_init(void)
-{
-       sighand_cachep = kmem_cache_create("sighand_cache",
-                       sizeof(struct sighand_struct), 0,
-                       SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_DESTROY_BY_RCU,
-                       sighand_ctor, NULL);
-       signal_cachep = kmem_cache_create("signal_cache",
-                       sizeof(struct signal_struct), 0,
-                       SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
-       files_cachep = kmem_cache_create("files_cache", 
-                       sizeof(struct files_struct), 0,
-                       SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
-       fs_cachep = kmem_cache_create("fs_cache", 
-                       sizeof(struct fs_struct), 0,
-                       SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
-       vm_area_cachep = kmem_cache_create("vm_area_struct",
-                       sizeof(struct vm_area_struct), 0,
-                       SLAB_PANIC, NULL, NULL);
-       mm_cachep = kmem_cache_create("mm_struct",
-                       sizeof(struct mm_struct), ARCH_MIN_MMSTRUCT_ALIGN,
-                       SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
-}
-
-
-/*
- * Check constraints on flags passed to the unshare system call and
- * force unsharing of additional process context as appropriate.
- */
-static inline void check_unshare_flags(unsigned long *flags_ptr)
-{
-       /*
-        * If unsharing a thread from a thread group, must also
-        * unshare vm.
-        */
-       if (*flags_ptr & CLONE_THREAD)
-               *flags_ptr |= CLONE_VM;
-
-       /*
-        * If unsharing vm, must also unshare signal handlers.
-        */
-       if (*flags_ptr & CLONE_VM)
-               *flags_ptr |= CLONE_SIGHAND;
-
-       /*
-        * If unsharing signal handlers and the task was created
-        * using CLONE_THREAD, then must unshare the thread
-        */
-       if ((*flags_ptr & CLONE_SIGHAND) &&
-           (atomic_read(&current->signal->count) > 1))
-               *flags_ptr |= CLONE_THREAD;
-
-       /*
-        * If unsharing namespace, must also unshare filesystem information.
-        */
-       if (*flags_ptr & CLONE_NEWNS)
-               *flags_ptr |= CLONE_FS;
-}
-
-/*
- * Unsharing of tasks created with CLONE_THREAD is not supported yet
- */
-static int unshare_thread(unsigned long unshare_flags)
-{
-       if (unshare_flags & CLONE_THREAD)
-               return -EINVAL;
-
-       return 0;
-}
-
-/*
- * Unshare the filesystem structure if it is being shared
- */
-static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp)
-{
-       struct fs_struct *fs = current->fs;
-
-       if ((unshare_flags & CLONE_FS) &&
-           (fs && atomic_read(&fs->count) > 1)) {
-               *new_fsp = __copy_fs_struct(current->fs);
-               if (!*new_fsp)
-                       return -ENOMEM;
-       }
-
-       return 0;
-}
-
-/*
- * Unshare the namespace structure if it is being shared
- */
-static int unshare_namespace(unsigned long unshare_flags, struct namespace **new_nsp, struct fs_struct *new_fs)
-{
-       struct namespace *ns = current->namespace;
-
-       if ((unshare_flags & CLONE_NEWNS) &&
-           (ns && atomic_read(&ns->count) > 1)) {
-               if (!capable(CAP_SYS_ADMIN))
-                       return -EPERM;
-
-               *new_nsp = dup_namespace(current, new_fs ? new_fs : current->fs);
-               if (!*new_nsp)
-                       return -ENOMEM;
-       }
-
-       return 0;
-}
-
-/*
- * Unsharing of sighand for tasks created with CLONE_SIGHAND is not
- * supported yet
- */
-static int unshare_sighand(unsigned long unshare_flags, struct sighand_struct **new_sighp)
-{
-       struct sighand_struct *sigh = current->sighand;
-
-       if ((unshare_flags & CLONE_SIGHAND) &&
-           (sigh && atomic_read(&sigh->count) > 1))
-               return -EINVAL;
-       else
-               return 0;
-}
-
-/*
- * Unshare vm if it is being shared
- */
-static int unshare_vm(unsigned long unshare_flags, struct mm_struct **new_mmp)
-{
-       struct mm_struct *mm = current->mm;
-
-       if ((unshare_flags & CLONE_VM) &&
-           (mm && atomic_read(&mm->mm_users) > 1)) {
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-/*
- * Unshare file descriptor table if it is being shared
- */
-static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp)
-{
-       struct files_struct *fd = current->files;
-       int error = 0;
-
-       if ((unshare_flags & CLONE_FILES) &&
-           (fd && atomic_read(&fd->count) > 1)) {
-               *new_fdp = dup_fd(fd, &error);
-               if (!*new_fdp)
-                       return error;
-       }
-
-       return 0;
-}
-
-/*
- * Unsharing of semundo for tasks created with CLONE_SYSVSEM is not
- * supported yet
- */
-static int unshare_semundo(unsigned long unshare_flags, struct sem_undo_list **new_ulistp)
-{
-       if (unshare_flags & CLONE_SYSVSEM)
-               return -EINVAL;
-
-       return 0;
-}
-
-/*
- * unshare allows a process to 'unshare' part of the process
- * context which was originally shared using clone.  copy_*
- * functions used by do_fork() cannot be used here directly
- * because they modify an inactive task_struct that is being
- * constructed. Here we are modifying the current, active,
- * task_struct.
- */
-asmlinkage long sys_unshare(unsigned long unshare_flags)
-{
-       int err = 0;
-       struct fs_struct *fs, *new_fs = NULL;
-       struct namespace *ns, *new_ns = NULL;
-       struct sighand_struct *sigh, *new_sigh = NULL;
-       struct mm_struct *mm, *new_mm = NULL, *active_mm = NULL;
-       struct files_struct *fd, *new_fd = NULL;
-       struct sem_undo_list *new_ulist = NULL;
-
-       check_unshare_flags(&unshare_flags);
-
-       /* Return -EINVAL for all unsupported flags */
-       err = -EINVAL;
-       if (unshare_flags & ~(CLONE_THREAD|CLONE_FS|CLONE_NEWNS|CLONE_SIGHAND|
-                               CLONE_VM|CLONE_FILES|CLONE_SYSVSEM))
-               goto bad_unshare_out;
-
-       if ((err = unshare_thread(unshare_flags)))
-               goto bad_unshare_out;
-       if ((err = unshare_fs(unshare_flags, &new_fs)))
-               goto bad_unshare_cleanup_thread;
-       if ((err = unshare_namespace(unshare_flags, &new_ns, new_fs)))
-               goto bad_unshare_cleanup_fs;
-       if ((err = unshare_sighand(unshare_flags, &new_sigh)))
-               goto bad_unshare_cleanup_ns;
-       if ((err = unshare_vm(unshare_flags, &new_mm)))
-               goto bad_unshare_cleanup_sigh;
-       if ((err = unshare_fd(unshare_flags, &new_fd)))
-               goto bad_unshare_cleanup_vm;
-       if ((err = unshare_semundo(unshare_flags, &new_ulist)))
-               goto bad_unshare_cleanup_fd;
-
-       if (new_fs || new_ns || new_sigh || new_mm || new_fd || new_ulist) {
-
-               task_lock(current);
-
-               if (new_fs) {
-                       fs = current->fs;
-                       current->fs = new_fs;
-                       new_fs = fs;
-               }
-
-               if (new_ns) {
-                       ns = current->namespace;
-                       current->namespace = new_ns;
-                       new_ns = ns;
-               }
-
-               if (new_sigh) {
-                       sigh = current->sighand;
-                       rcu_assign_pointer(current->sighand, new_sigh);
-                       new_sigh = sigh;
-               }
-
-               if (new_mm) {
-                       mm = current->mm;
-                       active_mm = current->active_mm;
-                       current->mm = new_mm;
-                       current->active_mm = new_mm;
-                       activate_mm(active_mm, new_mm);
-                       new_mm = mm;
-               }
-
-               if (new_fd) {
-                       fd = current->files;
-                       current->files = new_fd;
-                       new_fd = fd;
-               }
-
-               task_unlock(current);
-       }
-
-bad_unshare_cleanup_fd:
-       if (new_fd)
-               put_files_struct(new_fd);
-
-bad_unshare_cleanup_vm:
-       if (new_mm)
-               mmput(new_mm);
-
-bad_unshare_cleanup_sigh:
-       if (new_sigh)
-               if (atomic_dec_and_test(&new_sigh->count))
-                       kmem_cache_free(sighand_cachep, new_sigh);
-
-bad_unshare_cleanup_ns:
-       if (new_ns)
-               put_namespace(new_ns);
-
-bad_unshare_cleanup_fs:
-       if (new_fs)
-               put_fs_struct(new_fs);
-
-bad_unshare_cleanup_thread:
-bad_unshare_out:
-       return err;
-}
diff --git a/linux-2.6-xen-sparse/kernel/irq/spurious.c b/linux-2.6-xen-sparse/kernel/irq/spurious.c
deleted file mode 100644 (file)
index 9ff0259..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * linux/kernel/irq/spurious.c
- *
- * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar
- *
- * This file contains spurious interrupt handling.
- */
-
-#include <linux/irq.h>
-#include <linux/module.h>
-#include <linux/kallsyms.h>
-#include <linux/interrupt.h>
-
-static int irqfixup __read_mostly;
-
-/*
- * Recovery handler for misrouted interrupts.
- */
-static int misrouted_irq(int irq, struct pt_regs *regs)
-{
-       int i;
-       int ok = 0;
-       int work = 0;   /* Did we do work for a real IRQ */
-
-       for (i = 1; i < NR_IRQS; i++) {
-               struct irq_desc *desc = irq_desc + i;
-               struct irqaction *action;
-
-               if (i == irq)   /* Already tried */
-                       continue;
-
-               spin_lock(&desc->lock);
-               /* Already running on another processor */
-               if (desc->status & IRQ_INPROGRESS) {
-                       /*
-                        * Already running: If it is shared get the other
-                        * CPU to go looking for our mystery interrupt too
-                        */
-                       if (desc->action && (desc->action->flags & IRQF_SHARED))
-                               desc->status |= IRQ_PENDING;
-                       spin_unlock(&desc->lock);
-                       continue;
-               }
-               /* Honour the normal IRQ locking */
-               desc->status |= IRQ_INPROGRESS;
-               action = desc->action;
-               spin_unlock(&desc->lock);
-
-               while (action) {
-                       /* Only shared IRQ handlers are safe to call */
-                       if (action->flags & IRQF_SHARED) {
-                               if (action->handler(i, action->dev_id, regs) ==
-                                               IRQ_HANDLED)
-                                       ok = 1;
-                       }
-                       action = action->next;
-               }
-               local_irq_disable();
-               /* Now clean up the flags */
-               spin_lock(&desc->lock);
-               action = desc->action;
-
-               /*
-                * While we were looking for a fixup someone queued a real
-                * IRQ clashing with our walk:
-                */
-               while ((desc->status & IRQ_PENDING) && action) {
-                       /*
-                        * Perform real IRQ processing for the IRQ we deferred
-                        */
-                       work = 1;
-                       spin_unlock(&desc->lock);
-                       handle_IRQ_event(i, regs, action);
-                       spin_lock(&desc->lock);
-                       desc->status &= ~IRQ_PENDING;
-               }
-               desc->status &= ~IRQ_INPROGRESS;
-               /*
-                * If we did actual work for the real IRQ line we must let the
-                * IRQ controller clean up too
-                */
-               if (work && desc->chip && desc->chip->end)
-                       desc->chip->end(i);
-               spin_unlock(&desc->lock);
-       }
-       /* So the caller can adjust the irq error counts */
-       return ok;
-}
-
-/*
- * If 99,900 of the previous 100,000 interrupts have not been handled
- * then assume that the IRQ is stuck in some manner. Drop a diagnostic
- * and try to turn the IRQ off.
- *
- * (The other 100-of-100,000 interrupts may have been a correctly
- *  functioning device sharing an IRQ with the failing one)
- *
- * Called under desc->lock
- */
-
-static void
-__report_bad_irq(unsigned int irq, struct irq_desc *desc,
-                irqreturn_t action_ret)
-{
-       struct irqaction *action;
-
-       if (action_ret != IRQ_HANDLED && action_ret != IRQ_NONE) {
-               printk(KERN_ERR "irq event %d: bogus return value %x\n",
-                               irq, action_ret);
-       } else {
-               printk(KERN_ERR "irq %d: nobody cared (try booting with "
-                               "the \"irqpoll\" option)\n", irq);
-       }
-       dump_stack();
-       printk(KERN_ERR "handlers:\n");
-
-       action = desc->action;
-       while (action) {
-               printk(KERN_ERR "[<%p>]", action->handler);
-               print_symbol(" (%s)",
-                       (unsigned long)action->handler);
-               printk("\n");
-               action = action->next;
-       }
-}
-
-static void
-report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret)
-{
-       static int count = 100;
-
-       if (count > 0) {
-               count--;
-               __report_bad_irq(irq, desc, action_ret);
-       }
-}
-
-void note_interrupt(unsigned int irq, struct irq_desc *desc,
-                   irqreturn_t action_ret, struct pt_regs *regs)
-{
-       if (unlikely(action_ret != IRQ_HANDLED)) {
-               if (!irq_ignore_unhandled(irq))
-                       desc->irqs_unhandled++;
-               if (unlikely(action_ret != IRQ_NONE))
-                       report_bad_irq(irq, desc, action_ret);
-       }
-
-       if (unlikely(irqfixup)) {
-               /* Don't punish working computers */
-               if ((irqfixup == 2 && irq == 0) || action_ret == IRQ_NONE) {
-                       int ok = misrouted_irq(irq, regs);
-                       if (action_ret == IRQ_NONE)
-                               desc->irqs_unhandled -= ok;
-               }
-       }
-
-       desc->irq_count++;
-       if (likely(desc->irq_count < 100000))
-               return;
-
-       desc->irq_count = 0;
-       if (unlikely(desc->irqs_unhandled > 99900)) {
-               /*
-                * The interrupt is stuck
-                */
-               __report_bad_irq(irq, desc, action_ret);
-               /*
-                * Now kill the IRQ
-                */
-               printk(KERN_EMERG "Disabling IRQ #%d\n", irq);
-               desc->status |= IRQ_DISABLED;
-               desc->depth = 1;
-               desc->chip->disable(irq);
-       }
-       desc->irqs_unhandled = 0;
-}
-
-int noirqdebug __read_mostly;
-
-int __init noirqdebug_setup(char *str)
-{
-       noirqdebug = 1;
-       printk(KERN_INFO "IRQ lockup detection disabled\n");
-
-       return 1;
-}
-
-__setup("noirqdebug", noirqdebug_setup);
-
-static int __init irqfixup_setup(char *str)
-{
-       irqfixup = 1;
-       printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n");
-       printk(KERN_WARNING "This may impact system performance.\n");
-
-       return 1;
-}
-
-__setup("irqfixup", irqfixup_setup);
-
-static int __init irqpoll_setup(char *str)
-{
-       irqfixup = 2;
-       printk(KERN_WARNING "Misrouted IRQ fixup and polling support "
-                               "enabled\n");
-       printk(KERN_WARNING "This may significantly impact system "
-                               "performance\n");
-       return 1;
-}
-
-__setup("irqpoll", irqpoll_setup);
diff --git a/linux-2.6-xen-sparse/kernel/kexec.c b/linux-2.6-xen-sparse/kernel/kexec.c
deleted file mode 100644 (file)
index a6e2120..0000000
+++ /dev/null
@@ -1,1122 +0,0 @@
-/*
- * kexec.c - kexec system call
- * Copyright (C) 2002-2004 Eric Biederman  <ebiederm@xmission.com>
- *
- * This source code is licensed under the GNU General Public License,
- * Version 2.  See the file COPYING for more details.
- */
-
-#include <linux/capability.h>
-#include <linux/mm.h>
-#include <linux/file.h>
-#include <linux/slab.h>
-#include <linux/fs.h>
-#include <linux/kexec.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-#include <linux/highmem.h>
-#include <linux/syscalls.h>
-#include <linux/reboot.h>
-#include <linux/syscalls.h>
-#include <linux/ioport.h>
-#include <linux/hardirq.h>
-
-#include <asm/page.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/semaphore.h>
-
-/* Per cpu memory for storing cpu states in case of system crash. */
-note_buf_t* crash_notes;
-
-/* Location of the reserved area for the crash kernel */
-struct resource crashk_res = {
-       .name  = "Crash kernel",
-       .start = 0,
-       .end   = 0,
-       .flags = IORESOURCE_BUSY | IORESOURCE_MEM
-};
-
-int kexec_should_crash(struct task_struct *p)
-{
-       if (in_interrupt() || !p->pid || p->pid == 1 || panic_on_oops)
-               return 1;
-       return 0;
-}
-
-/*
- * When kexec transitions to the new kernel there is a one-to-one
- * mapping between physical and virtual addresses.  On processors
- * where you can disable the MMU this is trivial, and easy.  For
- * others it is still a simple predictable page table to setup.
- *
- * In that environment kexec copies the new kernel to its final
- * resting place.  This means I can only support memory whose
- * physical address can fit in an unsigned long.  In particular
- * addresses where (pfn << PAGE_SHIFT) > ULONG_MAX cannot be handled.
- * If the assembly stub has more restrictive requirements
- * KEXEC_SOURCE_MEMORY_LIMIT and KEXEC_DEST_MEMORY_LIMIT can be
- * defined more restrictively in <asm/kexec.h>.
- *
- * The code for the transition from the current kernel to the
- * the new kernel is placed in the control_code_buffer, whose size
- * is given by KEXEC_CONTROL_CODE_SIZE.  In the best case only a single
- * page of memory is necessary, but some architectures require more.
- * Because this memory must be identity mapped in the transition from
- * virtual to physical addresses it must live in the range
- * 0 - TASK_SIZE, as only the user space mappings are arbitrarily
- * modifiable.
- *
- * The assembly stub in the control code buffer is passed a linked list
- * of descriptor pages detailing the source pages of the new kernel,
- * and the destination addresses of those source pages.  As this data
- * structure is not used in the context of the current OS, it must
- * be self-contained.
- *
- * The code has been made to work with highmem pages and will use a
- * destination page in its final resting place (if it happens
- * to allocate it).  The end product of this is that most of the
- * physical address space, and most of RAM can be used.
- *
- * Future directions include:
- *  - allocating a page table with the control code buffer identity
- *    mapped, to simplify machine_kexec and make kexec_on_panic more
- *    reliable.
- */
-
-/*
- * KIMAGE_NO_DEST is an impossible destination address..., for
- * allocating pages whose destination address we do not care about.
- */
-#define KIMAGE_NO_DEST (-1UL)
-
-static int kimage_is_destination_range(struct kimage *image,
-                                      unsigned long start, unsigned long end);
-static struct page *kimage_alloc_page(struct kimage *image,
-                                      gfp_t gfp_mask,
-                                      unsigned long dest);
-
-static int do_kimage_alloc(struct kimage **rimage, unsigned long entry,
-                           unsigned long nr_segments,
-                            struct kexec_segment __user *segments)
-{
-       size_t segment_bytes;
-       struct kimage *image;
-       unsigned long i;
-       int result;
-
-       /* Allocate a controlling structure */
-       result = -ENOMEM;
-       image = kmalloc(sizeof(*image), GFP_KERNEL);
-       if (!image)
-               goto out;
-
-       memset(image, 0, sizeof(*image));
-       image->head = 0;
-       image->entry = &image->head;
-       image->last_entry = &image->head;
-       image->control_page = ~0; /* By default this does not apply */
-       image->start = entry;
-       image->type = KEXEC_TYPE_DEFAULT;
-
-       /* Initialize the list of control pages */
-       INIT_LIST_HEAD(&image->control_pages);
-
-       /* Initialize the list of destination pages */
-       INIT_LIST_HEAD(&image->dest_pages);
-
-       /* Initialize the list of unuseable pages */
-       INIT_LIST_HEAD(&image->unuseable_pages);
-
-       /* Read in the segments */
-       image->nr_segments = nr_segments;
-       segment_bytes = nr_segments * sizeof(*segments);
-       result = copy_from_user(image->segment, segments, segment_bytes);
-       if (result)
-               goto out;
-
-       /*
-        * Verify we have good destination addresses.  The caller is
-        * responsible for making certain we don't attempt to load
-        * the new image into invalid or reserved areas of RAM.  This
-        * just verifies it is an address we can use.
-        *
-        * Since the kernel does everything in page size chunks ensure
-        * the destination addreses are page aligned.  Too many
-        * special cases crop of when we don't do this.  The most
-        * insidious is getting overlapping destination addresses
-        * simply because addresses are changed to page size
-        * granularity.
-        */
-       result = -EADDRNOTAVAIL;
-       for (i = 0; i < nr_segments; i++) {
-               unsigned long mstart, mend;
-
-               mstart = image->segment[i].mem;
-               mend   = mstart + image->segment[i].memsz;
-               if ((mstart & ~PAGE_MASK) || (mend & ~PAGE_MASK))
-                       goto out;
-               if (mend >= KEXEC_DESTINATION_MEMORY_LIMIT)
-                       goto out;
-       }
-
-       /* Verify our destination addresses do not overlap.
-        * If we alloed overlapping destination addresses
-        * through very weird things can happen with no
-        * easy explanation as one segment stops on another.
-        */
-       result = -EINVAL;
-       for (i = 0; i < nr_segments; i++) {
-               unsigned long mstart, mend;
-               unsigned long j;
-
-               mstart = image->segment[i].mem;
-               mend   = mstart + image->segment[i].memsz;
-               for (j = 0; j < i; j++) {
-                       unsigned long pstart, pend;
-                       pstart = image->segment[j].mem;
-                       pend   = pstart + image->segment[j].memsz;
-                       /* Do the segments overlap ? */
-                       if ((mend > pstart) && (mstart < pend))
-                               goto out;
-               }
-       }
-
-       /* Ensure our buffer sizes are strictly less than
-        * our memory sizes.  This should always be the case,
-        * and it is easier to check up front than to be surprised
-        * later on.
-        */
-       result = -EINVAL;
-       for (i = 0; i < nr_segments; i++) {
-               if (image->segment[i].bufsz > image->segment[i].memsz)
-                       goto out;
-       }
-
-       result = 0;
-out:
-       if (result == 0)
-               *rimage = image;
-       else
-               kfree(image);
-
-       return result;
-
-}
-
-static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry,
-                               unsigned long nr_segments,
-                               struct kexec_segment __user *segments)
-{
-       int result;
-       struct kimage *image;
-
-       /* Allocate and initialize a controlling structure */
-       image = NULL;
-       result = do_kimage_alloc(&image, entry, nr_segments, segments);
-       if (result)
-               goto out;
-
-       *rimage = image;
-
-       /*
-        * Find a location for the control code buffer, and add it
-        * the vector of segments so that it's pages will also be
-        * counted as destination pages.
-        */
-       result = -ENOMEM;
-       image->control_code_page = kimage_alloc_control_pages(image,
-                                          get_order(KEXEC_CONTROL_CODE_SIZE));
-       if (!image->control_code_page) {
-               printk(KERN_ERR "Could not allocate control_code_buffer\n");
-               goto out;
-       }
-
-       result = 0;
- out:
-       if (result == 0)
-               *rimage = image;
-       else
-               kfree(image);
-
-       return result;
-}
-
-static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry,
-                               unsigned long nr_segments,
-                               struct kexec_segment __user *segments)
-{
-       int result;
-       struct kimage *image;
-       unsigned long i;
-
-       image = NULL;
-       /* Verify we have a valid entry point */
-       if ((entry < crashk_res.start) || (entry > crashk_res.end)) {
-               result = -EADDRNOTAVAIL;
-               goto out;
-       }
-
-       /* Allocate and initialize a controlling structure */
-       result = do_kimage_alloc(&image, entry, nr_segments, segments);
-       if (result)
-               goto out;
-
-       /* Enable the special crash kernel control page
-        * allocation policy.
-        */
-       image->control_page = crashk_res.start;
-       image->type = KEXEC_TYPE_CRASH;
-
-       /*
-        * Verify we have good destination addresses.  Normally
-        * the caller is responsible for making certain we don't
-        * attempt to load the new image into invalid or reserved
-        * areas of RAM.  But crash kernels are preloaded into a
-        * reserved area of ram.  We must ensure the addresses
-        * are in the reserved area otherwise preloading the
-        * kernel could corrupt things.
-        */
-       result = -EADDRNOTAVAIL;
-       for (i = 0; i < nr_segments; i++) {
-               unsigned long mstart, mend;
-
-               mstart = image->segment[i].mem;
-               mend = mstart + image->segment[i].memsz - 1;
-               /* Ensure we are within the crash kernel limits */
-               if ((mstart < crashk_res.start) || (mend > crashk_res.end))
-                       goto out;
-       }
-
-       /*
-        * Find a location for the control code buffer, and add
-        * the vector of segments so that it's pages will also be
-        * counted as destination pages.
-        */
-       result = -ENOMEM;
-       image->control_code_page = kimage_alloc_control_pages(image,
-                                          get_order(KEXEC_CONTROL_CODE_SIZE));
-       if (!image->control_code_page) {
-               printk(KERN_ERR "Could not allocate control_code_buffer\n");
-               goto out;
-       }
-
-       result = 0;
-out:
-       if (result == 0)
-               *rimage = image;
-       else
-               kfree(image);
-
-       return result;
-}
-
-static int kimage_is_destination_range(struct kimage *image,
-                                       unsigned long start,
-                                       unsigned long end)
-{
-       unsigned long i;
-
-       for (i = 0; i < image->nr_segments; i++) {
-               unsigned long mstart, mend;
-
-               mstart = image->segment[i].mem;
-               mend = mstart + image->segment[i].memsz;
-               if ((end > mstart) && (start < mend))
-                       return 1;
-       }
-
-       return 0;
-}
-
-static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order, unsigned long limit)
-{
-       struct page *pages;
-
-       pages = alloc_pages(gfp_mask, order);
-       if (pages) {
-               unsigned int count, i;
-#ifdef CONFIG_XEN
-               int address_bits;
-
-               if (limit == ~0UL)
-                       address_bits = BITS_PER_LONG;
-               else
-                       address_bits = long_log2(limit);
-
-               if (xen_create_contiguous_region((unsigned long)page_address(pages),
-                                                order, address_bits) < 0) {
-                       __free_pages(pages, order);
-                       return NULL;
-               }
-#endif
-               pages->mapping = NULL;
-               set_page_private(pages, order);
-               count = 1 << order;
-               for (i = 0; i < count; i++)
-                       SetPageReserved(pages + i);
-       }
-
-       return pages;
-}
-
-static void kimage_free_pages(struct page *page)
-{
-       unsigned int order, count, i;
-
-       order = page_private(page);
-       count = 1 << order;
-       for (i = 0; i < count; i++)
-               ClearPageReserved(page + i);
-#ifdef CONFIG_XEN
-       xen_destroy_contiguous_region((unsigned long)page_address(page), order);
-#endif
-       __free_pages(page, order);
-}
-
-static void kimage_free_page_list(struct list_head *list)
-{
-       struct list_head *pos, *next;
-
-       list_for_each_safe(pos, next, list) {
-               struct page *page;
-
-               page = list_entry(pos, struct page, lru);
-               list_del(&page->lru);
-               kimage_free_pages(page);
-       }
-}
-
-static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
-                                                       unsigned int order)
-{
-       /* Control pages are special, they are the intermediaries
-        * that are needed while we copy the rest of the pages
-        * to their final resting place.  As such they must
-        * not conflict with either the destination addresses
-        * or memory the kernel is already using.
-        *
-        * The only case where we really need more than one of
-        * these are for architectures where we cannot disable
-        * the MMU and must instead generate an identity mapped
-        * page table for all of the memory.
-        *
-        * At worst this runs in O(N) of the image size.
-        */
-       struct list_head extra_pages;
-       struct page *pages;
-       unsigned int count;
-
-       count = 1 << order;
-       INIT_LIST_HEAD(&extra_pages);
-
-       /* Loop while I can allocate a page and the page allocated
-        * is a destination page.
-        */
-       do {
-               unsigned long pfn, epfn, addr, eaddr;
-
-               pages = kimage_alloc_pages(GFP_KERNEL, order, KEXEC_CONTROL_MEMORY_LIMIT);
-               if (!pages)
-                       break;
-               pfn   = kexec_page_to_pfn(pages);
-               epfn  = pfn + count;
-               addr  = pfn << PAGE_SHIFT;
-               eaddr = epfn << PAGE_SHIFT;
-               if ((epfn >= (KEXEC_CONTROL_MEMORY_LIMIT >> PAGE_SHIFT)) ||
-                             kimage_is_destination_range(image, addr, eaddr)) {
-                       list_add(&pages->lru, &extra_pages);
-                       pages = NULL;
-               }
-       } while (!pages);
-
-       if (pages) {
-               /* Remember the allocated page... */
-               list_add(&pages->lru, &image->control_pages);
-
-               /* Because the page is already in it's destination
-                * location we will never allocate another page at
-                * that address.  Therefore kimage_alloc_pages
-                * will not return it (again) and we don't need
-                * to give it an entry in image->segment[].
-                */
-       }
-       /* Deal with the destination pages I have inadvertently allocated.
-        *
-        * Ideally I would convert multi-page allocations into single
-        * page allocations, and add everyting to image->dest_pages.
-        *
-        * For now it is simpler to just free the pages.
-        */
-       kimage_free_page_list(&extra_pages);
-
-       return pages;
-}
-
-#ifndef CONFIG_XEN
-static struct page *kimage_alloc_crash_control_pages(struct kimage *image,
-                                                     unsigned int order)
-{
-       /* Control pages are special, they are the intermediaries
-        * that are needed while we copy the rest of the pages
-        * to their final resting place.  As such they must
-        * not conflict with either the destination addresses
-        * or memory the kernel is already using.
-        *
-        * Control pages are also the only pags we must allocate
-        * when loading a crash kernel.  All of the other pages
-        * are specified by the segments and we just memcpy
-        * into them directly.
-        *
-        * The only case where we really need more than one of
-        * these are for architectures where we cannot disable
-        * the MMU and must instead generate an identity mapped
-        * page table for all of the memory.
-        *
-        * Given the low demand this implements a very simple
-        * allocator that finds the first hole of the appropriate
-        * size in the reserved memory region, and allocates all
-        * of the memory up to and including the hole.
-        */
-       unsigned long hole_start, hole_end, size;
-       struct page *pages;
-
-       pages = NULL;
-       size = (1 << order) << PAGE_SHIFT;
-       hole_start = (image->control_page + (size - 1)) & ~(size - 1);
-       hole_end   = hole_start + size - 1;
-       while (hole_end <= crashk_res.end) {
-               unsigned long i;
-
-               if (hole_end > KEXEC_CONTROL_MEMORY_LIMIT)
-                       break;
-               if (hole_end > crashk_res.end)
-                       break;
-               /* See if I overlap any of the segments */
-               for (i = 0; i < image->nr_segments; i++) {
-                       unsigned long mstart, mend;
-
-                       mstart = image->segment[i].mem;
-                       mend   = mstart + image->segment[i].memsz - 1;
-                       if ((hole_end >= mstart) && (hole_start <= mend)) {
-                               /* Advance the hole to the end of the segment */
-                               hole_start = (mend + (size - 1)) & ~(size - 1);
-                               hole_end   = hole_start + size - 1;
-                               break;
-                       }
-               }
-               /* If I don't overlap any segments I have found my hole! */
-               if (i == image->nr_segments) {
-                       pages = kexec_pfn_to_page(hole_start >> PAGE_SHIFT);
-                       break;
-               }
-       }
-       if (pages)
-               image->control_page = hole_end;
-
-       return pages;
-}
-
-
-struct page *kimage_alloc_control_pages(struct kimage *image,
-                                        unsigned int order)
-{
-       struct page *pages = NULL;
-
-       switch (image->type) {
-       case KEXEC_TYPE_DEFAULT:
-               pages = kimage_alloc_normal_control_pages(image, order);
-               break;
-       case KEXEC_TYPE_CRASH:
-               pages = kimage_alloc_crash_control_pages(image, order);
-               break;
-       }
-
-       return pages;
-}
-#else /* !CONFIG_XEN */
-struct page *kimage_alloc_control_pages(struct kimage *image,
-                                        unsigned int order)
-{
-       return kimage_alloc_normal_control_pages(image, order);
-}
-#endif
-
-static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
-{
-       if (*image->entry != 0)
-               image->entry++;
-
-       if (image->entry == image->last_entry) {
-               kimage_entry_t *ind_page;
-               struct page *page;
-
-               page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST);
-               if (!page)
-                       return -ENOMEM;
-
-               ind_page = page_address(page);
-               *image->entry = kexec_virt_to_phys(ind_page) | IND_INDIRECTION;
-               image->entry = ind_page;
-               image->last_entry = ind_page +
-                                     ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
-       }
-       *image->entry = entry;
-       image->entry++;
-       *image->entry = 0;
-
-       return 0;
-}
-
-static int kimage_set_destination(struct kimage *image,
-                                  unsigned long destination)
-{
-       int result;
-
-       destination &= PAGE_MASK;
-       result = kimage_add_entry(image, destination | IND_DESTINATION);
-       if (result == 0)
-               image->destination = destination;
-
-       return result;
-}
-
-
-static int kimage_add_page(struct kimage *image, unsigned long page)
-{
-       int result;
-
-       page &= PAGE_MASK;
-       result = kimage_add_entry(image, page | IND_SOURCE);
-       if (result == 0)
-               image->destination += PAGE_SIZE;
-
-       return result;
-}
-
-
-static void kimage_free_extra_pages(struct kimage *image)
-{
-       /* Walk through and free any extra destination pages I may have */
-       kimage_free_page_list(&image->dest_pages);
-
-       /* Walk through and free any unuseable pages I have cached */
-       kimage_free_page_list(&image->unuseable_pages);
-
-}
-static int kimage_terminate(struct kimage *image)
-{
-       if (*image->entry != 0)
-               image->entry++;
-
-       *image->entry = IND_DONE;
-
-       return 0;
-}
-
-#define for_each_kimage_entry(image, ptr, entry) \
-       for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
-               ptr = (entry & IND_INDIRECTION)? \
-                       kexec_phys_to_virt((entry & PAGE_MASK)): ptr +1)
-
-static void kimage_free_entry(kimage_entry_t entry)
-{
-       struct page *page;
-
-       page = kexec_pfn_to_page(entry >> PAGE_SHIFT);
-       kimage_free_pages(page);
-}
-
-static void kimage_free(struct kimage *image)
-{
-       kimage_entry_t *ptr, entry;
-       kimage_entry_t ind = 0;
-
-       if (!image)
-               return;
-
-#ifdef CONFIG_XEN
-       xen_machine_kexec_unload(image);
-#endif
-
-       kimage_free_extra_pages(image);
-       for_each_kimage_entry(image, ptr, entry) {
-               if (entry & IND_INDIRECTION) {
-                       /* Free the previous indirection page */
-                       if (ind & IND_INDIRECTION)
-                               kimage_free_entry(ind);
-                       /* Save this indirection page until we are
-                        * done with it.
-                        */
-                       ind = entry;
-               }
-               else if (entry & IND_SOURCE)
-                       kimage_free_entry(entry);
-       }
-       /* Free the final indirection page */
-       if (ind & IND_INDIRECTION)
-               kimage_free_entry(ind);
-
-       /* Handle any machine specific cleanup */
-       machine_kexec_cleanup(image);
-
-       /* Free the kexec control pages... */
-       kimage_free_page_list(&image->control_pages);
-       kfree(image);
-}
-
-static kimage_entry_t *kimage_dst_used(struct kimage *image,
-                                       unsigned long page)
-{
-       kimage_entry_t *ptr, entry;
-       unsigned long destination = 0;
-
-       for_each_kimage_entry(image, ptr, entry) {
-               if (entry & IND_DESTINATION)
-                       destination = entry & PAGE_MASK;
-               else if (entry & IND_SOURCE) {
-                       if (page == destination)
-                               return ptr;
-                       destination += PAGE_SIZE;
-               }
-       }
-
-       return NULL;
-}
-
-static struct page *kimage_alloc_page(struct kimage *image,
-                                       gfp_t gfp_mask,
-                                       unsigned long destination)
-{
-       /*
-        * Here we implement safeguards to ensure that a source page
-        * is not copied to its destination page before the data on
-        * the destination page is no longer useful.
-        *
-        * To do this we maintain the invariant that a source page is
-        * either its own destination page, or it is not a
-        * destination page at all.
-        *
-        * That is slightly stronger than required, but the proof
-        * that no problems will not occur is trivial, and the
-        * implementation is simply to verify.
-        *
-        * When allocating all pages normally this algorithm will run
-        * in O(N) time, but in the worst case it will run in O(N^2)
-        * time.   If the runtime is a problem the data structures can
-        * be fixed.
-        */
-       struct page *page;
-       unsigned long addr;
-
-       /*
-        * Walk through the list of destination pages, and see if I
-        * have a match.
-        */
-       list_for_each_entry(page, &image->dest_pages, lru) {
-               addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
-               if (addr == destination) {
-                       list_del(&page->lru);
-                       return page;
-               }
-       }
-       page = NULL;
-       while (1) {
-               kimage_entry_t *old;
-
-               /* Allocate a page, if we run out of memory give up */
-               page = kimage_alloc_pages(gfp_mask, 0, KEXEC_SOURCE_MEMORY_LIMIT);
-               if (!page)
-                       return NULL;
-               /* If the page cannot be used file it away */
-               if (kexec_page_to_pfn(page) >
-                               (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
-                       list_add(&page->lru, &image->unuseable_pages);
-                       continue;
-               }
-               addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
-
-               /* If it is the destination page we want use it */
-               if (addr == destination)
-                       break;
-
-               /* If the page is not a destination page use it */
-               if (!kimage_is_destination_range(image, addr,
-                                                 addr + PAGE_SIZE))
-                       break;
-
-               /*
-                * I know that the page is someones destination page.
-                * See if there is already a source page for this
-                * destination page.  And if so swap the source pages.
-                */
-               old = kimage_dst_used(image, addr);
-               if (old) {
-                       /* If so move it */
-                       unsigned long old_addr;
-                       struct page *old_page;
-
-                       old_addr = *old & PAGE_MASK;
-                       old_page = kexec_pfn_to_page(old_addr >> PAGE_SHIFT);
-                       copy_highpage(page, old_page);
-                       *old = addr | (*old & ~PAGE_MASK);
-
-                       /* The old page I have found cannot be a
-                        * destination page, so return it.
-                        */
-                       addr = old_addr;
-                       page = old_page;
-                       break;
-               }
-               else {
-                       /* Place the page on the destination list I
-                        * will use it later.
-                        */
-                       list_add(&page->lru, &image->dest_pages);
-               }
-       }
-
-       return page;
-}
-
-static int kimage_load_normal_segment(struct kimage *image,
-                                        struct kexec_segment *segment)
-{
-       unsigned long maddr;
-       unsigned long ubytes, mbytes;
-       int result;
-       unsigned char __user *buf;
-
-       result = 0;
-       buf = segment->buf;
-       ubytes = segment->bufsz;
-       mbytes = segment->memsz;
-       maddr = segment->mem;
-
-       result = kimage_set_destination(image, maddr);
-       if (result < 0)
-               goto out;
-
-       while (mbytes) {
-               struct page *page;
-               char *ptr;
-               size_t uchunk, mchunk;
-
-               page = kimage_alloc_page(image, GFP_HIGHUSER, maddr);
-               if (page == 0) {
-                       result  = -ENOMEM;
-                       goto out;
-               }
-               result = kimage_add_page(image, kexec_page_to_pfn(page)
-                                                               << PAGE_SHIFT);
-               if (result < 0)
-                       goto out;
-
-               ptr = kmap(page);
-               /* Start with a clear page */
-               memset(ptr, 0, PAGE_SIZE);
-               ptr += maddr & ~PAGE_MASK;
-               mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK);
-               if (mchunk > mbytes)
-                       mchunk = mbytes;
-
-               uchunk = mchunk;
-               if (uchunk > ubytes)
-                       uchunk = ubytes;
-
-               result = copy_from_user(ptr, buf, uchunk);
-               kunmap(page);
-               if (result) {
-                       result = (result < 0) ? result : -EIO;
-                       goto out;
-               }
-               ubytes -= uchunk;
-               maddr  += mchunk;
-               buf    += mchunk;
-               mbytes -= mchunk;
-       }
-out:
-       return result;
-}
-
-#ifndef CONFIG_XEN
-static int kimage_load_crash_segment(struct kimage *image,
-                                       struct kexec_segment *segment)
-{
-       /* For crash dumps kernels we simply copy the data from
-        * user space to it's destination.
-        * We do things a page at a time for the sake of kmap.
-        */
-       unsigned long maddr;
-       unsigned long ubytes, mbytes;
-       int result;
-       unsigned char __user *buf;
-
-       result = 0;
-       buf = segment->buf;
-       ubytes = segment->bufsz;
-       mbytes = segment->memsz;
-       maddr = segment->mem;
-       while (mbytes) {
-               struct page *page;
-               char *ptr;
-               size_t uchunk, mchunk;
-
-               page = kexec_pfn_to_page(maddr >> PAGE_SHIFT);
-               if (page == 0) {
-                       result  = -ENOMEM;
-                       goto out;
-               }
-               ptr = kmap(page);
-               ptr += maddr & ~PAGE_MASK;
-               mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK);
-               if (mchunk > mbytes)
-                       mchunk = mbytes;
-
-               uchunk = mchunk;
-               if (uchunk > ubytes) {
-                       uchunk = ubytes;
-                       /* Zero the trailing part of the page */
-                       memset(ptr + uchunk, 0, mchunk - uchunk);
-               }
-               result = copy_from_user(ptr, buf, uchunk);
-               kunmap(page);
-               if (result) {
-                       result = (result < 0) ? result : -EIO;
-                       goto out;
-               }
-               ubytes -= uchunk;
-               maddr  += mchunk;
-               buf    += mchunk;
-               mbytes -= mchunk;
-       }
-out:
-       return result;
-}
-
-static int kimage_load_segment(struct kimage *image,
-                               struct kexec_segment *segment)
-{
-       int result = -ENOMEM;
-
-       switch (image->type) {
-       case KEXEC_TYPE_DEFAULT:
-               result = kimage_load_normal_segment(image, segment);
-               break;
-       case KEXEC_TYPE_CRASH:
-               result = kimage_load_crash_segment(image, segment);
-               break;
-       }
-
-       return result;
-}
-#else /* CONFIG_XEN */
-static int kimage_load_segment(struct kimage *image,
-                               struct kexec_segment *segment)
-{
-       return kimage_load_normal_segment(image, segment);
-}
-#endif
-
-/*
- * Exec Kernel system call: for obvious reasons only root may call it.
- *
- * This call breaks up into three pieces.
- * - A generic part which loads the new kernel from the current
- *   address space, and very carefully places the data in the
- *   allocated pages.
- *
- * - A generic part that interacts with the kernel and tells all of
- *   the devices to shut down.  Preventing on-going dmas, and placing
- *   the devices in a consistent state so a later kernel can
- *   reinitialize them.
- *
- * - A machine specific part that includes the syscall number
- *   and the copies the image to it's final destination.  And
- *   jumps into the image at entry.
- *
- * kexec does not sync, or unmount filesystems so if you need
- * that to happen you need to do that yourself.
- */
-struct kimage *kexec_image;
-struct kimage *kexec_crash_image;
-/*
- * A home grown binary mutex.
- * Nothing can wait so this mutex is safe to use
- * in interrupt context :)
- */
-static int kexec_lock;
-
-asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
-                               struct kexec_segment __user *segments,
-                               unsigned long flags)
-{
-       struct kimage **dest_image, *image;
-       int locked;
-       int result;
-
-       /* We only trust the superuser with rebooting the system. */
-       if (!capable(CAP_SYS_BOOT))
-               return -EPERM;
-
-       /*
-        * Verify we have a legal set of flags
-        * This leaves us room for future extensions.
-        */
-       if ((flags & KEXEC_FLAGS) != (flags & ~KEXEC_ARCH_MASK))
-               return -EINVAL;
-
-       /* Verify we are on the appropriate architecture */
-       if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
-               ((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH_DEFAULT))
-               return -EINVAL;
-
-       /* Put an artificial cap on the number
-        * of segments passed to kexec_load.
-        */
-       if (nr_segments > KEXEC_SEGMENT_MAX)
-               return -EINVAL;
-
-       image = NULL;
-       result = 0;
-
-       /* Because we write directly to the reserved memory
-        * region when loading crash kernels we need a mutex here to
-        * prevent multiple crash  kernels from attempting to load
-        * simultaneously, and to prevent a crash kernel from loading
-        * over the top of a in use crash kernel.
-        *
-        * KISS: always take the mutex.
-        */
-       locked = xchg(&kexec_lock, 1);
-       if (locked)
-               return -EBUSY;
-
-       dest_image = &kexec_image;
-       if (flags & KEXEC_ON_CRASH)
-               dest_image = &kexec_crash_image;
-       if (nr_segments > 0) {
-               unsigned long i;
-
-               /* Loading another kernel to reboot into */
-               if ((flags & KEXEC_ON_CRASH) == 0)
-                       result = kimage_normal_alloc(&image, entry,
-                                                       nr_segments, segments);
-               /* Loading another kernel to switch to if this one crashes */
-               else if (flags & KEXEC_ON_CRASH) {
-                       /* Free any current crash dump kernel before
-                        * we corrupt it.
-                        */
-                       kimage_free(xchg(&kexec_crash_image, NULL));
-                       result = kimage_crash_alloc(&image, entry,
-                                                    nr_segments, segments);
-               }
-               if (result)
-                       goto out;
-
-               result = machine_kexec_prepare(image);
-               if (result)
-                       goto out;
-
-               for (i = 0; i < nr_segments; i++) {
-                       result = kimage_load_segment(image, &image->segment[i]);
-                       if (result)
-                               goto out;
-               }
-               result = kimage_terminate(image);
-               if (result)
-                       goto out;
-       }
-#ifdef CONFIG_XEN
-       if (image) {
-               result = xen_machine_kexec_load(image);
-               if (result)
-                       goto out;
-       }
-#endif
-       /* Install the new kernel, and  Uninstall the old */
-       image = xchg(dest_image, image);
-
-out:
-       xchg(&kexec_lock, 0); /* Release the mutex */
-       kimage_free(image);
-
-       return result;
-}
-
-#ifdef CONFIG_COMPAT
-asmlinkage long compat_sys_kexec_load(unsigned long entry,
-                               unsigned long nr_segments,
-                               struct compat_kexec_segment __user *segments,
-                               unsigned long flags)
-{
-       struct compat_kexec_segment in;
-       struct kexec_segment out, __user *ksegments;
-       unsigned long i, result;
-
-       /* Don't allow clients that don't understand the native
-        * architecture to do anything.
-        */
-       if ((flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_DEFAULT)
-               return -EINVAL;
-
-       if (nr_segments > KEXEC_SEGMENT_MAX)
-               return -EINVAL;
-
-       ksegments = compat_alloc_user_space(nr_segments * sizeof(out));
-       for (i=0; i < nr_segments; i++) {
-               result = copy_from_user(&in, &segments[i], sizeof(in));
-               if (result)
-                       return -EFAULT;
-
-               out.buf   = compat_ptr(in.buf);
-               out.bufsz = in.bufsz;
-               out.mem   = in.mem;
-               out.memsz = in.memsz;
-
-               result = copy_to_user(&ksegments[i], &out, sizeof(out));
-               if (result)
-                       return -EFAULT;
-       }
-
-       return sys_kexec_load(entry, nr_segments, ksegments, flags);
-}
-#endif
-
-void crash_kexec(struct pt_regs *regs)
-{
-       int locked;
-
-       /* Take the kexec_lock here to prevent sys_kexec_load
-        * running on one cpu from replacing the crash kernel
-        * we are using after a panic on a different cpu.
-        *
-        * If the crash kernel was not located in a fixed area
-        * of memory the xchg(&kexec_crash_image) would be
-        * sufficient.  But since I reuse the memory...
-        */
-       locked = xchg(&kexec_lock, 1);
-       if (!locked) {
-               if (kexec_crash_image) {
-                       struct pt_regs fixed_regs;
-                       crash_setup_regs(&fixed_regs, regs);
-                       machine_crash_shutdown(&fixed_regs);
-                       machine_kexec(kexec_crash_image);
-               }
-               xchg(&kexec_lock, 0);
-       }
-}
-
-static int __init crash_notes_memory_init(void)
-{
-       /* Allocate memory for saving cpu registers. */
-       crash_notes = alloc_percpu(note_buf_t);
-       if (!crash_notes) {
-               printk("Kexec: Memory allocation for saving cpu register"
-               " states failed\n");
-               return -ENOMEM;
-       }
-       return 0;
-}
-module_init(crash_notes_memory_init)
diff --git a/linux-2.6-xen-sparse/lib/Makefile b/linux-2.6-xen-sparse/lib/Makefile
deleted file mode 100644 (file)
index a072306..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Makefile for some libs needed in the kernel.
-#
-
-lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
-        bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-        idr.o div64.o int_sqrt.o bitmap.o extable.o prio_tree.o \
-        sha1.o
-
-lib-$(CONFIG_SMP) += cpumask.o
-
-lib-y  += kobject.o kref.o kobject_uevent.o klist.o
-
-obj-y += sort.o parser.o halfmd4.o iomap_copy.o debug_locks.o
-
-ifeq ($(CONFIG_DEBUG_KOBJECT),y)
-CFLAGS_kobject.o += -DDEBUG
-CFLAGS_kobject_uevent.o += -DDEBUG
-endif
-
-obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
-obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
-lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
-lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
-lib-$(CONFIG_SEMAPHORE_SLEEPERS) += semaphore-sleepers.o
-lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
-lib-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
-obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o
-obj-$(CONFIG_PLIST) += plist.o
-obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o
-
-ifneq ($(CONFIG_HAVE_DEC_LOCK),y)
-  lib-y += dec_and_lock.o
-endif
-
-obj-$(CONFIG_CRC_CCITT)        += crc-ccitt.o
-obj-$(CONFIG_CRC16)    += crc16.o
-obj-$(CONFIG_CRC32)    += crc32.o
-obj-$(CONFIG_LIBCRC32C)        += libcrc32c.o
-obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
-obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
-
-obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/
-obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate/
-obj-$(CONFIG_REED_SOLOMON) += reed_solomon/
-
-obj-$(CONFIG_TEXTSEARCH) += textsearch.o
-obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
-obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o
-obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o
-obj-$(CONFIG_SMP) += percpu_counter.o
-obj-$(CONFIG_AUDIT_GENERIC) += audit.o
-
-obj-$(CONFIG_SWIOTLB) += swiotlb.o
-ifeq ($(CONFIG_X86),y)
-swiotlb-$(CONFIG_XEN) := ../arch/i386/kernel/swiotlb.o
-endif
-ifeq ($(CONFIG_IA64),y)
-swiotlb-$(CONFIG_XEN) := ../arch/ia64/xen/swiotlb.o
-endif
-
-hostprogs-y    := gen_crc32table
-clean-files    := crc32table.h
-
-$(obj)/crc32.o: $(obj)/crc32table.h
-
-quiet_cmd_crc32 = GEN     $@
-      cmd_crc32 = $< > $@
-
-$(obj)/crc32table.h: $(obj)/gen_crc32table
-       $(call cmd,crc32)
diff --git a/linux-2.6-xen-sparse/mkbuildtree b/linux-2.6-xen-sparse/mkbuildtree
deleted file mode 100755 (executable)
index 37d43f7..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/bin/bash
-
-# mkbuildtree <build tree>
-#
-# Creates symbolic links in <build tree> for the sparse tree
-# in the current directory.
-
-# Script to determine the relative path between two directories.
-# Copyright (c) D. J. Hawkey Jr. 2002
-# Fixed for Xen project by K. Fraser in 2003.  
-abs_to_rel ()
-{
-       local CWD SRCPATH
-                
-       if [ "$1" != "/" -a "${1##*[^/]}" = "/" ]; then
-               SRCPATH=${1%?}
-       else
-               SRCPATH=$1
-       fi
-       if [ "$2" != "/" -a "${2##*[^/]}" = "/" ]; then
-               DESTPATH=${2%?}
-       else
-               DESTPATH=$2
-       fi
-
-       CWD=$PWD
-       [ "${1%%[^/]*}" != "/" ] && cd $1 && SRCPATH=$PWD
-       [ "${2%%[^/]*}" != "/" ] && cd $2 && DESTPATH=$PWD
-       [ "$CWD" != "$PWD" ] && cd $CWD
-
-       BASEPATH=$SRCPATH
-
-       [ "$SRCPATH" = "$DESTPATH" ] && DESTPATH="." && return
-       [ "$SRCPATH" = "/" ] && DESTPATH=${DESTPATH#?} && return
-
-       while [ "$BASEPATH/" != "${DESTPATH%${DESTPATH#$BASEPATH/}}" ]; do
-          BASEPATH=${BASEPATH%/*}
-       done
-
-       SRCPATH=${SRCPATH#$BASEPATH}
-        DESTPATH=${DESTPATH#$BASEPATH}
-        DESTPATH=${DESTPATH#?}
-       while [ -n "$SRCPATH" ]; do
-               SRCPATH=${SRCPATH%/*}
-               DESTPATH="../$DESTPATH"
-       done
-
-       [ -z "$BASEPATH" ] && BASEPATH="/"
-       [ "${DESTPATH##*[^/]}" = "/" ] && DESTPATH=${DESTPATH%?}
-}
-
-# relative_lndir <target_dir>
-# Creates a tree of symlinks in the current working directory that mirror
-# real files in <target_dir>. <target_dir> should be relative to the current
-# working directory. Symlinks in <target_dir> are ignored. Source-control files
-# are ignored.
-relative_lndir ()
-{
-  local SYMLINK_DIR REAL_DIR pref i j
-  SYMLINK_DIR=$PWD
-  REAL_DIR=$1
-  (
-  cd $REAL_DIR
-  for i in `find . -type d | grep -v SCCS`; do
-    [ -d $SYMLINK_DIR/$i ] || mkdir -p $SYMLINK_DIR/$i
-    (
-    cd $i
-    pref=`echo $i | sed -e 's#/[^/]*#../#g' -e 's#^\.##'`
-    for j in `find . -maxdepth 1 -type f -o -type l`; do
-      ln -sf ${pref}${REAL_DIR}/$i/$j ${SYMLINK_DIR}/$i/$j
-    done
-    )
-  done
-  )
-}
-
-[ "$1" == "" ] && { echo "Syntax: $0 <linux tree to xenify>"; exit 1; }
-
-# Get absolute path to the destination directory
-pushd . >/dev/null
-cd ${1} || { echo "cannot cd to ${1}"; exit 1; }
-AD=$PWD
-popd >/dev/null
-  
-# Get absolute path to the source directory
-AS=`pwd`
-
-# Get path to source, relative to destination
-abs_to_rel ${AD} ${AS}
-RS=$DESTPATH
-
-# Arch-specific pre-processing
-if [ -e arch/${LINUX_ARCH}/xen-mkbuildtree-pre ]; then
-       bash arch/${LINUX_ARCH}/xen-mkbuildtree-pre
-fi
-
-# Remove old copies of files and directories at the destination
-for i in `find . -type f -o -type l` ; do rm -f ${AD}/${i#./} ; done
-
-# We now work from the destination directory
-cd ${AD} || { echo "cannot cd to ${AD}"; exit 1; }
-
-# Remove old symlinks
-for i in `find . -type l`; do rm -f $i; done
-
-# Create symlinks of files and directories which exist in the sparse source
-relative_lndir ${RS}
-rm -f mkbuildtree
-
-# Create links to the shared definitions of the Xen interfaces.
-rm -rf ${AD}/include/xen/interface
-mkdir  ${AD}/include/xen/interface
-cd     ${AD}/include/xen/interface
-relative_lndir ../../../${RS}/../xen/include/public
-
-# Arch-specific post-processing
-cd ${AD}
-if [ -e arch/${LINUX_ARCH}/xen-mkbuildtree-post ]; then
-       bash arch/${LINUX_ARCH}/xen-mkbuildtree-post
-fi
diff --git a/linux-2.6-xen-sparse/mm/Kconfig b/linux-2.6-xen-sparse/mm/Kconfig
deleted file mode 100644 (file)
index 14492aa..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-config SELECT_MEMORY_MODEL
-       def_bool y
-       depends on EXPERIMENTAL || ARCH_SELECT_MEMORY_MODEL
-
-choice
-       prompt "Memory model"
-       depends on SELECT_MEMORY_MODEL
-       default DISCONTIGMEM_MANUAL if ARCH_DISCONTIGMEM_DEFAULT
-       default SPARSEMEM_MANUAL if ARCH_SPARSEMEM_DEFAULT
-       default FLATMEM_MANUAL
-
-config FLATMEM_MANUAL
-       bool "Flat Memory"
-       depends on !(ARCH_DISCONTIGMEM_ENABLE || ARCH_SPARSEMEM_ENABLE) || ARCH_FLATMEM_ENABLE
-       help
-         This option allows you to change some of the ways that
-         Linux manages its memory internally.  Most users will
-         only have one option here: FLATMEM.  This is normal
-         and a correct option.
-
-         Some users of more advanced features like NUMA and
-         memory hotplug may have different options here.
-         DISCONTIGMEM is an more mature, better tested system,
-         but is incompatible with memory hotplug and may suffer
-         decreased performance over SPARSEMEM.  If unsure between
-         "Sparse Memory" and "Discontiguous Memory", choose
-         "Discontiguous Memory".
-
-         If unsure, choose this option (Flat Memory) over any other.
-
-config DISCONTIGMEM_MANUAL
-       bool "Discontiguous Memory"
-       depends on ARCH_DISCONTIGMEM_ENABLE
-       help
-         This option provides enhanced support for discontiguous
-         memory systems, over FLATMEM.  These systems have holes
-         in their physical address spaces, and this option provides
-         more efficient handling of these holes.  However, the vast
-         majority of hardware has quite flat address spaces, and
-         can have degraded performance from extra overhead that
-         this option imposes.
-
-         Many NUMA configurations will have this as the only option.
-
-         If unsure, choose "Flat Memory" over this option.
-
-config SPARSEMEM_MANUAL
-       bool "Sparse Memory"
-       depends on ARCH_SPARSEMEM_ENABLE
-       help
-         This will be the only option for some systems, including
-         memory hotplug systems.  This is normal.
-
-         For many other systems, this will be an alternative to
-         "Discontiguous Memory".  This option provides some potential
-         performance benefits, along with decreased code complexity,
-         but it is newer, and more experimental.
-
-         If unsure, choose "Discontiguous Memory" or "Flat Memory"
-         over this option.
-
-endchoice
-
-config DISCONTIGMEM
-       def_bool y
-       depends on (!SELECT_MEMORY_MODEL && ARCH_DISCONTIGMEM_ENABLE) || DISCONTIGMEM_MANUAL
-
-config SPARSEMEM
-       def_bool y
-       depends on SPARSEMEM_MANUAL
-
-config FLATMEM
-       def_bool y
-       depends on (!DISCONTIGMEM && !SPARSEMEM) || FLATMEM_MANUAL
-
-config FLAT_NODE_MEM_MAP
-       def_bool y
-       depends on !SPARSEMEM
-
-#
-# Both the NUMA code and DISCONTIGMEM use arrays of pg_data_t's
-# to represent different areas of memory.  This variable allows
-# those dependencies to exist individually.
-#
-config NEED_MULTIPLE_NODES
-       def_bool y
-       depends on DISCONTIGMEM || NUMA
-
-config HAVE_MEMORY_PRESENT
-       def_bool y
-       depends on ARCH_HAVE_MEMORY_PRESENT || SPARSEMEM
-
-#
-# SPARSEMEM_EXTREME (which is the default) does some bootmem
-# allocations when memory_present() is called.  If this can not
-# be done on your architecture, select this option.  However,
-# statically allocating the mem_section[] array can potentially
-# consume vast quantities of .bss, so be careful.
-#
-# This option will also potentially produce smaller runtime code
-# with gcc 3.4 and later.
-#
-config SPARSEMEM_STATIC
-       def_bool n
-
-#
-# Architectecture platforms which require a two level mem_section in SPARSEMEM
-# must select this option. This is usually for architecture platforms with
-# an extremely sparse physical address space.
-#
-config SPARSEMEM_EXTREME
-       def_bool y
-       depends on SPARSEMEM && !SPARSEMEM_STATIC
-
-# eventually, we can have this option just 'select SPARSEMEM'
-config MEMORY_HOTPLUG
-       bool "Allow for memory hot-add"
-       depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG
-       depends on (IA64 || X86 || PPC64)
-
-comment "Memory hotplug is currently incompatible with Software Suspend"
-       depends on SPARSEMEM && HOTPLUG && SOFTWARE_SUSPEND
-
-# Heavily threaded applications may benefit from splitting the mm-wide
-# page_table_lock, so that faults on different parts of the user address
-# space can be handled with less contention: split it at this NR_CPUS.
-# Default to 4 for wider testing, though 8 might be more appropriate.
-# ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
-# PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes.
-# XEN on x86 architecture uses the mapping field on pagetable pages to store a
-# pointer to the destructor. This conflicts with pte_lock_deinit().
-#
-config SPLIT_PTLOCK_CPUS
-       int
-       default "4096" if ARM && !CPU_CACHE_VIPT
-       default "4096" if PARISC && !PA20
-       default "4096" if X86_XEN || X86_64_XEN
-       default "4"
-
-#
-# support for page migration
-#
-config MIGRATION
-       bool "Page migration"
-       def_bool y
-       depends on NUMA
-       help
-         Allows the migration of the physical location of pages of processes
-         while the virtual addresses are not changed. This is useful for
-         example on NUMA systems to put pages nearer to the processors accessing
-         the page.
-
-config RESOURCES_64BIT
-       bool "64 bit Memory and IO resources (EXPERIMENTAL)" if (!64BIT && EXPERIMENTAL)
-       default 64BIT
-       help
-         This option allows memory and IO resources to be 64 bit.
diff --git a/linux-2.6-xen-sparse/mm/highmem.c b/linux-2.6-xen-sparse/mm/highmem.c
deleted file mode 100644 (file)
index 821d4cd..0000000
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- * High memory handling common code and variables.
- *
- * (C) 1999 Andrea Arcangeli, SuSE GmbH, andrea@suse.de
- *          Gerhard Wichert, Siemens AG, Gerhard.Wichert@pdb.siemens.de
- *
- *
- * Redesigned the x86 32-bit VM architecture to deal with
- * 64-bit physical space. With current x86 CPUs this
- * means up to 64 Gigabytes physical RAM.
- *
- * Rewrote high memory support to move the page cache into
- * high memory. Implemented permanent (schedulable) kmaps
- * based on Linus' idea.
- *
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/swap.h>
-#include <linux/bio.h>
-#include <linux/pagemap.h>
-#include <linux/mempool.h>
-#include <linux/blkdev.h>
-#include <linux/init.h>
-#include <linux/hash.h>
-#include <linux/highmem.h>
-#include <linux/blktrace_api.h>
-#include <asm/tlbflush.h>
-
-static mempool_t *page_pool, *isa_page_pool;
-
-static void *mempool_alloc_pages_isa(gfp_t gfp_mask, void *data)
-{
-       return mempool_alloc_pages(gfp_mask | GFP_DMA, data);
-}
-
-/*
- * Virtual_count is not a pure "count".
- *  0 means that it is not mapped, and has not been mapped
- *    since a TLB flush - it is usable.
- *  1 means that there are no users, but it has been mapped
- *    since the last TLB flush - so we can't use it.
- *  n means that there are (n-1) current users of it.
- */
-#ifdef CONFIG_HIGHMEM
-
-static int pkmap_count[LAST_PKMAP];
-static unsigned int last_pkmap_nr;
-static  __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock);
-
-pte_t * pkmap_page_table;
-
-static DECLARE_WAIT_QUEUE_HEAD(pkmap_map_wait);
-
-static void flush_all_zero_pkmaps(void)
-{
-       int i;
-
-       flush_cache_kmaps();
-
-       for (i = 0; i < LAST_PKMAP; i++) {
-               struct page *page;
-
-               /*
-                * zero means we don't have anything to do,
-                * >1 means that it is still in use. Only
-                * a count of 1 means that it is free but
-                * needs to be unmapped
-                */
-               if (pkmap_count[i] != 1)
-                       continue;
-               pkmap_count[i] = 0;
-
-               /* sanity check */
-               BUG_ON(pte_none(pkmap_page_table[i]));
-
-               /*
-                * Don't need an atomic fetch-and-clear op here;
-                * no-one has the page mapped, and cannot get at
-                * its virtual address (and hence PTE) without first
-                * getting the kmap_lock (which is held here).
-                * So no dangers, even with speculative execution.
-                */
-               page = pte_page(pkmap_page_table[i]);
-               pte_clear(&init_mm, (unsigned long)page_address(page),
-                         &pkmap_page_table[i]);
-
-               set_page_address(page, NULL);
-       }
-       flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP));
-}
-
-static inline unsigned long map_new_virtual(struct page *page)
-{
-       unsigned long vaddr;
-       int count;
-
-start:
-       count = LAST_PKMAP;
-       /* Find an empty entry */
-       for (;;) {
-               last_pkmap_nr = (last_pkmap_nr + 1) & LAST_PKMAP_MASK;
-               if (!last_pkmap_nr) {
-                       flush_all_zero_pkmaps();
-                       count = LAST_PKMAP;
-               }
-               if (!pkmap_count[last_pkmap_nr])
-                       break;  /* Found a usable entry */
-               if (--count)
-                       continue;
-
-               /*
-                * Sleep for somebody else to unmap their entries
-                */
-               {
-                       DECLARE_WAITQUEUE(wait, current);
-
-                       __set_current_state(TASK_UNINTERRUPTIBLE);
-                       add_wait_queue(&pkmap_map_wait, &wait);
-                       spin_unlock(&kmap_lock);
-                       schedule();
-                       remove_wait_queue(&pkmap_map_wait, &wait);
-                       spin_lock(&kmap_lock);
-
-                       /* Somebody else might have mapped it while we slept */
-                       if (page_address(page))
-                               return (unsigned long)page_address(page);
-
-                       /* Re-start */
-                       goto start;
-               }
-       }
-       vaddr = PKMAP_ADDR(last_pkmap_nr);
-       set_pte_at(&init_mm, vaddr,
-                  &(pkmap_page_table[last_pkmap_nr]), mk_pte(page, kmap_prot));
-
-       pkmap_count[last_pkmap_nr] = 1;
-       set_page_address(page, (void *)vaddr);
-
-       return vaddr;
-}
-
-#ifdef CONFIG_XEN
-void kmap_flush_unused(void)
-{
-       spin_lock(&kmap_lock);
-       flush_all_zero_pkmaps();
-       spin_unlock(&kmap_lock);
-}
-
-EXPORT_SYMBOL(kmap_flush_unused);
-#endif
-
-void fastcall *kmap_high(struct page *page)
-{
-       unsigned long vaddr;
-
-       /*
-        * For highmem pages, we can't trust "virtual" until
-        * after we have the lock.
-        *
-        * We cannot call this from interrupts, as it may block
-        */
-       spin_lock(&kmap_lock);
-       vaddr = (unsigned long)page_address(page);
-       if (!vaddr)
-               vaddr = map_new_virtual(page);
-       pkmap_count[PKMAP_NR(vaddr)]++;
-       BUG_ON(pkmap_count[PKMAP_NR(vaddr)] < 2);
-       spin_unlock(&kmap_lock);
-       return (void*) vaddr;
-}
-
-EXPORT_SYMBOL(kmap_high);
-
-void fastcall kunmap_high(struct page *page)
-{
-       unsigned long vaddr;
-       unsigned long nr;
-       int need_wakeup;
-
-       spin_lock(&kmap_lock);
-       vaddr = (unsigned long)page_address(page);
-       BUG_ON(!vaddr);
-       nr = PKMAP_NR(vaddr);
-
-       /*
-        * A count must never go down to zero
-        * without a TLB flush!
-        */
-       need_wakeup = 0;
-       switch (--pkmap_count[nr]) {
-       case 0:
-               BUG();
-       case 1:
-               /*
-                * Avoid an unnecessary wake_up() function call.
-                * The common case is pkmap_count[] == 1, but
-                * no waiters.
-                * The tasks queued in the wait-queue are guarded
-                * by both the lock in the wait-queue-head and by
-                * the kmap_lock.  As the kmap_lock is held here,
-                * no need for the wait-queue-head's lock.  Simply
-                * test if the queue is empty.
-                */
-               need_wakeup = waitqueue_active(&pkmap_map_wait);
-       }
-       spin_unlock(&kmap_lock);
-
-       /* do wake-up, if needed, race-free outside of the spin lock */
-       if (need_wakeup)
-               wake_up(&pkmap_map_wait);
-}
-
-EXPORT_SYMBOL(kunmap_high);
-
-#define POOL_SIZE      64
-
-static __init int init_emergency_pool(void)
-{
-       struct sysinfo i;
-       si_meminfo(&i);
-       si_swapinfo(&i);
-        
-       if (!i.totalhigh)
-               return 0;
-
-       page_pool = mempool_create_page_pool(POOL_SIZE, 0);
-       BUG_ON(!page_pool);
-       printk("highmem bounce pool size: %d pages\n", POOL_SIZE);
-
-       return 0;
-}
-
-__initcall(init_emergency_pool);
-
-/*
- * highmem version, map in to vec
- */
-static void bounce_copy_vec(struct bio_vec *to, unsigned char *vfrom)
-{
-       unsigned long flags;
-       unsigned char *vto;
-
-       local_irq_save(flags);
-       vto = kmap_atomic(to->bv_page, KM_BOUNCE_READ);
-       memcpy(vto + to->bv_offset, vfrom, to->bv_len);
-       kunmap_atomic(vto, KM_BOUNCE_READ);
-       local_irq_restore(flags);
-}
-
-#else /* CONFIG_HIGHMEM */
-
-#define bounce_copy_vec(to, vfrom)     \
-       memcpy(page_address((to)->bv_page) + (to)->bv_offset, vfrom, (to)->bv_len)
-
-#endif
-
-#define ISA_POOL_SIZE  16
-
-/*
- * gets called "every" time someone init's a queue with BLK_BOUNCE_ISA
- * as the max address, so check if the pool has already been created.
- */
-int init_emergency_isa_pool(void)
-{
-       if (isa_page_pool)
-               return 0;
-
-       isa_page_pool = mempool_create(ISA_POOL_SIZE, mempool_alloc_pages_isa,
-                                      mempool_free_pages, (void *) 0);
-       BUG_ON(!isa_page_pool);
-
-       printk("isa bounce pool size: %d pages\n", ISA_POOL_SIZE);
-       return 0;
-}
-
-/*
- * Simple bounce buffer support for highmem pages. Depending on the
- * queue gfp mask set, *to may or may not be a highmem page. kmap it
- * always, it will do the Right Thing
- */
-static void copy_to_high_bio_irq(struct bio *to, struct bio *from)
-{
-       unsigned char *vfrom;
-       struct bio_vec *tovec, *fromvec;
-       int i;
-
-       __bio_for_each_segment(tovec, to, i, 0) {
-               fromvec = from->bi_io_vec + i;
-
-               /*
-                * not bounced
-                */
-               if (tovec->bv_page == fromvec->bv_page)
-                       continue;
-
-               /*
-                * fromvec->bv_offset and fromvec->bv_len might have been
-                * modified by the block layer, so use the original copy,
-                * bounce_copy_vec already uses tovec->bv_len
-                */
-               vfrom = page_address(fromvec->bv_page) + tovec->bv_offset;
-
-               flush_dcache_page(tovec->bv_page);
-               bounce_copy_vec(tovec, vfrom);
-       }
-}
-
-static void bounce_end_io(struct bio *bio, mempool_t *pool, int err)
-{
-       struct bio *bio_orig = bio->bi_private;
-       struct bio_vec *bvec, *org_vec;
-       int i;
-
-       if (test_bit(BIO_EOPNOTSUPP, &bio->bi_flags))
-               set_bit(BIO_EOPNOTSUPP, &bio_orig->bi_flags);
-
-       /*
-        * free up bounce indirect pages used
-        */
-       __bio_for_each_segment(bvec, bio, i, 0) {
-               org_vec = bio_orig->bi_io_vec + i;
-               if (bvec->bv_page == org_vec->bv_page)
-                       continue;
-
-               dec_zone_page_state(bvec->bv_page, NR_BOUNCE);
-               mempool_free(bvec->bv_page, pool);
-       }
-
-       bio_endio(bio_orig, bio_orig->bi_size, err);
-       bio_put(bio);
-}
-
-static int bounce_end_io_write(struct bio *bio, unsigned int bytes_done, int err)
-{
-       if (bio->bi_size)
-               return 1;
-
-       bounce_end_io(bio, page_pool, err);
-       return 0;
-}
-
-static int bounce_end_io_write_isa(struct bio *bio, unsigned int bytes_done, int err)
-{
-       if (bio->bi_size)
-               return 1;
-
-       bounce_end_io(bio, isa_page_pool, err);
-       return 0;
-}
-
-static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err)
-{
-       struct bio *bio_orig = bio->bi_private;
-
-       if (test_bit(BIO_UPTODATE, &bio->bi_flags))
-               copy_to_high_bio_irq(bio_orig, bio);
-
-       bounce_end_io(bio, pool, err);
-}
-
-static int bounce_end_io_read(struct bio *bio, unsigned int bytes_done, int err)
-{
-       if (bio->bi_size)
-               return 1;
-
-       __bounce_end_io_read(bio, page_pool, err);
-       return 0;
-}
-
-static int bounce_end_io_read_isa(struct bio *bio, unsigned int bytes_done, int err)
-{
-       if (bio->bi_size)
-               return 1;
-
-       __bounce_end_io_read(bio, isa_page_pool, err);
-       return 0;
-}
-
-static void __blk_queue_bounce(request_queue_t *q, struct bio **bio_orig,
-                              mempool_t *pool)
-{
-       struct page *page;
-       struct bio *bio = NULL;
-       int i, rw = bio_data_dir(*bio_orig);
-       struct bio_vec *to, *from;
-
-       bio_for_each_segment(from, *bio_orig, i) {
-               page = from->bv_page;
-
-               /*
-                * is destination page below bounce pfn?
-                */
-               if (page_to_pfn(page) < q->bounce_pfn)
-                       continue;
-
-               /*
-                * irk, bounce it
-                */
-               if (!bio)
-                       bio = bio_alloc(GFP_NOIO, (*bio_orig)->bi_vcnt);
-
-               to = bio->bi_io_vec + i;
-
-               to->bv_page = mempool_alloc(pool, q->bounce_gfp);
-               to->bv_len = from->bv_len;
-               to->bv_offset = from->bv_offset;
-               inc_zone_page_state(to->bv_page, NR_BOUNCE);
-
-               if (rw == WRITE) {
-                       char *vto, *vfrom;
-
-                       flush_dcache_page(from->bv_page);
-                       vto = page_address(to->bv_page) + to->bv_offset;
-                       vfrom = kmap(from->bv_page) + from->bv_offset;
-                       memcpy(vto, vfrom, to->bv_len);
-                       kunmap(from->bv_page);
-               }
-       }
-
-       /*
-        * no pages bounced
-        */
-       if (!bio)
-               return;
-
-       /*
-        * at least one page was bounced, fill in possible non-highmem
-        * pages
-        */
-       __bio_for_each_segment(from, *bio_orig, i, 0) {
-               to = bio_iovec_idx(bio, i);
-               if (!to->bv_page) {
-                       to->bv_page = from->bv_page;
-                       to->bv_len = from->bv_len;
-                       to->bv_offset = from->bv_offset;
-               }
-       }
-
-       bio->bi_bdev = (*bio_orig)->bi_bdev;
-       bio->bi_flags |= (1 << BIO_BOUNCED);
-       bio->bi_sector = (*bio_orig)->bi_sector;
-       bio->bi_rw = (*bio_orig)->bi_rw;
-
-       bio->bi_vcnt = (*bio_orig)->bi_vcnt;
-       bio->bi_idx = (*bio_orig)->bi_idx;
-       bio->bi_size = (*bio_orig)->bi_size;
-
-       if (pool == page_pool) {
-               bio->bi_end_io = bounce_end_io_write;
-               if (rw == READ)
-                       bio->bi_end_io = bounce_end_io_read;
-       } else {
-               bio->bi_end_io = bounce_end_io_write_isa;
-               if (rw == READ)
-                       bio->bi_end_io = bounce_end_io_read_isa;
-       }
-
-       bio->bi_private = *bio_orig;
-       *bio_orig = bio;
-}
-
-void blk_queue_bounce(request_queue_t *q, struct bio **bio_orig)
-{
-       mempool_t *pool;
-
-       /*
-        * for non-isa bounce case, just check if the bounce pfn is equal
-        * to or bigger than the highest pfn in the system -- in that case,
-        * don't waste time iterating over bio segments
-        */
-       if (!(q->bounce_gfp & GFP_DMA)) {
-               if (q->bounce_pfn >= blk_max_pfn)
-                       return;
-               pool = page_pool;
-       } else {
-               BUG_ON(!isa_page_pool);
-               pool = isa_page_pool;
-       }
-
-       blk_add_trace_bio(q, *bio_orig, BLK_TA_BOUNCE);
-
-       /*
-        * slow path
-        */
-       __blk_queue_bounce(q, bio_orig, pool);
-}
-
-EXPORT_SYMBOL(blk_queue_bounce);
-
-#if defined(HASHED_PAGE_VIRTUAL)
-
-#define PA_HASH_ORDER  7
-
-/*
- * Describes one page->virtual association
- */
-struct page_address_map {
-       struct page *page;
-       void *virtual;
-       struct list_head list;
-};
-
-/*
- * page_address_map freelist, allocated from page_address_maps.
- */
-static struct list_head page_address_pool;     /* freelist */
-static spinlock_t pool_lock;                   /* protects page_address_pool */
-
-/*
- * Hash table bucket
- */
-static struct page_address_slot {
-       struct list_head lh;                    /* List of page_address_maps */
-       spinlock_t lock;                        /* Protect this bucket's list */
-} ____cacheline_aligned_in_smp page_address_htable[1<<PA_HASH_ORDER];
-
-static struct page_address_slot *page_slot(struct page *page)
-{
-       return &page_address_htable[hash_ptr(page, PA_HASH_ORDER)];
-}
-
-void *page_address(struct page *page)
-{
-       unsigned long flags;
-       void *ret;
-       struct page_address_slot *pas;
-
-       if (!PageHighMem(page))
-               return lowmem_page_address(page);
-
-       pas = page_slot(page);
-       ret = NULL;
-       spin_lock_irqsave(&pas->lock, flags);
-       if (!list_empty(&pas->lh)) {
-               struct page_address_map *pam;
-
-               list_for_each_entry(pam, &pas->lh, list) {
-                       if (pam->page == page) {
-                               ret = pam->virtual;
-                               goto done;
-                       }
-               }
-       }
-done:
-       spin_unlock_irqrestore(&pas->lock, flags);
-       return ret;
-}
-
-EXPORT_SYMBOL(page_address);
-
-void set_page_address(struct page *page, void *virtual)
-{
-       unsigned long flags;
-       struct page_address_slot *pas;
-       struct page_address_map *pam;
-
-       BUG_ON(!PageHighMem(page));
-
-       pas = page_slot(page);
-       if (virtual) {          /* Add */
-               BUG_ON(list_empty(&page_address_pool));
-
-               spin_lock_irqsave(&pool_lock, flags);
-               pam = list_entry(page_address_pool.next,
-                               struct page_address_map, list);
-               list_del(&pam->list);
-               spin_unlock_irqrestore(&pool_lock, flags);
-
-               pam->page = page;
-               pam->virtual = virtual;
-
-               spin_lock_irqsave(&pas->lock, flags);
-               list_add_tail(&pam->list, &pas->lh);
-               spin_unlock_irqrestore(&pas->lock, flags);
-       } else {                /* Remove */
-               spin_lock_irqsave(&pas->lock, flags);
-               list_for_each_entry(pam, &pas->lh, list) {
-                       if (pam->page == page) {
-                               list_del(&pam->list);
-                               spin_unlock_irqrestore(&pas->lock, flags);
-                               spin_lock_irqsave(&pool_lock, flags);
-                               list_add_tail(&pam->list, &page_address_pool);
-                               spin_unlock_irqrestore(&pool_lock, flags);
-                               goto done;
-                       }
-               }
-               spin_unlock_irqrestore(&pas->lock, flags);
-       }
-done:
-       return;
-}
-
-static struct page_address_map page_address_maps[LAST_PKMAP];
-
-void __init page_address_init(void)
-{
-       int i;
-
-       INIT_LIST_HEAD(&page_address_pool);
-       for (i = 0; i < ARRAY_SIZE(page_address_maps); i++)
-               list_add(&page_address_maps[i].list, &page_address_pool);
-       for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) {
-               INIT_LIST_HEAD(&page_address_htable[i].lh);
-               spin_lock_init(&page_address_htable[i].lock);
-       }
-       spin_lock_init(&pool_lock);
-}
-
-#endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */
diff --git a/linux-2.6-xen-sparse/mm/memory.c b/linux-2.6-xen-sparse/mm/memory.c
deleted file mode 100644 (file)
index 2df16c2..0000000
+++ /dev/null
@@ -1,2630 +0,0 @@
-/*
- *  linux/mm/memory.c
- *
- *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
- */
-
-/*
- * demand-loading started 01.12.91 - seems it is high on the list of
- * things wanted, and it should be easy to implement. - Linus
- */
-
-/*
- * Ok, demand-loading was easy, shared pages a little bit tricker. Shared
- * pages started 02.12.91, seems to work. - Linus.
- *
- * Tested sharing by executing about 30 /bin/sh: under the old kernel it
- * would have taken more than the 6M I have free, but it worked well as
- * far as I could see.
- *
- * Also corrected some "invalidate()"s - I wasn't doing enough of them.
- */
-
-/*
- * Real VM (paging to/from disk) started 18.12.91. Much more work and
- * thought has to go into this. Oh, well..
- * 19.12.91  -  works, somewhat. Sometimes I get faults, don't know why.
- *             Found it. Everything seems to work now.
- * 20.12.91  -  Ok, making the swap-device changeable like the root.
- */
-
-/*
- * 05.04.94  -  Multi-page memory management added for v1.1.
- *             Idea by Alex Bligh (alex@cconcepts.co.uk)
- *
- * 16.07.99  -  Support of BIGMEM added by Gerhard Wichert, Siemens AG
- *             (Gerhard.Wichert@pdb.siemens.de)
- *
- * Aug/Sep 2004 Changed to four level page tables (Andi Kleen)
- */
-
-#include <linux/kernel_stat.h>
-#include <linux/mm.h>
-#include <linux/hugetlb.h>
-#include <linux/mman.h>
-#include <linux/swap.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/rmap.h>
-#include <linux/module.h>
-#include <linux/delayacct.h>
-#include <linux/init.h>
-
-#include <asm/pgalloc.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-#include <asm/tlbflush.h>
-#include <asm/pgtable.h>
-
-#include <linux/swapops.h>
-#include <linux/elf.h>
-
-#ifndef CONFIG_NEED_MULTIPLE_NODES
-/* use the per-pgdat data instead for discontigmem - mbligh */
-unsigned long max_mapnr;
-struct page *mem_map;
-
-EXPORT_SYMBOL(max_mapnr);
-EXPORT_SYMBOL(mem_map);
-#endif
-
-unsigned long num_physpages;
-/*
- * A number of key systems in x86 including ioremap() rely on the assumption
- * that high_memory defines the upper bound on direct map memory, then end
- * of ZONE_NORMAL.  Under CONFIG_DISCONTIG this means that max_low_pfn and
- * highstart_pfn must be the same; there must be no gap between ZONE_NORMAL
- * and ZONE_HIGHMEM.
- */
-void * high_memory;
-unsigned long vmalloc_earlyreserve;
-
-EXPORT_SYMBOL(num_physpages);
-EXPORT_SYMBOL(high_memory);
-EXPORT_SYMBOL(vmalloc_earlyreserve);
-
-int randomize_va_space __read_mostly = 1;
-
-static int __init disable_randmaps(char *s)
-{
-       randomize_va_space = 0;
-       return 1;
-}
-__setup("norandmaps", disable_randmaps);
-
-
-/*
- * If a p?d_bad entry is found while walking page tables, report
- * the error, before resetting entry to p?d_none.  Usually (but
- * very seldom) called out from the p?d_none_or_clear_bad macros.
- */
-
-void pgd_clear_bad(pgd_t *pgd)
-{
-       pgd_ERROR(*pgd);
-       pgd_clear(pgd);
-}
-
-void pud_clear_bad(pud_t *pud)
-{
-       pud_ERROR(*pud);
-       pud_clear(pud);
-}
-
-void pmd_clear_bad(pmd_t *pmd)
-{
-       pmd_ERROR(*pmd);
-       pmd_clear(pmd);
-}
-
-/*
- * Note: this doesn't free the actual pages themselves. That
- * has been handled earlier when unmapping all the memory regions.
- */
-static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd)
-{
-       struct page *page = pmd_page(*pmd);
-       pmd_clear(pmd);
-       pte_lock_deinit(page);
-       pte_free_tlb(tlb, page);
-       dec_zone_page_state(page, NR_PAGETABLE);
-       tlb->mm->nr_ptes--;
-}
-
-static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
-                               unsigned long addr, unsigned long end,
-                               unsigned long floor, unsigned long ceiling)
-{
-       pmd_t *pmd;
-       unsigned long next;
-       unsigned long start;
-
-       start = addr;
-       pmd = pmd_offset(pud, addr);
-       do {
-               next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(pmd))
-                       continue;
-               free_pte_range(tlb, pmd);
-       } while (pmd++, addr = next, addr != end);
-
-       start &= PUD_MASK;
-       if (start < floor)
-               return;
-       if (ceiling) {
-               ceiling &= PUD_MASK;
-               if (!ceiling)
-                       return;
-       }
-       if (end - 1 > ceiling - 1)
-               return;
-
-       pmd = pmd_offset(pud, start);
-       pud_clear(pud);
-       pmd_free_tlb(tlb, pmd);
-}
-
-static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
-                               unsigned long addr, unsigned long end,
-                               unsigned long floor, unsigned long ceiling)
-{
-       pud_t *pud;
-       unsigned long next;
-       unsigned long start;
-
-       start = addr;
-       pud = pud_offset(pgd, addr);
-       do {
-               next = pud_addr_end(addr, end);
-               if (pud_none_or_clear_bad(pud))
-                       continue;
-               free_pmd_range(tlb, pud, addr, next, floor, ceiling);
-       } while (pud++, addr = next, addr != end);
-
-       start &= PGDIR_MASK;
-       if (start < floor)
-               return;
-       if (ceiling) {
-               ceiling &= PGDIR_MASK;
-               if (!ceiling)
-                       return;
-       }
-       if (end - 1 > ceiling - 1)
-               return;
-
-       pud = pud_offset(pgd, start);
-       pgd_clear(pgd);
-       pud_free_tlb(tlb, pud);
-}
-
-/*
- * This function frees user-level page tables of a process.
- *
- * Must be called with pagetable lock held.
- */
-void free_pgd_range(struct mmu_gather **tlb,
-                       unsigned long addr, unsigned long end,
-                       unsigned long floor, unsigned long ceiling)
-{
-       pgd_t *pgd;
-       unsigned long next;
-       unsigned long start;
-
-       /*
-        * The next few lines have given us lots of grief...
-        *
-        * Why are we testing PMD* at this top level?  Because often
-        * there will be no work to do at all, and we'd prefer not to
-        * go all the way down to the bottom just to discover that.
-        *
-        * Why all these "- 1"s?  Because 0 represents both the bottom
-        * of the address space and the top of it (using -1 for the
-        * top wouldn't help much: the masks would do the wrong thing).
-        * The rule is that addr 0 and floor 0 refer to the bottom of
-        * the address space, but end 0 and ceiling 0 refer to the top
-        * Comparisons need to use "end - 1" and "ceiling - 1" (though
-        * that end 0 case should be mythical).
-        *
-        * Wherever addr is brought up or ceiling brought down, we must
-        * be careful to reject "the opposite 0" before it confuses the
-        * subsequent tests.  But what about where end is brought down
-        * by PMD_SIZE below? no, end can't go down to 0 there.
-        *
-        * Whereas we round start (addr) and ceiling down, by different
-        * masks at different levels, in order to test whether a table
-        * now has no other vmas using it, so can be freed, we don't
-        * bother to round floor or end up - the tests don't need that.
-        */
-
-       addr &= PMD_MASK;
-       if (addr < floor) {
-               addr += PMD_SIZE;
-               if (!addr)
-                       return;
-       }
-       if (ceiling) {
-               ceiling &= PMD_MASK;
-               if (!ceiling)
-                       return;
-       }
-       if (end - 1 > ceiling - 1)
-               end -= PMD_SIZE;
-       if (addr > end - 1)
-               return;
-
-       start = addr;
-       pgd = pgd_offset((*tlb)->mm, addr);
-       do {
-               next = pgd_addr_end(addr, end);
-               if (pgd_none_or_clear_bad(pgd))
-                       continue;
-               free_pud_range(*tlb, pgd, addr, next, floor, ceiling);
-       } while (pgd++, addr = next, addr != end);
-
-       if (!(*tlb)->fullmm)
-               flush_tlb_pgtables((*tlb)->mm, start, end);
-}
-
-void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *vma,
-               unsigned long floor, unsigned long ceiling)
-{
-       while (vma) {
-               struct vm_area_struct *next = vma->vm_next;
-               unsigned long addr = vma->vm_start;
-
-               /*
-                * Hide vma from rmap and vmtruncate before freeing pgtables
-                */
-               anon_vma_unlink(vma);
-               unlink_file_vma(vma);
-
-               if (is_vm_hugetlb_page(vma)) {
-                       hugetlb_free_pgd_range(tlb, addr, vma->vm_end,
-                               floor, next? next->vm_start: ceiling);
-               } else {
-                       /*
-                        * Optimization: gather nearby vmas into one call down
-                        */
-                       while (next && next->vm_start <= vma->vm_end + PMD_SIZE
-                              && !is_vm_hugetlb_page(next)) {
-                               vma = next;
-                               next = vma->vm_next;
-                               anon_vma_unlink(vma);
-                               unlink_file_vma(vma);
-                       }
-                       free_pgd_range(tlb, addr, vma->vm_end,
-                               floor, next? next->vm_start: ceiling);
-               }
-               vma = next;
-       }
-}
-
-int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
-{
-       struct page *new = pte_alloc_one(mm, address);
-       if (!new)
-               return -ENOMEM;
-
-       pte_lock_init(new);
-       spin_lock(&mm->page_table_lock);
-       if (pmd_present(*pmd)) {        /* Another has populated it */
-               pte_lock_deinit(new);
-               pte_free(new);
-       } else {
-               mm->nr_ptes++;
-               inc_zone_page_state(new, NR_PAGETABLE);
-               pmd_populate(mm, pmd, new);
-       }
-       spin_unlock(&mm->page_table_lock);
-       return 0;
-}
-
-int __pte_alloc_kernel(pmd_t *pmd, unsigned long address)
-{
-       pte_t *new = pte_alloc_one_kernel(&init_mm, address);
-       if (!new)
-               return -ENOMEM;
-
-       spin_lock(&init_mm.page_table_lock);
-       if (pmd_present(*pmd))          /* Another has populated it */
-               pte_free_kernel(new);
-       else
-               pmd_populate_kernel(&init_mm, pmd, new);
-       spin_unlock(&init_mm.page_table_lock);
-       return 0;
-}
-
-static inline void add_mm_rss(struct mm_struct *mm, int file_rss, int anon_rss)
-{
-       if (file_rss)
-               add_mm_counter(mm, file_rss, file_rss);
-       if (anon_rss)
-               add_mm_counter(mm, anon_rss, anon_rss);
-}
-
-/*
- * This function is called to print an error when a bad pte
- * is found. For example, we might have a PFN-mapped pte in
- * a region that doesn't allow it.
- *
- * The calling function must still handle the error.
- */
-void print_bad_pte(struct vm_area_struct *vma, pte_t pte, unsigned long vaddr)
-{
-       printk(KERN_ERR "Bad pte = %08llx, process = %s, "
-                       "vm_flags = %lx, vaddr = %lx\n",
-               (long long)pte_val(pte),
-               (vma->vm_mm == current->mm ? current->comm : "???"),
-               vma->vm_flags, vaddr);
-       dump_stack();
-}
-
-static inline int is_cow_mapping(unsigned int flags)
-{
-       return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
-}
-
-/*
- * This function gets the "struct page" associated with a pte.
- *
- * NOTE! Some mappings do not have "struct pages". A raw PFN mapping
- * will have each page table entry just pointing to a raw page frame
- * number, and as far as the VM layer is concerned, those do not have
- * pages associated with them - even if the PFN might point to memory
- * that otherwise is perfectly fine and has a "struct page".
- *
- * The way we recognize those mappings is through the rules set up
- * by "remap_pfn_range()": the vma will have the VM_PFNMAP bit set,
- * and the vm_pgoff will point to the first PFN mapped: thus every
- * page that is a raw mapping will always honor the rule
- *
- *     pfn_of_page == vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT)
- *
- * and if that isn't true, the page has been COW'ed (in which case it
- * _does_ have a "struct page" associated with it even if it is in a
- * VM_PFNMAP range).
- */
-struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
-{
-       unsigned long pfn = pte_pfn(pte);
-
-       if (unlikely(vma->vm_flags & VM_PFNMAP)) {
-               unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT;
-               if (pfn == vma->vm_pgoff + off)
-                       return NULL;
-               if (!is_cow_mapping(vma->vm_flags))
-                       return NULL;
-       }
-
-       /*
-        * Add some anal sanity checks for now. Eventually,
-        * we should just do "return pfn_to_page(pfn)", but
-        * in the meantime we check that we get a valid pfn,
-        * and that the resulting page looks ok.
-        */
-       if (unlikely(!pfn_valid(pfn))) {
-               if (!(vma->vm_flags & VM_RESERVED))
-                       print_bad_pte(vma, pte, addr);
-               return NULL;
-       }
-
-       /*
-        * NOTE! We still have PageReserved() pages in the page 
-        * tables. 
-        *
-        * The PAGE_ZERO() pages and various VDSO mappings can
-        * cause them to exist.
-        */
-       return pfn_to_page(pfn);
-}
-
-/*
- * copy one vm_area from one task to the other. Assumes the page tables
- * already present in the new task to be cleared in the whole range
- * covered by this vma.
- */
-
-static inline void
-copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
-               pte_t *dst_pte, pte_t *src_pte, struct vm_area_struct *vma,
-               unsigned long addr, int *rss)
-{
-       unsigned long vm_flags = vma->vm_flags;
-       pte_t pte = *src_pte;
-       struct page *page;
-
-       /* pte contains position in swap or file, so copy. */
-       if (unlikely(!pte_present(pte))) {
-               if (!pte_file(pte)) {
-                       swp_entry_t entry = pte_to_swp_entry(pte);
-
-                       swap_duplicate(entry);
-                       /* make sure dst_mm is on swapoff's mmlist. */
-                       if (unlikely(list_empty(&dst_mm->mmlist))) {
-                               spin_lock(&mmlist_lock);
-                               if (list_empty(&dst_mm->mmlist))
-                                       list_add(&dst_mm->mmlist,
-                                                &src_mm->mmlist);
-                               spin_unlock(&mmlist_lock);
-                       }
-                       if (is_write_migration_entry(entry) &&
-                                       is_cow_mapping(vm_flags)) {
-                               /*
-                                * COW mappings require pages in both parent
-                                * and child to be set to read.
-                                */
-                               make_migration_entry_read(&entry);
-                               pte = swp_entry_to_pte(entry);
-                               set_pte_at(src_mm, addr, src_pte, pte);
-                       }
-               }
-               goto out_set_pte;
-       }
-
-       /*
-        * If it's a COW mapping, write protect it both
-        * in the parent and the child
-        */
-       if (is_cow_mapping(vm_flags)) {
-               ptep_set_wrprotect(src_mm, addr, src_pte);
-               pte = *src_pte;
-       }
-
-       /*
-        * If it's a shared mapping, mark it clean in
-        * the child
-        */
-       if (vm_flags & VM_SHARED)
-               pte = pte_mkclean(pte);
-       pte = pte_mkold(pte);
-
-       page = vm_normal_page(vma, addr, pte);
-       if (page) {
-               get_page(page);
-               page_dup_rmap(page);
-               rss[!!PageAnon(page)]++;
-       }
-
-out_set_pte:
-       set_pte_at(dst_mm, addr, dst_pte, pte);
-}
-
-static int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
-               pmd_t *dst_pmd, pmd_t *src_pmd, struct vm_area_struct *vma,
-               unsigned long addr, unsigned long end)
-{
-       pte_t *src_pte, *dst_pte;
-       spinlock_t *src_ptl, *dst_ptl;
-       int progress = 0;
-       int rss[2];
-
-again:
-       rss[1] = rss[0] = 0;
-       dst_pte = pte_alloc_map_lock(dst_mm, dst_pmd, addr, &dst_ptl);
-       if (!dst_pte)
-               return -ENOMEM;
-       src_pte = pte_offset_map_nested(src_pmd, addr);
-       src_ptl = pte_lockptr(src_mm, src_pmd);
-       spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING);
-
-       do {
-               /*
-                * We are holding two locks at this point - either of them
-                * could generate latencies in another task on another CPU.
-                */
-               if (progress >= 32) {
-                       progress = 0;
-                       if (need_resched() ||
-                           need_lockbreak(src_ptl) ||
-                           need_lockbreak(dst_ptl))
-                               break;
-               }
-               if (pte_none(*src_pte)) {
-                       progress++;
-                       continue;
-               }
-               copy_one_pte(dst_mm, src_mm, dst_pte, src_pte, vma, addr, rss);
-               progress += 8;
-       } while (dst_pte++, src_pte++, addr += PAGE_SIZE, addr != end);
-
-       spin_unlock(src_ptl);
-       pte_unmap_nested(src_pte - 1);
-       add_mm_rss(dst_mm, rss[0], rss[1]);
-       pte_unmap_unlock(dst_pte - 1, dst_ptl);
-       cond_resched();
-       if (addr != end)
-               goto again;
-       return 0;
-}
-
-static inline int copy_pmd_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
-               pud_t *dst_pud, pud_t *src_pud, struct vm_area_struct *vma,
-               unsigned long addr, unsigned long end)
-{
-       pmd_t *src_pmd, *dst_pmd;
-       unsigned long next;
-
-       dst_pmd = pmd_alloc(dst_mm, dst_pud, addr);
-       if (!dst_pmd)
-               return -ENOMEM;
-       src_pmd = pmd_offset(src_pud, addr);
-       do {
-               next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(src_pmd))
-                       continue;
-               if (copy_pte_range(dst_mm, src_mm, dst_pmd, src_pmd,
-                                               vma, addr, next))
-                       return -ENOMEM;
-       } while (dst_pmd++, src_pmd++, addr = next, addr != end);
-       return 0;
-}
-
-static inline int copy_pud_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
-               pgd_t *dst_pgd, pgd_t *src_pgd, struct vm_area_struct *vma,
-               unsigned long addr, unsigned long end)
-{
-       pud_t *src_pud, *dst_pud;
-       unsigned long next;
-
-       dst_pud = pud_alloc(dst_mm, dst_pgd, addr);
-       if (!dst_pud)
-               return -ENOMEM;
-       src_pud = pud_offset(src_pgd, addr);
-       do {
-               next = pud_addr_end(addr, end);
-               if (pud_none_or_clear_bad(src_pud))
-                       continue;
-               if (copy_pmd_range(dst_mm, src_mm, dst_pud, src_pud,
-                                               vma, addr, next))
-                       return -ENOMEM;
-       } while (dst_pud++, src_pud++, addr = next, addr != end);
-       return 0;
-}
-
-int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
-               struct vm_area_struct *vma)
-{
-       pgd_t *src_pgd, *dst_pgd;
-       unsigned long next;
-       unsigned long addr = vma->vm_start;
-       unsigned long end = vma->vm_end;
-
-       /*
-        * Don't copy ptes where a page fault will fill them correctly.
-        * Fork becomes much lighter when there are big shared or private
-        * readonly mappings. The tradeoff is that copy_page_range is more
-        * efficient than faulting.
-        */
-       if (!(vma->vm_flags & (VM_HUGETLB|VM_NONLINEAR|VM_PFNMAP|VM_INSERTPAGE))) {
-               if (!vma->anon_vma)
-                       return 0;
-       }
-
-       if (is_vm_hugetlb_page(vma))
-               return copy_hugetlb_page_range(dst_mm, src_mm, vma);
-
-       dst_pgd = pgd_offset(dst_mm, addr);
-       src_pgd = pgd_offset(src_mm, addr);
-       do {
-               next = pgd_addr_end(addr, end);
-               if (pgd_none_or_clear_bad(src_pgd))
-                       continue;
-               if (copy_pud_range(dst_mm, src_mm, dst_pgd, src_pgd,
-                                               vma, addr, next))
-                       return -ENOMEM;
-       } while (dst_pgd++, src_pgd++, addr = next, addr != end);
-       return 0;
-}
-
-static unsigned long zap_pte_range(struct mmu_gather *tlb,
-                               struct vm_area_struct *vma, pmd_t *pmd,
-                               unsigned long addr, unsigned long end,
-                               long *zap_work, struct zap_details *details)
-{
-       struct mm_struct *mm = tlb->mm;
-       pte_t *pte;
-       spinlock_t *ptl;
-       int file_rss = 0;
-       int anon_rss = 0;
-
-       pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
-       do {
-               pte_t ptent = *pte;
-               if (pte_none(ptent)) {
-                       (*zap_work)--;
-                       continue;
-               }
-
-               (*zap_work) -= PAGE_SIZE;
-
-               if (pte_present(ptent)) {
-                       struct page *page;
-
-                       page = vm_normal_page(vma, addr, ptent);
-                       if (unlikely(details) && page) {
-                               /*
-                                * unmap_shared_mapping_pages() wants to
-                                * invalidate cache without truncating:
-                                * unmap shared but keep private pages.
-                                */
-                               if (details->check_mapping &&
-                                   details->check_mapping != page->mapping)
-                                       continue;
-                               /*
-                                * Each page->index must be checked when
-                                * invalidating or truncating nonlinear.
-                                */
-                               if (details->nonlinear_vma &&
-                                   (page->index < details->first_index ||
-                                    page->index > details->last_index))
-                                       continue;
-                       }
-                       if (unlikely(vma->vm_ops && vma->vm_ops->zap_pte))
-                               ptent = vma->vm_ops->zap_pte(vma, addr, pte,
-                                                            tlb->fullmm);
-                       else
-                               ptent = ptep_get_and_clear_full(mm, addr, pte,
-                                                               tlb->fullmm);
-                       tlb_remove_tlb_entry(tlb, pte, addr);
-                       if (unlikely(!page))
-                               continue;
-                       if (unlikely(details) && details->nonlinear_vma
-                           && linear_page_index(details->nonlinear_vma,
-                                               addr) != page->index)
-                               set_pte_at(mm, addr, pte,
-                                          pgoff_to_pte(page->index));
-                       if (PageAnon(page))
-                               anon_rss--;
-                       else {
-                               if (pte_dirty(ptent))
-                                       set_page_dirty(page);
-                               if (pte_young(ptent))
-                                       mark_page_accessed(page);
-                               file_rss--;
-                       }
-                       page_remove_rmap(page);
-                       tlb_remove_page(tlb, page);
-                       continue;
-               }
-               /*
-                * If details->check_mapping, we leave swap entries;
-                * if details->nonlinear_vma, we leave file entries.
-                */
-               if (unlikely(details))
-                       continue;
-               if (!pte_file(ptent))
-                       free_swap_and_cache(pte_to_swp_entry(ptent));
-               pte_clear_full(mm, addr, pte, tlb->fullmm);
-       } while (pte++, addr += PAGE_SIZE, (addr != end && *zap_work > 0));
-
-       add_mm_rss(mm, file_rss, anon_rss);
-       pte_unmap_unlock(pte - 1, ptl);
-
-       return addr;
-}
-
-static inline unsigned long zap_pmd_range(struct mmu_gather *tlb,
-                               struct vm_area_struct *vma, pud_t *pud,
-                               unsigned long addr, unsigned long end,
-                               long *zap_work, struct zap_details *details)
-{
-       pmd_t *pmd;
-       unsigned long next;
-
-       pmd = pmd_offset(pud, addr);
-       do {
-               next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(pmd)) {
-                       (*zap_work)--;
-                       continue;
-               }
-               next = zap_pte_range(tlb, vma, pmd, addr, next,
-                                               zap_work, details);
-       } while (pmd++, addr = next, (addr != end && *zap_work > 0));
-
-       return addr;
-}
-
-static inline unsigned long zap_pud_range(struct mmu_gather *tlb,
-                               struct vm_area_struct *vma, pgd_t *pgd,
-                               unsigned long addr, unsigned long end,
-                               long *zap_work, struct zap_details *details)
-{
-       pud_t *pud;
-       unsigned long next;
-
-       pud = pud_offset(pgd, addr);
-       do {
-               next = pud_addr_end(addr, end);
-               if (pud_none_or_clear_bad(pud)) {
-                       (*zap_work)--;
-                       continue;
-               }
-               next = zap_pmd_range(tlb, vma, pud, addr, next,
-                                               zap_work, details);
-       } while (pud++, addr = next, (addr != end && *zap_work > 0));
-
-       return addr;
-}
-
-static unsigned long unmap_page_range(struct mmu_gather *tlb,
-                               struct vm_area_struct *vma,
-                               unsigned long addr, unsigned long end,
-                               long *zap_work, struct zap_details *details)
-{
-       pgd_t *pgd;
-       unsigned long next;
-
-       if (details && !details->check_mapping && !details->nonlinear_vma)
-               details = NULL;
-
-       BUG_ON(addr >= end);
-
-       tlb_start_vma(tlb, vma);
-       pgd = pgd_offset(vma->vm_mm, addr);
-       do {
-               next = pgd_addr_end(addr, end);
-               if (pgd_none_or_clear_bad(pgd)) {
-                       (*zap_work)--;
-                       continue;
-               }
-               next = zap_pud_range(tlb, vma, pgd, addr, next,
-                                               zap_work, details);
-       } while (pgd++, addr = next, (addr != end && *zap_work > 0));
-       tlb_end_vma(tlb, vma);
-
-       return addr;
-}
-
-#ifdef CONFIG_PREEMPT
-# define ZAP_BLOCK_SIZE        (8 * PAGE_SIZE)
-#else
-/* No preempt: go for improved straight-line efficiency */
-# define ZAP_BLOCK_SIZE        (1024 * PAGE_SIZE)
-#endif
-
-/**
- * unmap_vmas - unmap a range of memory covered by a list of vma's
- * @tlbp: address of the caller's struct mmu_gather
- * @vma: the starting vma
- * @start_addr: virtual address at which to start unmapping
- * @end_addr: virtual address at which to end unmapping
- * @nr_accounted: Place number of unmapped pages in vm-accountable vma's here
- * @details: details of nonlinear truncation or shared cache invalidation
- *
- * Returns the end address of the unmapping (restart addr if interrupted).
- *
- * Unmap all pages in the vma list.
- *
- * We aim to not hold locks for too long (for scheduling latency reasons).
- * So zap pages in ZAP_BLOCK_SIZE bytecounts.  This means we need to
- * return the ending mmu_gather to the caller.
- *
- * Only addresses between `start' and `end' will be unmapped.
- *
- * The VMA list must be sorted in ascending virtual address order.
- *
- * unmap_vmas() assumes that the caller will flush the whole unmapped address
- * range after unmap_vmas() returns.  So the only responsibility here is to
- * ensure that any thus-far unmapped pages are flushed before unmap_vmas()
- * drops the lock and schedules.
- */
-unsigned long unmap_vmas(struct mmu_gather **tlbp,
-               struct vm_area_struct *vma, unsigned long start_addr,
-               unsigned long end_addr, unsigned long *nr_accounted,
-               struct zap_details *details)
-{
-       long zap_work = ZAP_BLOCK_SIZE;
-       unsigned long tlb_start = 0;    /* For tlb_finish_mmu */
-       int tlb_start_valid = 0;
-       unsigned long start = start_addr;
-       spinlock_t *i_mmap_lock = details? details->i_mmap_lock: NULL;
-       int fullmm = (*tlbp)->fullmm;
-
-       for ( ; vma && vma->vm_start < end_addr; vma = vma->vm_next) {
-               unsigned long end;
-
-               start = max(vma->vm_start, start_addr);
-               if (start >= vma->vm_end)
-                       continue;
-               end = min(vma->vm_end, end_addr);
-               if (end <= vma->vm_start)
-                       continue;
-
-               if (vma->vm_flags & VM_ACCOUNT)
-                       *nr_accounted += (end - start) >> PAGE_SHIFT;
-
-               while (start != end) {
-                       if (!tlb_start_valid) {
-                               tlb_start = start;
-                               tlb_start_valid = 1;
-                       }
-
-                       if (unlikely(is_vm_hugetlb_page(vma))) {
-                               unmap_hugepage_range(vma, start, end);
-                               zap_work -= (end - start) /
-                                               (HPAGE_SIZE / PAGE_SIZE);
-                               start = end;
-                       } else
-                               start = unmap_page_range(*tlbp, vma,
-                                               start, end, &zap_work, details);
-
-                       if (zap_work > 0) {
-                               BUG_ON(start != end);
-                               break;
-                       }
-
-                       tlb_finish_mmu(*tlbp, tlb_start, start);
-
-                       if (need_resched() ||
-                               (i_mmap_lock && need_lockbreak(i_mmap_lock))) {
-                               if (i_mmap_lock) {
-                                       *tlbp = NULL;
-                                       goto out;
-                               }
-                               cond_resched();
-                       }
-
-                       *tlbp = tlb_gather_mmu(vma->vm_mm, fullmm);
-                       tlb_start_valid = 0;
-                       zap_work = ZAP_BLOCK_SIZE;
-               }
-       }
-out:
-       return start;   /* which is now the end (or restart) address */
-}
-
-/**
- * zap_page_range - remove user pages in a given range
- * @vma: vm_area_struct holding the applicable pages
- * @address: starting address of pages to zap
- * @size: number of bytes to zap
- * @details: details of nonlinear truncation or shared cache invalidation
- */
-unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
-               unsigned long size, struct zap_details *details)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       struct mmu_gather *tlb;
-       unsigned long end = address + size;
-       unsigned long nr_accounted = 0;
-
-       lru_add_drain();
-       tlb = tlb_gather_mmu(mm, 0);
-       update_hiwater_rss(mm);
-       end = unmap_vmas(&tlb, vma, address, end, &nr_accounted, details);
-       if (tlb)
-               tlb_finish_mmu(tlb, address, end);
-       return end;
-}
-EXPORT_SYMBOL(zap_page_range);
-
-/*
- * Do a quick page-table lookup for a single page.
- */
-struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
-                       unsigned int flags)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *ptep, pte;
-       spinlock_t *ptl;
-       struct page *page;
-       struct mm_struct *mm = vma->vm_mm;
-
-       page = follow_huge_addr(mm, address, flags & FOLL_WRITE);
-       if (!IS_ERR(page)) {
-               BUG_ON(flags & FOLL_GET);
-               goto out;
-       }
-
-       page = NULL;
-       pgd = pgd_offset(mm, address);
-       if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd)))
-               goto no_page_table;
-
-       pud = pud_offset(pgd, address);
-       if (pud_none(*pud) || unlikely(pud_bad(*pud)))
-               goto no_page_table;
-       
-       pmd = pmd_offset(pud, address);
-       if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd)))
-               goto no_page_table;
-
-       if (pmd_huge(*pmd)) {
-               BUG_ON(flags & FOLL_GET);
-               page = follow_huge_pmd(mm, address, pmd, flags & FOLL_WRITE);
-               goto out;
-       }
-
-       ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
-       if (!ptep)
-               goto out;
-
-       pte = *ptep;
-       if (!pte_present(pte))
-               goto unlock;
-       if ((flags & FOLL_WRITE) && !pte_write(pte))
-               goto unlock;
-       page = vm_normal_page(vma, address, pte);
-       if (unlikely(!page))
-               goto unlock;
-
-       if (flags & FOLL_GET)
-               get_page(page);
-       if (flags & FOLL_TOUCH) {
-               if ((flags & FOLL_WRITE) &&
-                   !pte_dirty(pte) && !PageDirty(page))
-                       set_page_dirty(page);
-               mark_page_accessed(page);
-       }
-unlock:
-       pte_unmap_unlock(ptep, ptl);
-out:
-       return page;
-
-no_page_table:
-       /*
-        * When core dumping an enormous anonymous area that nobody
-        * has touched so far, we don't want to allocate page tables.
-        */
-       if (flags & FOLL_ANON) {
-               page = ZERO_PAGE(address);
-               if (flags & FOLL_GET)
-                       get_page(page);
-               BUG_ON(flags & FOLL_WRITE);
-       }
-       return page;
-}
-
-int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
-               unsigned long start, int len, int write, int force,
-               struct page **pages, struct vm_area_struct **vmas)
-{
-       int i;
-       unsigned int vm_flags;
-
-       /* 
-        * Require read or write permissions.
-        * If 'force' is set, we only require the "MAY" flags.
-        */
-       vm_flags  = write ? (VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
-       vm_flags &= force ? (VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
-       i = 0;
-
-       do {
-               struct vm_area_struct *vma;
-               unsigned int foll_flags;
-
-               vma = find_extend_vma(mm, start);
-               if (!vma && in_gate_area(tsk, start)) {
-                       unsigned long pg = start & PAGE_MASK;
-                       struct vm_area_struct *gate_vma = get_gate_vma(tsk);
-                       pgd_t *pgd;
-                       pud_t *pud;
-                       pmd_t *pmd;
-                       pte_t *pte;
-                       if (write) /* user gate pages are read-only */
-                               return i ? : -EFAULT;
-                       if (pg > TASK_SIZE)
-                               pgd = pgd_offset_k(pg);
-                       else
-                               pgd = pgd_offset_gate(mm, pg);
-                       BUG_ON(pgd_none(*pgd));
-                       pud = pud_offset(pgd, pg);
-                       BUG_ON(pud_none(*pud));
-                       pmd = pmd_offset(pud, pg);
-                       if (pmd_none(*pmd))
-                               return i ? : -EFAULT;
-                       pte = pte_offset_map(pmd, pg);
-                       if (pte_none(*pte)) {
-                               pte_unmap(pte);
-                               return i ? : -EFAULT;
-                       }
-                       if (pages) {
-                               struct page *page = vm_normal_page(gate_vma, start, *pte);
-                               pages[i] = page;
-                               if (page)
-                                       get_page(page);
-                       }
-                       pte_unmap(pte);
-                       if (vmas)
-                               vmas[i] = gate_vma;
-                       i++;
-                       start += PAGE_SIZE;
-                       len--;
-                       continue;
-               }
-
-#ifdef CONFIG_XEN
-               if (vma && (vma->vm_flags & VM_FOREIGN)) {
-                       struct page **map = vma->vm_private_data;
-                       int offset = (start - vma->vm_start) >> PAGE_SHIFT;
-                       if (map[offset] != NULL) {
-                               if (pages) {
-                                       struct page *page = map[offset];
-                                       
-                                       pages[i] = page;
-                                       get_page(page);
-                               }
-                               if (vmas)
-                                       vmas[i] = vma;
-                               i++;
-                               start += PAGE_SIZE;
-                               len--;
-                               continue;
-                       }
-               }
-#endif
-               if (!vma || (vma->vm_flags & (VM_IO | VM_PFNMAP))
-                               || !(vm_flags & vma->vm_flags))
-                       return i ? : -EFAULT;
-
-               if (is_vm_hugetlb_page(vma)) {
-                       i = follow_hugetlb_page(mm, vma, pages, vmas,
-                                               &start, &len, i);
-                       continue;
-               }
-
-               foll_flags = FOLL_TOUCH;
-               if (pages)
-                       foll_flags |= FOLL_GET;
-               if (!write && !(vma->vm_flags & VM_LOCKED) &&
-                   (!vma->vm_ops || !vma->vm_ops->nopage))
-                       foll_flags |= FOLL_ANON;
-
-               do {
-                       struct page *page;
-
-                       if (write)
-                               foll_flags |= FOLL_WRITE;
-
-                       cond_resched();
-                       while (!(page = follow_page(vma, start, foll_flags))) {
-                               int ret;
-                               ret = __handle_mm_fault(mm, vma, start,
-                                               foll_flags & FOLL_WRITE);
-                               /*
-                                * The VM_FAULT_WRITE bit tells us that do_wp_page has
-                                * broken COW when necessary, even if maybe_mkwrite
-                                * decided not to set pte_write. We can thus safely do
-                                * subsequent page lookups as if they were reads.
-                                */
-                               if (ret & VM_FAULT_WRITE)
-                                       foll_flags &= ~FOLL_WRITE;
-                               
-                               switch (ret & ~VM_FAULT_WRITE) {
-                               case VM_FAULT_MINOR:
-                                       tsk->min_flt++;
-                                       break;
-                               case VM_FAULT_MAJOR:
-                                       tsk->maj_flt++;
-                                       break;
-                               case VM_FAULT_SIGBUS:
-                                       return i ? i : -EFAULT;
-                               case VM_FAULT_OOM:
-                                       return i ? i : -ENOMEM;
-                               default:
-                                       BUG();
-                               }
-                       }
-                       if (pages) {
-                               pages[i] = page;
-
-                               flush_anon_page(page, start);
-                               flush_dcache_page(page);
-                       }
-                       if (vmas)
-                               vmas[i] = vma;
-                       i++;
-                       start += PAGE_SIZE;
-                       len--;
-               } while (len && start < vma->vm_end);
-       } while (len);
-       return i;
-}
-EXPORT_SYMBOL(get_user_pages);
-
-static int zeromap_pte_range(struct mm_struct *mm, pmd_t *pmd,
-                       unsigned long addr, unsigned long end, pgprot_t prot)
-{
-       pte_t *pte;
-       spinlock_t *ptl;
-
-       pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
-       if (!pte)
-               return -ENOMEM;
-       do {
-               struct page *page = ZERO_PAGE(addr);
-               pte_t zero_pte = pte_wrprotect(mk_pte(page, prot));
-               page_cache_get(page);
-               page_add_file_rmap(page);
-               inc_mm_counter(mm, file_rss);
-               BUG_ON(!pte_none(*pte));
-               set_pte_at(mm, addr, pte, zero_pte);
-       } while (pte++, addr += PAGE_SIZE, addr != end);
-       pte_unmap_unlock(pte - 1, ptl);
-       return 0;
-}
-
-static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud,
-                       unsigned long addr, unsigned long end, pgprot_t prot)
-{
-       pmd_t *pmd;
-       unsigned long next;
-
-       pmd = pmd_alloc(mm, pud, addr);
-       if (!pmd)
-               return -ENOMEM;
-       do {
-               next = pmd_addr_end(addr, end);
-               if (zeromap_pte_range(mm, pmd, addr, next, prot))
-                       return -ENOMEM;
-       } while (pmd++, addr = next, addr != end);
-       return 0;
-}
-
-static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd,
-                       unsigned long addr, unsigned long end, pgprot_t prot)
-{
-       pud_t *pud;
-       unsigned long next;
-
-       pud = pud_alloc(mm, pgd, addr);
-       if (!pud)
-               return -ENOMEM;
-       do {
-               next = pud_addr_end(addr, end);
-               if (zeromap_pmd_range(mm, pud, addr, next, prot))
-                       return -ENOMEM;
-       } while (pud++, addr = next, addr != end);
-       return 0;
-}
-
-int zeromap_page_range(struct vm_area_struct *vma,
-                       unsigned long addr, unsigned long size, pgprot_t prot)
-{
-       pgd_t *pgd;
-       unsigned long next;
-       unsigned long end = addr + size;
-       struct mm_struct *mm = vma->vm_mm;
-       int err;
-
-       BUG_ON(addr >= end);
-       pgd = pgd_offset(mm, addr);
-       flush_cache_range(vma, addr, end);
-       do {
-               next = pgd_addr_end(addr, end);
-               err = zeromap_pud_range(mm, pgd, addr, next, prot);
-               if (err)
-                       break;
-       } while (pgd++, addr = next, addr != end);
-       return err;
-}
-
-pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
-{
-       pgd_t * pgd = pgd_offset(mm, addr);
-       pud_t * pud = pud_alloc(mm, pgd, addr);
-       if (pud) {
-               pmd_t * pmd = pmd_alloc(mm, pud, addr);
-               if (pmd)
-                       return pte_alloc_map_lock(mm, pmd, addr, ptl);
-       }
-       return NULL;
-}
-
-/*
- * This is the old fallback for page remapping.
- *
- * For historical reasons, it only allows reserved pages. Only
- * old drivers should use this, and they needed to mark their
- * pages reserved for the old functions anyway.
- */
-static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *page, pgprot_t prot)
-{
-       int retval;
-       pte_t *pte;
-       spinlock_t *ptl;  
-
-       retval = -EINVAL;
-       if (PageAnon(page))
-               goto out;
-       retval = -ENOMEM;
-       flush_dcache_page(page);
-       pte = get_locked_pte(mm, addr, &ptl);
-       if (!pte)
-               goto out;
-       retval = -EBUSY;
-       if (!pte_none(*pte))
-               goto out_unlock;
-
-       /* Ok, finally just insert the thing.. */
-       get_page(page);
-       inc_mm_counter(mm, file_rss);
-       page_add_file_rmap(page);
-       set_pte_at(mm, addr, pte, mk_pte(page, prot));
-
-       retval = 0;
-out_unlock:
-       pte_unmap_unlock(pte, ptl);
-out:
-       return retval;
-}
-
-/*
- * This allows drivers to insert individual pages they've allocated
- * into a user vma.
- *
- * The page has to be a nice clean _individual_ kernel allocation.
- * If you allocate a compound page, you need to have marked it as
- * such (__GFP_COMP), or manually just split the page up yourself
- * (see split_page()).
- *
- * NOTE! Traditionally this was done with "remap_pfn_range()" which
- * took an arbitrary page protection parameter. This doesn't allow
- * that. Your vma protection will have to be set up correctly, which
- * means that if you want a shared writable mapping, you'd better
- * ask for a shared writable mapping!
- *
- * The page does not need to be reserved.
- */
-int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, struct page *page)
-{
-       if (addr < vma->vm_start || addr >= vma->vm_end)
-               return -EFAULT;
-       if (!page_count(page))
-               return -EINVAL;
-       vma->vm_flags |= VM_INSERTPAGE;
-       return insert_page(vma->vm_mm, addr, page, vma->vm_page_prot);
-}
-EXPORT_SYMBOL(vm_insert_page);
-
-/*
- * maps a range of physical memory into the requested pages. the old
- * mappings are removed. any references to nonexistent pages results
- * in null mappings (currently treated as "copy-on-access")
- */
-static int remap_pte_range(struct mm_struct *mm, pmd_t *pmd,
-                       unsigned long addr, unsigned long end,
-                       unsigned long pfn, pgprot_t prot)
-{
-       pte_t *pte;
-       spinlock_t *ptl;
-
-       pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
-       if (!pte)
-               return -ENOMEM;
-       do {
-               BUG_ON(!pte_none(*pte));
-               set_pte_at(mm, addr, pte, pfn_pte(pfn, prot));
-               pfn++;
-       } while (pte++, addr += PAGE_SIZE, addr != end);
-       pte_unmap_unlock(pte - 1, ptl);
-       return 0;
-}
-
-static inline int remap_pmd_range(struct mm_struct *mm, pud_t *pud,
-                       unsigned long addr, unsigned long end,
-                       unsigned long pfn, pgprot_t prot)
-{
-       pmd_t *pmd;
-       unsigned long next;
-
-       pfn -= addr >> PAGE_SHIFT;
-       pmd = pmd_alloc(mm, pud, addr);
-       if (!pmd)
-               return -ENOMEM;
-       do {
-               next = pmd_addr_end(addr, end);
-               if (remap_pte_range(mm, pmd, addr, next,
-                               pfn + (addr >> PAGE_SHIFT), prot))
-                       return -ENOMEM;
-       } while (pmd++, addr = next, addr != end);
-       return 0;
-}
-
-static inline int remap_pud_range(struct mm_struct *mm, pgd_t *pgd,
-                       unsigned long addr, unsigned long end,
-                       unsigned long pfn, pgprot_t prot)
-{
-       pud_t *pud;
-       unsigned long next;
-
-       pfn -= addr >> PAGE_SHIFT;
-       pud = pud_alloc(mm, pgd, addr);
-       if (!pud)
-               return -ENOMEM;
-       do {
-               next = pud_addr_end(addr, end);
-               if (remap_pmd_range(mm, pud, addr, next,
-                               pfn + (addr >> PAGE_SHIFT), prot))
-                       return -ENOMEM;
-       } while (pud++, addr = next, addr != end);
-       return 0;
-}
-
-/*  Note: this is only safe if the mm semaphore is held when called. */
-int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
-                   unsigned long pfn, unsigned long size, pgprot_t prot)
-{
-       pgd_t *pgd;
-       unsigned long next;
-       unsigned long end = addr + PAGE_ALIGN(size);
-       struct mm_struct *mm = vma->vm_mm;
-       int err;
-
-       /*
-        * Physically remapped pages are special. Tell the
-        * rest of the world about it:
-        *   VM_IO tells people not to look at these pages
-        *      (accesses can have side effects).
-        *   VM_RESERVED is specified all over the place, because
-        *      in 2.4 it kept swapout's vma scan off this vma; but
-        *      in 2.6 the LRU scan won't even find its pages, so this
-        *      flag means no more than count its pages in reserved_vm,
-        *      and omit it from core dump, even when VM_IO turned off.
-        *   VM_PFNMAP tells the core MM that the base pages are just
-        *      raw PFN mappings, and do not have a "struct page" associated
-        *      with them.
-        *
-        * There's a horrible special case to handle copy-on-write
-        * behaviour that some programs depend on. We mark the "original"
-        * un-COW'ed pages by matching them up with "vma->vm_pgoff".
-        */
-       if (is_cow_mapping(vma->vm_flags)) {
-               if (addr != vma->vm_start || end != vma->vm_end)
-                       return -EINVAL;
-               vma->vm_pgoff = pfn;
-       }
-
-       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
-
-       BUG_ON(addr >= end);
-       pfn -= addr >> PAGE_SHIFT;
-       pgd = pgd_offset(mm, addr);
-       flush_cache_range(vma, addr, end);
-       do {
-               next = pgd_addr_end(addr, end);
-               err = remap_pud_range(mm, pgd, addr, next,
-                               pfn + (addr >> PAGE_SHIFT), prot);
-               if (err)
-                       break;
-       } while (pgd++, addr = next, addr != end);
-       return err;
-}
-EXPORT_SYMBOL(remap_pfn_range);
-
-#ifdef CONFIG_XEN
-static inline int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
-                                    unsigned long addr, unsigned long end,
-                                    pte_fn_t fn, void *data)
-{
-       pte_t *pte;
-       int err;
-       struct page *pmd_page;
-       spinlock_t *ptl;
-
-       pte = (mm == &init_mm) ?
-               pte_alloc_kernel(pmd, addr) :
-               pte_alloc_map_lock(mm, pmd, addr, &ptl);
-       if (!pte)
-               return -ENOMEM;
-
-       BUG_ON(pmd_huge(*pmd));
-
-       pmd_page = pmd_page(*pmd);
-
-       do {
-               err = fn(pte, pmd_page, addr, data);
-               if (err)
-                       break;
-       } while (pte++, addr += PAGE_SIZE, addr != end);
-
-       if (mm != &init_mm)
-               pte_unmap_unlock(pte-1, ptl);
-       return err;
-}
-
-static inline int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud,
-                                    unsigned long addr, unsigned long end,
-                                    pte_fn_t fn, void *data)
-{
-       pmd_t *pmd;
-       unsigned long next;
-       int err;
-
-       pmd = pmd_alloc(mm, pud, addr);
-       if (!pmd)
-               return -ENOMEM;
-       do {
-               next = pmd_addr_end(addr, end);
-               err = apply_to_pte_range(mm, pmd, addr, next, fn, data);
-               if (err)
-                       break;
-       } while (pmd++, addr = next, addr != end);
-       return err;
-}
-
-static inline int apply_to_pud_range(struct mm_struct *mm, pgd_t *pgd,
-                                    unsigned long addr, unsigned long end,
-                                    pte_fn_t fn, void *data)
-{
-       pud_t *pud;
-       unsigned long next;
-       int err;
-
-       pud = pud_alloc(mm, pgd, addr);
-       if (!pud)
-               return -ENOMEM;
-       do {
-               next = pud_addr_end(addr, end);
-               err = apply_to_pmd_range(mm, pud, addr, next, fn, data);
-               if (err)
-                       break;
-       } while (pud++, addr = next, addr != end);
-       return err;
-}
-
-/*
- * Scan a region of virtual memory, filling in page tables as necessary
- * and calling a provided function on each leaf page table.
- */
-int apply_to_page_range(struct mm_struct *mm, unsigned long addr,
-                       unsigned long size, pte_fn_t fn, void *data)
-{
-       pgd_t *pgd;
-       unsigned long next;
-       unsigned long end = addr + size;
-       int err;
-
-       BUG_ON(addr >= end);
-       pgd = pgd_offset(mm, addr);
-       do {
-               next = pgd_addr_end(addr, end);
-               err = apply_to_pud_range(mm, pgd, addr, next, fn, data);
-               if (err)
-                       break;
-       } while (pgd++, addr = next, addr != end);
-       return err;
-}
-EXPORT_SYMBOL_GPL(apply_to_page_range);
-#endif
-
-/*
- * handle_pte_fault chooses page fault handler according to an entry
- * which was read non-atomically.  Before making any commitment, on
- * those architectures or configurations (e.g. i386 with PAE) which
- * might give a mix of unmatched parts, do_swap_page and do_file_page
- * must check under lock before unmapping the pte and proceeding
- * (but do_wp_page is only called after already making such a check;
- * and do_anonymous_page and do_no_page can safely check later on).
- */
-static inline int pte_unmap_same(struct mm_struct *mm, pmd_t *pmd,
-                               pte_t *page_table, pte_t orig_pte)
-{
-       int same = 1;
-#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)
-       if (sizeof(pte_t) > sizeof(unsigned long)) {
-               spinlock_t *ptl = pte_lockptr(mm, pmd);
-               spin_lock(ptl);
-               same = pte_same(*page_table, orig_pte);
-               spin_unlock(ptl);
-       }
-#endif
-       pte_unmap(page_table);
-       return same;
-}
-
-/*
- * Do pte_mkwrite, but only if the vma says VM_WRITE.  We do this when
- * servicing faults for write access.  In the normal case, do always want
- * pte_mkwrite.  But get_user_pages can cause write faults for mappings
- * that do not have writing enabled, when used by access_process_vm.
- */
-static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_flags & VM_WRITE))
-               pte = pte_mkwrite(pte);
-       return pte;
-}
-
-static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va)
-{
-       /*
-        * If the source page was a PFN mapping, we don't have
-        * a "struct page" for it. We do a best-effort copy by
-        * just copying from the original user address. If that
-        * fails, we just zero-fill it. Live with it.
-        */
-       if (unlikely(!src)) {
-               void *kaddr = kmap_atomic(dst, KM_USER0);
-               void __user *uaddr = (void __user *)(va & PAGE_MASK);
-
-               /*
-                * This really shouldn't fail, because the page is there
-                * in the page tables. But it might just be unreadable,
-                * in which case we just give up and fill the result with
-                * zeroes.
-                */
-               if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
-                       memset(kaddr, 0, PAGE_SIZE);
-               kunmap_atomic(kaddr, KM_USER0);
-               return;
-               
-       }
-       copy_user_highpage(dst, src, va);
-}
-
-/*
- * This routine handles present pages, when users try to write
- * to a shared page. It is done by copying the page to a new address
- * and decrementing the shared-page counter for the old page.
- *
- * Note that this routine assumes that the protection checks have been
- * done by the caller (the low-level page fault routine in most cases).
- * Thus we can safely just mark it writable once we've done any necessary
- * COW.
- *
- * We also mark the page dirty at this point even though the page will
- * change only once the write actually happens. This avoids a few races,
- * and potentially makes it more efficient.
- *
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), with pte both mapped and locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, pte_t *page_table, pmd_t *pmd,
-               spinlock_t *ptl, pte_t orig_pte)
-{
-       struct page *old_page, *new_page;
-       pte_t entry;
-       int reuse, ret = VM_FAULT_MINOR;
-
-       old_page = vm_normal_page(vma, address, orig_pte);
-       if (!old_page)
-               goto gotten;
-
-       if (unlikely((vma->vm_flags & (VM_SHARED|VM_WRITE)) ==
-                               (VM_SHARED|VM_WRITE))) {
-               if (vma->vm_ops && vma->vm_ops->page_mkwrite) {
-                       /*
-                        * Notify the address space that the page is about to
-                        * become writable so that it can prohibit this or wait
-                        * for the page to get into an appropriate state.
-                        *
-                        * We do this without the lock held, so that it can
-                        * sleep if it needs to.
-                        */
-                       page_cache_get(old_page);
-                       pte_unmap_unlock(page_table, ptl);
-
-                       if (vma->vm_ops->page_mkwrite(vma, old_page) < 0)
-                               goto unwritable_page;
-
-                       page_cache_release(old_page);
-
-                       /*
-                        * Since we dropped the lock we need to revalidate
-                        * the PTE as someone else may have changed it.  If
-                        * they did, we just return, as we can count on the
-                        * MMU to tell us if they didn't also make it writable.
-                        */
-                       page_table = pte_offset_map_lock(mm, pmd, address,
-                                                        &ptl);
-                       if (!pte_same(*page_table, orig_pte))
-                               goto unlock;
-               }
-
-               reuse = 1;
-       } else if (PageAnon(old_page) && !TestSetPageLocked(old_page)) {
-               reuse = can_share_swap_page(old_page);
-               unlock_page(old_page);
-       } else {
-               reuse = 0;
-       }
-
-       if (reuse) {
-               flush_cache_page(vma, address, pte_pfn(orig_pte));
-               entry = pte_mkyoung(orig_pte);
-               entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-               ptep_set_access_flags(vma, address, page_table, entry, 1);
-               update_mmu_cache(vma, address, entry);
-               lazy_mmu_prot_update(entry);
-               ret |= VM_FAULT_WRITE;
-               goto unlock;
-       }
-
-       /*
-        * Ok, we need to copy. Oh, well..
-        */
-       page_cache_get(old_page);
-gotten:
-       pte_unmap_unlock(page_table, ptl);
-
-       if (unlikely(anon_vma_prepare(vma)))
-               goto oom;
-       if (old_page == ZERO_PAGE(address)) {
-               new_page = alloc_zeroed_user_highpage(vma, address);
-               if (!new_page)
-                       goto oom;
-       } else {
-               new_page = alloc_page_vma(GFP_HIGHUSER, vma, address);
-               if (!new_page)
-                       goto oom;
-               cow_user_page(new_page, old_page, address);
-       }
-
-       /*
-        * Re-check the pte - we dropped the lock
-        */
-       page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
-       if (likely(pte_same(*page_table, orig_pte))) {
-               if (old_page) {
-                       page_remove_rmap(old_page);
-                       if (!PageAnon(old_page)) {
-                               dec_mm_counter(mm, file_rss);
-                               inc_mm_counter(mm, anon_rss);
-                       }
-               } else
-                       inc_mm_counter(mm, anon_rss);
-               flush_cache_page(vma, address, pte_pfn(orig_pte));
-               entry = mk_pte(new_page, vma->vm_page_prot);
-               entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-               lazy_mmu_prot_update(entry);
-               ptep_establish(vma, address, page_table, entry);
-               update_mmu_cache(vma, address, entry);
-               lru_cache_add_active(new_page);
-               page_add_new_anon_rmap(new_page, vma, address);
-
-               /* Free the old page.. */
-               new_page = old_page;
-               ret |= VM_FAULT_WRITE;
-       }
-       if (new_page)
-               page_cache_release(new_page);
-       if (old_page)
-               page_cache_release(old_page);
-unlock:
-       pte_unmap_unlock(page_table, ptl);
-       return ret;
-oom:
-       if (old_page)
-               page_cache_release(old_page);
-       return VM_FAULT_OOM;
-
-unwritable_page:
-       page_cache_release(old_page);
-       return VM_FAULT_SIGBUS;
-}
-
-/*
- * Helper functions for unmap_mapping_range().
- *
- * __ Notes on dropping i_mmap_lock to reduce latency while unmapping __
- *
- * We have to restart searching the prio_tree whenever we drop the lock,
- * since the iterator is only valid while the lock is held, and anyway
- * a later vma might be split and reinserted earlier while lock dropped.
- *
- * The list of nonlinear vmas could be handled more efficiently, using
- * a placeholder, but handle it in the same way until a need is shown.
- * It is important to search the prio_tree before nonlinear list: a vma
- * may become nonlinear and be shifted from prio_tree to nonlinear list
- * while the lock is dropped; but never shifted from list to prio_tree.
- *
- * In order to make forward progress despite restarting the search,
- * vm_truncate_count is used to mark a vma as now dealt with, so we can
- * quickly skip it next time around.  Since the prio_tree search only
- * shows us those vmas affected by unmapping the range in question, we
- * can't efficiently keep all vmas in step with mapping->truncate_count:
- * so instead reset them all whenever it wraps back to 0 (then go to 1).
- * mapping->truncate_count and vma->vm_truncate_count are protected by
- * i_mmap_lock.
- *
- * In order to make forward progress despite repeatedly restarting some
- * large vma, note the restart_addr from unmap_vmas when it breaks out:
- * and restart from that address when we reach that vma again.  It might
- * have been split or merged, shrunk or extended, but never shifted: so
- * restart_addr remains valid so long as it remains in the vma's range.
- * unmap_mapping_range forces truncate_count to leap over page-aligned
- * values so we can save vma's restart_addr in its truncate_count field.
- */
-#define is_restart_addr(truncate_count) (!((truncate_count) & ~PAGE_MASK))
-
-static void reset_vma_truncate_counts(struct address_space *mapping)
-{
-       struct vm_area_struct *vma;
-       struct prio_tree_iter iter;
-
-       vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, 0, ULONG_MAX)
-               vma->vm_truncate_count = 0;
-       list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.vm_set.list)
-               vma->vm_truncate_count = 0;
-}
-
-static int unmap_mapping_range_vma(struct vm_area_struct *vma,
-               unsigned long start_addr, unsigned long end_addr,
-               struct zap_details *details)
-{
-       unsigned long restart_addr;
-       int need_break;
-
-again:
-       restart_addr = vma->vm_truncate_count;
-       if (is_restart_addr(restart_addr) && start_addr < restart_addr) {
-               start_addr = restart_addr;
-               if (start_addr >= end_addr) {
-                       /* Top of vma has been split off since last time */
-                       vma->vm_truncate_count = details->truncate_count;
-                       return 0;
-               }
-       }
-
-       restart_addr = zap_page_range(vma, start_addr,
-                                       end_addr - start_addr, details);
-       need_break = need_resched() ||
-                       need_lockbreak(details->i_mmap_lock);
-
-       if (restart_addr >= end_addr) {
-               /* We have now completed this vma: mark it so */
-               vma->vm_truncate_count = details->truncate_count;
-               if (!need_break)
-                       return 0;
-       } else {
-               /* Note restart_addr in vma's truncate_count field */
-               vma->vm_truncate_count = restart_addr;
-               if (!need_break)
-                       goto again;
-       }
-
-       spin_unlock(details->i_mmap_lock);
-       cond_resched();
-       spin_lock(details->i_mmap_lock);
-       return -EINTR;
-}
-
-static inline void unmap_mapping_range_tree(struct prio_tree_root *root,
-                                           struct zap_details *details)
-{
-       struct vm_area_struct *vma;
-       struct prio_tree_iter iter;
-       pgoff_t vba, vea, zba, zea;
-
-restart:
-       vma_prio_tree_foreach(vma, &iter, root,
-                       details->first_index, details->last_index) {
-               /* Skip quickly over those we have already dealt with */
-               if (vma->vm_truncate_count == details->truncate_count)
-                       continue;
-
-               vba = vma->vm_pgoff;
-               vea = vba + ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) - 1;
-               /* Assume for now that PAGE_CACHE_SHIFT == PAGE_SHIFT */
-               zba = details->first_index;
-               if (zba < vba)
-                       zba = vba;
-               zea = details->last_index;
-               if (zea > vea)
-                       zea = vea;
-
-               if (unmap_mapping_range_vma(vma,
-                       ((zba - vba) << PAGE_SHIFT) + vma->vm_start,
-                       ((zea - vba + 1) << PAGE_SHIFT) + vma->vm_start,
-                               details) < 0)
-                       goto restart;
-       }
-}
-
-static inline void unmap_mapping_range_list(struct list_head *head,
-                                           struct zap_details *details)
-{
-       struct vm_area_struct *vma;
-
-       /*
-        * In nonlinear VMAs there is no correspondence between virtual address
-        * offset and file offset.  So we must perform an exhaustive search
-        * across *all* the pages in each nonlinear VMA, not just the pages
-        * whose virtual address lies outside the file truncation point.
-        */
-restart:
-       list_for_each_entry(vma, head, shared.vm_set.list) {
-               /* Skip quickly over those we have already dealt with */
-               if (vma->vm_truncate_count == details->truncate_count)
-                       continue;
-               details->nonlinear_vma = vma;
-               if (unmap_mapping_range_vma(vma, vma->vm_start,
-                                       vma->vm_end, details) < 0)
-                       goto restart;
-       }
-}
-
-/**
- * unmap_mapping_range - unmap the portion of all mmaps
- * in the specified address_space corresponding to the specified
- * page range in the underlying file.
- * @mapping: the address space containing mmaps to be unmapped.
- * @holebegin: byte in first page to unmap, relative to the start of
- * the underlying file.  This will be rounded down to a PAGE_SIZE
- * boundary.  Note that this is different from vmtruncate(), which
- * must keep the partial page.  In contrast, we must get rid of
- * partial pages.
- * @holelen: size of prospective hole in bytes.  This will be rounded
- * up to a PAGE_SIZE boundary.  A holelen of zero truncates to the
- * end of the file.
- * @even_cows: 1 when truncating a file, unmap even private COWed pages;
- * but 0 when invalidating pagecache, don't throw away private data.
- */
-void unmap_mapping_range(struct address_space *mapping,
-               loff_t const holebegin, loff_t const holelen, int even_cows)
-{
-       struct zap_details details;
-       pgoff_t hba = holebegin >> PAGE_SHIFT;
-       pgoff_t hlen = (holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       /* Check for overflow. */
-       if (sizeof(holelen) > sizeof(hlen)) {
-               long long holeend =
-                       (holebegin + holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
-               if (holeend & ~(long long)ULONG_MAX)
-                       hlen = ULONG_MAX - hba + 1;
-       }
-
-       details.check_mapping = even_cows? NULL: mapping;
-       details.nonlinear_vma = NULL;
-       details.first_index = hba;
-       details.last_index = hba + hlen - 1;
-       if (details.last_index < details.first_index)
-               details.last_index = ULONG_MAX;
-       details.i_mmap_lock = &mapping->i_mmap_lock;
-
-       spin_lock(&mapping->i_mmap_lock);
-
-       /* serialize i_size write against truncate_count write */
-       smp_wmb();
-       /* Protect against page faults, and endless unmapping loops */
-       mapping->truncate_count++;
-       /*
-        * For archs where spin_lock has inclusive semantics like ia64
-        * this smp_mb() will prevent to read pagetable contents
-        * before the truncate_count increment is visible to
-        * other cpus.
-        */
-       smp_mb();
-       if (unlikely(is_restart_addr(mapping->truncate_count))) {
-               if (mapping->truncate_count == 0)
-                       reset_vma_truncate_counts(mapping);
-               mapping->truncate_count++;
-       }
-       details.truncate_count = mapping->truncate_count;
-
-       if (unlikely(!prio_tree_empty(&mapping->i_mmap)))
-               unmap_mapping_range_tree(&mapping->i_mmap, &details);
-       if (unlikely(!list_empty(&mapping->i_mmap_nonlinear)))
-               unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details);
-       spin_unlock(&mapping->i_mmap_lock);
-}
-EXPORT_SYMBOL(unmap_mapping_range);
-
-/*
- * Handle all mappings that got truncated by a "truncate()"
- * system call.
- *
- * NOTE! We have to be ready to update the memory sharing
- * between the file and the memory map for a potential last
- * incomplete page.  Ugly, but necessary.
- */
-int vmtruncate(struct inode * inode, loff_t offset)
-{
-       struct address_space *mapping = inode->i_mapping;
-       unsigned long limit;
-
-       if (inode->i_size < offset)
-               goto do_expand;
-       /*
-        * truncation of in-use swapfiles is disallowed - it would cause
-        * subsequent swapout to scribble on the now-freed blocks.
-        */
-       if (IS_SWAPFILE(inode))
-               goto out_busy;
-       i_size_write(inode, offset);
-       unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
-       truncate_inode_pages(mapping, offset);
-       goto out_truncate;
-
-do_expand:
-       limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
-       if (limit != RLIM_INFINITY && offset > limit)
-               goto out_sig;
-       if (offset > inode->i_sb->s_maxbytes)
-               goto out_big;
-       i_size_write(inode, offset);
-
-out_truncate:
-       if (inode->i_op && inode->i_op->truncate)
-               inode->i_op->truncate(inode);
-       return 0;
-out_sig:
-       send_sig(SIGXFSZ, current, 0);
-out_big:
-       return -EFBIG;
-out_busy:
-       return -ETXTBSY;
-}
-EXPORT_SYMBOL(vmtruncate);
-
-int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end)
-{
-       struct address_space *mapping = inode->i_mapping;
-
-       /*
-        * If the underlying filesystem is not going to provide
-        * a way to truncate a range of blocks (punch a hole) -
-        * we should return failure right now.
-        */
-       if (!inode->i_op || !inode->i_op->truncate_range)
-               return -ENOSYS;
-
-       mutex_lock(&inode->i_mutex);
-       down_write(&inode->i_alloc_sem);
-       unmap_mapping_range(mapping, offset, (end - offset), 1);
-       truncate_inode_pages_range(mapping, offset, end);
-       inode->i_op->truncate_range(inode, offset, end);
-       up_write(&inode->i_alloc_sem);
-       mutex_unlock(&inode->i_mutex);
-
-       return 0;
-}
-EXPORT_UNUSED_SYMBOL(vmtruncate_range);  /*  June 2006  */
-
-/* 
- * Primitive swap readahead code. We simply read an aligned block of
- * (1 << page_cluster) entries in the swap area. This method is chosen
- * because it doesn't cost us any seek time.  We also make sure to queue
- * the 'original' request together with the readahead ones...  
- *
- * This has been extended to use the NUMA policies from the mm triggering
- * the readahead.
- *
- * Caller must hold down_read on the vma->vm_mm if vma is not NULL.
- */
-void swapin_readahead(swp_entry_t entry, unsigned long addr,struct vm_area_struct *vma)
-{
-#ifdef CONFIG_NUMA
-       struct vm_area_struct *next_vma = vma ? vma->vm_next : NULL;
-#endif
-       int i, num;
-       struct page *new_page;
-       unsigned long offset;
-
-       /*
-        * Get the number of handles we should do readahead io to.
-        */
-       num = valid_swaphandles(entry, &offset);
-       for (i = 0; i < num; offset++, i++) {
-               /* Ok, do the async read-ahead now */
-               new_page = read_swap_cache_async(swp_entry(swp_type(entry),
-                                                          offset), vma, addr);
-               if (!new_page)
-                       break;
-               page_cache_release(new_page);
-#ifdef CONFIG_NUMA
-               /*
-                * Find the next applicable VMA for the NUMA policy.
-                */
-               addr += PAGE_SIZE;
-               if (addr == 0)
-                       vma = NULL;
-               if (vma) {
-                       if (addr >= vma->vm_end) {
-                               vma = next_vma;
-                               next_vma = vma ? vma->vm_next : NULL;
-                       }
-                       if (vma && addr < vma->vm_start)
-                               vma = NULL;
-               } else {
-                       if (next_vma && addr >= next_vma->vm_start) {
-                               vma = next_vma;
-                               next_vma = vma->vm_next;
-                       }
-               }
-#endif
-       }
-       lru_add_drain();        /* Push any new pages onto the LRU now */
-}
-
-/*
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), and pte mapped but not yet locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, pte_t *page_table, pmd_t *pmd,
-               int write_access, pte_t orig_pte)
-{
-       spinlock_t *ptl;
-       struct page *page;
-       swp_entry_t entry;
-       pte_t pte;
-       int ret = VM_FAULT_MINOR;
-
-       if (!pte_unmap_same(mm, pmd, page_table, orig_pte))
-               goto out;
-
-       entry = pte_to_swp_entry(orig_pte);
-       if (is_migration_entry(entry)) {
-               migration_entry_wait(mm, pmd, address);
-               goto out;
-       }
-       delayacct_set_flag(DELAYACCT_PF_SWAPIN);
-       page = lookup_swap_cache(entry);
-       if (!page) {
-               swapin_readahead(entry, address, vma);
-               page = read_swap_cache_async(entry, vma, address);
-               if (!page) {
-                       /*
-                        * Back out if somebody else faulted in this pte
-                        * while we released the pte lock.
-                        */
-                       page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
-                       if (likely(pte_same(*page_table, orig_pte)))
-                               ret = VM_FAULT_OOM;
-                       delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
-                       goto unlock;
-               }
-
-               /* Had to read the page from swap area: Major fault */
-               ret = VM_FAULT_MAJOR;
-               count_vm_event(PGMAJFAULT);
-               grab_swap_token();
-       }
-
-       delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
-       mark_page_accessed(page);
-       lock_page(page);
-
-       /*
-        * Back out if somebody else already faulted in this pte.
-        */
-       page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
-       if (unlikely(!pte_same(*page_table, orig_pte)))
-               goto out_nomap;
-
-       if (unlikely(!PageUptodate(page))) {
-               ret = VM_FAULT_SIGBUS;
-               goto out_nomap;
-       }
-
-       /* The page isn't present yet, go ahead with the fault. */
-
-       inc_mm_counter(mm, anon_rss);
-       pte = mk_pte(page, vma->vm_page_prot);
-       if (write_access && can_share_swap_page(page)) {
-               pte = maybe_mkwrite(pte_mkdirty(pte), vma);
-               write_access = 0;
-       }
-
-       flush_icache_page(vma, page);
-       set_pte_at(mm, address, page_table, pte);
-       page_add_anon_rmap(page, vma, address);
-
-       swap_free(entry);
-       if (vm_swap_full())
-               remove_exclusive_swap_page(page);
-       unlock_page(page);
-
-       if (write_access) {
-               if (do_wp_page(mm, vma, address,
-                               page_table, pmd, ptl, pte) == VM_FAULT_OOM)
-                       ret = VM_FAULT_OOM;
-               goto out;
-       }
-
-       /* No need to invalidate - it was non-present before */
-       update_mmu_cache(vma, address, pte);
-       lazy_mmu_prot_update(pte);
-unlock:
-       pte_unmap_unlock(page_table, ptl);
-out:
-       return ret;
-out_nomap:
-       pte_unmap_unlock(page_table, ptl);
-       unlock_page(page);
-       page_cache_release(page);
-       return ret;
-}
-
-/*
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), and pte mapped but not yet locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, pte_t *page_table, pmd_t *pmd,
-               int write_access)
-{
-       struct page *page;
-       spinlock_t *ptl;
-       pte_t entry;
-
-       if (write_access) {
-               /* Allocate our own private page. */
-               pte_unmap(page_table);
-
-               if (unlikely(anon_vma_prepare(vma)))
-                       goto oom;
-               page = alloc_zeroed_user_highpage(vma, address);
-               if (!page)
-                       goto oom;
-
-               entry = mk_pte(page, vma->vm_page_prot);
-               entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-
-               page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
-               if (!pte_none(*page_table))
-                       goto release;
-               inc_mm_counter(mm, anon_rss);
-               lru_cache_add_active(page);
-               page_add_new_anon_rmap(page, vma, address);
-       } else {
-               /* Map the ZERO_PAGE - vm_page_prot is readonly */
-               page = ZERO_PAGE(address);
-               page_cache_get(page);
-               entry = mk_pte(page, vma->vm_page_prot);
-
-               ptl = pte_lockptr(mm, pmd);
-               spin_lock(ptl);
-               if (!pte_none(*page_table))
-                       goto release;
-               inc_mm_counter(mm, file_rss);
-               page_add_file_rmap(page);
-       }
-
-       set_pte_at(mm, address, page_table, entry);
-
-       /* No need to invalidate - it was non-present before */
-       update_mmu_cache(vma, address, entry);
-       lazy_mmu_prot_update(entry);
-unlock:
-       pte_unmap_unlock(page_table, ptl);
-       return VM_FAULT_MINOR;
-release:
-       page_cache_release(page);
-       goto unlock;
-oom:
-       return VM_FAULT_OOM;
-}
-
-/*
- * do_no_page() tries to create a new page mapping. It aggressively
- * tries to share with existing pages, but makes a separate copy if
- * the "write_access" parameter is true in order to avoid the next
- * page fault.
- *
- * As this is called only for pages that do not currently exist, we
- * do not need to flush old virtual caches or the TLB.
- *
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), and pte mapped but not yet locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, pte_t *page_table, pmd_t *pmd,
-               int write_access)
-{
-       spinlock_t *ptl;
-       struct page *new_page;
-       struct address_space *mapping = NULL;
-       pte_t entry;
-       unsigned int sequence = 0;
-       int ret = VM_FAULT_MINOR;
-       int anon = 0;
-
-       pte_unmap(page_table);
-       BUG_ON(vma->vm_flags & VM_PFNMAP);
-
-       if (vma->vm_file) {
-               mapping = vma->vm_file->f_mapping;
-               sequence = mapping->truncate_count;
-               smp_rmb(); /* serializes i_size against truncate_count */
-       }
-retry:
-       new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, &ret);
-       /*
-        * No smp_rmb is needed here as long as there's a full
-        * spin_lock/unlock sequence inside the ->nopage callback
-        * (for the pagecache lookup) that acts as an implicit
-        * smp_mb() and prevents the i_size read to happen
-        * after the next truncate_count read.
-        */
-
-       /* no page was available -- either SIGBUS or OOM */
-       if (new_page == NOPAGE_SIGBUS)
-               return VM_FAULT_SIGBUS;
-       if (new_page == NOPAGE_OOM)
-               return VM_FAULT_OOM;
-
-       /*
-        * Should we do an early C-O-W break?
-        */
-       if (write_access) {
-               if (!(vma->vm_flags & VM_SHARED)) {
-                       struct page *page;
-
-                       if (unlikely(anon_vma_prepare(vma)))
-                               goto oom;
-                       page = alloc_page_vma(GFP_HIGHUSER, vma, address);
-                       if (!page)
-                               goto oom;
-                       copy_user_highpage(page, new_page, address);
-                       page_cache_release(new_page);
-                       new_page = page;
-                       anon = 1;
-
-               } else {
-                       /* if the page will be shareable, see if the backing
-                        * address space wants to know that the page is about
-                        * to become writable */
-                       if (vma->vm_ops->page_mkwrite &&
-                           vma->vm_ops->page_mkwrite(vma, new_page) < 0
-                           ) {
-                               page_cache_release(new_page);
-                               return VM_FAULT_SIGBUS;
-                       }
-               }
-       }
-
-       page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
-       /*
-        * For a file-backed vma, someone could have truncated or otherwise
-        * invalidated this page.  If unmap_mapping_range got called,
-        * retry getting the page.
-        */
-       if (mapping && unlikely(sequence != mapping->truncate_count)) {
-               pte_unmap_unlock(page_table, ptl);
-               page_cache_release(new_page);
-               cond_resched();
-               sequence = mapping->truncate_count;
-               smp_rmb();
-               goto retry;
-       }
-
-       /*
-        * This silly early PAGE_DIRTY setting removes a race
-        * due to the bad i386 page protection. But it's valid
-        * for other architectures too.
-        *
-        * Note that if write_access is true, we either now have
-        * an exclusive copy of the page, or this is a shared mapping,
-        * so we can make it writable and dirty to avoid having to
-        * handle that later.
-        */
-       /* Only go through if we didn't race with anybody else... */
-       if (pte_none(*page_table)) {
-               flush_icache_page(vma, new_page);
-               entry = mk_pte(new_page, vma->vm_page_prot);
-               if (write_access)
-                       entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-               set_pte_at(mm, address, page_table, entry);
-               if (anon) {
-                       inc_mm_counter(mm, anon_rss);
-                       lru_cache_add_active(new_page);
-                       page_add_new_anon_rmap(new_page, vma, address);
-               } else {
-                       inc_mm_counter(mm, file_rss);
-                       page_add_file_rmap(new_page);
-               }
-       } else {
-               /* One of our sibling threads was faster, back out. */
-               page_cache_release(new_page);
-               goto unlock;
-       }
-
-       /* no need to invalidate: a not-present page shouldn't be cached */
-       update_mmu_cache(vma, address, entry);
-       lazy_mmu_prot_update(entry);
-unlock:
-       pte_unmap_unlock(page_table, ptl);
-       return ret;
-oom:
-       page_cache_release(new_page);
-       return VM_FAULT_OOM;
-}
-
-/*
- * Fault of a previously existing named mapping. Repopulate the pte
- * from the encoded file_pte if possible. This enables swappable
- * nonlinear vmas.
- *
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), and pte mapped but not yet locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static int do_file_page(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, pte_t *page_table, pmd_t *pmd,
-               int write_access, pte_t orig_pte)
-{
-       pgoff_t pgoff;
-       int err;
-
-       if (!pte_unmap_same(mm, pmd, page_table, orig_pte))
-               return VM_FAULT_MINOR;
-
-       if (unlikely(!(vma->vm_flags & VM_NONLINEAR))) {
-               /*
-                * Page table corrupted: show pte and kill process.
-                */
-               print_bad_pte(vma, orig_pte, address);
-               return VM_FAULT_OOM;
-       }
-       /* We can then assume vm->vm_ops && vma->vm_ops->populate */
-
-       pgoff = pte_to_pgoff(orig_pte);
-       err = vma->vm_ops->populate(vma, address & PAGE_MASK, PAGE_SIZE,
-                                       vma->vm_page_prot, pgoff, 0);
-       if (err == -ENOMEM)
-               return VM_FAULT_OOM;
-       if (err)
-               return VM_FAULT_SIGBUS;
-       return VM_FAULT_MAJOR;
-}
-
-/*
- * These routines also need to handle stuff like marking pages dirty
- * and/or accessed for architectures that don't do it in hardware (most
- * RISC architectures).  The early dirtying is also good on the i386.
- *
- * There is also a hook called "update_mmu_cache()" that architectures
- * with external mmu caches can use to update those (ie the Sparc or
- * PowerPC hashed page tables that act as extended TLBs).
- *
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
- * but allow concurrent faults), and pte mapped but not yet locked.
- * We return with mmap_sem still held, but pte unmapped and unlocked.
- */
-static inline int handle_pte_fault(struct mm_struct *mm,
-               struct vm_area_struct *vma, unsigned long address,
-               pte_t *pte, pmd_t *pmd, int write_access)
-{
-       pte_t entry;
-       pte_t old_entry;
-       spinlock_t *ptl;
-
-       old_entry = entry = *pte;
-       if (!pte_present(entry)) {
-               if (pte_none(entry)) {
-                       if (!vma->vm_ops || !vma->vm_ops->nopage)
-                               return do_anonymous_page(mm, vma, address,
-                                       pte, pmd, write_access);
-                       return do_no_page(mm, vma, address,
-                                       pte, pmd, write_access);
-               }
-               if (pte_file(entry))
-                       return do_file_page(mm, vma, address,
-                                       pte, pmd, write_access, entry);
-               return do_swap_page(mm, vma, address,
-                                       pte, pmd, write_access, entry);
-       }
-
-       ptl = pte_lockptr(mm, pmd);
-       spin_lock(ptl);
-       if (unlikely(!pte_same(*pte, entry)))
-               goto unlock;
-       if (write_access) {
-               if (!pte_write(entry))
-                       return do_wp_page(mm, vma, address,
-                                       pte, pmd, ptl, entry);
-               entry = pte_mkdirty(entry);
-       }
-       entry = pte_mkyoung(entry);
-       if (!pte_same(old_entry, entry)) {
-               ptep_set_access_flags(vma, address, pte, entry, write_access);
-               update_mmu_cache(vma, address, entry);
-               lazy_mmu_prot_update(entry);
-       } else {
-               /*
-                * This is needed only for protection faults but the arch code
-                * is not yet telling us if this is a protection fault or not.
-                * This still avoids useless tlb flushes for .text page faults
-                * with threads.
-                */
-               if (write_access)
-                       flush_tlb_page(vma, address);
-       }
-unlock:
-       pte_unmap_unlock(pte, ptl);
-       return VM_FAULT_MINOR;
-}
-
-/*
- * By the time we get here, we already hold the mm semaphore
- */
-int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
-               unsigned long address, int write_access)
-{
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       __set_current_state(TASK_RUNNING);
-
-       count_vm_event(PGFAULT);
-
-       if (unlikely(is_vm_hugetlb_page(vma)))
-               return hugetlb_fault(mm, vma, address, write_access);
-
-       pgd = pgd_offset(mm, address);
-       pud = pud_alloc(mm, pgd, address);
-       if (!pud)
-               return VM_FAULT_OOM;
-       pmd = pmd_alloc(mm, pud, address);
-       if (!pmd)
-               return VM_FAULT_OOM;
-       pte = pte_alloc_map(mm, pmd, address);
-       if (!pte)
-               return VM_FAULT_OOM;
-
-       return handle_pte_fault(mm, vma, address, pte, pmd, write_access);
-}
-
-EXPORT_SYMBOL_GPL(__handle_mm_fault);
-
-#ifndef __PAGETABLE_PUD_FOLDED
-/*
- * Allocate page upper directory.
- * We've already handled the fast-path in-line.
- */
-int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
-{
-       pud_t *new = pud_alloc_one(mm, address);
-       if (!new)
-               return -ENOMEM;
-
-       spin_lock(&mm->page_table_lock);
-       if (pgd_present(*pgd))          /* Another has populated it */
-               pud_free(new);
-       else
-               pgd_populate(mm, pgd, new);
-       spin_unlock(&mm->page_table_lock);
-       return 0;
-}
-#else
-/* Workaround for gcc 2.96 */
-int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
-{
-       return 0;
-}
-#endif /* __PAGETABLE_PUD_FOLDED */
-
-#ifndef __PAGETABLE_PMD_FOLDED
-/*
- * Allocate page middle directory.
- * We've already handled the fast-path in-line.
- */
-int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
-{
-       pmd_t *new = pmd_alloc_one(mm, address);
-       if (!new)
-               return -ENOMEM;
-
-       spin_lock(&mm->page_table_lock);
-#ifndef __ARCH_HAS_4LEVEL_HACK
-       if (pud_present(*pud))          /* Another has populated it */
-               pmd_free(new);
-       else
-               pud_populate(mm, pud, new);
-#else
-       if (pgd_present(*pud))          /* Another has populated it */
-               pmd_free(new);
-       else
-               pgd_populate(mm, pud, new);
-#endif /* __ARCH_HAS_4LEVEL_HACK */
-       spin_unlock(&mm->page_table_lock);
-       return 0;
-}
-#else
-/* Workaround for gcc 2.96 */
-int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
-{
-       return 0;
-}
-#endif /* __PAGETABLE_PMD_FOLDED */
-
-int make_pages_present(unsigned long addr, unsigned long end)
-{
-       int ret, len, write;
-       struct vm_area_struct * vma;
-
-       vma = find_vma(current->mm, addr);
-       if (!vma)
-               return -1;
-       write = (vma->vm_flags & VM_WRITE) != 0;
-       BUG_ON(addr >= end);
-       BUG_ON(end > vma->vm_end);
-       len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
-       ret = get_user_pages(current, current->mm, addr,
-                       len, write, 0, NULL, NULL);
-       if (ret < 0)
-               return ret;
-       return ret == len ? 0 : -1;
-}
-
-/* 
- * Map a vmalloc()-space virtual address to the physical page.
- */
-struct page * vmalloc_to_page(void * vmalloc_addr)
-{
-       unsigned long addr = (unsigned long) vmalloc_addr;
-       struct page *page = NULL;
-       pgd_t *pgd = pgd_offset_k(addr);
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *ptep, pte;
-  
-       if (!pgd_none(*pgd)) {
-               pud = pud_offset(pgd, addr);
-               if (!pud_none(*pud)) {
-                       pmd = pmd_offset(pud, addr);
-                       if (!pmd_none(*pmd)) {
-                               ptep = pte_offset_map(pmd, addr);
-                               pte = *ptep;
-                               if (pte_present(pte))
-                                       page = pte_page(pte);
-                               pte_unmap(ptep);
-                       }
-               }
-       }
-       return page;
-}
-
-EXPORT_SYMBOL(vmalloc_to_page);
-
-/*
- * Map a vmalloc()-space virtual address to the physical page frame number.
- */
-unsigned long vmalloc_to_pfn(void * vmalloc_addr)
-{
-       return page_to_pfn(vmalloc_to_page(vmalloc_addr));
-}
-
-EXPORT_SYMBOL(vmalloc_to_pfn);
-
-#if !defined(__HAVE_ARCH_GATE_AREA)
-
-#if defined(AT_SYSINFO_EHDR)
-static struct vm_area_struct gate_vma;
-
-static int __init gate_vma_init(void)
-{
-       gate_vma.vm_mm = NULL;
-       gate_vma.vm_start = FIXADDR_USER_START;
-       gate_vma.vm_end = FIXADDR_USER_END;
-       gate_vma.vm_page_prot = PAGE_READONLY;
-       gate_vma.vm_flags = 0;
-       return 0;
-}
-__initcall(gate_vma_init);
-#endif
-
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
-{
-#ifdef AT_SYSINFO_EHDR
-       return &gate_vma;
-#else
-       return NULL;
-#endif
-}
-
-int in_gate_area_no_task(unsigned long addr)
-{
-#ifdef AT_SYSINFO_EHDR
-       if ((addr >= FIXADDR_USER_START) && (addr < FIXADDR_USER_END))
-               return 1;
-#endif
-       return 0;
-}
-
-#endif /* __HAVE_ARCH_GATE_AREA */
diff --git a/linux-2.6-xen-sparse/mm/mmap.c b/linux-2.6-xen-sparse/mm/mmap.c
deleted file mode 100644 (file)
index 191c8ad..0000000
+++ /dev/null
@@ -1,2093 +0,0 @@
-/*
- * mm/mmap.c
- *
- * Written by obz.
- *
- * Address space accounting code       <alan@redhat.com>
- */
-
-#include <linux/slab.h>
-#include <linux/mm.h>
-#include <linux/shm.h>
-#include <linux/mman.h>
-#include <linux/pagemap.h>
-#include <linux/swap.h>
-#include <linux/syscalls.h>
-#include <linux/capability.h>
-#include <linux/init.h>
-#include <linux/file.h>
-#include <linux/fs.h>
-#include <linux/personality.h>
-#include <linux/security.h>
-#include <linux/hugetlb.h>
-#include <linux/profile.h>
-#include <linux/module.h>
-#include <linux/mount.h>
-#include <linux/mempolicy.h>
-#include <linux/rmap.h>
-
-#include <asm/uaccess.h>
-#include <asm/cacheflush.h>
-#include <asm/tlb.h>
-
-#ifndef arch_mmap_check
-#define arch_mmap_check(addr, len, flags)      (0)
-#endif
-
-static void unmap_region(struct mm_struct *mm,
-               struct vm_area_struct *vma, struct vm_area_struct *prev,
-               unsigned long start, unsigned long end);
-
-/*
- * WARNING: the debugging will use recursive algorithms so never enable this
- * unless you know what you are doing.
- */
-#undef DEBUG_MM_RB
-
-/* description of effects of mapping type and prot in current implementation.
- * this is due to the limited x86 page protection hardware.  The expected
- * behavior is in parens:
- *
- * map_type    prot
- *             PROT_NONE       PROT_READ       PROT_WRITE      PROT_EXEC
- * MAP_SHARED  r: (no) no      r: (yes) yes    r: (no) yes     r: (no) yes
- *             w: (no) no      w: (no) no      w: (yes) yes    w: (no) no
- *             x: (no) no      x: (no) yes     x: (no) yes     x: (yes) yes
- *             
- * MAP_PRIVATE r: (no) no      r: (yes) yes    r: (no) yes     r: (no) yes
- *             w: (no) no      w: (no) no      w: (copy) copy  w: (no) no
- *             x: (no) no      x: (no) yes     x: (no) yes     x: (yes) yes
- *
- */
-pgprot_t protection_map[16] = {
-       __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
-       __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
-};
-
-int sysctl_overcommit_memory = OVERCOMMIT_GUESS;  /* heuristic overcommit */
-int sysctl_overcommit_ratio = 50;      /* default is 50% */
-int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;
-atomic_t vm_committed_space = ATOMIC_INIT(0);
-
-/*
- * Check that a process has enough memory to allocate a new virtual
- * mapping. 0 means there is enough memory for the allocation to
- * succeed and -ENOMEM implies there is not.
- *
- * We currently support three overcommit policies, which are set via the
- * vm.overcommit_memory sysctl.  See Documentation/vm/overcommit-accounting
- *
- * Strict overcommit modes added 2002 Feb 26 by Alan Cox.
- * Additional code 2002 Jul 20 by Robert Love.
- *
- * cap_sys_admin is 1 if the process has admin privileges, 0 otherwise.
- *
- * Note this is a helper function intended to be used by LSMs which
- * wish to use this logic.
- */
-int __vm_enough_memory(long pages, int cap_sys_admin)
-{
-       unsigned long free, allowed;
-
-       vm_acct_memory(pages);
-
-       /*
-        * Sometimes we want to use more memory than we have
-        */
-       if (sysctl_overcommit_memory == OVERCOMMIT_ALWAYS)
-               return 0;
-
-       if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) {
-               unsigned long n;
-
-               free = global_page_state(NR_FILE_PAGES);
-               free += nr_swap_pages;
-
-               /*
-                * Any slabs which are created with the
-                * SLAB_RECLAIM_ACCOUNT flag claim to have contents
-                * which are reclaimable, under pressure.  The dentry
-                * cache and most inode caches should fall into this
-                */
-               free += atomic_read(&slab_reclaim_pages);
-
-               /*
-                * Leave the last 3% for root
-                */
-               if (!cap_sys_admin)
-                       free -= free / 32;
-
-               if (free > pages)
-                       return 0;
-
-               /*
-                * nr_free_pages() is very expensive on large systems,
-                * only call if we're about to fail.
-                */
-               n = nr_free_pages();
-
-               /*
-                * Leave reserved pages. The pages are not for anonymous pages.
-                */
-               if (n <= totalreserve_pages)
-                       goto error;
-               else
-                       n -= totalreserve_pages;
-
-               /*
-                * Leave the last 3% for root
-                */
-               if (!cap_sys_admin)
-                       n -= n / 32;
-               free += n;
-
-               if (free > pages)
-                       return 0;
-
-               goto error;
-       }
-
-       allowed = (totalram_pages - hugetlb_total_pages())
-               * sysctl_overcommit_ratio / 100;
-       /*
-        * Leave the last 3% for root
-        */
-       if (!cap_sys_admin)
-               allowed -= allowed / 32;
-       allowed += total_swap_pages;
-
-       /* Don't let a single process grow too big:
-          leave 3% of the size of this process for other processes */
-       allowed -= current->mm->total_vm / 32;
-
-       /*
-        * cast `allowed' as a signed long because vm_committed_space
-        * sometimes has a negative value
-        */
-       if (atomic_read(&vm_committed_space) < (long)allowed)
-               return 0;
-error:
-       vm_unacct_memory(pages);
-
-       return -ENOMEM;
-}
-
-EXPORT_SYMBOL(__vm_enough_memory);
-
-/*
- * Requires inode->i_mapping->i_mmap_lock
- */
-static void __remove_shared_vm_struct(struct vm_area_struct *vma,
-               struct file *file, struct address_space *mapping)
-{
-       if (vma->vm_flags & VM_DENYWRITE)
-               atomic_inc(&file->f_dentry->d_inode->i_writecount);
-       if (vma->vm_flags & VM_SHARED)
-               mapping->i_mmap_writable--;
-
-       flush_dcache_mmap_lock(mapping);
-       if (unlikely(vma->vm_flags & VM_NONLINEAR))
-               list_del_init(&vma->shared.vm_set.list);
-       else
-               vma_prio_tree_remove(vma, &mapping->i_mmap);
-       flush_dcache_mmap_unlock(mapping);
-}
-
-/*
- * Unlink a file-based vm structure from its prio_tree, to hide
- * vma from rmap and vmtruncate before freeing its page tables.
- */
-void unlink_file_vma(struct vm_area_struct *vma)
-{
-       struct file *file = vma->vm_file;
-
-       if (file) {
-               struct address_space *mapping = file->f_mapping;
-               spin_lock(&mapping->i_mmap_lock);
-               __remove_shared_vm_struct(vma, file, mapping);
-               spin_unlock(&mapping->i_mmap_lock);
-       }
-}
-
-/*
- * Close a vm structure and free it, returning the next.
- */
-static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
-{
-       struct vm_area_struct *next = vma->vm_next;
-
-       might_sleep();
-       if (vma->vm_ops && vma->vm_ops->close)
-               vma->vm_ops->close(vma);
-       if (vma->vm_file)
-               fput(vma->vm_file);
-       mpol_free(vma_policy(vma));
-       kmem_cache_free(vm_area_cachep, vma);
-       return next;
-}
-
-asmlinkage unsigned long sys_brk(unsigned long brk)
-{
-       unsigned long rlim, retval;
-       unsigned long newbrk, oldbrk;
-       struct mm_struct *mm = current->mm;
-
-       down_write(&mm->mmap_sem);
-
-       if (brk < mm->end_code)
-               goto out;
-
-       /*
-        * Check against rlimit here. If this check is done later after the test
-        * of oldbrk with newbrk then it can escape the test and let the data
-        * segment grow beyond its set limit the in case where the limit is
-        * not page aligned -Ram Gupta
-        */
-       rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-       if (rlim < RLIM_INFINITY && brk - mm->start_data > rlim)
-               goto out;
-
-       newbrk = PAGE_ALIGN(brk);
-       oldbrk = PAGE_ALIGN(mm->brk);
-       if (oldbrk == newbrk)
-               goto set_brk;
-
-       /* Always allow shrinking brk. */
-       if (brk <= mm->brk) {
-               if (!do_munmap(mm, newbrk, oldbrk-newbrk))
-                       goto set_brk;
-               goto out;
-       }
-
-       /* Check against existing mmap mappings. */
-       if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE))
-               goto out;
-
-       /* Ok, looks good - let it rip. */
-       if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
-               goto out;
-set_brk:
-       mm->brk = brk;
-out:
-       retval = mm->brk;
-       up_write(&mm->mmap_sem);
-       return retval;
-}
-
-#ifdef DEBUG_MM_RB
-static int browse_rb(struct rb_root *root)
-{
-       int i = 0, j;
-       struct rb_node *nd, *pn = NULL;
-       unsigned long prev = 0, pend = 0;
-
-       for (nd = rb_first(root); nd; nd = rb_next(nd)) {
-               struct vm_area_struct *vma;
-               vma = rb_entry(nd, struct vm_area_struct, vm_rb);
-               if (vma->vm_start < prev)
-                       printk("vm_start %lx prev %lx\n", vma->vm_start, prev), i = -1;
-               if (vma->vm_start < pend)
-                       printk("vm_start %lx pend %lx\n", vma->vm_start, pend);
-               if (vma->vm_start > vma->vm_end)
-                       printk("vm_end %lx < vm_start %lx\n", vma->vm_end, vma->vm_start);
-               i++;
-               pn = nd;
-       }
-       j = 0;
-       for (nd = pn; nd; nd = rb_prev(nd)) {
-               j++;
-       }
-       if (i != j)
-               printk("backwards %d, forwards %d\n", j, i), i = 0;
-       return i;
-}
-
-void validate_mm(struct mm_struct *mm)
-{
-       int bug = 0;
-       int i = 0;
-       struct vm_area_struct *tmp = mm->mmap;
-       while (tmp) {
-               tmp = tmp->vm_next;
-               i++;
-       }
-       if (i != mm->map_count)
-               printk("map_count %d vm_next %d\n", mm->map_count, i), bug = 1;
-       i = browse_rb(&mm->mm_rb);
-       if (i != mm->map_count)
-               printk("map_count %d rb %d\n", mm->map_count, i), bug = 1;
-       BUG_ON(bug);
-}
-#else
-#define validate_mm(mm) do { } while (0)
-#endif
-
-static struct vm_area_struct *
-find_vma_prepare(struct mm_struct *mm, unsigned long addr,
-               struct vm_area_struct **pprev, struct rb_node ***rb_link,
-               struct rb_node ** rb_parent)
-{
-       struct vm_area_struct * vma;
-       struct rb_node ** __rb_link, * __rb_parent, * rb_prev;
-
-       __rb_link = &mm->mm_rb.rb_node;
-       rb_prev = __rb_parent = NULL;
-       vma = NULL;
-
-       while (*__rb_link) {
-               struct vm_area_struct *vma_tmp;
-
-               __rb_parent = *__rb_link;
-               vma_tmp = rb_entry(__rb_parent, struct vm_area_struct, vm_rb);
-
-               if (vma_tmp->vm_end > addr) {
-                       vma = vma_tmp;
-                       if (vma_tmp->vm_start <= addr)
-                               return vma;
-                       __rb_link = &__rb_parent->rb_left;
-               } else {
-                       rb_prev = __rb_parent;
-                       __rb_link = &__rb_parent->rb_right;
-               }
-       }
-
-       *pprev = NULL;
-       if (rb_prev)
-               *pprev = rb_entry(rb_prev, struct vm_area_struct, vm_rb);
-       *rb_link = __rb_link;
-       *rb_parent = __rb_parent;
-       return vma;
-}
-
-static inline void
-__vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
-               struct vm_area_struct *prev, struct rb_node *rb_parent)
-{
-       if (prev) {
-               vma->vm_next = prev->vm_next;
-               prev->vm_next = vma;
-       } else {
-               mm->mmap = vma;
-               if (rb_parent)
-                       vma->vm_next = rb_entry(rb_parent,
-                                       struct vm_area_struct, vm_rb);
-               else
-                       vma->vm_next = NULL;
-       }
-}
-
-void __vma_link_rb(struct mm_struct *mm, struct vm_area_struct *vma,
-               struct rb_node **rb_link, struct rb_node *rb_parent)
-{
-       rb_link_node(&vma->vm_rb, rb_parent, rb_link);
-       rb_insert_color(&vma->vm_rb, &mm->mm_rb);
-}
-
-static inline void __vma_link_file(struct vm_area_struct *vma)
-{
-       struct file * file;
-
-       file = vma->vm_file;
-       if (file) {
-               struct address_space *mapping = file->f_mapping;
-
-               if (vma->vm_flags & VM_DENYWRITE)
-                       atomic_dec(&file->f_dentry->d_inode->i_writecount);
-               if (vma->vm_flags & VM_SHARED)
-                       mapping->i_mmap_writable++;
-
-               flush_dcache_mmap_lock(mapping);
-               if (unlikely(vma->vm_flags & VM_NONLINEAR))
-                       vma_nonlinear_insert(vma, &mapping->i_mmap_nonlinear);
-               else
-                       vma_prio_tree_insert(vma, &mapping->i_mmap);
-               flush_dcache_mmap_unlock(mapping);
-       }
-}
-
-static void
-__vma_link(struct mm_struct *mm, struct vm_area_struct *vma,
-       struct vm_area_struct *prev, struct rb_node **rb_link,
-       struct rb_node *rb_parent)
-{
-       __vma_link_list(mm, vma, prev, rb_parent);
-       __vma_link_rb(mm, vma, rb_link, rb_parent);
-       __anon_vma_link(vma);
-}
-
-static void vma_link(struct mm_struct *mm, struct vm_area_struct *vma,
-                       struct vm_area_struct *prev, struct rb_node **rb_link,
-                       struct rb_node *rb_parent)
-{
-       struct address_space *mapping = NULL;
-
-       if (vma->vm_file)
-               mapping = vma->vm_file->f_mapping;
-
-       if (mapping) {
-               spin_lock(&mapping->i_mmap_lock);
-               vma->vm_truncate_count = mapping->truncate_count;
-       }
-       anon_vma_lock(vma);
-
-       __vma_link(mm, vma, prev, rb_link, rb_parent);
-       __vma_link_file(vma);
-
-       anon_vma_unlock(vma);
-       if (mapping)
-               spin_unlock(&mapping->i_mmap_lock);
-
-       mm->map_count++;
-       validate_mm(mm);
-}
-
-/*
- * Helper for vma_adjust in the split_vma insert case:
- * insert vm structure into list and rbtree and anon_vma,
- * but it has already been inserted into prio_tree earlier.
- */
-static void
-__insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
-{
-       struct vm_area_struct * __vma, * prev;
-       struct rb_node ** rb_link, * rb_parent;
-
-       __vma = find_vma_prepare(mm, vma->vm_start,&prev, &rb_link, &rb_parent);
-       BUG_ON(__vma && __vma->vm_start < vma->vm_end);
-       __vma_link(mm, vma, prev, rb_link, rb_parent);
-       mm->map_count++;
-}
-
-static inline void
-__vma_unlink(struct mm_struct *mm, struct vm_area_struct *vma,
-               struct vm_area_struct *prev)
-{
-       prev->vm_next = vma->vm_next;
-       rb_erase(&vma->vm_rb, &mm->mm_rb);
-       if (mm->mmap_cache == vma)
-               mm->mmap_cache = prev;
-}
-
-/*
- * We cannot adjust vm_start, vm_end, vm_pgoff fields of a vma that
- * is already present in an i_mmap tree without adjusting the tree.
- * The following helper function should be used when such adjustments
- * are necessary.  The "insert" vma (if any) is to be inserted
- * before we drop the necessary locks.
- */
-void vma_adjust(struct vm_area_struct *vma, unsigned long start,
-       unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       struct vm_area_struct *next = vma->vm_next;
-       struct vm_area_struct *importer = NULL;
-       struct address_space *mapping = NULL;
-       struct prio_tree_root *root = NULL;
-       struct file *file = vma->vm_file;
-       struct anon_vma *anon_vma = NULL;
-       long adjust_next = 0;
-       int remove_next = 0;
-
-       if (next && !insert) {
-               if (end >= next->vm_end) {
-                       /*
-                        * vma expands, overlapping all the next, and
-                        * perhaps the one after too (mprotect case 6).
-                        */
-again:                 remove_next = 1 + (end > next->vm_end);
-                       end = next->vm_end;
-                       anon_vma = next->anon_vma;
-                       importer = vma;
-               } else if (end > next->vm_start) {
-                       /*
-                        * vma expands, overlapping part of the next:
-                        * mprotect case 5 shifting the boundary up.
-                        */
-                       adjust_next = (end - next->vm_start) >> PAGE_SHIFT;
-                       anon_vma = next->anon_vma;
-                       importer = vma;
-               } else if (end < vma->vm_end) {
-                       /*
-                        * vma shrinks, and !insert tells it's not
-                        * split_vma inserting another: so it must be
-                        * mprotect case 4 shifting the boundary down.
-                        */
-                       adjust_next = - ((vma->vm_end - end) >> PAGE_SHIFT);
-                       anon_vma = next->anon_vma;
-                       importer = next;
-               }
-       }
-
-       if (file) {
-               mapping = file->f_mapping;
-               if (!(vma->vm_flags & VM_NONLINEAR))
-                       root = &mapping->i_mmap;
-               spin_lock(&mapping->i_mmap_lock);
-               if (importer &&
-                   vma->vm_truncate_count != next->vm_truncate_count) {
-                       /*
-                        * unmap_mapping_range might be in progress:
-                        * ensure that the expanding vma is rescanned.
-                        */
-                       importer->vm_truncate_count = 0;
-               }
-               if (insert) {
-                       insert->vm_truncate_count = vma->vm_truncate_count;
-                       /*
-                        * Put into prio_tree now, so instantiated pages
-                        * are visible to arm/parisc __flush_dcache_page
-                        * throughout; but we cannot insert into address
-                        * space until vma start or end is updated.
-                        */
-                       __vma_link_file(insert);
-               }
-       }
-
-       /*
-        * When changing only vma->vm_end, we don't really need
-        * anon_vma lock: but is that case worth optimizing out?
-        */
-       if (vma->anon_vma)
-               anon_vma = vma->anon_vma;
-       if (anon_vma) {
-               spin_lock(&anon_vma->lock);
-               /*
-                * Easily overlooked: when mprotect shifts the boundary,
-                * make sure the expanding vma has anon_vma set if the
-                * shrinking vma had, to cover any anon pages imported.
-                */
-               if (importer && !importer->anon_vma) {
-                       importer->anon_vma = anon_vma;
-                       __anon_vma_link(importer);
-               }
-       }
-
-       if (root) {
-               flush_dcache_mmap_lock(mapping);
-               vma_prio_tree_remove(vma, root);
-               if (adjust_next)
-                       vma_prio_tree_remove(next, root);
-       }
-
-       vma->vm_start = start;
-       vma->vm_end = end;
-       vma->vm_pgoff = pgoff;
-       if (adjust_next) {
-               next->vm_start += adjust_next << PAGE_SHIFT;
-               next->vm_pgoff += adjust_next;
-       }
-
-       if (root) {
-               if (adjust_next)
-                       vma_prio_tree_insert(next, root);
-               vma_prio_tree_insert(vma, root);
-               flush_dcache_mmap_unlock(mapping);
-       }
-
-       if (remove_next) {
-               /*
-                * vma_merge has merged next into vma, and needs
-                * us to remove next before dropping the locks.
-                */
-               __vma_unlink(mm, next, vma);
-               if (file)
-                       __remove_shared_vm_struct(next, file, mapping);
-               if (next->anon_vma)
-                       __anon_vma_merge(vma, next);
-       } else if (insert) {
-               /*
-                * split_vma has split insert from vma, and needs
-                * us to insert it before dropping the locks
-                * (it may either follow vma or precede it).
-                */
-               __insert_vm_struct(mm, insert);
-       }
-
-       if (anon_vma)
-               spin_unlock(&anon_vma->lock);
-       if (mapping)
-               spin_unlock(&mapping->i_mmap_lock);
-
-       if (remove_next) {
-               if (file)
-                       fput(file);
-               mm->map_count--;
-               mpol_free(vma_policy(next));
-               kmem_cache_free(vm_area_cachep, next);
-               /*
-                * In mprotect's case 6 (see comments on vma_merge),
-                * we must remove another next too. It would clutter
-                * up the code too much to do both in one go.
-                */
-               if (remove_next == 2) {
-                       next = vma->vm_next;
-                       goto again;
-               }
-       }
-
-       validate_mm(mm);
-}
-
-/*
- * If the vma has a ->close operation then the driver probably needs to release
- * per-vma resources, so we don't attempt to merge those.
- */
-#define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP)
-
-static inline int is_mergeable_vma(struct vm_area_struct *vma,
-                       struct file *file, unsigned long vm_flags)
-{
-       if (vma->vm_flags != vm_flags)
-               return 0;
-       if (vma->vm_file != file)
-               return 0;
-       if (vma->vm_ops && vma->vm_ops->close)
-               return 0;
-       return 1;
-}
-
-static inline int is_mergeable_anon_vma(struct anon_vma *anon_vma1,
-                                       struct anon_vma *anon_vma2)
-{
-       return !anon_vma1 || !anon_vma2 || (anon_vma1 == anon_vma2);
-}
-
-/*
- * Return true if we can merge this (vm_flags,anon_vma,file,vm_pgoff)
- * in front of (at a lower virtual address and file offset than) the vma.
- *
- * We cannot merge two vmas if they have differently assigned (non-NULL)
- * anon_vmas, nor if same anon_vma is assigned but offsets incompatible.
- *
- * We don't check here for the merged mmap wrapping around the end of pagecache
- * indices (16TB on ia32) because do_mmap_pgoff() does not permit mmap's which
- * wrap, nor mmaps which cover the final page at index -1UL.
- */
-static int
-can_vma_merge_before(struct vm_area_struct *vma, unsigned long vm_flags,
-       struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff)
-{
-       if (is_mergeable_vma(vma, file, vm_flags) &&
-           is_mergeable_anon_vma(anon_vma, vma->anon_vma)) {
-               if (vma->vm_pgoff == vm_pgoff)
-                       return 1;
-       }
-       return 0;
-}
-
-/*
- * Return true if we can merge this (vm_flags,anon_vma,file,vm_pgoff)
- * beyond (at a higher virtual address and file offset than) the vma.
- *
- * We cannot merge two vmas if they have differently assigned (non-NULL)
- * anon_vmas, nor if same anon_vma is assigned but offsets incompatible.
- */
-static int
-can_vma_merge_after(struct vm_area_struct *vma, unsigned long vm_flags,
-       struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff)
-{
-       if (is_mergeable_vma(vma, file, vm_flags) &&
-           is_mergeable_anon_vma(anon_vma, vma->anon_vma)) {
-               pgoff_t vm_pglen;
-               vm_pglen = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-               if (vma->vm_pgoff + vm_pglen == vm_pgoff)
-                       return 1;
-       }
-       return 0;
-}
-
-/*
- * Given a mapping request (addr,end,vm_flags,file,pgoff), figure out
- * whether that can be merged with its predecessor or its successor.
- * Or both (it neatly fills a hole).
- *
- * In most cases - when called for mmap, brk or mremap - [addr,end) is
- * certain not to be mapped by the time vma_merge is called; but when
- * called for mprotect, it is certain to be already mapped (either at
- * an offset within prev, or at the start of next), and the flags of
- * this area are about to be changed to vm_flags - and the no-change
- * case has already been eliminated.
- *
- * The following mprotect cases have to be considered, where AAAA is
- * the area passed down from mprotect_fixup, never extending beyond one
- * vma, PPPPPP is the prev vma specified, and NNNNNN the next vma after:
- *
- *     AAAA             AAAA                AAAA          AAAA
- *    PPPPPPNNNNNN    PPPPPPNNNNNN    PPPPPPNNNNNN    PPPPNNNNXXXX
- *    cannot merge    might become    might become    might become
- *                    PPNNNNNNNNNN    PPPPPPPPPPNN    PPPPPPPPPPPP 6 or
- *    mmap, brk or    case 4 below    case 5 below    PPPPPPPPXXXX 7 or
- *    mremap move:                                    PPPPNNNNNNNN 8
- *        AAAA
- *    PPPP    NNNN    PPPPPPPPPPPP    PPPPPPPPNNNN    PPPPNNNNNNNN
- *    might become    case 1 below    case 2 below    case 3 below
- *
- * Odd one out? Case 8, because it extends NNNN but needs flags of XXXX:
- * mprotect_fixup updates vm_flags & vm_page_prot on successful return.
- */
-struct vm_area_struct *vma_merge(struct mm_struct *mm,
-                       struct vm_area_struct *prev, unsigned long addr,
-                       unsigned long end, unsigned long vm_flags,
-                       struct anon_vma *anon_vma, struct file *file,
-                       pgoff_t pgoff, struct mempolicy *policy)
-{
-       pgoff_t pglen = (end - addr) >> PAGE_SHIFT;
-       struct vm_area_struct *area, *next;
-
-       /*
-        * We later require that vma->vm_flags == vm_flags,
-        * so this tests vma->vm_flags & VM_SPECIAL, too.
-        */
-       if (vm_flags & VM_SPECIAL)
-               return NULL;
-
-       if (prev)
-               next = prev->vm_next;
-       else
-               next = mm->mmap;
-       area = next;
-       if (next && next->vm_end == end)                /* cases 6, 7, 8 */
-               next = next->vm_next;
-
-       /*
-        * Can it merge with the predecessor?
-        */
-       if (prev && prev->vm_end == addr &&
-                       mpol_equal(vma_policy(prev), policy) &&
-                       can_vma_merge_after(prev, vm_flags,
-                                               anon_vma, file, pgoff)) {
-               /*
-                * OK, it can.  Can we now merge in the successor as well?
-                */
-               if (next && end == next->vm_start &&
-                               mpol_equal(policy, vma_policy(next)) &&
-                               can_vma_merge_before(next, vm_flags,
-                                       anon_vma, file, pgoff+pglen) &&
-                               is_mergeable_anon_vma(prev->anon_vma,
-                                                     next->anon_vma)) {
-                                                       /* cases 1, 6 */
-                       vma_adjust(prev, prev->vm_start,
-                               next->vm_end, prev->vm_pgoff, NULL);
-               } else                                  /* cases 2, 5, 7 */
-                       vma_adjust(prev, prev->vm_start,
-                               end, prev->vm_pgoff, NULL);
-               return prev;
-       }
-
-       /*
-        * Can this new request be merged in front of next?
-        */
-       if (next && end == next->vm_start &&
-                       mpol_equal(policy, vma_policy(next)) &&
-                       can_vma_merge_before(next, vm_flags,
-                                       anon_vma, file, pgoff+pglen)) {
-               if (prev && addr < prev->vm_end)        /* case 4 */
-                       vma_adjust(prev, prev->vm_start,
-                               addr, prev->vm_pgoff, NULL);
-               else                                    /* cases 3, 8 */
-                       vma_adjust(area, addr, next->vm_end,
-                               next->vm_pgoff - pglen, NULL);
-               return area;
-       }
-
-       return NULL;
-}
-
-/*
- * find_mergeable_anon_vma is used by anon_vma_prepare, to check
- * neighbouring vmas for a suitable anon_vma, before it goes off
- * to allocate a new anon_vma.  It checks because a repetitive
- * sequence of mprotects and faults may otherwise lead to distinct
- * anon_vmas being allocated, preventing vma merge in subsequent
- * mprotect.
- */
-struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma)
-{
-       struct vm_area_struct *near;
-       unsigned long vm_flags;
-
-       near = vma->vm_next;
-       if (!near)
-               goto try_prev;
-
-       /*
-        * Since only mprotect tries to remerge vmas, match flags
-        * which might be mprotected into each other later on.
-        * Neither mlock nor madvise tries to remerge at present,
-        * so leave their flags as obstructing a merge.
-        */
-       vm_flags = vma->vm_flags & ~(VM_READ|VM_WRITE|VM_EXEC);
-       vm_flags |= near->vm_flags & (VM_READ|VM_WRITE|VM_EXEC);
-
-       if (near->anon_vma && vma->vm_end == near->vm_start &&
-                       mpol_equal(vma_policy(vma), vma_policy(near)) &&
-                       can_vma_merge_before(near, vm_flags,
-                               NULL, vma->vm_file, vma->vm_pgoff +
-                               ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)))
-               return near->anon_vma;
-try_prev:
-       /*
-        * It is potentially slow to have to call find_vma_prev here.
-        * But it's only on the first write fault on the vma, not
-        * every time, and we could devise a way to avoid it later
-        * (e.g. stash info in next's anon_vma_node when assigning
-        * an anon_vma, or when trying vma_merge).  Another time.
-        */
-       BUG_ON(find_vma_prev(vma->vm_mm, vma->vm_start, &near) != vma);
-       if (!near)
-               goto none;
-
-       vm_flags = vma->vm_flags & ~(VM_READ|VM_WRITE|VM_EXEC);
-       vm_flags |= near->vm_flags & (VM_READ|VM_WRITE|VM_EXEC);
-
-       if (near->anon_vma && near->vm_end == vma->vm_start &&
-                       mpol_equal(vma_policy(near), vma_policy(vma)) &&
-                       can_vma_merge_after(near, vm_flags,
-                               NULL, vma->vm_file, vma->vm_pgoff))
-               return near->anon_vma;
-none:
-       /*
-        * There's no absolute need to look only at touching neighbours:
-        * we could search further afield for "compatible" anon_vmas.
-        * But it would probably just be a waste of time searching,
-        * or lead to too many vmas hanging off the same anon_vma.
-        * We're trying to allow mprotect remerging later on,
-        * not trying to minimize memory used for anon_vmas.
-        */
-       return NULL;
-}
-
-#ifdef CONFIG_PROC_FS
-void vm_stat_account(struct mm_struct *mm, unsigned long flags,
-                                               struct file *file, long pages)
-{
-       const unsigned long stack_flags
-               = VM_STACK_FLAGS & (VM_GROWSUP|VM_GROWSDOWN);
-
-       if (file) {
-               mm->shared_vm += pages;
-               if ((flags & (VM_EXEC|VM_WRITE)) == VM_EXEC)
-                       mm->exec_vm += pages;
-       } else if (flags & stack_flags)
-               mm->stack_vm += pages;
-       if (flags & (VM_RESERVED|VM_IO))
-               mm->reserved_vm += pages;
-}
-#endif /* CONFIG_PROC_FS */
-
-/*
- * The caller must hold down_write(current->mm->mmap_sem).
- */
-
-unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
-                       unsigned long len, unsigned long prot,
-                       unsigned long flags, unsigned long pgoff)
-{
-       struct mm_struct * mm = current->mm;
-       struct vm_area_struct * vma, * prev;
-       struct inode *inode;
-       unsigned int vm_flags;
-       int correct_wcount = 0;
-       int error;
-       struct rb_node ** rb_link, * rb_parent;
-       int accountable = 1;
-       unsigned long charged = 0, reqprot = prot;
-
-       if (file) {
-               if (is_file_hugepages(file))
-                       accountable = 0;
-
-               if (!file->f_op || !file->f_op->mmap)
-                       return -ENODEV;
-
-               if ((prot & PROT_EXEC) &&
-                   (file->f_vfsmnt->mnt_flags & MNT_NOEXEC))
-                       return -EPERM;
-       }
-       /*
-        * Does the application expect PROT_READ to imply PROT_EXEC?
-        *
-        * (the exception is when the underlying filesystem is noexec
-        *  mounted, in which case we dont add PROT_EXEC.)
-        */
-       if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))
-               if (!(file && (file->f_vfsmnt->mnt_flags & MNT_NOEXEC)))
-                       prot |= PROT_EXEC;
-
-       if (!len)
-               return -EINVAL;
-
-       error = arch_mmap_check(addr, len, flags);
-       if (error)
-               return error;
-
-       /* Careful about overflows.. */
-       len = PAGE_ALIGN(len);
-       if (!len || len > TASK_SIZE)
-               return -ENOMEM;
-
-       /* offset overflow? */
-       if ((pgoff + (len >> PAGE_SHIFT)) < pgoff)
-               return -EOVERFLOW;
-
-       /* Too many mappings? */
-       if (mm->map_count > sysctl_max_map_count)
-               return -ENOMEM;
-
-       /* Obtain the address to map to. we verify (or select) it and ensure
-        * that it represents a valid section of the address space.
-        */
-       addr = get_unmapped_area(file, addr, len, pgoff, flags);
-       if (addr & ~PAGE_MASK)
-               return addr;
-
-       /* Do simple checking here so the lower-level routines won't have
-        * to. we assume access permissions have been handled by the open
-        * of the memory object, so we don't do any here.
-        */
-       vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) |
-                       mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
-
-       if (flags & MAP_LOCKED) {
-               if (!can_do_mlock())
-                       return -EPERM;
-               vm_flags |= VM_LOCKED;
-       }
-       /* mlock MCL_FUTURE? */
-       if (vm_flags & VM_LOCKED) {
-               unsigned long locked, lock_limit;
-               locked = len >> PAGE_SHIFT;
-               locked += mm->locked_vm;
-               lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
-               lock_limit >>= PAGE_SHIFT;
-               if (locked > lock_limit && !capable(CAP_IPC_LOCK))
-                       return -EAGAIN;
-       }
-
-       inode = file ? file->f_dentry->d_inode : NULL;
-
-       if (file) {
-               switch (flags & MAP_TYPE) {
-               case MAP_SHARED:
-                       if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))
-                               return -EACCES;
-
-                       /*
-                        * Make sure we don't allow writing to an append-only
-                        * file..
-                        */
-                       if (IS_APPEND(inode) && (file->f_mode & FMODE_WRITE))
-                               return -EACCES;
-
-                       /*
-                        * Make sure there are no mandatory locks on the file.
-                        */
-                       if (locks_verify_locked(inode))
-                               return -EAGAIN;
-
-                       vm_flags |= VM_SHARED | VM_MAYSHARE;
-                       if (!(file->f_mode & FMODE_WRITE))
-                               vm_flags &= ~(VM_MAYWRITE | VM_SHARED);
-
-                       /* fall through */
-               case MAP_PRIVATE:
-                       if (!(file->f_mode & FMODE_READ))
-                               return -EACCES;
-                       break;
-
-               default:
-                       return -EINVAL;
-               }
-       } else {
-               switch (flags & MAP_TYPE) {
-               case MAP_SHARED:
-                       vm_flags |= VM_SHARED | VM_MAYSHARE;
-                       break;
-               case MAP_PRIVATE:
-                       /*
-                        * Set pgoff according to addr for anon_vma.
-                        */
-                       pgoff = addr >> PAGE_SHIFT;
-                       break;
-               default:
-                       return -EINVAL;
-               }
-       }
-
-       error = security_file_mmap(file, reqprot, prot, flags);
-       if (error)
-               return error;
-               
-       /* Clear old maps */
-       error = -ENOMEM;
-munmap_back:
-       vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
-       if (vma && vma->vm_start < addr + len) {
-               if (do_munmap(mm, addr, len))
-                       return -ENOMEM;
-               goto munmap_back;
-       }
-
-       /* Check against address space limit. */
-       if (!may_expand_vm(mm, len >> PAGE_SHIFT))
-               return -ENOMEM;
-
-       if (accountable && (!(flags & MAP_NORESERVE) ||
-                           sysctl_overcommit_memory == OVERCOMMIT_NEVER)) {
-               if (vm_flags & VM_SHARED) {
-                       /* Check memory availability in shmem_file_setup? */
-                       vm_flags |= VM_ACCOUNT;
-               } else if (vm_flags & VM_WRITE) {
-                       /*
-                        * Private writable mapping: check memory availability
-                        */
-                       charged = len >> PAGE_SHIFT;
-                       if (security_vm_enough_memory(charged))
-                               return -ENOMEM;
-                       vm_flags |= VM_ACCOUNT;
-               }
-       }
-
-       /*
-        * Can we just expand an old private anonymous mapping?
-        * The VM_SHARED test is necessary because shmem_zero_setup
-        * will create the file object for a shared anonymous map below.
-        */
-       if (!file && !(vm_flags & VM_SHARED) &&
-           vma_merge(mm, prev, addr, addr + len, vm_flags,
-                                       NULL, NULL, pgoff, NULL))
-               goto out;
-
-       /*
-        * Determine the object being mapped and call the appropriate
-        * specific mapper. the address has already been validated, but
-        * not unmapped, but the maps are removed from the list.
-        */
-       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
-       if (!vma) {
-               error = -ENOMEM;
-               goto unacct_error;
-       }
-
-       vma->vm_mm = mm;
-       vma->vm_start = addr;
-       vma->vm_end = addr + len;
-       vma->vm_flags = vm_flags;
-       vma->vm_page_prot = protection_map[vm_flags &
-                               (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)];
-       vma->vm_pgoff = pgoff;
-
-       if (file) {
-               error = -EINVAL;
-               if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))
-                       goto free_vma;
-               if (vm_flags & VM_DENYWRITE) {
-                       error = deny_write_access(file);
-                       if (error)
-                               goto free_vma;
-                       correct_wcount = 1;
-               }
-               vma->vm_file = file;
-               get_file(file);
-               error = file->f_op->mmap(file, vma);
-               if (error)
-                       goto unmap_and_free_vma;
-       } else if (vm_flags & VM_SHARED) {
-               error = shmem_zero_setup(vma);
-               if (error)
-                       goto free_vma;
-       }
-
-       /* Don't make the VMA automatically writable if it's shared, but the
-        * backer wishes to know when pages are first written to */
-       if (vma->vm_ops && vma->vm_ops->page_mkwrite)
-               vma->vm_page_prot =
-                       protection_map[vm_flags & (VM_READ|VM_WRITE|VM_EXEC)];
-
-       /* We set VM_ACCOUNT in a shared mapping's vm_flags, to inform
-        * shmem_zero_setup (perhaps called through /dev/zero's ->mmap)
-        * that memory reservation must be checked; but that reservation
-        * belongs to shared memory object, not to vma: so now clear it.
-        */
-       if ((vm_flags & (VM_SHARED|VM_ACCOUNT)) == (VM_SHARED|VM_ACCOUNT))
-               vma->vm_flags &= ~VM_ACCOUNT;
-
-       /* Can addr have changed??
-        *
-        * Answer: Yes, several device drivers can do it in their
-        *         f_op->mmap method. -DaveM
-        */
-       addr = vma->vm_start;
-       pgoff = vma->vm_pgoff;
-       vm_flags = vma->vm_flags;
-
-       if (!file || !vma_merge(mm, prev, addr, vma->vm_end,
-                       vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) {
-               file = vma->vm_file;
-               vma_link(mm, vma, prev, rb_link, rb_parent);
-               if (correct_wcount)
-                       atomic_inc(&inode->i_writecount);
-       } else {
-               if (file) {
-                       if (correct_wcount)
-                               atomic_inc(&inode->i_writecount);
-                       fput(file);
-               }
-               mpol_free(vma_policy(vma));
-               kmem_cache_free(vm_area_cachep, vma);
-       }
-out:   
-       mm->total_vm += len >> PAGE_SHIFT;
-       vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT);
-       if (vm_flags & VM_LOCKED) {
-               mm->locked_vm += len >> PAGE_SHIFT;
-               make_pages_present(addr, addr + len);
-       }
-       if (flags & MAP_POPULATE) {
-               up_write(&mm->mmap_sem);
-               sys_remap_file_pages(addr, len, 0,
-                                       pgoff, flags & MAP_NONBLOCK);
-               down_write(&mm->mmap_sem);
-       }
-       return addr;
-
-unmap_and_free_vma:
-       if (correct_wcount)
-               atomic_inc(&inode->i_writecount);
-       vma->vm_file = NULL;
-       fput(file);
-
-       /* Undo any partial mapping done by a device driver. */
-       unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
-       charged = 0;
-free_vma:
-       kmem_cache_free(vm_area_cachep, vma);
-unacct_error:
-       if (charged)
-               vm_unacct_memory(charged);
-       return error;
-}
-
-EXPORT_SYMBOL(do_mmap_pgoff);
-
-/* Get an address range which is currently unmapped.
- * For shmat() with addr=0.
- *
- * Ugly calling convention alert:
- * Return value with the low bits set means error value,
- * ie
- *     if (ret & ~PAGE_MASK)
- *             error = ret;
- *
- * This function "knows" that -ENOMEM has the bits set.
- */
-#ifndef HAVE_ARCH_UNMAPPED_AREA
-unsigned long
-arch_get_unmapped_area(struct file *filp, unsigned long addr,
-               unsigned long len, unsigned long pgoff, unsigned long flags)
-{
-       struct mm_struct *mm = current->mm;
-       struct vm_area_struct *vma;
-       unsigned long start_addr;
-
-       if (len > TASK_SIZE)
-               return -ENOMEM;
-
-       if (addr) {
-               addr = PAGE_ALIGN(addr);
-               vma = find_vma(mm, addr);
-               if (TASK_SIZE - len >= addr &&
-                   (!vma || addr + len <= vma->vm_start))
-                       return addr;
-       }
-       if (len > mm->cached_hole_size) {
-               start_addr = addr = mm->free_area_cache;
-       } else {
-               start_addr = addr = TASK_UNMAPPED_BASE;
-               mm->cached_hole_size = 0;
-       }
-
-full_search:
-       for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
-               /* At this point:  (!vma || addr < vma->vm_end). */
-               if (TASK_SIZE - len < addr) {
-                       /*
-                        * Start a new search - just in case we missed
-                        * some holes.
-                        */
-                       if (start_addr != TASK_UNMAPPED_BASE) {
-                               addr = TASK_UNMAPPED_BASE;
-                               start_addr = addr;
-                               mm->cached_hole_size = 0;
-                               goto full_search;
-                       }
-                       return -ENOMEM;
-               }
-               if (!vma || addr + len <= vma->vm_start) {
-                       /*
-                        * Remember the place where we stopped the search:
-                        */
-                       mm->free_area_cache = addr + len;
-                       return addr;
-               }
-               if (addr + mm->cached_hole_size < vma->vm_start)
-                       mm->cached_hole_size = vma->vm_start - addr;
-               addr = vma->vm_end;
-       }
-}
-#endif 
-
-void arch_unmap_area(struct mm_struct *mm, unsigned long addr)
-{
-       /*
-        * Is this a new hole at the lowest possible address?
-        */
-       if (addr >= TASK_UNMAPPED_BASE && addr < mm->free_area_cache) {
-               mm->free_area_cache = addr;
-               mm->cached_hole_size = ~0UL;
-       }
-}
-
-/*
- * This mmap-allocator allocates new areas top-down from below the
- * stack's low limit (the base):
- */
-#ifndef HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
-unsigned long
-arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
-                         const unsigned long len, const unsigned long pgoff,
-                         const unsigned long flags)
-{
-       struct vm_area_struct *vma;
-       struct mm_struct *mm = current->mm;
-       unsigned long addr = addr0;
-
-       /* requested length too big for entire address space */
-       if (len > TASK_SIZE)
-               return -ENOMEM;
-
-       /* requesting a specific address */
-       if (addr) {
-               addr = PAGE_ALIGN(addr);
-               vma = find_vma(mm, addr);
-               if (TASK_SIZE - len >= addr &&
-                               (!vma || addr + len <= vma->vm_start))
-                       return addr;
-       }
-
-       /* check if free_area_cache is useful for us */
-       if (len <= mm->cached_hole_size) {
-               mm->cached_hole_size = 0;
-               mm->free_area_cache = mm->mmap_base;
-       }
-
-       /* either no address requested or can't fit in requested address hole */
-       addr = mm->free_area_cache;
-
-       /* make sure it can fit in the remaining address space */
-       if (addr > len) {
-               vma = find_vma(mm, addr-len);
-               if (!vma || addr <= vma->vm_start)
-                       /* remember the address as a hint for next time */
-                       return (mm->free_area_cache = addr-len);
-       }
-
-       if (mm->mmap_base < len)
-               goto bottomup;
-
-       addr = mm->mmap_base-len;
-
-       do {
-               /*
-                * Lookup failure means no vma is above this address,
-                * else if new region fits below vma->vm_start,
-                * return with success:
-                */
-               vma = find_vma(mm, addr);
-               if (!vma || addr+len <= vma->vm_start)
-                       /* remember the address as a hint for next time */
-                       return (mm->free_area_cache = addr);
-
-               /* remember the largest hole we saw so far */
-               if (addr + mm->cached_hole_size < vma->vm_start)
-                       mm->cached_hole_size = vma->vm_start - addr;
-
-               /* try just below the current vma->vm_start */
-               addr = vma->vm_start-len;
-       } while (len < vma->vm_start);
-
-bottomup:
-       /*
-        * A failed mmap() very likely causes application failure,
-        * so fall back to the bottom-up function here. This scenario
-        * can happen with large stack limits and large mmap()
-        * allocations.
-        */
-       mm->cached_hole_size = ~0UL;
-       mm->free_area_cache = TASK_UNMAPPED_BASE;
-       addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
-       /*
-        * Restore the topdown base:
-        */
-       mm->free_area_cache = mm->mmap_base;
-       mm->cached_hole_size = ~0UL;
-
-       return addr;
-}
-#endif
-
-void arch_unmap_area_topdown(struct mm_struct *mm, unsigned long addr)
-{
-       /*
-        * Is this a new hole at the highest possible address?
-        */
-       if (addr > mm->free_area_cache)
-               mm->free_area_cache = addr;
-
-       /* dont allow allocations above current base */
-       if (mm->free_area_cache > mm->mmap_base)
-               mm->free_area_cache = mm->mmap_base;
-}
-
-unsigned long
-get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
-               unsigned long pgoff, unsigned long flags)
-{
-       unsigned long ret;
-
-       if (!(flags & MAP_FIXED)) {
-               unsigned long (*get_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
-
-               get_area = current->mm->get_unmapped_area;
-               if (file && file->f_op && file->f_op->get_unmapped_area)
-                       get_area = file->f_op->get_unmapped_area;
-               addr = get_area(file, addr, len, pgoff, flags);
-               if (IS_ERR_VALUE(addr))
-                       return addr;
-       }
-
-       if (addr > TASK_SIZE - len)
-               return -ENOMEM;
-       if (addr & ~PAGE_MASK)
-               return -EINVAL;
-       if (file && is_file_hugepages(file))  {
-               /*
-                * Check if the given range is hugepage aligned, and
-                * can be made suitable for hugepages.
-                */
-               ret = prepare_hugepage_range(addr, len);
-       } else {
-               /*
-                * Ensure that a normal request is not falling in a
-                * reserved hugepage range.  For some archs like IA-64,
-                * there is a separate region for hugepages.
-                */
-               ret = is_hugepage_only_range(current->mm, addr, len);
-       }
-       if (ret)
-               return -EINVAL;
-       return addr;
-}
-
-EXPORT_SYMBOL(get_unmapped_area);
-
-/* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
-struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)
-{
-       struct vm_area_struct *vma = NULL;
-
-       if (mm) {
-               /* Check the cache first. */
-               /* (Cache hit rate is typically around 35%.) */
-               vma = mm->mmap_cache;
-               if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) {
-                       struct rb_node * rb_node;
-
-                       rb_node = mm->mm_rb.rb_node;
-                       vma = NULL;
-
-                       while (rb_node) {
-                               struct vm_area_struct * vma_tmp;
-
-                               vma_tmp = rb_entry(rb_node,
-                                               struct vm_area_struct, vm_rb);
-
-                               if (vma_tmp->vm_end > addr) {
-                                       vma = vma_tmp;
-                                       if (vma_tmp->vm_start <= addr)
-                                               break;
-                                       rb_node = rb_node->rb_left;
-                               } else
-                                       rb_node = rb_node->rb_right;
-                       }
-                       if (vma)
-                               mm->mmap_cache = vma;
-               }
-       }
-       return vma;
-}
-
-EXPORT_SYMBOL(find_vma);
-
-/* Same as find_vma, but also return a pointer to the previous VMA in *pprev. */
-struct vm_area_struct *
-find_vma_prev(struct mm_struct *mm, unsigned long addr,
-                       struct vm_area_struct **pprev)
-{
-       struct vm_area_struct *vma = NULL, *prev = NULL;
-       struct rb_node * rb_node;
-       if (!mm)
-               goto out;
-
-       /* Guard against addr being lower than the first VMA */
-       vma = mm->mmap;
-
-       /* Go through the RB tree quickly. */
-       rb_node = mm->mm_rb.rb_node;
-
-       while (rb_node) {
-               struct vm_area_struct *vma_tmp;
-               vma_tmp = rb_entry(rb_node, struct vm_area_struct, vm_rb);
-
-               if (addr < vma_tmp->vm_end) {
-                       rb_node = rb_node->rb_left;
-               } else {
-                       prev = vma_tmp;
-                       if (!prev->vm_next || (addr < prev->vm_next->vm_end))
-                               break;
-                       rb_node = rb_node->rb_right;
-               }
-       }
-
-out:
-       *pprev = prev;
-       return prev ? prev->vm_next : vma;
-}
-
-/*
- * Verify that the stack growth is acceptable and
- * update accounting. This is shared with both the
- * grow-up and grow-down cases.
- */
-static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, unsigned long grow)
-{
-       struct mm_struct *mm = vma->vm_mm;
-       struct rlimit *rlim = current->signal->rlim;
-
-       /* address space limit tests */
-       if (!may_expand_vm(mm, grow))
-               return -ENOMEM;
-
-       /* Stack limit test */
-       if (size > rlim[RLIMIT_STACK].rlim_cur)
-               return -ENOMEM;
-
-       /* mlock limit tests */
-       if (vma->vm_flags & VM_LOCKED) {
-               unsigned long locked;
-               unsigned long limit;
-               locked = mm->locked_vm + grow;
-               limit = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
-               if (locked > limit && !capable(CAP_IPC_LOCK))
-                       return -ENOMEM;
-       }
-
-       /*
-        * Overcommit..  This must be the final test, as it will
-        * update security statistics.
-        */
-       if (security_vm_enough_memory(grow))
-               return -ENOMEM;
-
-       /* Ok, everything looks good - let it rip */
-       mm->total_vm += grow;
-       if (vma->vm_flags & VM_LOCKED)
-               mm->locked_vm += grow;
-       vm_stat_account(mm, vma->vm_flags, vma->vm_file, grow);
-       return 0;
-}
-
-#if defined(CONFIG_STACK_GROWSUP) || defined(CONFIG_IA64)
-/*
- * PA-RISC uses this for its stack; IA64 for its Register Backing Store.
- * vma is the last one with address > vma->vm_end.  Have to extend vma.
- */
-#ifndef CONFIG_IA64
-static inline
-#endif
-int expand_upwards(struct vm_area_struct *vma, unsigned long address)
-{
-       int error;
-
-       if (!(vma->vm_flags & VM_GROWSUP))
-               return -EFAULT;
-
-       /*
-        * We must make sure the anon_vma is allocated
-        * so that the anon_vma locking is not a noop.
-        */
-       if (unlikely(anon_vma_prepare(vma)))
-               return -ENOMEM;
-       anon_vma_lock(vma);
-
-       /*
-        * vma->vm_start/vm_end cannot change under us because the caller
-        * is required to hold the mmap_sem in read mode.  We need the
-        * anon_vma lock to serialize against concurrent expand_stacks.
-        */
-       address += 4 + PAGE_SIZE - 1;
-       address &= PAGE_MASK;
-       error = 0;
-
-       /* Somebody else might have raced and expanded it already */
-       if (address > vma->vm_end) {
-               unsigned long size, grow;
-
-               size = address - vma->vm_start;
-               grow = (address - vma->vm_end) >> PAGE_SHIFT;
-
-               error = acct_stack_growth(vma, size, grow);
-               if (!error)
-                       vma->vm_end = address;
-       }
-       anon_vma_unlock(vma);
-       return error;
-}
-#endif /* CONFIG_STACK_GROWSUP || CONFIG_IA64 */
-
-#ifdef CONFIG_STACK_GROWSUP
-int expand_stack(struct vm_area_struct *vma, unsigned long address)
-{
-       return expand_upwards(vma, address);
-}
-
-struct vm_area_struct *
-find_extend_vma(struct mm_struct *mm, unsigned long addr)
-{
-       struct vm_area_struct *vma, *prev;
-
-       addr &= PAGE_MASK;
-       vma = find_vma_prev(mm, addr, &prev);
-       if (vma && (vma->vm_start <= addr))
-               return vma;
-       if (!prev || expand_stack(prev, addr))
-               return NULL;
-       if (prev->vm_flags & VM_LOCKED) {
-               make_pages_present(addr, prev->vm_end);
-       }
-       return prev;
-}
-#else
-/*
- * vma is the first one with address < vma->vm_start.  Have to extend vma.
- */
-int expand_stack(struct vm_area_struct *vma, unsigned long address)
-{
-       int error;
-
-       /*
-        * We must make sure the anon_vma is allocated
-        * so that the anon_vma locking is not a noop.
-        */
-       if (unlikely(anon_vma_prepare(vma)))
-               return -ENOMEM;
-       anon_vma_lock(vma);
-
-       /*
-        * vma->vm_start/vm_end cannot change under us because the caller
-        * is required to hold the mmap_sem in read mode.  We need the
-        * anon_vma lock to serialize against concurrent expand_stacks.
-        */
-       address &= PAGE_MASK;
-       error = 0;
-
-       /* Somebody else might have raced and expanded it already */
-       if (address < vma->vm_start) {
-               unsigned long size, grow;
-
-               size = vma->vm_end - address;
-               grow = (vma->vm_start - address) >> PAGE_SHIFT;
-
-               error = acct_stack_growth(vma, size, grow);
-               if (!error) {
-                       vma->vm_start = address;
-                       vma->vm_pgoff -= grow;
-               }
-       }
-       anon_vma_unlock(vma);
-       return error;
-}
-
-struct vm_area_struct *
-find_extend_vma(struct mm_struct * mm, unsigned long addr)
-{
-       struct vm_area_struct * vma;
-       unsigned long start;
-
-       addr &= PAGE_MASK;
-       vma = find_vma(mm,addr);
-       if (!vma)
-               return NULL;
-       if (vma->vm_start <= addr)
-               return vma;
-       if (!(vma->vm_flags & VM_GROWSDOWN))
-               return NULL;
-       start = vma->vm_start;
-       if (expand_stack(vma, addr))
-               return NULL;
-       if (vma->vm_flags & VM_LOCKED) {
-               make_pages_present(addr, start);
-       }
-       return vma;
-}
-#endif
-
-/*
- * Ok - we have the memory areas we should free on the vma list,
- * so release them, and do the vma updates.
- *
- * Called with the mm semaphore held.
- */
-static void remove_vma_list(struct mm_struct *mm, struct vm_area_struct *vma)
-{
-       /* Update high watermark before we lower total_vm */
-       update_hiwater_vm(mm);
-       do {
-               long nrpages = vma_pages(vma);
-
-               mm->total_vm -= nrpages;
-               if (vma->vm_flags & VM_LOCKED)
-                       mm->locked_vm -= nrpages;
-               vm_stat_account(mm, vma->vm_flags, vma->vm_file, -nrpages);
-               vma = remove_vma(vma);
-       } while (vma);
-       validate_mm(mm);
-}
-
-/*
- * Get rid of page table information in the indicated region.
- *
- * Called with the mm semaphore held.
- */
-static void unmap_region(struct mm_struct *mm,
-               struct vm_area_struct *vma, struct vm_area_struct *prev,
-               unsigned long start, unsigned long end)
-{
-       struct vm_area_struct *next = prev? prev->vm_next: mm->mmap;
-       struct mmu_gather *tlb;
-       unsigned long nr_accounted = 0;
-
-       lru_add_drain();
-       tlb = tlb_gather_mmu(mm, 0);
-       update_hiwater_rss(mm);
-       unmap_vmas(&tlb, vma, start, end, &nr_accounted, NULL);
-       vm_unacct_memory(nr_accounted);
-       free_pgtables(&tlb, vma, prev? prev->vm_end: FIRST_USER_ADDRESS,
-                                next? next->vm_start: 0);
-       tlb_finish_mmu(tlb, start, end);
-}
-
-/*
- * Create a list of vma's touched by the unmap, removing them from the mm's
- * vma list as we go..
- */
-static void
-detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
-       struct vm_area_struct *prev, unsigned long end)
-{
-       struct vm_area_struct **insertion_point;
-       struct vm_area_struct *tail_vma = NULL;
-       unsigned long addr;
-
-       insertion_point = (prev ? &prev->vm_next : &mm->mmap);
-       do {
-               rb_erase(&vma->vm_rb, &mm->mm_rb);
-               mm->map_count--;
-               tail_vma = vma;
-               vma = vma->vm_next;
-       } while (vma && vma->vm_start < end);
-       *insertion_point = vma;
-       tail_vma->vm_next = NULL;
-       if (mm->unmap_area == arch_unmap_area)
-               addr = prev ? prev->vm_end : mm->mmap_base;
-       else
-               addr = vma ?  vma->vm_start : mm->mmap_base;
-       mm->unmap_area(mm, addr);
-       mm->mmap_cache = NULL;          /* Kill the cache. */
-}
-
-/*
- * Split a vma into two pieces at address 'addr', a new vma is allocated
- * either for the first part or the the tail.
- */
-int split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
-             unsigned long addr, int new_below)
-{
-       struct mempolicy *pol;
-       struct vm_area_struct *new;
-
-       if (is_vm_hugetlb_page(vma) && (addr & ~HPAGE_MASK))
-               return -EINVAL;
-
-       if (mm->map_count >= sysctl_max_map_count)
-               return -ENOMEM;
-
-       new = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!new)
-               return -ENOMEM;
-
-       /* most fields are the same, copy all, and then fixup */
-       *new = *vma;
-
-       if (new_below)
-               new->vm_end = addr;
-       else {
-               new->vm_start = addr;
-               new->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT);
-       }
-
-       pol = mpol_copy(vma_policy(vma));
-       if (IS_ERR(pol)) {
-               kmem_cache_free(vm_area_cachep, new);
-               return PTR_ERR(pol);
-       }
-       vma_set_policy(new, pol);
-
-       if (new->vm_file)
-               get_file(new->vm_file);
-
-       if (new->vm_ops && new->vm_ops->open)
-               new->vm_ops->open(new);
-
-       if (new_below)
-               vma_adjust(vma, addr, vma->vm_end, vma->vm_pgoff +
-                       ((addr - new->vm_start) >> PAGE_SHIFT), new);
-       else
-               vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new);
-
-       return 0;
-}
-
-/* Munmap is split into 2 main parts -- this part which finds
- * what needs doing, and the areas themselves, which do the
- * work.  This now handles partial unmappings.
- * Jeremy Fitzhardinge <jeremy@goop.org>
- */
-int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
-{
-       unsigned long end;
-       struct vm_area_struct *vma, *prev, *last;
-
-       if ((start & ~PAGE_MASK) || start > TASK_SIZE || len > TASK_SIZE-start)
-               return -EINVAL;
-
-       if ((len = PAGE_ALIGN(len)) == 0)
-               return -EINVAL;
-
-       /* Find the first overlapping VMA */
-       vma = find_vma_prev(mm, start, &prev);
-       if (!vma)
-               return 0;
-       /* we have  start < vma->vm_end  */
-
-       /* if it doesn't overlap, we have nothing.. */
-       end = start + len;
-       if (vma->vm_start >= end)
-               return 0;
-
-       /*
-        * If we need to split any vma, do it now to save pain later.
-        *
-        * Note: mremap's move_vma VM_ACCOUNT handling assumes a partially
-        * unmapped vm_area_struct will remain in use: so lower split_vma
-        * places tmp vma above, and higher split_vma places tmp vma below.
-        */
-       if (start > vma->vm_start) {
-               int error = split_vma(mm, vma, start, 0);
-               if (error)
-                       return error;
-               prev = vma;
-       }
-
-       /* Does it split the last one? */
-       last = find_vma(mm, end);
-       if (last && end > last->vm_start) {
-               int error = split_vma(mm, last, end, 1);
-               if (error)
-                       return error;
-       }
-       vma = prev? prev->vm_next: mm->mmap;
-
-       /*
-        * Remove the vma's, and unmap the actual pages
-        */
-       detach_vmas_to_be_unmapped(mm, vma, prev, end);
-       unmap_region(mm, vma, prev, start, end);
-
-       /* Fix up all other VM information */
-       remove_vma_list(mm, vma);
-
-       return 0;
-}
-
-EXPORT_SYMBOL(do_munmap);
-
-asmlinkage long sys_munmap(unsigned long addr, size_t len)
-{
-       int ret;
-       struct mm_struct *mm = current->mm;
-
-       profile_munmap(addr);
-
-       down_write(&mm->mmap_sem);
-       ret = do_munmap(mm, addr, len);
-       up_write(&mm->mmap_sem);
-       return ret;
-}
-
-static inline void verify_mm_writelocked(struct mm_struct *mm)
-{
-#ifdef CONFIG_DEBUG_VM
-       if (unlikely(down_read_trylock(&mm->mmap_sem))) {
-               WARN_ON(1);
-               up_read(&mm->mmap_sem);
-       }
-#endif
-}
-
-/*
- *  this is really a simplified "do_mmap".  it only handles
- *  anonymous maps.  eventually we may be able to do some
- *  brk-specific accounting here.
- */
-unsigned long do_brk(unsigned long addr, unsigned long len)
-{
-       struct mm_struct * mm = current->mm;
-       struct vm_area_struct * vma, * prev;
-       unsigned long flags;
-       struct rb_node ** rb_link, * rb_parent;
-       pgoff_t pgoff = addr >> PAGE_SHIFT;
-       int error;
-
-       len = PAGE_ALIGN(len);
-       if (!len)
-               return addr;
-
-       if ((addr + len) > TASK_SIZE || (addr + len) < addr)
-               return -EINVAL;
-
-       flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
-
-       error = arch_mmap_check(addr, len, flags);
-       if (error)
-               return error;
-
-       /*
-        * mlock MCL_FUTURE?
-        */
-       if (mm->def_flags & VM_LOCKED) {
-               unsigned long locked, lock_limit;
-               locked = len >> PAGE_SHIFT;
-               locked += mm->locked_vm;
-               lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
-               lock_limit >>= PAGE_SHIFT;
-               if (locked > lock_limit && !capable(CAP_IPC_LOCK))
-                       return -EAGAIN;
-       }
-
-       /*
-        * mm->mmap_sem is required to protect against another thread
-        * changing the mappings in case we sleep.
-        */
-       verify_mm_writelocked(mm);
-
-       /*
-        * Clear old maps.  this also does some error checking for us
-        */
- munmap_back:
-       vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
-       if (vma && vma->vm_start < addr + len) {
-               if (do_munmap(mm, addr, len))
-                       return -ENOMEM;
-               goto munmap_back;
-       }
-
-       /* Check against address space limits *after* clearing old maps... */
-       if (!may_expand_vm(mm, len >> PAGE_SHIFT))
-               return -ENOMEM;
-
-       if (mm->map_count > sysctl_max_map_count)
-               return -ENOMEM;
-
-       if (security_vm_enough_memory(len >> PAGE_SHIFT))
-               return -ENOMEM;
-
-       /* Can we just expand an old private anonymous mapping? */
-       if (vma_merge(mm, prev, addr, addr + len, flags,
-                                       NULL, NULL, pgoff, NULL))
-               goto out;
-
-       /*
-        * create a vma struct for an anonymous mapping
-        */
-       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
-       if (!vma) {
-               vm_unacct_memory(len >> PAGE_SHIFT);
-               return -ENOMEM;
-       }
-
-       vma->vm_mm = mm;
-       vma->vm_start = addr;
-       vma->vm_end = addr + len;
-       vma->vm_pgoff = pgoff;
-       vma->vm_flags = flags;
-       vma->vm_page_prot = protection_map[flags &
-                               (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)];
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-out:
-       mm->total_vm += len >> PAGE_SHIFT;
-       if (flags & VM_LOCKED) {
-               mm->locked_vm += len >> PAGE_SHIFT;
-               make_pages_present(addr, addr + len);
-       }
-       return addr;
-}
-
-EXPORT_SYMBOL(do_brk);
-
-/* Release all mmaps. */
-void exit_mmap(struct mm_struct *mm)
-{
-       struct mmu_gather *tlb;
-       struct vm_area_struct *vma = mm->mmap;
-       unsigned long nr_accounted = 0;
-       unsigned long end;
-
-#ifdef arch_exit_mmap
-       arch_exit_mmap(mm);
-#endif
-
-       lru_add_drain();
-       flush_cache_mm(mm);
-       tlb = tlb_gather_mmu(mm, 1);
-       /* Don't update_hiwater_rss(mm) here, do_exit already did */
-       /* Use -1 here to ensure all VMAs in the mm are unmapped */
-       end = unmap_vmas(&tlb, vma, 0, -1, &nr_accounted, NULL);
-       vm_unacct_memory(nr_accounted);
-       free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0);
-       tlb_finish_mmu(tlb, 0, end);
-
-       /*
-        * Walk the list again, actually closing and freeing it,
-        * with preemption enabled, without holding any MM locks.
-        */
-       while (vma)
-               vma = remove_vma(vma);
-
-       BUG_ON(mm->nr_ptes > (FIRST_USER_ADDRESS+PMD_SIZE-1)>>PMD_SHIFT);
-}
-
-/* Insert vm structure into process list sorted by address
- * and into the inode's i_mmap tree.  If vm_file is non-NULL
- * then i_mmap_lock is taken here.
- */
-int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
-{
-       struct vm_area_struct * __vma, * prev;
-       struct rb_node ** rb_link, * rb_parent;
-
-       /*
-        * The vm_pgoff of a purely anonymous vma should be irrelevant
-        * until its first write fault, when page's anon_vma and index
-        * are set.  But now set the vm_pgoff it will almost certainly
-        * end up with (unless mremap moves it elsewhere before that
-        * first wfault), so /proc/pid/maps tells a consistent story.
-        *
-        * By setting it to reflect the virtual start address of the
-        * vma, merges and splits can happen in a seamless way, just
-        * using the existing file pgoff checks and manipulations.
-        * Similarly in do_mmap_pgoff and in do_brk.
-        */
-       if (!vma->vm_file) {
-               BUG_ON(vma->anon_vma);
-               vma->vm_pgoff = vma->vm_start >> PAGE_SHIFT;
-       }
-       __vma = find_vma_prepare(mm,vma->vm_start,&prev,&rb_link,&rb_parent);
-       if (__vma && __vma->vm_start < vma->vm_end)
-               return -ENOMEM;
-       if ((vma->vm_flags & VM_ACCOUNT) &&
-            security_vm_enough_memory(vma_pages(vma)))
-               return -ENOMEM;
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-       return 0;
-}
-
-/*
- * Copy the vma structure to a new location in the same mm,
- * prior to moving page table entries, to effect an mremap move.
- */
-struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
-       unsigned long addr, unsigned long len, pgoff_t pgoff)
-{
-       struct vm_area_struct *vma = *vmap;
-       unsigned long vma_start = vma->vm_start;
-       struct mm_struct *mm = vma->vm_mm;
-       struct vm_area_struct *new_vma, *prev;
-       struct rb_node **rb_link, *rb_parent;
-       struct mempolicy *pol;
-
-       /*
-        * If anonymous vma has not yet been faulted, update new pgoff
-        * to match new location, to increase its chance of merging.
-        */
-       if (!vma->vm_file && !vma->anon_vma)
-               pgoff = addr >> PAGE_SHIFT;
-
-       find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
-       new_vma = vma_merge(mm, prev, addr, addr + len, vma->vm_flags,
-                       vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma));
-       if (new_vma) {
-               /*
-                * Source vma may have been merged into new_vma
-                */
-               if (vma_start >= new_vma->vm_start &&
-                   vma_start < new_vma->vm_end)
-                       *vmap = new_vma;
-       } else {
-               new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-               if (new_vma) {
-                       *new_vma = *vma;
-                       pol = mpol_copy(vma_policy(vma));
-                       if (IS_ERR(pol)) {
-                               kmem_cache_free(vm_area_cachep, new_vma);
-                               return NULL;
-                       }
-                       vma_set_policy(new_vma, pol);
-                       new_vma->vm_start = addr;
-                       new_vma->vm_end = addr + len;
-                       new_vma->vm_pgoff = pgoff;
-                       if (new_vma->vm_file)
-                               get_file(new_vma->vm_file);
-                       if (new_vma->vm_ops && new_vma->vm_ops->open)
-                               new_vma->vm_ops->open(new_vma);
-                       vma_link(mm, new_vma, prev, rb_link, rb_parent);
-               }
-       }
-       return new_vma;
-}
-
-/*
- * Return true if the calling process may expand its vm space by the passed
- * number of pages
- */
-int may_expand_vm(struct mm_struct *mm, unsigned long npages)
-{
-       unsigned long cur = mm->total_vm;       /* pages */
-       unsigned long lim;
-
-       lim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT;
-
-       if (cur + npages > lim)
-               return 0;
-       return 1;
-}
diff --git a/linux-2.6-xen-sparse/mm/page_alloc.c b/linux-2.6-xen-sparse/mm/page_alloc.c
deleted file mode 100644 (file)
index b0a813a..0000000
+++ /dev/null
@@ -1,2481 +0,0 @@
-/*
- *  linux/mm/page_alloc.c
- *
- *  Manages the free list, the system allocates free pages here.
- *  Note that kmalloc() lives in slab.c
- *
- *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
- *  Swap reorganised 29.12.95, Stephen Tweedie
- *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- *  Reshaped it to be a zoned allocator, Ingo Molnar, Red Hat, 1999
- *  Discontiguous memory support, Kanoj Sarcar, SGI, Nov 1999
- *  Zone balancing, Kanoj Sarcar, SGI, Jan 2000
- *  Per cpu hot/cold page lists, bulk allocation, Martin J. Bligh, Sept 2002
- *          (lots of bits borrowed from Ingo Molnar & Andrew Morton)
- */
-
-#include <linux/stddef.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/interrupt.h>
-#include <linux/pagemap.h>
-#include <linux/bootmem.h>
-#include <linux/compiler.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/suspend.h>
-#include <linux/pagevec.h>
-#include <linux/blkdev.h>
-#include <linux/slab.h>
-#include <linux/notifier.h>
-#include <linux/topology.h>
-#include <linux/sysctl.h>
-#include <linux/cpu.h>
-#include <linux/cpuset.h>
-#include <linux/memory_hotplug.h>
-#include <linux/nodemask.h>
-#include <linux/vmalloc.h>
-#include <linux/mempolicy.h>
-#include <linux/stop_machine.h>
-
-#include <asm/tlbflush.h>
-#include <asm/div64.h>
-#include "internal.h"
-
-/*
- * MCD - HACK: Find somewhere to initialize this EARLY, or make this
- * initializer cleaner
- */
-nodemask_t node_online_map __read_mostly = { { [0] = 1UL } };
-EXPORT_SYMBOL(node_online_map);
-nodemask_t node_possible_map __read_mostly = NODE_MASK_ALL;
-EXPORT_SYMBOL(node_possible_map);
-unsigned long totalram_pages __read_mostly;
-unsigned long totalhigh_pages __read_mostly;
-unsigned long totalreserve_pages __read_mostly;
-long nr_swap_pages;
-int percpu_pagelist_fraction;
-
-static void __free_pages_ok(struct page *page, unsigned int order);
-
-/*
- * results with 256, 32 in the lowmem_reserve sysctl:
- *     1G machine -> (16M dma, 800M-16M normal, 1G-800M high)
- *     1G machine -> (16M dma, 784M normal, 224M high)
- *     NORMAL allocation will leave 784M/256 of ram reserved in the ZONE_DMA
- *     HIGHMEM allocation will leave 224M/32 of ram reserved in ZONE_NORMAL
- *     HIGHMEM allocation will (224M+784M)/256 of ram reserved in ZONE_DMA
- *
- * TBD: should special case ZONE_DMA32 machines here - in those we normally
- * don't need any ZONE_NORMAL reservation
- */
-int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = { 256, 256, 32 };
-
-EXPORT_SYMBOL(totalram_pages);
-
-/*
- * Used by page_zone() to look up the address of the struct zone whose
- * id is encoded in the upper bits of page->flags
- */
-struct zone *zone_table[1 << ZONETABLE_SHIFT] __read_mostly;
-EXPORT_SYMBOL(zone_table);
-
-static char *zone_names[MAX_NR_ZONES] = { "DMA", "DMA32", "Normal", "HighMem" };
-int min_free_kbytes = 1024;
-
-unsigned long __meminitdata nr_kernel_pages;
-unsigned long __meminitdata nr_all_pages;
-
-#ifdef CONFIG_DEBUG_VM
-static int page_outside_zone_boundaries(struct zone *zone, struct page *page)
-{
-       int ret = 0;
-       unsigned seq;
-       unsigned long pfn = page_to_pfn(page);
-
-       do {
-               seq = zone_span_seqbegin(zone);
-               if (pfn >= zone->zone_start_pfn + zone->spanned_pages)
-                       ret = 1;
-               else if (pfn < zone->zone_start_pfn)
-                       ret = 1;
-       } while (zone_span_seqretry(zone, seq));
-
-       return ret;
-}
-
-static int page_is_consistent(struct zone *zone, struct page *page)
-{
-#ifdef CONFIG_HOLES_IN_ZONE
-       if (!pfn_valid(page_to_pfn(page)))
-               return 0;
-#endif
-       if (zone != page_zone(page))
-               return 0;
-
-       return 1;
-}
-/*
- * Temporary debugging check for pages not lying within a given zone.
- */
-static int bad_range(struct zone *zone, struct page *page)
-{
-       if (page_outside_zone_boundaries(zone, page))
-               return 1;
-       if (!page_is_consistent(zone, page))
-               return 1;
-
-       return 0;
-}
-
-#else
-static inline int bad_range(struct zone *zone, struct page *page)
-{
-       return 0;
-}
-#endif
-
-static void bad_page(struct page *page)
-{
-       printk(KERN_EMERG "Bad page state in process '%s'\n"
-               KERN_EMERG "page:%p flags:0x%0*lx mapping:%p mapcount:%d count:%d\n"
-               KERN_EMERG "Trying to fix it up, but a reboot is needed\n"
-               KERN_EMERG "Backtrace:\n",
-               current->comm, page, (int)(2*sizeof(unsigned long)),
-               (unsigned long)page->flags, page->mapping,
-               page_mapcount(page), page_count(page));
-       dump_stack();
-       page->flags &= ~(1 << PG_lru    |
-                       1 << PG_private |
-                       1 << PG_locked  |
-                       1 << PG_active  |
-                       1 << PG_dirty   |
-                       1 << PG_reclaim |
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
-                       1 << PG_writeback |
-                       1 << PG_buddy   |
-#ifdef CONFIG_X86_XEN
-                       1 << PG_pinned  |
-#endif
-                       1 << PG_foreign );
-       set_page_count(page, 0);
-       reset_page_mapcount(page);
-       page->mapping = NULL;
-       add_taint(TAINT_BAD_PAGE);
-}
-
-/*
- * Higher-order pages are called "compound pages".  They are structured thusly:
- *
- * The first PAGE_SIZE page is called the "head page".
- *
- * The remaining PAGE_SIZE pages are called "tail pages".
- *
- * All pages have PG_compound set.  All pages have their ->private pointing at
- * the head page (even the head page has this).
- *
- * The first tail page's ->lru.next holds the address of the compound page's
- * put_page() function.  Its ->lru.prev holds the order of allocation.
- * This usage means that zero-order pages may not be compound.
- */
-
-static void free_compound_page(struct page *page)
-{
-       __free_pages_ok(page, (unsigned long)page[1].lru.prev);
-}
-
-static void prep_compound_page(struct page *page, unsigned long order)
-{
-       int i;
-       int nr_pages = 1 << order;
-
-       page[1].lru.next = (void *)free_compound_page;  /* set dtor */
-       page[1].lru.prev = (void *)order;
-       for (i = 0; i < nr_pages; i++) {
-               struct page *p = page + i;
-
-               __SetPageCompound(p);
-               set_page_private(p, (unsigned long)page);
-       }
-}
-
-static void destroy_compound_page(struct page *page, unsigned long order)
-{
-       int i;
-       int nr_pages = 1 << order;
-
-       if (unlikely((unsigned long)page[1].lru.prev != order))
-               bad_page(page);
-
-       for (i = 0; i < nr_pages; i++) {
-               struct page *p = page + i;
-
-               if (unlikely(!PageCompound(p) |
-                               (page_private(p) != (unsigned long)page)))
-                       bad_page(page);
-               __ClearPageCompound(p);
-       }
-}
-
-static inline void prep_zero_page(struct page *page, int order, gfp_t gfp_flags)
-{
-       int i;
-
-       BUG_ON((gfp_flags & (__GFP_WAIT | __GFP_HIGHMEM)) == __GFP_HIGHMEM);
-       /*
-        * clear_highpage() will use KM_USER0, so it's a bug to use __GFP_ZERO
-        * and __GFP_HIGHMEM from hard or soft interrupt context.
-        */
-       BUG_ON((gfp_flags & __GFP_HIGHMEM) && in_interrupt());
-       for (i = 0; i < (1 << order); i++)
-               clear_highpage(page + i);
-}
-
-/*
- * function for dealing with page's order in buddy system.
- * zone->lock is already acquired when we use these.
- * So, we don't need atomic page->flags operations here.
- */
-static inline unsigned long page_order(struct page *page)
-{
-       return page_private(page);
-}
-
-static inline void set_page_order(struct page *page, int order)
-{
-       set_page_private(page, order);
-       __SetPageBuddy(page);
-}
-
-static inline void rmv_page_order(struct page *page)
-{
-       __ClearPageBuddy(page);
-       set_page_private(page, 0);
-}
-
-/*
- * Locate the struct page for both the matching buddy in our
- * pair (buddy1) and the combined O(n+1) page they form (page).
- *
- * 1) Any buddy B1 will have an order O twin B2 which satisfies
- * the following equation:
- *     B2 = B1 ^ (1 << O)
- * For example, if the starting buddy (buddy2) is #8 its order
- * 1 buddy is #10:
- *     B2 = 8 ^ (1 << 1) = 8 ^ 2 = 10
- *
- * 2) Any buddy B will have an order O+1 parent P which
- * satisfies the following equation:
- *     P = B & ~(1 << O)
- *
- * Assumption: *_mem_map is contiguous at least up to MAX_ORDER
- */
-static inline struct page *
-__page_find_buddy(struct page *page, unsigned long page_idx, unsigned int order)
-{
-       unsigned long buddy_idx = page_idx ^ (1 << order);
-
-       return page + (buddy_idx - page_idx);
-}
-
-static inline unsigned long
-__find_combined_index(unsigned long page_idx, unsigned int order)
-{
-       return (page_idx & ~(1 << order));
-}
-
-/*
- * This function checks whether a page is free && is the buddy
- * we can do coalesce a page and its buddy if
- * (a) the buddy is not in a hole &&
- * (b) the buddy is in the buddy system &&
- * (c) a page and its buddy have the same order &&
- * (d) a page and its buddy are in the same zone.
- *
- * For recording whether a page is in the buddy system, we use PG_buddy.
- * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
- *
- * For recording page's order, we use page_private(page).
- */
-static inline int page_is_buddy(struct page *page, struct page *buddy,
-                                                               int order)
-{
-#ifdef CONFIG_HOLES_IN_ZONE
-       if (!pfn_valid(page_to_pfn(buddy)))
-               return 0;
-#endif
-
-       if (page_zone_id(page) != page_zone_id(buddy))
-               return 0;
-
-       if (PageBuddy(buddy) && page_order(buddy) == order) {
-               BUG_ON(page_count(buddy) != 0);
-               return 1;
-       }
-       return 0;
-}
-
-/*
- * Freeing function for a buddy system allocator.
- *
- * The concept of a buddy system is to maintain direct-mapped table
- * (containing bit values) for memory blocks of various "orders".
- * The bottom level table contains the map for the smallest allocatable
- * units of memory (here, pages), and each level above it describes
- * pairs of units from the levels below, hence, "buddies".
- * At a high level, all that happens here is marking the table entry
- * at the bottom level available, and propagating the changes upward
- * as necessary, plus some accounting needed to play nicely with other
- * parts of the VM system.
- * At each level, we keep a list of pages, which are heads of continuous
- * free pages of length of (1 << order) and marked with PG_buddy. Page's
- * order is recorded in page_private(page) field.
- * So when we are allocating or freeing one, we can derive the state of the
- * other.  That is, if we allocate a small block, and both were   
- * free, the remainder of the region must be split into blocks.   
- * If a block is freed, and its buddy is also free, then this
- * triggers coalescing into a block of larger size.            
- *
- * -- wli
- */
-
-static inline void __free_one_page(struct page *page,
-               struct zone *zone, unsigned int order)
-{
-       unsigned long page_idx;
-       int order_size = 1 << order;
-
-       if (unlikely(PageCompound(page)))
-               destroy_compound_page(page, order);
-
-       page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
-
-       BUG_ON(page_idx & (order_size - 1));
-       BUG_ON(bad_range(zone, page));
-
-       zone->free_pages += order_size;
-       while (order < MAX_ORDER-1) {
-               unsigned long combined_idx;
-               struct free_area *area;
-               struct page *buddy;
-
-               buddy = __page_find_buddy(page, page_idx, order);
-               if (!page_is_buddy(page, buddy, order))
-                       break;          /* Move the buddy up one level. */
-
-               list_del(&buddy->lru);
-               area = zone->free_area + order;
-               area->nr_free--;
-               rmv_page_order(buddy);
-               combined_idx = __find_combined_index(page_idx, order);
-               page = page + (combined_idx - page_idx);
-               page_idx = combined_idx;
-               order++;
-       }
-       set_page_order(page, order);
-       list_add(&page->lru, &zone->free_area[order].free_list);
-       zone->free_area[order].nr_free++;
-}
-
-static inline int free_pages_check(struct page *page)
-{
-       if (unlikely(page_mapcount(page) |
-               (page->mapping != NULL)  |
-               (page_count(page) != 0)  |
-               (page->flags & (
-                       1 << PG_lru     |
-                       1 << PG_private |
-                       1 << PG_locked  |
-                       1 << PG_active  |
-                       1 << PG_reclaim |
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
-                       1 << PG_writeback |
-                       1 << PG_reserved |
-                       1 << PG_buddy   |
-#ifdef CONFIG_X86_XEN
-                       1 << PG_pinned  |
-#endif
-                       1 << PG_foreign ))))
-               bad_page(page);
-       if (PageDirty(page))
-               __ClearPageDirty(page);
-       /*
-        * For now, we report if PG_reserved was found set, but do not
-        * clear it, and do not free the page.  But we shall soon need
-        * to do more, for when the ZERO_PAGE count wraps negative.
-        */
-       return PageReserved(page);
-}
-
-/*
- * Frees a list of pages. 
- * Assumes all pages on list are in same zone, and of same order.
- * count is the number of pages to free.
- *
- * If the zone was previously in an "all pages pinned" state then look to
- * see if this freeing clears that state.
- *
- * And clear the zone's pages_scanned counter, to hold off the "all pages are
- * pinned" detection logic.
- */
-static void free_pages_bulk(struct zone *zone, int count,
-                                       struct list_head *list, int order)
-{
-       spin_lock(&zone->lock);
-       zone->all_unreclaimable = 0;
-       zone->pages_scanned = 0;
-       while (count--) {
-               struct page *page;
-
-               BUG_ON(list_empty(list));
-               page = list_entry(list->prev, struct page, lru);
-               /* have to delete it as __free_one_page list manipulates */
-               list_del(&page->lru);
-               __free_one_page(page, zone, order);
-       }
-       spin_unlock(&zone->lock);
-}
-
-static void free_one_page(struct zone *zone, struct page *page, int order)
-{
-       LIST_HEAD(list);
-       list_add(&page->lru, &list);
-       free_pages_bulk(zone, 1, &list, order);
-}
-
-static void __free_pages_ok(struct page *page, unsigned int order)
-{
-       unsigned long flags;
-       int i;
-       int reserved = 0;
-
-       if (arch_free_page(page, order))
-               return;
-       if (!PageHighMem(page))
-               debug_check_no_locks_freed(page_address(page),
-                                          PAGE_SIZE<<order);
-
-       for (i = 0 ; i < (1 << order) ; ++i)
-               reserved += free_pages_check(page + i);
-       if (reserved)
-               return;
-
-       kernel_map_pages(page, 1 << order, 0);
-       local_irq_save(flags);
-       __count_vm_events(PGFREE, 1 << order);
-       free_one_page(page_zone(page), page, order);
-       local_irq_restore(flags);
-}
-
-/*
- * permit the bootmem allocator to evade page validation on high-order frees
- */
-void fastcall __init __free_pages_bootmem(struct page *page, unsigned int order)
-{
-       if (order == 0) {
-               __ClearPageReserved(page);
-               set_page_count(page, 0);
-               set_page_refcounted(page);
-               __free_page(page);
-       } else {
-               int loop;
-
-               prefetchw(page);
-               for (loop = 0; loop < BITS_PER_LONG; loop++) {
-                       struct page *p = &page[loop];
-
-                       if (loop + 1 < BITS_PER_LONG)
-                               prefetchw(p + 1);
-                       __ClearPageReserved(p);
-                       set_page_count(p, 0);
-               }
-
-               set_page_refcounted(page);
-               __free_pages(page, order);
-       }
-}
-
-
-/*
- * The order of subdivision here is critical for the IO subsystem.
- * Please do not alter this order without good reasons and regression
- * testing. Specifically, as large blocks of memory are subdivided,
- * the order in which smaller blocks are delivered depends on the order
- * they're subdivided in this function. This is the primary factor
- * influencing the order in which pages are delivered to the IO
- * subsystem according to empirical testing, and this is also justified
- * by considering the behavior of a buddy system containing a single
- * large block of memory acted on by a series of small allocations.
- * This behavior is a critical factor in sglist merging's success.
- *
- * -- wli
- */
-static inline void expand(struct zone *zone, struct page *page,
-       int low, int high, struct free_area *area)
-{
-       unsigned long size = 1 << high;
-
-       while (high > low) {
-               area--;
-               high--;
-               size >>= 1;
-               BUG_ON(bad_range(zone, &page[size]));
-               list_add(&page[size].lru, &area->free_list);
-               area->nr_free++;
-               set_page_order(&page[size], high);
-       }
-}
-
-/*
- * This page is about to be returned from the page allocator
- */
-static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
-{
-       if (unlikely(page_mapcount(page) |
-               (page->mapping != NULL)  |
-               (page_count(page) != 0)  |
-               (page->flags & (
-                       1 << PG_lru     |
-                       1 << PG_private |
-                       1 << PG_locked  |
-                       1 << PG_active  |
-                       1 << PG_dirty   |
-                       1 << PG_reclaim |
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
-                       1 << PG_writeback |
-                       1 << PG_reserved |
-                       1 << PG_buddy   |
-#ifdef CONFIG_X86_XEN
-                       1 << PG_pinned  |
-#endif
-                       1 << PG_foreign ))))
-               bad_page(page);
-
-       /*
-        * For now, we report if PG_reserved was found set, but do not
-        * clear it, and do not allocate the page: as a safety net.
-        */
-       if (PageReserved(page))
-               return 1;
-
-       page->flags &= ~(1 << PG_uptodate | 1 << PG_error |
-                       1 << PG_referenced | 1 << PG_arch_1 |
-                       1 << PG_checked | 1 << PG_mappedtodisk);
-       set_page_private(page, 0);
-       set_page_refcounted(page);
-       kernel_map_pages(page, 1 << order, 1);
-
-       if (gfp_flags & __GFP_ZERO)
-               prep_zero_page(page, order, gfp_flags);
-
-       if (order && (gfp_flags & __GFP_COMP))
-               prep_compound_page(page, order);
-
-       return 0;
-}
-
-/* 
- * Do the hard work of removing an element from the buddy allocator.
- * Call me with the zone->lock already held.
- */
-static struct page *__rmqueue(struct zone *zone, unsigned int order)
-{
-       struct free_area * area;
-       unsigned int current_order;
-       struct page *page;
-
-       for (current_order = order; current_order < MAX_ORDER; ++current_order) {
-               area = zone->free_area + current_order;
-               if (list_empty(&area->free_list))
-                       continue;
-
-               page = list_entry(area->free_list.next, struct page, lru);
-               list_del(&page->lru);
-               rmv_page_order(page);
-               area->nr_free--;
-               zone->free_pages -= 1UL << order;
-               expand(zone, page, order, current_order, area);
-               return page;
-       }
-
-       return NULL;
-}
-
-/* 
- * Obtain a specified number of elements from the buddy allocator, all under
- * a single hold of the lock, for efficiency.  Add them to the supplied list.
- * Returns the number of new pages which were placed at *list.
- */
-static int rmqueue_bulk(struct zone *zone, unsigned int order, 
-                       unsigned long count, struct list_head *list)
-{
-       int i;
-       
-       spin_lock(&zone->lock);
-       for (i = 0; i < count; ++i) {
-               struct page *page = __rmqueue(zone, order);
-               if (unlikely(page == NULL))
-                       break;
-               list_add_tail(&page->lru, list);
-       }
-       spin_unlock(&zone->lock);
-       return i;
-}
-
-#ifdef CONFIG_NUMA
-/*
- * Called from the slab reaper to drain pagesets on a particular node that
- * belong to the currently executing processor.
- * Note that this function must be called with the thread pinned to
- * a single processor.
- */
-void drain_node_pages(int nodeid)
-{
-       int i, z;
-       unsigned long flags;
-
-       for (z = 0; z < MAX_NR_ZONES; z++) {
-               struct zone *zone = NODE_DATA(nodeid)->node_zones + z;
-               struct per_cpu_pageset *pset;
-
-               pset = zone_pcp(zone, smp_processor_id());
-               for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
-                       struct per_cpu_pages *pcp;
-
-                       pcp = &pset->pcp[i];
-                       if (pcp->count) {
-                               local_irq_save(flags);
-                               free_pages_bulk(zone, pcp->count, &pcp->list, 0);
-                               pcp->count = 0;
-                               local_irq_restore(flags);
-                       }
-               }
-       }
-}
-#endif
-
-#if defined(CONFIG_PM) || defined(CONFIG_HOTPLUG_CPU)
-static void __drain_pages(unsigned int cpu)
-{
-       unsigned long flags;
-       struct zone *zone;
-       int i;
-
-       for_each_zone(zone) {
-               struct per_cpu_pageset *pset;
-
-               pset = zone_pcp(zone, cpu);
-               for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
-                       struct per_cpu_pages *pcp;
-
-                       pcp = &pset->pcp[i];
-                       local_irq_save(flags);
-                       free_pages_bulk(zone, pcp->count, &pcp->list, 0);
-                       pcp->count = 0;
-                       local_irq_restore(flags);
-               }
-       }
-}
-#endif /* CONFIG_PM || CONFIG_HOTPLUG_CPU */
-
-#ifdef CONFIG_PM
-
-void mark_free_pages(struct zone *zone)
-{
-       unsigned long zone_pfn, flags;
-       int order;
-       struct list_head *curr;
-
-       if (!zone->spanned_pages)
-               return;
-
-       spin_lock_irqsave(&zone->lock, flags);
-       for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn)
-               ClearPageNosaveFree(pfn_to_page(zone_pfn + zone->zone_start_pfn));
-
-       for (order = MAX_ORDER - 1; order >= 0; --order)
-               list_for_each(curr, &zone->free_area[order].free_list) {
-                       unsigned long start_pfn, i;
-
-                       start_pfn = page_to_pfn(list_entry(curr, struct page, lru));
-
-                       for (i=0; i < (1<<order); i++)
-                               SetPageNosaveFree(pfn_to_page(start_pfn+i));
-       }
-       spin_unlock_irqrestore(&zone->lock, flags);
-}
-
-/*
- * Spill all of this CPU's per-cpu pages back into the buddy allocator.
- */
-void drain_local_pages(void)
-{
-       unsigned long flags;
-
-       local_irq_save(flags);  
-       __drain_pages(smp_processor_id());
-       local_irq_restore(flags);       
-}
-#endif /* CONFIG_PM */
-
-/*
- * Free a 0-order page
- */
-static void fastcall free_hot_cold_page(struct page *page, int cold)
-{
-       struct zone *zone = page_zone(page);
-       struct per_cpu_pages *pcp;
-       unsigned long flags;
-
-       if (arch_free_page(page, 0))
-               return;
-
-       if (PageAnon(page))
-               page->mapping = NULL;
-       if (free_pages_check(page))
-               return;
-
-       kernel_map_pages(page, 1, 0);
-
-       pcp = &zone_pcp(zone, get_cpu())->pcp[cold];
-       local_irq_save(flags);
-       __count_vm_event(PGFREE);
-       list_add(&page->lru, &pcp->list);
-       pcp->count++;
-       if (pcp->count >= pcp->high) {
-               free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
-               pcp->count -= pcp->batch;
-       }
-       local_irq_restore(flags);
-       put_cpu();
-}
-
-void fastcall free_hot_page(struct page *page)
-{
-       free_hot_cold_page(page, 0);
-}
-       
-void fastcall free_cold_page(struct page *page)
-{
-       free_hot_cold_page(page, 1);
-}
-
-/*
- * split_page takes a non-compound higher-order page, and splits it into
- * n (1<<order) sub-pages: page[0..n]
- * Each sub-page must be freed individually.
- *
- * Note: this is probably too low level an operation for use in drivers.
- * Please consult with lkml before using this in your driver.
- */
-void split_page(struct page *page, unsigned int order)
-{
-       int i;
-
-       BUG_ON(PageCompound(page));
-       BUG_ON(!page_count(page));
-       for (i = 1; i < (1 << order); i++)
-               set_page_refcounted(page + i);
-}
-
-/*
- * Really, prep_compound_page() should be called from __rmqueue_bulk().  But
- * we cheat by calling it from here, in the order > 0 path.  Saves a branch
- * or two.
- */
-static struct page *buffered_rmqueue(struct zonelist *zonelist,
-                       struct zone *zone, int order, gfp_t gfp_flags)
-{
-       unsigned long flags;
-       struct page *page;
-       int cold = !!(gfp_flags & __GFP_COLD);
-       int cpu;
-
-again:
-       cpu  = get_cpu();
-       if (likely(order == 0)) {
-               struct per_cpu_pages *pcp;
-
-               pcp = &zone_pcp(zone, cpu)->pcp[cold];
-               local_irq_save(flags);
-               if (!pcp->count) {
-                       pcp->count += rmqueue_bulk(zone, 0,
-                                               pcp->batch, &pcp->list);
-                       if (unlikely(!pcp->count))
-                               goto failed;
-               }
-               page = list_entry(pcp->list.next, struct page, lru);
-               list_del(&page->lru);
-               pcp->count--;
-       } else {
-               spin_lock_irqsave(&zone->lock, flags);
-               page = __rmqueue(zone, order);
-               spin_unlock(&zone->lock);
-               if (!page)
-                       goto failed;
-       }
-
-       __count_zone_vm_events(PGALLOC, zone, 1 << order);
-       zone_statistics(zonelist, zone);
-       local_irq_restore(flags);
-       put_cpu();
-
-       BUG_ON(bad_range(zone, page));
-       if (prep_new_page(page, order, gfp_flags))
-               goto again;
-       return page;
-
-failed:
-       local_irq_restore(flags);
-       put_cpu();
-       return NULL;
-}
-
-#define ALLOC_NO_WATERMARKS    0x01 /* don't check watermarks at all */
-#define ALLOC_WMARK_MIN                0x02 /* use pages_min watermark */
-#define ALLOC_WMARK_LOW                0x04 /* use pages_low watermark */
-#define ALLOC_WMARK_HIGH       0x08 /* use pages_high watermark */
-#define ALLOC_HARDER           0x10 /* try to alloc harder */
-#define ALLOC_HIGH             0x20 /* __GFP_HIGH set */
-#define ALLOC_CPUSET           0x40 /* check for correct cpuset */
-
-/*
- * Return 1 if free pages are above 'mark'. This takes into account the order
- * of the allocation.
- */
-int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
-                     int classzone_idx, int alloc_flags)
-{
-       /* free_pages my go negative - that's OK */
-       long min = mark, free_pages = z->free_pages - (1 << order) + 1;
-       int o;
-
-       if (alloc_flags & ALLOC_HIGH)
-               min -= min / 2;
-       if (alloc_flags & ALLOC_HARDER)
-               min -= min / 4;
-
-       if (free_pages <= min + z->lowmem_reserve[classzone_idx])
-               return 0;
-       for (o = 0; o < order; o++) {
-               /* At the next order, this order's pages become unavailable */
-               free_pages -= z->free_area[o].nr_free << o;
-
-               /* Require fewer higher order pages to be free */
-               min >>= 1;
-
-               if (free_pages <= min)
-                       return 0;
-       }
-       return 1;
-}
-
-/*
- * get_page_from_freeliest goes through the zonelist trying to allocate
- * a page.
- */
-static struct page *
-get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
-               struct zonelist *zonelist, int alloc_flags)
-{
-       struct zone **z = zonelist->zones;
-       struct page *page = NULL;
-       int classzone_idx = zone_idx(*z);
-
-       /*
-        * Go through the zonelist once, looking for a zone with enough free.
-        * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
-        */
-       do {
-               if ((alloc_flags & ALLOC_CPUSET) &&
-                               !cpuset_zone_allowed(*z, gfp_mask))
-                       continue;
-
-               if (!(alloc_flags & ALLOC_NO_WATERMARKS)) {
-                       unsigned long mark;
-                       if (alloc_flags & ALLOC_WMARK_MIN)
-                               mark = (*z)->pages_min;
-                       else if (alloc_flags & ALLOC_WMARK_LOW)
-                               mark = (*z)->pages_low;
-                       else
-                               mark = (*z)->pages_high;
-                       if (!zone_watermark_ok(*z, order, mark,
-                                   classzone_idx, alloc_flags))
-                               if (!zone_reclaim_mode ||
-                                   !zone_reclaim(*z, gfp_mask, order))
-                                       continue;
-               }
-
-               page = buffered_rmqueue(zonelist, *z, order, gfp_mask);
-               if (page) {
-                       break;
-               }
-       } while (*(++z) != NULL);
-       return page;
-}
-
-/*
- * This is the 'heart' of the zoned buddy allocator.
- */
-struct page * fastcall
-__alloc_pages(gfp_t gfp_mask, unsigned int order,
-               struct zonelist *zonelist)
-{
-       const gfp_t wait = gfp_mask & __GFP_WAIT;
-       struct zone **z;
-       struct page *page;
-       struct reclaim_state reclaim_state;
-       struct task_struct *p = current;
-       int do_retry;
-       int alloc_flags;
-       int did_some_progress;
-
-       might_sleep_if(wait);
-
-restart:
-       z = zonelist->zones;  /* the list of zones suitable for gfp_mask */
-
-       if (unlikely(*z == NULL)) {
-               /* Should this ever happen?? */
-               return NULL;
-       }
-
-       page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
-                               zonelist, ALLOC_WMARK_LOW|ALLOC_CPUSET);
-       if (page)
-               goto got_pg;
-
-       do {
-               wakeup_kswapd(*z, order);
-       } while (*(++z));
-
-       /*
-        * OK, we're below the kswapd watermark and have kicked background
-        * reclaim. Now things get more complex, so set up alloc_flags according
-        * to how we want to proceed.
-        *
-        * The caller may dip into page reserves a bit more if the caller
-        * cannot run direct reclaim, or if the caller has realtime scheduling
-        * policy or is asking for __GFP_HIGH memory.  GFP_ATOMIC requests will
-        * set both ALLOC_HARDER (!wait) and ALLOC_HIGH (__GFP_HIGH).
-        */
-       alloc_flags = ALLOC_WMARK_MIN;
-       if ((unlikely(rt_task(p)) && !in_interrupt()) || !wait)
-               alloc_flags |= ALLOC_HARDER;
-       if (gfp_mask & __GFP_HIGH)
-               alloc_flags |= ALLOC_HIGH;
-       if (wait)
-               alloc_flags |= ALLOC_CPUSET;
-
-       /*
-        * Go through the zonelist again. Let __GFP_HIGH and allocations
-        * coming from realtime tasks go deeper into reserves.
-        *
-        * This is the last chance, in general, before the goto nopage.
-        * Ignore cpuset if GFP_ATOMIC (!wait) rather than fail alloc.
-        * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
-        */
-       page = get_page_from_freelist(gfp_mask, order, zonelist, alloc_flags);
-       if (page)
-               goto got_pg;
-
-       /* This allocation should allow future memory freeing. */
-
-       if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
-                       && !in_interrupt()) {
-               if (!(gfp_mask & __GFP_NOMEMALLOC)) {
-nofail_alloc:
-                       /* go through the zonelist yet again, ignoring mins */
-                       page = get_page_from_freelist(gfp_mask, order,
-                               zonelist, ALLOC_NO_WATERMARKS);
-                       if (page)
-                               goto got_pg;
-                       if (gfp_mask & __GFP_NOFAIL) {
-                               blk_congestion_wait(WRITE, HZ/50);
-                               goto nofail_alloc;
-                       }
-               }
-               goto nopage;
-       }
-
-       /* Atomic allocations - we can't balance anything */
-       if (!wait)
-               goto nopage;
-
-rebalance:
-       cond_resched();
-
-       /* We now go into synchronous reclaim */
-       cpuset_memory_pressure_bump();
-       p->flags |= PF_MEMALLOC;
-       reclaim_state.reclaimed_slab = 0;
-       p->reclaim_state = &reclaim_state;
-
-       did_some_progress = try_to_free_pages(zonelist->zones, gfp_mask);
-
-       p->reclaim_state = NULL;
-       p->flags &= ~PF_MEMALLOC;
-
-       cond_resched();
-
-       if (likely(did_some_progress)) {
-               page = get_page_from_freelist(gfp_mask, order,
-                                               zonelist, alloc_flags);
-               if (page)
-                       goto got_pg;
-       } else if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY)) {
-               /*
-                * Go through the zonelist yet one more time, keep
-                * very high watermark here, this is only to catch
-                * a parallel oom killing, we must fail if we're still
-                * under heavy pressure.
-                */
-               page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
-                               zonelist, ALLOC_WMARK_HIGH|ALLOC_CPUSET);
-               if (page)
-                       goto got_pg;
-
-               out_of_memory(zonelist, gfp_mask, order);
-               goto restart;
-       }
-
-       /*
-        * Don't let big-order allocations loop unless the caller explicitly
-        * requests that.  Wait for some write requests to complete then retry.
-        *
-        * In this implementation, __GFP_REPEAT means __GFP_NOFAIL for order
-        * <= 3, but that may not be true in other implementations.
-        */
-       do_retry = 0;
-       if (!(gfp_mask & __GFP_NORETRY)) {
-               if ((order <= 3) || (gfp_mask & __GFP_REPEAT))
-                       do_retry = 1;
-               if (gfp_mask & __GFP_NOFAIL)
-                       do_retry = 1;
-       }
-       if (do_retry) {
-               blk_congestion_wait(WRITE, HZ/50);
-               goto rebalance;
-       }
-
-nopage:
-       if (!(gfp_mask & __GFP_NOWARN) && printk_ratelimit()) {
-               printk(KERN_WARNING "%s: page allocation failure."
-                       " order:%d, mode:0x%x\n",
-                       p->comm, order, gfp_mask);
-               dump_stack();
-               show_mem();
-       }
-got_pg:
-       return page;
-}
-
-EXPORT_SYMBOL(__alloc_pages);
-
-/*
- * Common helper functions.
- */
-fastcall unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
-{
-       struct page * page;
-       page = alloc_pages(gfp_mask, order);
-       if (!page)
-               return 0;
-       return (unsigned long) page_address(page);
-}
-
-EXPORT_SYMBOL(__get_free_pages);
-
-fastcall unsigned long get_zeroed_page(gfp_t gfp_mask)
-{
-       struct page * page;
-
-       /*
-        * get_zeroed_page() returns a 32-bit address, which cannot represent
-        * a highmem page
-        */
-       BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
-
-       page = alloc_pages(gfp_mask | __GFP_ZERO, 0);
-       if (page)
-               return (unsigned long) page_address(page);
-       return 0;
-}
-
-EXPORT_SYMBOL(get_zeroed_page);
-
-void __pagevec_free(struct pagevec *pvec)
-{
-       int i = pagevec_count(pvec);
-
-       while (--i >= 0)
-               free_hot_cold_page(pvec->pages[i], pvec->cold);
-}
-
-fastcall void __free_pages(struct page *page, unsigned int order)
-{
-       if (put_page_testzero(page)) {
-               if (order == 0)
-                       free_hot_page(page);
-               else
-                       __free_pages_ok(page, order);
-       }
-}
-
-EXPORT_SYMBOL(__free_pages);
-
-fastcall void free_pages(unsigned long addr, unsigned int order)
-{
-       if (addr != 0) {
-               BUG_ON(!virt_addr_valid((void *)addr));
-               __free_pages(virt_to_page((void *)addr), order);
-       }
-}
-
-EXPORT_SYMBOL(free_pages);
-
-/*
- * Total amount of free (allocatable) RAM:
- */
-unsigned int nr_free_pages(void)
-{
-       unsigned int sum = 0;
-       struct zone *zone;
-
-       for_each_zone(zone)
-               sum += zone->free_pages;
-
-       return sum;
-}
-
-EXPORT_SYMBOL(nr_free_pages);
-
-#ifdef CONFIG_NUMA
-unsigned int nr_free_pages_pgdat(pg_data_t *pgdat)
-{
-       unsigned int i, sum = 0;
-
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               sum += pgdat->node_zones[i].free_pages;
-
-       return sum;
-}
-#endif
-
-static unsigned int nr_free_zone_pages(int offset)
-{
-       /* Just pick one node, since fallback list is circular */
-       pg_data_t *pgdat = NODE_DATA(numa_node_id());
-       unsigned int sum = 0;
-
-       struct zonelist *zonelist = pgdat->node_zonelists + offset;
-       struct zone **zonep = zonelist->zones;
-       struct zone *zone;
-
-       for (zone = *zonep++; zone; zone = *zonep++) {
-               unsigned long size = zone->present_pages;
-               unsigned long high = zone->pages_high;
-               if (size > high)
-                       sum += size - high;
-       }
-
-       return sum;
-}
-
-/*
- * Amount of free RAM allocatable within ZONE_DMA and ZONE_NORMAL
- */
-unsigned int nr_free_buffer_pages(void)
-{
-       return nr_free_zone_pages(gfp_zone(GFP_USER));
-}
-
-/*
- * Amount of free RAM allocatable within all zones
- */
-unsigned int nr_free_pagecache_pages(void)
-{
-       return nr_free_zone_pages(gfp_zone(GFP_HIGHUSER));
-}
-
-#ifdef CONFIG_HIGHMEM
-unsigned int nr_free_highpages (void)
-{
-       pg_data_t *pgdat;
-       unsigned int pages = 0;
-
-       for_each_online_pgdat(pgdat)
-               pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages;
-
-       return pages;
-}
-#endif
-
-#ifdef CONFIG_NUMA
-static void show_node(struct zone *zone)
-{
-       printk("Node %d ", zone->zone_pgdat->node_id);
-}
-#else
-#define show_node(zone)        do { } while (0)
-#endif
-
-void si_meminfo(struct sysinfo *val)
-{
-       val->totalram = totalram_pages;
-       val->sharedram = 0;
-       val->freeram = nr_free_pages();
-       val->bufferram = nr_blockdev_pages();
-#ifdef CONFIG_HIGHMEM
-       val->totalhigh = totalhigh_pages;
-       val->freehigh = nr_free_highpages();
-#else
-       val->totalhigh = 0;
-       val->freehigh = 0;
-#endif
-       val->mem_unit = PAGE_SIZE;
-}
-
-EXPORT_SYMBOL(si_meminfo);
-
-#ifdef CONFIG_NUMA
-void si_meminfo_node(struct sysinfo *val, int nid)
-{
-       pg_data_t *pgdat = NODE_DATA(nid);
-
-       val->totalram = pgdat->node_present_pages;
-       val->freeram = nr_free_pages_pgdat(pgdat);
-       val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages;
-       val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages;
-       val->mem_unit = PAGE_SIZE;
-}
-#endif
-
-#define K(x) ((x) << (PAGE_SHIFT-10))
-
-/*
- * Show free area list (used inside shift_scroll-lock stuff)
- * We also calculate the percentage fragmentation. We do this by counting the
- * memory on each free list with the exception of the first item on the list.
- */
-void show_free_areas(void)
-{
-       int cpu, temperature;
-       unsigned long active;
-       unsigned long inactive;
-       unsigned long free;
-       struct zone *zone;
-
-       for_each_zone(zone) {
-               show_node(zone);
-               printk("%s per-cpu:", zone->name);
-
-               if (!populated_zone(zone)) {
-                       printk(" empty\n");
-                       continue;
-               } else
-                       printk("\n");
-
-               for_each_online_cpu(cpu) {
-                       struct per_cpu_pageset *pageset;
-
-                       pageset = zone_pcp(zone, cpu);
-
-                       for (temperature = 0; temperature < 2; temperature++)
-                               printk("cpu %d %s: high %d, batch %d used:%d\n",
-                                       cpu,
-                                       temperature ? "cold" : "hot",
-                                       pageset->pcp[temperature].high,
-                                       pageset->pcp[temperature].batch,
-                                       pageset->pcp[temperature].count);
-               }
-       }
-
-       get_zone_counts(&active, &inactive, &free);
-
-       printk("Free pages: %11ukB (%ukB HighMem)\n",
-               K(nr_free_pages()),
-               K(nr_free_highpages()));
-
-       printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu "
-               "unstable:%lu free:%u slab:%lu mapped:%lu pagetables:%lu\n",
-               active,
-               inactive,
-               global_page_state(NR_FILE_DIRTY),
-               global_page_state(NR_WRITEBACK),
-               global_page_state(NR_UNSTABLE_NFS),
-               nr_free_pages(),
-               global_page_state(NR_SLAB),
-               global_page_state(NR_FILE_MAPPED),
-               global_page_state(NR_PAGETABLE));
-
-       for_each_zone(zone) {
-               int i;
-
-               show_node(zone);
-               printk("%s"
-                       " free:%lukB"
-                       " min:%lukB"
-                       " low:%lukB"
-                       " high:%lukB"
-                       " active:%lukB"
-                       " inactive:%lukB"
-                       " present:%lukB"
-                       " pages_scanned:%lu"
-                       " all_unreclaimable? %s"
-                       "\n",
-                       zone->name,
-                       K(zone->free_pages),
-                       K(zone->pages_min),
-                       K(zone->pages_low),
-                       K(zone->pages_high),
-                       K(zone->nr_active),
-                       K(zone->nr_inactive),
-                       K(zone->present_pages),
-                       zone->pages_scanned,
-                       (zone->all_unreclaimable ? "yes" : "no")
-                       );
-               printk("lowmem_reserve[]:");
-               for (i = 0; i < MAX_NR_ZONES; i++)
-                       printk(" %lu", zone->lowmem_reserve[i]);
-               printk("\n");
-       }
-
-       for_each_zone(zone) {
-               unsigned long nr[MAX_ORDER], flags, order, total = 0;
-
-               show_node(zone);
-               printk("%s: ", zone->name);
-               if (!populated_zone(zone)) {
-                       printk("empty\n");
-                       continue;
-               }
-
-               spin_lock_irqsave(&zone->lock, flags);
-               for (order = 0; order < MAX_ORDER; order++) {
-                       nr[order] = zone->free_area[order].nr_free;
-                       total += nr[order] << order;
-               }
-               spin_unlock_irqrestore(&zone->lock, flags);
-               for (order = 0; order < MAX_ORDER; order++)
-                       printk("%lu*%lukB ", nr[order], K(1UL) << order);
-               printk("= %lukB\n", K(total));
-       }
-
-       show_swap_cache_info();
-}
-
-/*
- * Builds allocation fallback zone lists.
- *
- * Add all populated zones of a node to the zonelist.
- */
-static int __meminit build_zonelists_node(pg_data_t *pgdat,
-                       struct zonelist *zonelist, int nr_zones, int zone_type)
-{
-       struct zone *zone;
-
-       BUG_ON(zone_type > ZONE_HIGHMEM);
-
-       do {
-               zone = pgdat->node_zones + zone_type;
-               if (populated_zone(zone)) {
-#ifndef CONFIG_HIGHMEM
-                       BUG_ON(zone_type > ZONE_NORMAL);
-#endif
-                       zonelist->zones[nr_zones++] = zone;
-                       check_highest_zone(zone_type);
-               }
-               zone_type--;
-
-       } while (zone_type >= 0);
-       return nr_zones;
-}
-
-static inline int highest_zone(int zone_bits)
-{
-       int res = ZONE_NORMAL;
-       if (zone_bits & (__force int)__GFP_HIGHMEM)
-               res = ZONE_HIGHMEM;
-       if (zone_bits & (__force int)__GFP_DMA32)
-               res = ZONE_DMA32;
-       if (zone_bits & (__force int)__GFP_DMA)
-               res = ZONE_DMA;
-       return res;
-}
-
-#ifdef CONFIG_NUMA
-#define MAX_NODE_LOAD (num_online_nodes())
-static int __meminitdata node_load[MAX_NUMNODES];
-/**
- * find_next_best_node - find the next node that should appear in a given node's fallback list
- * @node: node whose fallback list we're appending
- * @used_node_mask: nodemask_t of already used nodes
- *
- * We use a number of factors to determine which is the next node that should
- * appear on a given node's fallback list.  The node should not have appeared
- * already in @node's fallback list, and it should be the next closest node
- * according to the distance array (which contains arbitrary distance values
- * from each node to each node in the system), and should also prefer nodes
- * with no CPUs, since presumably they'll have very little allocation pressure
- * on them otherwise.
- * It returns -1 if no node is found.
- */
-static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask)
-{
-       int n, val;
-       int min_val = INT_MAX;
-       int best_node = -1;
-
-       /* Use the local node if we haven't already */
-       if (!node_isset(node, *used_node_mask)) {
-               node_set(node, *used_node_mask);
-               return node;
-       }
-
-       for_each_online_node(n) {
-               cpumask_t tmp;
-
-               /* Don't want a node to appear more than once */
-               if (node_isset(n, *used_node_mask))
-                       continue;
-
-               /* Use the distance array to find the distance */
-               val = node_distance(node, n);
-
-               /* Penalize nodes under us ("prefer the next node") */
-               val += (n < node);
-
-               /* Give preference to headless and unused nodes */
-               tmp = node_to_cpumask(n);
-               if (!cpus_empty(tmp))
-                       val += PENALTY_FOR_NODE_WITH_CPUS;
-
-               /* Slight preference for less loaded node */
-               val *= (MAX_NODE_LOAD*MAX_NUMNODES);
-               val += node_load[n];
-
-               if (val < min_val) {
-                       min_val = val;
-                       best_node = n;
-               }
-       }
-
-       if (best_node >= 0)
-               node_set(best_node, *used_node_mask);
-
-       return best_node;
-}
-
-static void __meminit build_zonelists(pg_data_t *pgdat)
-{
-       int i, j, k, node, local_node;
-       int prev_node, load;
-       struct zonelist *zonelist;
-       nodemask_t used_mask;
-
-       /* initialize zonelists */
-       for (i = 0; i < GFP_ZONETYPES; i++) {
-               zonelist = pgdat->node_zonelists + i;
-               zonelist->zones[0] = NULL;
-       }
-
-       /* NUMA-aware ordering of nodes */
-       local_node = pgdat->node_id;
-       load = num_online_nodes();
-       prev_node = local_node;
-       nodes_clear(used_mask);
-       while ((node = find_next_best_node(local_node, &used_mask)) >= 0) {
-               int distance = node_distance(local_node, node);
-
-               /*
-                * If another node is sufficiently far away then it is better
-                * to reclaim pages in a zone before going off node.
-                */
-               if (distance > RECLAIM_DISTANCE)
-                       zone_reclaim_mode = 1;
-
-               /*
-                * We don't want to pressure a particular node.
-                * So adding penalty to the first node in same
-                * distance group to make it round-robin.
-                */
-
-               if (distance != node_distance(local_node, prev_node))
-                       node_load[node] += load;
-               prev_node = node;
-               load--;
-               for (i = 0; i < GFP_ZONETYPES; i++) {
-                       zonelist = pgdat->node_zonelists + i;
-                       for (j = 0; zonelist->zones[j] != NULL; j++);
-
-                       k = highest_zone(i);
-
-                       j = build_zonelists_node(NODE_DATA(node), zonelist, j, k);
-                       zonelist->zones[j] = NULL;
-               }
-       }
-}
-
-#else  /* CONFIG_NUMA */
-
-static void __meminit build_zonelists(pg_data_t *pgdat)
-{
-       int i, j, k, node, local_node;
-
-       local_node = pgdat->node_id;
-       for (i = 0; i < GFP_ZONETYPES; i++) {
-               struct zonelist *zonelist;
-
-               zonelist = pgdat->node_zonelists + i;
-
-               j = 0;
-               k = highest_zone(i);
-               j = build_zonelists_node(pgdat, zonelist, j, k);
-               /*
-                * Now we build the zonelist so that it contains the zones
-                * of all the other nodes.
-                * We don't want to pressure a particular node, so when
-                * building the zones for node N, we make sure that the
-                * zones coming right after the local ones are those from
-                * node N+1 (modulo N)
-                */
-               for (node = local_node + 1; node < MAX_NUMNODES; node++) {
-                       if (!node_online(node))
-                               continue;
-                       j = build_zonelists_node(NODE_DATA(node), zonelist, j, k);
-               }
-               for (node = 0; node < local_node; node++) {
-                       if (!node_online(node))
-                               continue;
-                       j = build_zonelists_node(NODE_DATA(node), zonelist, j, k);
-               }
-
-               zonelist->zones[j] = NULL;
-       }
-}
-
-#endif /* CONFIG_NUMA */
-
-/* return values int ....just for stop_machine_run() */
-static int __meminit __build_all_zonelists(void *dummy)
-{
-       int nid;
-       for_each_online_node(nid)
-               build_zonelists(NODE_DATA(nid));
-       return 0;
-}
-
-void __meminit build_all_zonelists(void)
-{
-       if (system_state == SYSTEM_BOOTING) {
-               __build_all_zonelists(0);
-               cpuset_init_current_mems_allowed();
-       } else {
-               /* we have to stop all cpus to guaranntee there is no user
-                  of zonelist */
-               stop_machine_run(__build_all_zonelists, NULL, NR_CPUS);
-               /* cpuset refresh routine should be here */
-       }
-       vm_total_pages = nr_free_pagecache_pages();
-       printk("Built %i zonelists.  Total pages: %ld\n",
-                       num_online_nodes(), vm_total_pages);
-}
-
-/*
- * Helper functions to size the waitqueue hash table.
- * Essentially these want to choose hash table sizes sufficiently
- * large so that collisions trying to wait on pages are rare.
- * But in fact, the number of active page waitqueues on typical
- * systems is ridiculously low, less than 200. So this is even
- * conservative, even though it seems large.
- *
- * The constant PAGES_PER_WAITQUEUE specifies the ratio of pages to
- * waitqueues, i.e. the size of the waitq table given the number of pages.
- */
-#define PAGES_PER_WAITQUEUE    256
-
-#ifndef CONFIG_MEMORY_HOTPLUG
-static inline unsigned long wait_table_hash_nr_entries(unsigned long pages)
-{
-       unsigned long size = 1;
-
-       pages /= PAGES_PER_WAITQUEUE;
-
-       while (size < pages)
-               size <<= 1;
-
-       /*
-        * Once we have dozens or even hundreds of threads sleeping
-        * on IO we've got bigger problems than wait queue collision.
-        * Limit the size of the wait table to a reasonable size.
-        */
-       size = min(size, 4096UL);
-
-       return max(size, 4UL);
-}
-#else
-/*
- * A zone's size might be changed by hot-add, so it is not possible to determine
- * a suitable size for its wait_table.  So we use the maximum size now.
- *
- * The max wait table size = 4096 x sizeof(wait_queue_head_t).   ie:
- *
- *    i386 (preemption config)    : 4096 x 16 = 64Kbyte.
- *    ia64, x86-64 (no preemption): 4096 x 20 = 80Kbyte.
- *    ia64, x86-64 (preemption)   : 4096 x 24 = 96Kbyte.
- *
- * The maximum entries are prepared when a zone's memory is (512K + 256) pages
- * or more by the traditional way. (See above).  It equals:
- *
- *    i386, x86-64, powerpc(4K page size) : =  ( 2G + 1M)byte.
- *    ia64(16K page size)                 : =  ( 8G + 4M)byte.
- *    powerpc (64K page size)             : =  (32G +16M)byte.
- */
-static inline unsigned long wait_table_hash_nr_entries(unsigned long pages)
-{
-       return 4096UL;
-}
-#endif
-
-/*
- * This is an integer logarithm so that shifts can be used later
- * to extract the more random high bits from the multiplicative
- * hash function before the remainder is taken.
- */
-static inline unsigned long wait_table_bits(unsigned long size)
-{
-       return ffz(~size);
-}
-
-#define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1))
-
-static void __init calculate_zone_totalpages(struct pglist_data *pgdat,
-               unsigned long *zones_size, unsigned long *zholes_size)
-{
-       unsigned long realtotalpages, totalpages = 0;
-       int i;
-
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               totalpages += zones_size[i];
-       pgdat->node_spanned_pages = totalpages;
-
-       realtotalpages = totalpages;
-       if (zholes_size)
-               for (i = 0; i < MAX_NR_ZONES; i++)
-                       realtotalpages -= zholes_size[i];
-       pgdat->node_present_pages = realtotalpages;
-       printk(KERN_DEBUG "On node %d totalpages: %lu\n", pgdat->node_id, realtotalpages);
-}
-
-
-/*
- * Initially all pages are reserved - free ones are freed
- * up by free_all_bootmem() once the early boot process is
- * done. Non-atomic initialization, single-pass.
- */
-void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
-               unsigned long start_pfn)
-{
-       struct page *page;
-       unsigned long end_pfn = start_pfn + size;
-       unsigned long pfn;
-
-       for (pfn = start_pfn; pfn < end_pfn; pfn++) {
-               if (!early_pfn_valid(pfn))
-                       continue;
-               page = pfn_to_page(pfn);
-               set_page_links(page, zone, nid, pfn);
-               init_page_count(page);
-               reset_page_mapcount(page);
-               SetPageReserved(page);
-               INIT_LIST_HEAD(&page->lru);
-#ifdef WANT_PAGE_VIRTUAL
-               /* The shift won't overflow because ZONE_NORMAL is below 4G. */
-               if (!is_highmem_idx(zone))
-                       set_page_address(page, __va(pfn << PAGE_SHIFT));
-#endif
-       }
-}
-
-void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone,
-                               unsigned long size)
-{
-       int order;
-       for (order = 0; order < MAX_ORDER ; order++) {
-               INIT_LIST_HEAD(&zone->free_area[order].free_list);
-               zone->free_area[order].nr_free = 0;
-       }
-}
-
-#define ZONETABLE_INDEX(x, zone_nr)    ((x << ZONES_SHIFT) | zone_nr)
-void zonetable_add(struct zone *zone, int nid, int zid, unsigned long pfn,
-               unsigned long size)
-{
-       unsigned long snum = pfn_to_section_nr(pfn);
-       unsigned long end = pfn_to_section_nr(pfn + size);
-
-       if (FLAGS_HAS_NODE)
-               zone_table[ZONETABLE_INDEX(nid, zid)] = zone;
-       else
-               for (; snum <= end; snum++)
-                       zone_table[ZONETABLE_INDEX(snum, zid)] = zone;
-}
-
-#ifndef __HAVE_ARCH_MEMMAP_INIT
-#define memmap_init(size, nid, zone, start_pfn) \
-       memmap_init_zone((size), (nid), (zone), (start_pfn))
-#endif
-
-static int __cpuinit zone_batchsize(struct zone *zone)
-{
-       int batch;
-
-       /*
-        * The per-cpu-pages pools are set to around 1000th of the
-        * size of the zone.  But no more than 1/2 of a meg.
-        *
-        * OK, so we don't know how big the cache is.  So guess.
-        */
-       batch = zone->present_pages / 1024;
-       if (batch * PAGE_SIZE > 512 * 1024)
-               batch = (512 * 1024) / PAGE_SIZE;
-       batch /= 4;             /* We effectively *= 4 below */
-       if (batch < 1)
-               batch = 1;
-
-       /*
-        * Clamp the batch to a 2^n - 1 value. Having a power
-        * of 2 value was found to be more likely to have
-        * suboptimal cache aliasing properties in some cases.
-        *
-        * For example if 2 tasks are alternately allocating
-        * batches of pages, one task can end up with a lot
-        * of pages of one half of the possible page colors
-        * and the other with pages of the other colors.
-        */
-       batch = (1 << (fls(batch + batch/2)-1)) - 1;
-
-       return batch;
-}
-
-inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
-{
-       struct per_cpu_pages *pcp;
-
-       memset(p, 0, sizeof(*p));
-
-       pcp = &p->pcp[0];               /* hot */
-       pcp->count = 0;
-       pcp->high = 6 * batch;
-       pcp->batch = max(1UL, 1 * batch);
-       INIT_LIST_HEAD(&pcp->list);
-
-       pcp = &p->pcp[1];               /* cold*/
-       pcp->count = 0;
-       pcp->high = 2 * batch;
-       pcp->batch = max(1UL, batch/2);
-       INIT_LIST_HEAD(&pcp->list);
-}
-
-/*
- * setup_pagelist_highmark() sets the high water mark for hot per_cpu_pagelist
- * to the value high for the pageset p.
- */
-
-static void setup_pagelist_highmark(struct per_cpu_pageset *p,
-                               unsigned long high)
-{
-       struct per_cpu_pages *pcp;
-
-       pcp = &p->pcp[0]; /* hot list */
-       pcp->high = high;
-       pcp->batch = max(1UL, high/4);
-       if ((high/4) > (PAGE_SHIFT * 8))
-               pcp->batch = PAGE_SHIFT * 8;
-}
-
-
-#ifdef CONFIG_NUMA
-/*
- * Boot pageset table. One per cpu which is going to be used for all
- * zones and all nodes. The parameters will be set in such a way
- * that an item put on a list will immediately be handed over to
- * the buddy list. This is safe since pageset manipulation is done
- * with interrupts disabled.
- *
- * Some NUMA counter updates may also be caught by the boot pagesets.
- *
- * The boot_pagesets must be kept even after bootup is complete for
- * unused processors and/or zones. They do play a role for bootstrapping
- * hotplugged processors.
- *
- * zoneinfo_show() and maybe other functions do
- * not check if the processor is online before following the pageset pointer.
- * Other parts of the kernel may not check if the zone is available.
- */
-static struct per_cpu_pageset boot_pageset[NR_CPUS];
-
-/*
- * Dynamically allocate memory for the
- * per cpu pageset array in struct zone.
- */
-static int __cpuinit process_zones(int cpu)
-{
-       struct zone *zone, *dzone;
-
-       for_each_zone(zone) {
-
-               zone_pcp(zone, cpu) = kmalloc_node(sizeof(struct per_cpu_pageset),
-                                        GFP_KERNEL, cpu_to_node(cpu));
-               if (!zone_pcp(zone, cpu))
-                       goto bad;
-
-               setup_pageset(zone_pcp(zone, cpu), zone_batchsize(zone));
-
-               if (percpu_pagelist_fraction)
-                       setup_pagelist_highmark(zone_pcp(zone, cpu),
-                               (zone->present_pages / percpu_pagelist_fraction));
-       }
-
-       return 0;
-bad:
-       for_each_zone(dzone) {
-               if (dzone == zone)
-                       break;
-               kfree(zone_pcp(dzone, cpu));
-               zone_pcp(dzone, cpu) = NULL;
-       }
-       return -ENOMEM;
-}
-
-static inline void free_zone_pagesets(int cpu)
-{
-       struct zone *zone;
-
-       for_each_zone(zone) {
-               struct per_cpu_pageset *pset = zone_pcp(zone, cpu);
-
-               zone_pcp(zone, cpu) = NULL;
-               kfree(pset);
-       }
-}
-
-static int __cpuinit pageset_cpuup_callback(struct notifier_block *nfb,
-               unsigned long action,
-               void *hcpu)
-{
-       int cpu = (long)hcpu;
-       int ret = NOTIFY_OK;
-
-       switch (action) {
-               case CPU_UP_PREPARE:
-                       if (process_zones(cpu))
-                               ret = NOTIFY_BAD;
-                       break;
-               case CPU_UP_CANCELED:
-               case CPU_DEAD:
-                       free_zone_pagesets(cpu);
-                       break;
-               default:
-                       break;
-       }
-       return ret;
-}
-
-static struct notifier_block __cpuinitdata pageset_notifier =
-       { &pageset_cpuup_callback, NULL, 0 };
-
-void __init setup_per_cpu_pageset(void)
-{
-       int err;
-
-       /* Initialize per_cpu_pageset for cpu 0.
-        * A cpuup callback will do this for every cpu
-        * as it comes online
-        */
-       err = process_zones(smp_processor_id());
-       BUG_ON(err);
-       register_cpu_notifier(&pageset_notifier);
-}
-
-#endif
-
-static __meminit
-int zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages)
-{
-       int i;
-       struct pglist_data *pgdat = zone->zone_pgdat;
-       size_t alloc_size;
-
-       /*
-        * The per-page waitqueue mechanism uses hashed waitqueues
-        * per zone.
-        */
-       zone->wait_table_hash_nr_entries =
-                wait_table_hash_nr_entries(zone_size_pages);
-       zone->wait_table_bits =
-               wait_table_bits(zone->wait_table_hash_nr_entries);
-       alloc_size = zone->wait_table_hash_nr_entries
-                                       * sizeof(wait_queue_head_t);
-
-       if (system_state == SYSTEM_BOOTING) {
-               zone->wait_table = (wait_queue_head_t *)
-                       alloc_bootmem_node(pgdat, alloc_size);
-       } else {
-               /*
-                * This case means that a zone whose size was 0 gets new memory
-                * via memory hot-add.
-                * But it may be the case that a new node was hot-added.  In
-                * this case vmalloc() will not be able to use this new node's
-                * memory - this wait_table must be initialized to use this new
-                * node itself as well.
-                * To use this new node's memory, further consideration will be
-                * necessary.
-                */
-               zone->wait_table = (wait_queue_head_t *)vmalloc(alloc_size);
-       }
-       if (!zone->wait_table)
-               return -ENOMEM;
-
-       for(i = 0; i < zone->wait_table_hash_nr_entries; ++i)
-               init_waitqueue_head(zone->wait_table + i);
-
-       return 0;
-}
-
-static __meminit void zone_pcp_init(struct zone *zone)
-{
-       int cpu;
-       unsigned long batch = zone_batchsize(zone);
-
-       for (cpu = 0; cpu < NR_CPUS; cpu++) {
-#ifdef CONFIG_NUMA
-               /* Early boot. Slab allocator not functional yet */
-               zone_pcp(zone, cpu) = &boot_pageset[cpu];
-               setup_pageset(&boot_pageset[cpu],0);
-#else
-               setup_pageset(zone_pcp(zone,cpu), batch);
-#endif
-       }
-       if (zone->present_pages)
-               printk(KERN_DEBUG "  %s zone: %lu pages, LIFO batch:%lu\n",
-                       zone->name, zone->present_pages, batch);
-}
-
-__meminit int init_currently_empty_zone(struct zone *zone,
-                                       unsigned long zone_start_pfn,
-                                       unsigned long size)
-{
-       struct pglist_data *pgdat = zone->zone_pgdat;
-       int ret;
-       ret = zone_wait_table_init(zone, size);
-       if (ret)
-               return ret;
-       pgdat->nr_zones = zone_idx(zone) + 1;
-
-       zone->zone_start_pfn = zone_start_pfn;
-
-       memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn);
-
-       zone_init_free_lists(pgdat, zone, zone->spanned_pages);
-
-       return 0;
-}
-
-/*
- * Set up the zone data structures:
- *   - mark all pages reserved
- *   - mark all memory queues empty
- *   - clear the memory bitmaps
- */
-static void __meminit free_area_init_core(struct pglist_data *pgdat,
-               unsigned long *zones_size, unsigned long *zholes_size)
-{
-       unsigned long j;
-       int nid = pgdat->node_id;
-       unsigned long zone_start_pfn = pgdat->node_start_pfn;
-       int ret;
-
-       pgdat_resize_init(pgdat);
-       pgdat->nr_zones = 0;
-       init_waitqueue_head(&pgdat->kswapd_wait);
-       pgdat->kswapd_max_order = 0;
-       
-       for (j = 0; j < MAX_NR_ZONES; j++) {
-               struct zone *zone = pgdat->node_zones + j;
-               unsigned long size, realsize;
-
-               realsize = size = zones_size[j];
-               if (zholes_size)
-                       realsize -= zholes_size[j];
-
-               if (j < ZONE_HIGHMEM)
-                       nr_kernel_pages += realsize;
-               nr_all_pages += realsize;
-
-               zone->spanned_pages = size;
-               zone->present_pages = realsize;
-#ifdef CONFIG_NUMA
-               zone->min_unmapped_ratio = (realsize*sysctl_min_unmapped_ratio)
-                                               / 100;
-#endif
-               zone->name = zone_names[j];
-               spin_lock_init(&zone->lock);
-               spin_lock_init(&zone->lru_lock);
-               zone_seqlock_init(zone);
-               zone->zone_pgdat = pgdat;
-               zone->free_pages = 0;
-
-               zone->temp_priority = zone->prev_priority = DEF_PRIORITY;
-
-               zone_pcp_init(zone);
-               INIT_LIST_HEAD(&zone->active_list);
-               INIT_LIST_HEAD(&zone->inactive_list);
-               zone->nr_scan_active = 0;
-               zone->nr_scan_inactive = 0;
-               zone->nr_active = 0;
-               zone->nr_inactive = 0;
-               zap_zone_vm_stats(zone);
-               atomic_set(&zone->reclaim_in_progress, 0);
-               if (!size)
-                       continue;
-
-               zonetable_add(zone, nid, j, zone_start_pfn, size);
-               ret = init_currently_empty_zone(zone, zone_start_pfn, size);
-               BUG_ON(ret);
-               zone_start_pfn += size;
-       }
-}
-
-static void __init alloc_node_mem_map(struct pglist_data *pgdat)
-{
-       /* Skip empty nodes */
-       if (!pgdat->node_spanned_pages)
-               return;
-
-#ifdef CONFIG_FLAT_NODE_MEM_MAP
-       /* ia64 gets its own node_mem_map, before this, without bootmem */
-       if (!pgdat->node_mem_map) {
-               unsigned long size, start, end;
-               struct page *map;
-
-               /*
-                * The zone's endpoints aren't required to be MAX_ORDER
-                * aligned but the node_mem_map endpoints must be in order
-                * for the buddy allocator to function correctly.
-                */
-               start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES - 1);
-               end = pgdat->node_start_pfn + pgdat->node_spanned_pages;
-               end = ALIGN(end, MAX_ORDER_NR_PAGES);
-               size =  (end - start) * sizeof(struct page);
-               map = alloc_remap(pgdat->node_id, size);
-               if (!map)
-                       map = alloc_bootmem_node(pgdat, size);
-               pgdat->node_mem_map = map + (pgdat->node_start_pfn - start);
-       }
-#ifdef CONFIG_FLATMEM
-       /*
-        * With no DISCONTIG, the global mem_map is just set as node 0's
-        */
-       if (pgdat == NODE_DATA(0))
-               mem_map = NODE_DATA(0)->node_mem_map;
-#endif
-#endif /* CONFIG_FLAT_NODE_MEM_MAP */
-}
-
-void __meminit free_area_init_node(int nid, struct pglist_data *pgdat,
-               unsigned long *zones_size, unsigned long node_start_pfn,
-               unsigned long *zholes_size)
-{
-       pgdat->node_id = nid;
-       pgdat->node_start_pfn = node_start_pfn;
-       calculate_zone_totalpages(pgdat, zones_size, zholes_size);
-
-       alloc_node_mem_map(pgdat);
-
-       free_area_init_core(pgdat, zones_size, zholes_size);
-}
-
-#ifndef CONFIG_NEED_MULTIPLE_NODES
-static bootmem_data_t contig_bootmem_data;
-struct pglist_data contig_page_data = { .bdata = &contig_bootmem_data };
-
-EXPORT_SYMBOL(contig_page_data);
-#endif
-
-void __init free_area_init(unsigned long *zones_size)
-{
-       free_area_init_node(0, NODE_DATA(0), zones_size,
-                       __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL);
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-static int page_alloc_cpu_notify(struct notifier_block *self,
-                                unsigned long action, void *hcpu)
-{
-       int cpu = (unsigned long)hcpu;
-
-       if (action == CPU_DEAD) {
-               local_irq_disable();
-               __drain_pages(cpu);
-               vm_events_fold_cpu(cpu);
-               local_irq_enable();
-               refresh_cpu_vm_stats(cpu);
-       }
-       return NOTIFY_OK;
-}
-#endif /* CONFIG_HOTPLUG_CPU */
-
-void __init page_alloc_init(void)
-{
-       hotcpu_notifier(page_alloc_cpu_notify, 0);
-}
-
-/*
- * calculate_totalreserve_pages - called when sysctl_lower_zone_reserve_ratio
- *     or min_free_kbytes changes.
- */
-static void calculate_totalreserve_pages(void)
-{
-       struct pglist_data *pgdat;
-       unsigned long reserve_pages = 0;
-       int i, j;
-
-       for_each_online_pgdat(pgdat) {
-               for (i = 0; i < MAX_NR_ZONES; i++) {
-                       struct zone *zone = pgdat->node_zones + i;
-                       unsigned long max = 0;
-
-                       /* Find valid and maximum lowmem_reserve in the zone */
-                       for (j = i; j < MAX_NR_ZONES; j++) {
-                               if (zone->lowmem_reserve[j] > max)
-                                       max = zone->lowmem_reserve[j];
-                       }
-
-                       /* we treat pages_high as reserved pages. */
-                       max += zone->pages_high;
-
-                       if (max > zone->present_pages)
-                               max = zone->present_pages;
-                       reserve_pages += max;
-               }
-       }
-       totalreserve_pages = reserve_pages;
-}
-
-/*
- * setup_per_zone_lowmem_reserve - called whenever
- *     sysctl_lower_zone_reserve_ratio changes.  Ensures that each zone
- *     has a correct pages reserved value, so an adequate number of
- *     pages are left in the zone after a successful __alloc_pages().
- */
-static void setup_per_zone_lowmem_reserve(void)
-{
-       struct pglist_data *pgdat;
-       int j, idx;
-
-       for_each_online_pgdat(pgdat) {
-               for (j = 0; j < MAX_NR_ZONES; j++) {
-                       struct zone *zone = pgdat->node_zones + j;
-                       unsigned long present_pages = zone->present_pages;
-
-                       zone->lowmem_reserve[j] = 0;
-
-                       for (idx = j-1; idx >= 0; idx--) {
-                               struct zone *lower_zone;
-
-                               if (sysctl_lowmem_reserve_ratio[idx] < 1)
-                                       sysctl_lowmem_reserve_ratio[idx] = 1;
-
-                               lower_zone = pgdat->node_zones + idx;
-                               lower_zone->lowmem_reserve[j] = present_pages /
-                                       sysctl_lowmem_reserve_ratio[idx];
-                               present_pages += lower_zone->present_pages;
-                       }
-               }
-       }
-
-       /* update totalreserve_pages */
-       calculate_totalreserve_pages();
-}
-
-/*
- * setup_per_zone_pages_min - called when min_free_kbytes changes.  Ensures 
- *     that the pages_{min,low,high} values for each zone are set correctly 
- *     with respect to min_free_kbytes.
- */
-void setup_per_zone_pages_min(void)
-{
-       unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
-       unsigned long lowmem_pages = 0;
-       struct zone *zone;
-       unsigned long flags;
-
-       /* Calculate total number of !ZONE_HIGHMEM pages */
-       for_each_zone(zone) {
-               if (!is_highmem(zone))
-                       lowmem_pages += zone->present_pages;
-       }
-
-       for_each_zone(zone) {
-               u64 tmp;
-
-               spin_lock_irqsave(&zone->lru_lock, flags);
-               tmp = (u64)pages_min * zone->present_pages;
-               do_div(tmp, lowmem_pages);
-               if (is_highmem(zone)) {
-                       /*
-                        * __GFP_HIGH and PF_MEMALLOC allocations usually don't
-                        * need highmem pages, so cap pages_min to a small
-                        * value here.
-                        *
-                        * The (pages_high-pages_low) and (pages_low-pages_min)
-                        * deltas controls asynch page reclaim, and so should
-                        * not be capped for highmem.
-                        */
-                       int min_pages;
-
-                       min_pages = zone->present_pages / 1024;
-                       if (min_pages < SWAP_CLUSTER_MAX)
-                               min_pages = SWAP_CLUSTER_MAX;
-                       if (min_pages > 128)
-                               min_pages = 128;
-                       zone->pages_min = min_pages;
-               } else {
-                       /*
-                        * If it's a lowmem zone, reserve a number of pages
-                        * proportionate to the zone's size.
-                        */
-                       zone->pages_min = tmp;
-               }
-
-               zone->pages_low   = zone->pages_min + (tmp >> 2);
-               zone->pages_high  = zone->pages_min + (tmp >> 1);
-               spin_unlock_irqrestore(&zone->lru_lock, flags);
-       }
-
-       /* update totalreserve_pages */
-       calculate_totalreserve_pages();
-}
-
-/*
- * Initialise min_free_kbytes.
- *
- * For small machines we want it small (128k min).  For large machines
- * we want it large (64MB max).  But it is not linear, because network
- * bandwidth does not increase linearly with machine size.  We use
- *
- *     min_free_kbytes = 4 * sqrt(lowmem_kbytes), for better accuracy:
- *     min_free_kbytes = sqrt(lowmem_kbytes * 16)
- *
- * which yields
- *
- * 16MB:       512k
- * 32MB:       724k
- * 64MB:       1024k
- * 128MB:      1448k
- * 256MB:      2048k
- * 512MB:      2896k
- * 1024MB:     4096k
- * 2048MB:     5792k
- * 4096MB:     8192k
- * 8192MB:     11584k
- * 16384MB:    16384k
- */
-static int __init init_per_zone_pages_min(void)
-{
-       unsigned long lowmem_kbytes;
-
-       lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);
-
-       min_free_kbytes = int_sqrt(lowmem_kbytes * 16);
-       if (min_free_kbytes < 128)
-               min_free_kbytes = 128;
-       if (min_free_kbytes > 65536)
-               min_free_kbytes = 65536;
-       setup_per_zone_pages_min();
-       setup_per_zone_lowmem_reserve();
-       return 0;
-}
-module_init(init_per_zone_pages_min)
-
-/*
- * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so 
- *     that we can call two helper functions whenever min_free_kbytes
- *     changes.
- */
-int min_free_kbytes_sysctl_handler(ctl_table *table, int write, 
-       struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
-{
-       proc_dointvec(table, write, file, buffer, length, ppos);
-       setup_per_zone_pages_min();
-       return 0;
-}
-
-#ifdef CONFIG_NUMA
-int sysctl_min_unmapped_ratio_sysctl_handler(ctl_table *table, int write,
-       struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
-{
-       struct zone *zone;
-       int rc;
-
-       rc = proc_dointvec_minmax(table, write, file, buffer, length, ppos);
-       if (rc)
-               return rc;
-
-       for_each_zone(zone)
-               zone->min_unmapped_ratio = (zone->present_pages *
-                               sysctl_min_unmapped_ratio) / 100;
-       return 0;
-}
-#endif
-
-/*
- * lowmem_reserve_ratio_sysctl_handler - just a wrapper around
- *     proc_dointvec() so that we can call setup_per_zone_lowmem_reserve()
- *     whenever sysctl_lowmem_reserve_ratio changes.
- *
- * The reserve ratio obviously has absolutely no relation with the
- * pages_min watermarks. The lowmem reserve ratio can only make sense
- * if in function of the boot time zone sizes.
- */
-int lowmem_reserve_ratio_sysctl_handler(ctl_table *table, int write,
-       struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
-{
-       proc_dointvec_minmax(table, write, file, buffer, length, ppos);
-       setup_per_zone_lowmem_reserve();
-       return 0;
-}
-
-/*
- * percpu_pagelist_fraction - changes the pcp->high for each zone on each
- * cpu.  It is the fraction of total pages in each zone that a hot per cpu pagelist
- * can have before it gets flushed back to buddy allocator.
- */
-
-int percpu_pagelist_fraction_sysctl_handler(ctl_table *table, int write,
-       struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
-{
-       struct zone *zone;
-       unsigned int cpu;
-       int ret;
-
-       ret = proc_dointvec_minmax(table, write, file, buffer, length, ppos);
-       if (!write || (ret == -EINVAL))
-               return ret;
-       for_each_zone(zone) {
-               for_each_online_cpu(cpu) {
-                       unsigned long  high;
-                       high = zone->present_pages / percpu_pagelist_fraction;
-                       setup_pagelist_highmark(zone_pcp(zone, cpu), high);
-               }
-       }
-       return 0;
-}
-
-__initdata int hashdist = HASHDIST_DEFAULT;
-
-#ifdef CONFIG_NUMA
-static int __init set_hashdist(char *str)
-{
-       if (!str)
-               return 0;
-       hashdist = simple_strtoul(str, &str, 0);
-       return 1;
-}
-__setup("hashdist=", set_hashdist);
-#endif
-
-/*
- * allocate a large system hash table from bootmem
- * - it is assumed that the hash table must contain an exact power-of-2
- *   quantity of entries
- * - limit is the number of hash buckets, not the total allocation size
- */
-void *__init alloc_large_system_hash(const char *tablename,
-                                    unsigned long bucketsize,
-                                    unsigned long numentries,
-                                    int scale,
-                                    int flags,
-                                    unsigned int *_hash_shift,
-                                    unsigned int *_hash_mask,
-                                    unsigned long limit)
-{
-       unsigned long long max = limit;
-       unsigned long log2qty, size;
-       void *table = NULL;
-
-       /* allow the kernel cmdline to have a say */
-       if (!numentries) {
-               /* round applicable memory size up to nearest megabyte */
-               numentries = (flags & HASH_HIGHMEM) ? nr_all_pages : nr_kernel_pages;
-               numentries += (1UL << (20 - PAGE_SHIFT)) - 1;
-               numentries >>= 20 - PAGE_SHIFT;
-               numentries <<= 20 - PAGE_SHIFT;
-
-               /* limit to 1 bucket per 2^scale bytes of low memory */
-               if (scale > PAGE_SHIFT)
-                       numentries >>= (scale - PAGE_SHIFT);
-               else
-                       numentries <<= (PAGE_SHIFT - scale);
-       }
-       numentries = roundup_pow_of_two(numentries);
-
-       /* limit allocation size to 1/16 total memory by default */
-       if (max == 0) {
-               max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
-               do_div(max, bucketsize);
-       }
-
-       if (numentries > max)
-               numentries = max;
-
-       log2qty = long_log2(numentries);
-
-       do {
-               size = bucketsize << log2qty;
-               if (flags & HASH_EARLY)
-                       table = alloc_bootmem(size);
-               else if (hashdist)
-                       table = __vmalloc(size, GFP_ATOMIC, PAGE_KERNEL);
-               else {
-                       unsigned long order;
-                       for (order = 0; ((1UL << order) << PAGE_SHIFT) < size; order++)
-                               ;
-                       table = (void*) __get_free_pages(GFP_ATOMIC, order);
-               }
-       } while (!table && size > PAGE_SIZE && --log2qty);
-
-       if (!table)
-               panic("Failed to allocate %s hash table\n", tablename);
-
-       printk("%s hash table entries: %d (order: %d, %lu bytes)\n",
-              tablename,
-              (1U << log2qty),
-              long_log2(size) - PAGE_SHIFT,
-              size);
-
-       if (_hash_shift)
-               *_hash_shift = log2qty;
-       if (_hash_mask)
-               *_hash_mask = (1 << log2qty) - 1;
-
-       return table;
-}
-
-#ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE
-struct page *pfn_to_page(unsigned long pfn)
-{
-       return __pfn_to_page(pfn);
-}
-unsigned long page_to_pfn(struct page *page)
-{
-       return __page_to_pfn(page);
-}
-EXPORT_SYMBOL(pfn_to_page);
-EXPORT_SYMBOL(page_to_pfn);
-#endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */
diff --git a/linux-2.6-xen-sparse/net/core/dev.c b/linux-2.6-xen-sparse/net/core/dev.c
deleted file mode 100644 (file)
index ec002f7..0000000
+++ /dev/null
@@ -1,3660 +0,0 @@
-/*
- *     NET3    Protocol independent device support routines.
- *
- *             This program is free software; you can redistribute it and/or
- *             modify it under the terms of the GNU General Public License
- *             as published by the Free Software Foundation; either version
- *             2 of the License, or (at your option) any later version.
- *
- *     Derived from the non IP parts of dev.c 1.0.19
- *             Authors:        Ross Biro
- *                             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *                             Mark Evans, <evansmp@uhura.aston.ac.uk>
- *
- *     Additional Authors:
- *             Florian la Roche <rzsfl@rz.uni-sb.de>
- *             Alan Cox <gw4pts@gw4pts.ampr.org>
- *             David Hinds <dahinds@users.sourceforge.net>
- *             Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
- *             Adam Sulmicki <adam@cfar.umd.edu>
- *              Pekka Riikonen <priikone@poesidon.pspt.fi>
- *
- *     Changes:
- *              D.J. Barrow     :       Fixed bug where dev->refcnt gets set
- *                                     to 2 if register_netdev gets called
- *                                     before net_dev_init & also removed a
- *                                     few lines of code in the process.
- *             Alan Cox        :       device private ioctl copies fields back.
- *             Alan Cox        :       Transmit queue code does relevant
- *                                     stunts to keep the queue safe.
- *             Alan Cox        :       Fixed double lock.
- *             Alan Cox        :       Fixed promisc NULL pointer trap
- *             ????????        :       Support the full private ioctl range
- *             Alan Cox        :       Moved ioctl permission check into
- *                                     drivers
- *             Tim Kordas      :       SIOCADDMULTI/SIOCDELMULTI
- *             Alan Cox        :       100 backlog just doesn't cut it when
- *                                     you start doing multicast video 8)
- *             Alan Cox        :       Rewrote net_bh and list manager.
- *             Alan Cox        :       Fix ETH_P_ALL echoback lengths.
- *             Alan Cox        :       Took out transmit every packet pass
- *                                     Saved a few bytes in the ioctl handler
- *             Alan Cox        :       Network driver sets packet type before
- *                                     calling netif_rx. Saves a function
- *                                     call a packet.
- *             Alan Cox        :       Hashed net_bh()
- *             Richard Kooijman:       Timestamp fixes.
- *             Alan Cox        :       Wrong field in SIOCGIFDSTADDR
- *             Alan Cox        :       Device lock protection.
- *             Alan Cox        :       Fixed nasty side effect of device close
- *                                     changes.
- *             Rudi Cilibrasi  :       Pass the right thing to
- *                                     set_mac_address()
- *             Dave Miller     :       32bit quantity for the device lock to
- *                                     make it work out on a Sparc.
- *             Bjorn Ekwall    :       Added KERNELD hack.
- *             Alan Cox        :       Cleaned up the backlog initialise.
- *             Craig Metz      :       SIOCGIFCONF fix if space for under
- *                                     1 device.
- *         Thomas Bogendoerfer :       Return ENODEV for dev_open, if there
- *                                     is no device open function.
- *             Andi Kleen      :       Fix error reporting for SIOCGIFCONF
- *         Michael Chastain    :       Fix signed/unsigned for SIOCGIFCONF
- *             Cyrus Durgin    :       Cleaned for KMOD
- *             Adam Sulmicki   :       Bug Fix : Network Device Unload
- *                                     A network device unload needs to purge
- *                                     the backlog queue.
- *     Paul Rusty Russell      :       SIOCSIFNAME
- *              Pekka Riikonen  :      Netdev boot-time settings code
- *              Andrew Morton   :       Make unregister_netdevice wait
- *                                     indefinitely on dev->refcnt
- *             J Hadi Salim    :       - Backlog queue sampling
- *                                     - netif_rx() feedback
- */
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <linux/bitops.h>
-#include <linux/capability.h>
-#include <linux/cpu.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mutex.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/if_ether.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/notifier.h>
-#include <linux/skbuff.h>
-#include <net/sock.h>
-#include <linux/rtnetlink.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/stat.h>
-#include <linux/if_bridge.h>
-#include <linux/divert.h>
-#include <net/dst.h>
-#include <net/pkt_sched.h>
-#include <net/checksum.h>
-#include <linux/highmem.h>
-#include <linux/init.h>
-#include <linux/kmod.h>
-#include <linux/module.h>
-#include <linux/kallsyms.h>
-#include <linux/netpoll.h>
-#include <linux/rcupdate.h>
-#include <linux/delay.h>
-#include <linux/wireless.h>
-#include <net/iw_handler.h>
-#include <asm/current.h>
-#include <linux/err.h>
-#include <linux/audit.h>
-#include <linux/dmaengine.h>
-#include <linux/err.h>
-#include <linux/ctype.h>
-
-#ifdef CONFIG_XEN
-#include <net/ip.h>
-#include <linux/tcp.h>
-#include <linux/udp.h>
-#endif
-
-/*
- *     The list of packet types we will receive (as opposed to discard)
- *     and the routines to invoke.
- *
- *     Why 16. Because with 16 the only overlap we get on a hash of the
- *     low nibble of the protocol value is RARP/SNAP/X.25.
- *
- *      NOTE:  That is no longer true with the addition of VLAN tags.  Not
- *             sure which should go first, but I bet it won't make much
- *             difference if we are running VLANs.  The good news is that
- *             this protocol won't be in the list unless compiled in, so
- *             the average user (w/out VLANs) will not be adversely affected.
- *             --BLG
- *
- *             0800    IP
- *             8100    802.1Q VLAN
- *             0001    802.3
- *             0002    AX.25
- *             0004    802.2
- *             8035    RARP
- *             0005    SNAP
- *             0805    X.25
- *             0806    ARP
- *             8137    IPX
- *             0009    Localtalk
- *             86DD    IPv6
- */
-
-static DEFINE_SPINLOCK(ptype_lock);
-static struct list_head ptype_base[16];        /* 16 way hashed list */
-static struct list_head ptype_all;             /* Taps */
-
-#ifdef CONFIG_NET_DMA
-static struct dma_client *net_dma_client;
-static unsigned int net_dma_count;
-static spinlock_t net_dma_event_lock;
-#endif
-
-/*
- * The @dev_base list is protected by @dev_base_lock and the rtnl
- * semaphore.
- *
- * Pure readers hold dev_base_lock for reading.
- *
- * Writers must hold the rtnl semaphore while they loop through the
- * dev_base list, and hold dev_base_lock for writing when they do the
- * actual updates.  This allows pure readers to access the list even
- * while a writer is preparing to update it.
- *
- * To put it another way, dev_base_lock is held for writing only to
- * protect against pure readers; the rtnl semaphore provides the
- * protection against other writers.
- *
- * See, for example usages, register_netdevice() and
- * unregister_netdevice(), which must be called with the rtnl
- * semaphore held.
- */
-struct net_device *dev_base;
-static struct net_device **dev_tail = &dev_base;
-DEFINE_RWLOCK(dev_base_lock);
-
-EXPORT_SYMBOL(dev_base);
-EXPORT_SYMBOL(dev_base_lock);
-
-#define NETDEV_HASHBITS        8
-static struct hlist_head dev_name_head[1<<NETDEV_HASHBITS];
-static struct hlist_head dev_index_head[1<<NETDEV_HASHBITS];
-
-static inline struct hlist_head *dev_name_hash(const char *name)
-{
-       unsigned hash = full_name_hash(name, strnlen(name, IFNAMSIZ));
-       return &dev_name_head[hash & ((1<<NETDEV_HASHBITS)-1)];
-}
-
-static inline struct hlist_head *dev_index_hash(int ifindex)
-{
-       return &dev_index_head[ifindex & ((1<<NETDEV_HASHBITS)-1)];
-}
-
-/*
- *     Our notifier list
- */
-
-static RAW_NOTIFIER_HEAD(netdev_chain);
-
-/*
- *     Device drivers call our routines to queue packets here. We empty the
- *     queue in the local softnet handler.
- */
-DEFINE_PER_CPU(struct softnet_data, softnet_data) = { NULL };
-
-#ifdef CONFIG_SYSFS
-extern int netdev_sysfs_init(void);
-extern int netdev_register_sysfs(struct net_device *);
-extern void netdev_unregister_sysfs(struct net_device *);
-#else
-#define netdev_sysfs_init()            (0)
-#define netdev_register_sysfs(dev)     (0)
-#define        netdev_unregister_sysfs(dev)    do { } while(0)
-#endif
-
-
-/*******************************************************************************
-
-               Protocol management and registration routines
-
-*******************************************************************************/
-
-/*
- *     For efficiency
- */
-
-static int netdev_nit;
-
-/*
- *     Add a protocol ID to the list. Now that the input handler is
- *     smarter we can dispense with all the messy stuff that used to be
- *     here.
- *
- *     BEWARE!!! Protocol handlers, mangling input packets,
- *     MUST BE last in hash buckets and checking protocol handlers
- *     MUST start from promiscuous ptype_all chain in net_bh.
- *     It is true now, do not change it.
- *     Explanation follows: if protocol handler, mangling packet, will
- *     be the first on list, it is not able to sense, that packet
- *     is cloned and should be copied-on-write, so that it will
- *     change it and subsequent readers will get broken packet.
- *                                                     --ANK (980803)
- */
-
-/**
- *     dev_add_pack - add packet handler
- *     @pt: packet type declaration
- *
- *     Add a protocol handler to the networking stack. The passed &packet_type
- *     is linked into kernel lists and may not be freed until it has been
- *     removed from the kernel lists.
- *
- *     This call does not sleep therefore it can not 
- *     guarantee all CPU's that are in middle of receiving packets
- *     will see the new packet type (until the next received packet).
- */
-
-void dev_add_pack(struct packet_type *pt)
-{
-       int hash;
-
-       spin_lock_bh(&ptype_lock);
-       if (pt->type == htons(ETH_P_ALL)) {
-               netdev_nit++;
-               list_add_rcu(&pt->list, &ptype_all);
-       } else {
-               hash = ntohs(pt->type) & 15;
-               list_add_rcu(&pt->list, &ptype_base[hash]);
-       }
-       spin_unlock_bh(&ptype_lock);
-}
-
-/**
- *     __dev_remove_pack        - remove packet handler
- *     @pt: packet type declaration
- *
- *     Remove a protocol handler that was previously added to the kernel
- *     protocol handlers by dev_add_pack(). The passed &packet_type is removed
- *     from the kernel lists and can be freed or reused once this function
- *     returns. 
- *
- *      The packet type might still be in use by receivers
- *     and must not be freed until after all the CPU's have gone
- *     through a quiescent state.
- */
-void __dev_remove_pack(struct packet_type *pt)
-{
-       struct list_head *head;
-       struct packet_type *pt1;
-
-       spin_lock_bh(&ptype_lock);
-
-       if (pt->type == htons(ETH_P_ALL)) {
-               netdev_nit--;
-               head = &ptype_all;
-       } else
-               head = &ptype_base[ntohs(pt->type) & 15];
-
-       list_for_each_entry(pt1, head, list) {
-               if (pt == pt1) {
-                       list_del_rcu(&pt->list);
-                       goto out;
-               }
-       }
-
-       printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt);
-out:
-       spin_unlock_bh(&ptype_lock);
-}
-/**
- *     dev_remove_pack  - remove packet handler
- *     @pt: packet type declaration
- *
- *     Remove a protocol handler that was previously added to the kernel
- *     protocol handlers by dev_add_pack(). The passed &packet_type is removed
- *     from the kernel lists and can be freed or reused once this function
- *     returns.
- *
- *     This call sleeps to guarantee that no CPU is looking at the packet
- *     type after return.
- */
-void dev_remove_pack(struct packet_type *pt)
-{
-       __dev_remove_pack(pt);
-       
-       synchronize_net();
-}
-
-/******************************************************************************
-
-                     Device Boot-time Settings Routines
-
-*******************************************************************************/
-
-/* Boot time configuration table */
-static struct netdev_boot_setup dev_boot_setup[NETDEV_BOOT_SETUP_MAX];
-
-/**
- *     netdev_boot_setup_add   - add new setup entry
- *     @name: name of the device
- *     @map: configured settings for the device
- *
- *     Adds new setup entry to the dev_boot_setup list.  The function
- *     returns 0 on error and 1 on success.  This is a generic routine to
- *     all netdevices.
- */
-static int netdev_boot_setup_add(char *name, struct ifmap *map)
-{
-       struct netdev_boot_setup *s;
-       int i;
-
-       s = dev_boot_setup;
-       for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) {
-               if (s[i].name[0] == '\0' || s[i].name[0] == ' ') {
-                       memset(s[i].name, 0, sizeof(s[i].name));
-                       strcpy(s[i].name, name);
-                       memcpy(&s[i].map, map, sizeof(s[i].map));
-                       break;
-               }
-       }
-
-       return i >= NETDEV_BOOT_SETUP_MAX ? 0 : 1;
-}
-
-/**
- *     netdev_boot_setup_check - check boot time settings
- *     @dev: the netdevice
- *
- *     Check boot time settings for the device.
- *     The found settings are set for the device to be used
- *     later in the device probing.
- *     Returns 0 if no settings found, 1 if they are.
- */
-int netdev_boot_setup_check(struct net_device *dev)
-{
-       struct netdev_boot_setup *s = dev_boot_setup;
-       int i;
-
-       for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) {
-               if (s[i].name[0] != '\0' && s[i].name[0] != ' ' &&
-                   !strncmp(dev->name, s[i].name, strlen(s[i].name))) {
-                       dev->irq        = s[i].map.irq;
-                       dev->base_addr  = s[i].map.base_addr;
-                       dev->mem_start  = s[i].map.mem_start;
-                       dev->mem_end    = s[i].map.mem_end;
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-
-/**
- *     netdev_boot_base        - get address from boot time settings
- *     @prefix: prefix for network device
- *     @unit: id for network device
- *
- *     Check boot time settings for the base address of device.
- *     The found settings are set for the device to be used
- *     later in the device probing.
- *     Returns 0 if no settings found.
- */
-unsigned long netdev_boot_base(const char *prefix, int unit)
-{
-       const struct netdev_boot_setup *s = dev_boot_setup;
-       char name[IFNAMSIZ];
-       int i;
-
-       sprintf(name, "%s%d", prefix, unit);
-
-       /*
-        * If device already registered then return base of 1
-        * to indicate not to probe for this interface
-        */
-       if (__dev_get_by_name(name))
-               return 1;
-
-       for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++)
-               if (!strcmp(name, s[i].name))
-                       return s[i].map.base_addr;
-       return 0;
-}
-
-/*
- * Saves at boot time configured settings for any netdevice.
- */
-int __init netdev_boot_setup(char *str)
-{
-       int ints[5];
-       struct ifmap map;
-
-       str = get_options(str, ARRAY_SIZE(ints), ints);
-       if (!str || !*str)
-               return 0;
-
-       /* Save settings */
-       memset(&map, 0, sizeof(map));
-       if (ints[0] > 0)
-               map.irq = ints[1];
-       if (ints[0] > 1)
-               map.base_addr = ints[2];
-       if (ints[0] > 2)
-               map.mem_start = ints[3];
-       if (ints[0] > 3)
-               map.mem_end = ints[4];
-
-       /* Add new entry to the list */
-       return netdev_boot_setup_add(str, &map);
-}
-
-__setup("netdev=", netdev_boot_setup);
-
-/*******************************************************************************
-
-                           Device Interface Subroutines
-
-*******************************************************************************/
-
-/**
- *     __dev_get_by_name       - find a device by its name
- *     @name: name to find
- *
- *     Find an interface by name. Must be called under RTNL semaphore
- *     or @dev_base_lock. If the name is found a pointer to the device
- *     is returned. If the name is not found then %NULL is returned. The
- *     reference counters are not incremented so the caller must be
- *     careful with locks.
- */
-
-struct net_device *__dev_get_by_name(const char *name)
-{
-       struct hlist_node *p;
-
-       hlist_for_each(p, dev_name_hash(name)) {
-               struct net_device *dev
-                       = hlist_entry(p, struct net_device, name_hlist);
-               if (!strncmp(dev->name, name, IFNAMSIZ))
-                       return dev;
-       }
-       return NULL;
-}
-
-/**
- *     dev_get_by_name         - find a device by its name
- *     @name: name to find
- *
- *     Find an interface by name. This can be called from any
- *     context and does its own locking. The returned handle has
- *     the usage count incremented and the caller must use dev_put() to
- *     release it when it is no longer needed. %NULL is returned if no
- *     matching device is found.
- */
-
-struct net_device *dev_get_by_name(const char *name)
-{
-       struct net_device *dev;
-
-       read_lock(&dev_base_lock);
-       dev = __dev_get_by_name(name);
-       if (dev)
-               dev_hold(dev);
-       read_unlock(&dev_base_lock);
-       return dev;
-}
-
-/**
- *     __dev_get_by_index - find a device by its ifindex
- *     @ifindex: index of device
- *
- *     Search for an interface by index. Returns %NULL if the device
- *     is not found or a pointer to the device. The device has not
- *     had its reference counter increased so the caller must be careful
- *     about locking. The caller must hold either the RTNL semaphore
- *     or @dev_base_lock.
- */
-
-struct net_device *__dev_get_by_index(int ifindex)
-{
-       struct hlist_node *p;
-
-       hlist_for_each(p, dev_index_hash(ifindex)) {
-               struct net_device *dev
-                       = hlist_entry(p, struct net_device, index_hlist);
-               if (dev->ifindex == ifindex)
-                       return dev;
-       }
-       return NULL;
-}
-
-
-/**
- *     dev_get_by_index - find a device by its ifindex
- *     @ifindex: index of device
- *
- *     Search for an interface by index. Returns NULL if the device
- *     is not found or a pointer to the device. The device returned has
- *     had a reference added and the pointer is safe until the user calls
- *     dev_put to indicate they have finished with it.
- */
-
-struct net_device *dev_get_by_index(int ifindex)
-{
-       struct net_device *dev;
-
-       read_lock(&dev_base_lock);
-       dev = __dev_get_by_index(ifindex);
-       if (dev)
-               dev_hold(dev);
-       read_unlock(&dev_base_lock);
-       return dev;
-}
-
-/**
- *     dev_getbyhwaddr - find a device by its hardware address
- *     @type: media type of device
- *     @ha: hardware address
- *
- *     Search for an interface by MAC address. Returns NULL if the device
- *     is not found or a pointer to the device. The caller must hold the
- *     rtnl semaphore. The returned device has not had its ref count increased
- *     and the caller must therefore be careful about locking
- *
- *     BUGS:
- *     If the API was consistent this would be __dev_get_by_hwaddr
- */
-
-struct net_device *dev_getbyhwaddr(unsigned short type, char *ha)
-{
-       struct net_device *dev;
-
-       ASSERT_RTNL();
-
-       for (dev = dev_base; dev; dev = dev->next)
-               if (dev->type == type &&
-                   !memcmp(dev->dev_addr, ha, dev->addr_len))
-                       break;
-       return dev;
-}
-
-EXPORT_SYMBOL(dev_getbyhwaddr);
-
-struct net_device *dev_getfirstbyhwtype(unsigned short type)
-{
-       struct net_device *dev;
-
-       rtnl_lock();
-       for (dev = dev_base; dev; dev = dev->next) {
-               if (dev->type == type) {
-                       dev_hold(dev);
-                       break;
-               }
-       }
-       rtnl_unlock();
-       return dev;
-}
-
-EXPORT_SYMBOL(dev_getfirstbyhwtype);
-
-/**
- *     dev_get_by_flags - find any device with given flags
- *     @if_flags: IFF_* values
- *     @mask: bitmask of bits in if_flags to check
- *
- *     Search for any interface with the given flags. Returns NULL if a device
- *     is not found or a pointer to the device. The device returned has 
- *     had a reference added and the pointer is safe until the user calls
- *     dev_put to indicate they have finished with it.
- */
-
-struct net_device * dev_get_by_flags(unsigned short if_flags, unsigned short mask)
-{
-       struct net_device *dev;
-
-       read_lock(&dev_base_lock);
-       for (dev = dev_base; dev != NULL; dev = dev->next) {
-               if (((dev->flags ^ if_flags) & mask) == 0) {
-                       dev_hold(dev);
-                       break;
-               }
-       }
-       read_unlock(&dev_base_lock);
-       return dev;
-}
-
-/**
- *     dev_valid_name - check if name is okay for network device
- *     @name: name string
- *
- *     Network device names need to be valid file names to
- *     to allow sysfs to work.  We also disallow any kind of
- *     whitespace.
- */
-int dev_valid_name(const char *name)
-{
-       if (*name == '\0')
-               return 0;
-       if (!strcmp(name, ".") || !strcmp(name, ".."))
-               return 0;
-
-       while (*name) {
-               if (*name == '/' || isspace(*name))
-                       return 0;
-               name++;
-       }
-       return 1;
-}
-
-/**
- *     dev_alloc_name - allocate a name for a device
- *     @dev: device
- *     @name: name format string
- *
- *     Passed a format string - eg "lt%d" it will try and find a suitable
- *     id. It scans list of devices to build up a free map, then chooses
- *     the first empty slot. The caller must hold the dev_base or rtnl lock
- *     while allocating the name and adding the device in order to avoid
- *     duplicates.
- *     Limited to bits_per_byte * page size devices (ie 32K on most platforms).
- *     Returns the number of the unit assigned or a negative errno code.
- */
-
-int dev_alloc_name(struct net_device *dev, const char *name)
-{
-       int i = 0;
-       char buf[IFNAMSIZ];
-       const char *p;
-       const int max_netdevices = 8*PAGE_SIZE;
-       long *inuse;
-       struct net_device *d;
-
-       p = strnchr(name, IFNAMSIZ-1, '%');
-       if (p) {
-               /*
-                * Verify the string as this thing may have come from
-                * the user.  There must be either one "%d" and no other "%"
-                * characters.
-                */
-               if (p[1] != 'd' || strchr(p + 2, '%'))
-                       return -EINVAL;
-
-               /* Use one page as a bit array of possible slots */
-               inuse = (long *) get_zeroed_page(GFP_ATOMIC);
-               if (!inuse)
-                       return -ENOMEM;
-
-               for (d = dev_base; d; d = d->next) {
-                       if (!sscanf(d->name, name, &i))
-                               continue;
-                       if (i < 0 || i >= max_netdevices)
-                               continue;
-
-                       /*  avoid cases where sscanf is not exact inverse of printf */
-                       snprintf(buf, sizeof(buf), name, i);
-                       if (!strncmp(buf, d->name, IFNAMSIZ))
-                               set_bit(i, inuse);
-               }
-
-               i = find_first_zero_bit(inuse, max_netdevices);
-               free_page((unsigned long) inuse);
-       }
-
-       snprintf(buf, sizeof(buf), name, i);
-       if (!__dev_get_by_name(buf)) {
-               strlcpy(dev->name, buf, IFNAMSIZ);
-               return i;
-       }
-
-       /* It is possible to run out of possible slots
-        * when the name is long and there isn't enough space left
-        * for the digits, or if all bits are used.
-        */
-       return -ENFILE;
-}
-
-
-/**
- *     dev_change_name - change name of a device
- *     @dev: device
- *     @newname: name (or format string) must be at least IFNAMSIZ
- *
- *     Change name of a device, can pass format strings "eth%d".
- *     for wildcarding.
- */
-int dev_change_name(struct net_device *dev, char *newname)
-{
-       int err = 0;
-
-       ASSERT_RTNL();
-
-       if (dev->flags & IFF_UP)
-               return -EBUSY;
-
-       if (!dev_valid_name(newname))
-               return -EINVAL;
-
-       if (strchr(newname, '%')) {
-               err = dev_alloc_name(dev, newname);
-               if (err < 0)
-                       return err;
-               strcpy(newname, dev->name);
-       }
-       else if (__dev_get_by_name(newname))
-               return -EEXIST;
-       else
-               strlcpy(dev->name, newname, IFNAMSIZ);
-
-       err = class_device_rename(&dev->class_dev, dev->name);
-       if (!err) {
-               hlist_del(&dev->name_hlist);
-               hlist_add_head(&dev->name_hlist, dev_name_hash(dev->name));
-               raw_notifier_call_chain(&netdev_chain,
-                               NETDEV_CHANGENAME, dev);
-       }
-
-       return err;
-}
-
-/**
- *     netdev_features_change - device changes features
- *     @dev: device to cause notification
- *
- *     Called to indicate a device has changed features.
- */
-void netdev_features_change(struct net_device *dev)
-{
-       raw_notifier_call_chain(&netdev_chain, NETDEV_FEAT_CHANGE, dev);
-}
-EXPORT_SYMBOL(netdev_features_change);
-
-/**
- *     netdev_state_change - device changes state
- *     @dev: device to cause notification
- *
- *     Called to indicate a device has changed state. This function calls
- *     the notifier chains for netdev_chain and sends a NEWLINK message
- *     to the routing socket.
- */
-void netdev_state_change(struct net_device *dev)
-{
-       if (dev->flags & IFF_UP) {
-               raw_notifier_call_chain(&netdev_chain,
-                               NETDEV_CHANGE, dev);
-               rtmsg_ifinfo(RTM_NEWLINK, dev, 0);
-       }
-}
-
-/**
- *     dev_load        - load a network module
- *     @name: name of interface
- *
- *     If a network interface is not present and the process has suitable
- *     privileges this function loads the module. If module loading is not
- *     available in this kernel then it becomes a nop.
- */
-
-void dev_load(const char *name)
-{
-       struct net_device *dev;  
-
-       read_lock(&dev_base_lock);
-       dev = __dev_get_by_name(name);
-       read_unlock(&dev_base_lock);
-
-       if (!dev && capable(CAP_SYS_MODULE))
-               request_module("%s", name);
-}
-
-static int default_rebuild_header(struct sk_buff *skb)
-{
-       printk(KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n",
-              skb->dev ? skb->dev->name : "NULL!!!");
-       kfree_skb(skb);
-       return 1;
-}
-
-
-/**
- *     dev_open        - prepare an interface for use.
- *     @dev:   device to open
- *
- *     Takes a device from down to up state. The device's private open
- *     function is invoked and then the multicast lists are loaded. Finally
- *     the device is moved into the up state and a %NETDEV_UP message is
- *     sent to the netdev notifier chain.
- *
- *     Calling this function on an active interface is a nop. On a failure
- *     a negative errno code is returned.
- */
-int dev_open(struct net_device *dev)
-{
-       int ret = 0;
-
-       /*
-        *      Is it already up?
-        */
-
-       if (dev->flags & IFF_UP)
-               return 0;
-
-       /*
-        *      Is it even present?
-        */
-       if (!netif_device_present(dev))
-               return -ENODEV;
-
-       /*
-        *      Call device private open method
-        */
-       set_bit(__LINK_STATE_START, &dev->state);
-       if (dev->open) {
-               ret = dev->open(dev);
-               if (ret)
-                       clear_bit(__LINK_STATE_START, &dev->state);
-       }
-
-       /*
-        *      If it went open OK then:
-        */
-
-       if (!ret) {
-               /*
-                *      Set the flags.
-                */
-               dev->flags |= IFF_UP;
-
-               /*
-                *      Initialize multicasting status
-                */
-               dev_mc_upload(dev);
-
-               /*
-                *      Wakeup transmit queue engine
-                */
-               dev_activate(dev);
-
-               /*
-                *      ... and announce new interface.
-                */
-               raw_notifier_call_chain(&netdev_chain, NETDEV_UP, dev);
-       }
-       return ret;
-}
-
-/**
- *     dev_close - shutdown an interface.
- *     @dev: device to shutdown
- *
- *     This function moves an active device into down state. A
- *     %NETDEV_GOING_DOWN is sent to the netdev notifier chain. The device
- *     is then deactivated and finally a %NETDEV_DOWN is sent to the notifier
- *     chain.
- */
-int dev_close(struct net_device *dev)
-{
-       if (!(dev->flags & IFF_UP))
-               return 0;
-
-       /*
-        *      Tell people we are going down, so that they can
-        *      prepare to death, when device is still operating.
-        */
-       raw_notifier_call_chain(&netdev_chain, NETDEV_GOING_DOWN, dev);
-
-       dev_deactivate(dev);
-
-       clear_bit(__LINK_STATE_START, &dev->state);
-
-       /* Synchronize to scheduled poll. We cannot touch poll list,
-        * it can be even on different cpu. So just clear netif_running(),
-        * and wait when poll really will happen. Actually, the best place
-        * for this is inside dev->stop() after device stopped its irq
-        * engine, but this requires more changes in devices. */
-
-       smp_mb__after_clear_bit(); /* Commit netif_running(). */
-       while (test_bit(__LINK_STATE_RX_SCHED, &dev->state)) {
-               /* No hurry. */
-               msleep(1);
-       }
-
-       /*
-        *      Call the device specific close. This cannot fail.
-        *      Only if device is UP
-        *
-        *      We allow it to be called even after a DETACH hot-plug
-        *      event.
-        */
-       if (dev->stop)
-               dev->stop(dev);
-
-       /*
-        *      Device is now down.
-        */
-
-       dev->flags &= ~IFF_UP;
-
-       /*
-        * Tell people we are down
-        */
-       raw_notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev);
-
-       return 0;
-}
-
-
-/*
- *     Device change register/unregister. These are not inline or static
- *     as we export them to the world.
- */
-
-/**
- *     register_netdevice_notifier - register a network notifier block
- *     @nb: notifier
- *
- *     Register a notifier to be called when network device events occur.
- *     The notifier passed is linked into the kernel structures and must
- *     not be reused until it has been unregistered. A negative errno code
- *     is returned on a failure.
- *
- *     When registered all registration and up events are replayed
- *     to the new notifier to allow device to have a race free 
- *     view of the network device list.
- */
-
-int register_netdevice_notifier(struct notifier_block *nb)
-{
-       struct net_device *dev;
-       int err;
-
-       rtnl_lock();
-       err = raw_notifier_chain_register(&netdev_chain, nb);
-       if (!err) {
-               for (dev = dev_base; dev; dev = dev->next) {
-                       nb->notifier_call(nb, NETDEV_REGISTER, dev);
-
-                       if (dev->flags & IFF_UP) 
-                               nb->notifier_call(nb, NETDEV_UP, dev);
-               }
-       }
-       rtnl_unlock();
-       return err;
-}
-
-/**
- *     unregister_netdevice_notifier - unregister a network notifier block
- *     @nb: notifier
- *
- *     Unregister a notifier previously registered by
- *     register_netdevice_notifier(). The notifier is unlinked into the
- *     kernel structures and may then be reused. A negative errno code
- *     is returned on a failure.
- */
-
-int unregister_netdevice_notifier(struct notifier_block *nb)
-{
-       int err;
-
-       rtnl_lock();
-       err = raw_notifier_chain_unregister(&netdev_chain, nb);
-       rtnl_unlock();
-       return err;
-}
-
-/**
- *     call_netdevice_notifiers - call all network notifier blocks
- *      @val: value passed unmodified to notifier function
- *      @v:   pointer passed unmodified to notifier function
- *
- *     Call all network notifier blocks.  Parameters and return value
- *     are as for raw_notifier_call_chain().
- */
-
-int call_netdevice_notifiers(unsigned long val, void *v)
-{
-       return raw_notifier_call_chain(&netdev_chain, val, v);
-}
-
-/* When > 0 there are consumers of rx skb time stamps */
-static atomic_t netstamp_needed = ATOMIC_INIT(0);
-
-void net_enable_timestamp(void)
-{
-       atomic_inc(&netstamp_needed);
-}
-
-void net_disable_timestamp(void)
-{
-       atomic_dec(&netstamp_needed);
-}
-
-void __net_timestamp(struct sk_buff *skb)
-{
-       struct timeval tv;
-
-       do_gettimeofday(&tv);
-       skb_set_timestamp(skb, &tv);
-}
-EXPORT_SYMBOL(__net_timestamp);
-
-static inline void net_timestamp(struct sk_buff *skb)
-{
-       if (atomic_read(&netstamp_needed))
-               __net_timestamp(skb);
-       else {
-               skb->tstamp.off_sec = 0;
-               skb->tstamp.off_usec = 0;
-       }
-}
-
-/*
- *     Support routine. Sends outgoing frames to any network
- *     taps currently in use.
- */
-
-static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct packet_type *ptype;
-
-       net_timestamp(skb);
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(ptype, &ptype_all, list) {
-               /* Never send packets back to the socket
-                * they originated from - MvS (miquels@drinkel.ow.org)
-                */
-               if ((ptype->dev == dev || !ptype->dev) &&
-                   (ptype->af_packet_priv == NULL ||
-                    (struct sock *)ptype->af_packet_priv != skb->sk)) {
-                       struct sk_buff *skb2= skb_clone(skb, GFP_ATOMIC);
-                       if (!skb2)
-                               break;
-
-                       /* skb->nh should be correctly
-                          set by sender, so that the second statement is
-                          just protection against buggy protocols.
-                        */
-                       skb2->mac.raw = skb2->data;
-
-                       if (skb2->nh.raw < skb2->data ||
-                           skb2->nh.raw > skb2->tail) {
-                               if (net_ratelimit())
-                                       printk(KERN_CRIT "protocol %04x is "
-                                              "buggy, dev %s\n",
-                                              skb2->protocol, dev->name);
-                               skb2->nh.raw = skb2->data;
-                       }
-
-                       skb2->h.raw = skb2->nh.raw;
-                       skb2->pkt_type = PACKET_OUTGOING;
-                       ptype->func(skb2, skb->dev, ptype, skb->dev);
-               }
-       }
-       rcu_read_unlock();
-}
-
-
-void __netif_schedule(struct net_device *dev)
-{
-       if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {
-               unsigned long flags;
-               struct softnet_data *sd;
-
-               local_irq_save(flags);
-               sd = &__get_cpu_var(softnet_data);
-               dev->next_sched = sd->output_queue;
-               sd->output_queue = dev;
-               raise_softirq_irqoff(NET_TX_SOFTIRQ);
-               local_irq_restore(flags);
-       }
-}
-EXPORT_SYMBOL(__netif_schedule);
-
-void __netif_rx_schedule(struct net_device *dev)
-{
-       unsigned long flags;
-
-       local_irq_save(flags);
-       dev_hold(dev);
-       list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
-       if (dev->quota < 0)
-               dev->quota += dev->weight;
-       else
-               dev->quota = dev->weight;
-       __raise_softirq_irqoff(NET_RX_SOFTIRQ);
-       local_irq_restore(flags);
-}
-EXPORT_SYMBOL(__netif_rx_schedule);
-
-void dev_kfree_skb_any(struct sk_buff *skb)
-{
-       if (in_irq() || irqs_disabled())
-               dev_kfree_skb_irq(skb);
-       else
-               dev_kfree_skb(skb);
-}
-EXPORT_SYMBOL(dev_kfree_skb_any);
-
-
-/* Hot-plugging. */
-void netif_device_detach(struct net_device *dev)
-{
-       if (test_and_clear_bit(__LINK_STATE_PRESENT, &dev->state) &&
-           netif_running(dev)) {
-               netif_stop_queue(dev);
-       }
-}
-EXPORT_SYMBOL(netif_device_detach);
-
-void netif_device_attach(struct net_device *dev)
-{
-       if (!test_and_set_bit(__LINK_STATE_PRESENT, &dev->state) &&
-           netif_running(dev)) {
-               netif_wake_queue(dev);
-               __netdev_watchdog_up(dev);
-       }
-}
-EXPORT_SYMBOL(netif_device_attach);
-
-
-/*
- * Invalidate hardware checksum when packet is to be mangled, and
- * complete checksum manually on outgoing path.
- */
-int skb_checksum_help(struct sk_buff *skb, int inward)
-{
-       unsigned int csum;
-       int ret = 0, offset = skb->h.raw - skb->data;
-
-       if (inward)
-               goto out_set_summed;
-
-       if (unlikely(skb_shinfo(skb)->gso_size)) {
-               /* Let GSO fix up the checksum. */
-               goto out_set_summed;
-       }
-
-       if (skb_cloned(skb)) {
-               ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
-               if (ret)
-                       goto out;
-       }
-
-       BUG_ON(offset > (int)skb->len);
-       csum = skb_checksum(skb, offset, skb->len-offset, 0);
-
-       offset = skb->tail - skb->h.raw;
-       BUG_ON(offset <= 0);
-       BUG_ON(skb->csum + 2 > offset);
-
-       *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum);
-
-out_set_summed:
-       skb->ip_summed = CHECKSUM_NONE;
-out:   
-       return ret;
-}
-
-/**
- *     skb_gso_segment - Perform segmentation on skb.
- *     @skb: buffer to segment
- *     @features: features for the output path (see dev->features)
- *
- *     This function segments the given skb and returns a list of segments.
- *
- *     It may return NULL if the skb requires no segmentation.  This is
- *     only possible when GSO is used for verifying header integrity.
- */
-struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
-{
-       struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
-       struct packet_type *ptype;
-       int type = skb->protocol;
-       int err;
-
-       BUG_ON(skb_shinfo(skb)->frag_list);
-
-       skb->mac.raw = skb->data;
-       skb->mac_len = skb->nh.raw - skb->data;
-       __skb_pull(skb, skb->mac_len);
-
-       if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
-               if (skb_header_cloned(skb) &&
-                   (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
-                       return ERR_PTR(err);
-       }
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
-               if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
-                       if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
-                               err = ptype->gso_send_check(skb);
-                               segs = ERR_PTR(err);
-                               if (err || skb_gso_ok(skb, features))
-                                       break;
-                               __skb_push(skb, skb->data - skb->nh.raw);
-                       }
-                       segs = ptype->gso_segment(skb, features);
-                       break;
-               }
-       }
-       rcu_read_unlock();
-
-       __skb_push(skb, skb->data - skb->mac.raw);
-
-       return segs;
-}
-
-EXPORT_SYMBOL(skb_gso_segment);
-
-/* Take action when hardware reception checksum errors are detected. */
-#ifdef CONFIG_BUG
-void netdev_rx_csum_fault(struct net_device *dev)
-{
-       if (net_ratelimit()) {
-               printk(KERN_ERR "%s: hw csum failure.\n", 
-                       dev ? dev->name : "<unknown>");
-               dump_stack();
-       }
-}
-EXPORT_SYMBOL(netdev_rx_csum_fault);
-#endif
-
-/* Actually, we should eliminate this check as soon as we know, that:
- * 1. IOMMU is present and allows to map all the memory.
- * 2. No high memory really exists on this machine.
- */
-
-static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
-{
-#ifdef CONFIG_HIGHMEM
-       int i;
-
-       if (dev->features & NETIF_F_HIGHDMA)
-               return 0;
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-               if (PageHighMem(skb_shinfo(skb)->frags[i].page))
-                       return 1;
-
-#endif
-       return 0;
-}
-
-struct dev_gso_cb {
-       void (*destructor)(struct sk_buff *skb);
-};
-
-#define DEV_GSO_CB(skb) ((struct dev_gso_cb *)(skb)->cb)
-
-static void dev_gso_skb_destructor(struct sk_buff *skb)
-{
-       struct dev_gso_cb *cb;
-
-       do {
-               struct sk_buff *nskb = skb->next;
-
-               skb->next = nskb->next;
-               nskb->next = NULL;
-               kfree_skb(nskb);
-       } while (skb->next);
-
-       cb = DEV_GSO_CB(skb);
-       if (cb->destructor)
-               cb->destructor(skb);
-}
-
-/**
- *     dev_gso_segment - Perform emulated hardware segmentation on skb.
- *     @skb: buffer to segment
- *
- *     This function segments the given skb and stores the list of segments
- *     in skb->next.
- */
-static int dev_gso_segment(struct sk_buff *skb)
-{
-       struct net_device *dev = skb->dev;
-       struct sk_buff *segs;
-       int features = dev->features & ~(illegal_highdma(dev, skb) ?
-                                        NETIF_F_SG : 0);
-
-       segs = skb_gso_segment(skb, features);
-
-       /* Verifying header integrity only. */
-       if (!segs)
-               return 0;
-  
-       if (unlikely(IS_ERR(segs)))
-               return PTR_ERR(segs);
-
-       skb->next = segs;
-       DEV_GSO_CB(skb)->destructor = skb->destructor;
-       skb->destructor = dev_gso_skb_destructor;
-
-       return 0;
-}
-
-int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       if (likely(!skb->next)) {
-               if (netdev_nit)
-                       dev_queue_xmit_nit(skb, dev);
-
-               if (netif_needs_gso(dev, skb)) {
-                       if (unlikely(dev_gso_segment(skb)))
-                               goto out_kfree_skb;
-                       if (skb->next)
-                               goto gso;
-               }
-
-               return dev->hard_start_xmit(skb, dev);
-       }
-
-gso:
-       do {
-               struct sk_buff *nskb = skb->next;
-               int rc;
-
-               skb->next = nskb->next;
-               nskb->next = NULL;
-               rc = dev->hard_start_xmit(nskb, dev);
-               if (unlikely(rc)) {
-                       nskb->next = skb->next;
-                       skb->next = nskb;
-                       return rc;
-               }
-               if (unlikely(netif_queue_stopped(dev) && skb->next))
-                       return NETDEV_TX_BUSY;
-       } while (skb->next);
-       
-       skb->destructor = DEV_GSO_CB(skb)->destructor;
-
-out_kfree_skb:
-       kfree_skb(skb);
-       return 0;
-}
-
-#define HARD_TX_LOCK(dev, cpu) {                       \
-       if ((dev->features & NETIF_F_LLTX) == 0) {      \
-               netif_tx_lock(dev);                     \
-       }                                               \
-}
-
-#define HARD_TX_UNLOCK(dev) {                          \
-       if ((dev->features & NETIF_F_LLTX) == 0) {      \
-               netif_tx_unlock(dev);                   \
-       }                                               \
-}
-
-#ifdef CONFIG_XEN
-inline int skb_checksum_setup(struct sk_buff *skb)
-{
-       if (skb->proto_csum_blank) {
-               if (skb->protocol != htons(ETH_P_IP))
-                       goto out;
-               skb->h.raw = (unsigned char *)skb->nh.iph + 4*skb->nh.iph->ihl;
-               if (skb->h.raw >= skb->tail)
-                       goto out;
-               switch (skb->nh.iph->protocol) {
-               case IPPROTO_TCP:
-                       skb->csum = offsetof(struct tcphdr, check);
-                       break;
-               case IPPROTO_UDP:
-                       skb->csum = offsetof(struct udphdr, check);
-                       break;
-               default:
-                       if (net_ratelimit())
-                               printk(KERN_ERR "Attempting to checksum a non-"
-                                      "TCP/UDP packet, dropping a protocol"
-                                      " %d packet", skb->nh.iph->protocol);
-                       goto out;
-               }
-               if ((skb->h.raw + skb->csum + 2) > skb->tail)
-                       goto out;
-               skb->ip_summed = CHECKSUM_HW;
-               skb->proto_csum_blank = 0;
-       }
-       return 0;
-out:
-       return -EPROTO;
-}
-#else
-inline int skb_checksum_setup(struct sk_buff *skb) { return 0; }
-#endif
-
-
-/**
- *     dev_queue_xmit - transmit a buffer
- *     @skb: buffer to transmit
- *
- *     Queue a buffer for transmission to a network device. The caller must
- *     have set the device and priority and built the buffer before calling
- *     this function. The function can be called from an interrupt.
- *
- *     A negative errno code is returned on a failure. A success does not
- *     guarantee the frame will be transmitted as it may be dropped due
- *     to congestion or traffic shaping.
- *
- * -----------------------------------------------------------------------------------
- *      I notice this method can also return errors from the queue disciplines,
- *      including NET_XMIT_DROP, which is a positive value.  So, errors can also
- *      be positive.
- *
- *      Regardless of the return value, the skb is consumed, so it is currently
- *      difficult to retry a send to this method.  (You can bump the ref count
- *      before sending to hold a reference for retry if you are careful.)
- *
- *      When calling this method, interrupts MUST be enabled.  This is because
- *      the BH enable code must have IRQs enabled so that it will not deadlock.
- *          --BLG
- */
-
-int dev_queue_xmit(struct sk_buff *skb)
-{
-       struct net_device *dev = skb->dev;
-       struct Qdisc *q;
-       int rc = -ENOMEM;
-
-       /* If a checksum-deferred packet is forwarded to a device that needs a
-        * checksum, correct the pointers and force checksumming.
-        */
-       if (skb_checksum_setup(skb))
-               goto out_kfree_skb;
-
-       /* GSO will handle the following emulations directly. */
-       if (netif_needs_gso(dev, skb))
-               goto gso;
-
-       if (skb_shinfo(skb)->frag_list &&
-           !(dev->features & NETIF_F_FRAGLIST) &&
-           __skb_linearize(skb))
-               goto out_kfree_skb;
-
-       /* Fragmented skb is linearized if device does not support SG,
-        * or if at least one of fragments is in highmem and device
-        * does not support DMA from it.
-        */
-       if (skb_shinfo(skb)->nr_frags &&
-           (!(dev->features & NETIF_F_SG) || illegal_highdma(dev, skb)) &&
-           __skb_linearize(skb))
-               goto out_kfree_skb;
-
-       /* If packet is not checksummed and device does not support
-        * checksumming for this protocol, complete checksumming here.
-        */
-       if (skb->ip_summed == CHECKSUM_HW &&
-           (!(dev->features & NETIF_F_GEN_CSUM) &&
-            (!(dev->features & NETIF_F_IP_CSUM) ||
-             skb->protocol != htons(ETH_P_IP))))
-               if (skb_checksum_help(skb, 0))
-                       goto out_kfree_skb;
-
-gso:
-       spin_lock_prefetch(&dev->queue_lock);
-
-       /* Disable soft irqs for various locks below. Also 
-        * stops preemption for RCU. 
-        */
-       rcu_read_lock_bh(); 
-
-       /* Updates of qdisc are serialized by queue_lock. 
-        * The struct Qdisc which is pointed to by qdisc is now a 
-        * rcu structure - it may be accessed without acquiring 
-        * a lock (but the structure may be stale.) The freeing of the
-        * qdisc will be deferred until it's known that there are no 
-        * more references to it.
-        * 
-        * If the qdisc has an enqueue function, we still need to 
-        * hold the queue_lock before calling it, since queue_lock
-        * also serializes access to the device queue.
-        */
-
-       q = rcu_dereference(dev->qdisc);
-#ifdef CONFIG_NET_CLS_ACT
-       skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS);
-#endif
-       if (q->enqueue) {
-               /* Grab device queue */
-               spin_lock(&dev->queue_lock);
-
-               rc = q->enqueue(skb, q);
-
-               qdisc_run(dev);
-
-               spin_unlock(&dev->queue_lock);
-               rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc;
-               goto out;
-       }
-
-       /* The device has no queue. Common case for software devices:
-          loopback, all the sorts of tunnels...
-
-          Really, it is unlikely that netif_tx_lock protection is necessary
-          here.  (f.e. loopback and IP tunnels are clean ignoring statistics
-          counters.)
-          However, it is possible, that they rely on protection
-          made by us here.
-
-          Check this and shot the lock. It is not prone from deadlocks.
-          Either shot noqueue qdisc, it is even simpler 8)
-        */
-       if (dev->flags & IFF_UP) {
-               int cpu = smp_processor_id(); /* ok because BHs are off */
-
-               if (dev->xmit_lock_owner != cpu) {
-
-                       HARD_TX_LOCK(dev, cpu);
-
-                       if (!netif_queue_stopped(dev)) {
-                               rc = 0;
-                               if (!dev_hard_start_xmit(skb, dev)) {
-                                       HARD_TX_UNLOCK(dev);
-                                       goto out;
-                               }
-                       }
-                       HARD_TX_UNLOCK(dev);
-                       if (net_ratelimit())
-                               printk(KERN_CRIT "Virtual device %s asks to "
-                                      "queue packet!\n", dev->name);
-               } else {
-                       /* Recursion is detected! It is possible,
-                        * unfortunately */
-                       if (net_ratelimit())
-                               printk(KERN_CRIT "Dead loop on virtual device "
-                                      "%s, fix it urgently!\n", dev->name);
-               }
-       }
-
-       rc = -ENETDOWN;
-       rcu_read_unlock_bh();
-
-out_kfree_skb:
-       kfree_skb(skb);
-       return rc;
-out:
-       rcu_read_unlock_bh();
-       return rc;
-}
-
-
-/*=======================================================================
-                       Receiver routines
-  =======================================================================*/
-
-int netdev_max_backlog = 1000;
-int netdev_budget = 300;
-int weight_p = 64;            /* old backlog weight */
-
-DEFINE_PER_CPU(struct netif_rx_stats, netdev_rx_stat) = { 0, };
-
-
-/**
- *     netif_rx        -       post buffer to the network code
- *     @skb: buffer to post
- *
- *     This function receives a packet from a device driver and queues it for
- *     the upper (protocol) levels to process.  It always succeeds. The buffer
- *     may be dropped during processing for congestion control or by the
- *     protocol layers.
- *
- *     return values:
- *     NET_RX_SUCCESS  (no congestion)
- *     NET_RX_CN_LOW   (low congestion)
- *     NET_RX_CN_MOD   (moderate congestion)
- *     NET_RX_CN_HIGH  (high congestion)
- *     NET_RX_DROP     (packet was dropped)
- *
- */
-
-int netif_rx(struct sk_buff *skb)
-{
-       struct softnet_data *queue;
-       unsigned long flags;
-
-       /* if netpoll wants it, pretend we never saw it */
-       if (netpoll_rx(skb))
-               return NET_RX_DROP;
-
-       if (!skb->tstamp.off_sec)
-               net_timestamp(skb);
-
-       /*
-        * The code is rearranged so that the path is the most
-        * short when CPU is congested, but is still operating.
-        */
-       local_irq_save(flags);
-       queue = &__get_cpu_var(softnet_data);
-
-       __get_cpu_var(netdev_rx_stat).total++;
-       if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
-               if (queue->input_pkt_queue.qlen) {
-enqueue:
-                       dev_hold(skb->dev);
-                       __skb_queue_tail(&queue->input_pkt_queue, skb);
-                       local_irq_restore(flags);
-                       return NET_RX_SUCCESS;
-               }
-
-               netif_rx_schedule(&queue->backlog_dev);
-               goto enqueue;
-       }
-
-       __get_cpu_var(netdev_rx_stat).dropped++;
-       local_irq_restore(flags);
-
-       kfree_skb(skb);
-       return NET_RX_DROP;
-}
-
-int netif_rx_ni(struct sk_buff *skb)
-{
-       int err;
-
-       preempt_disable();
-       err = netif_rx(skb);
-       if (local_softirq_pending())
-               do_softirq();
-       preempt_enable();
-
-       return err;
-}
-
-EXPORT_SYMBOL(netif_rx_ni);
-
-static inline struct net_device *skb_bond(struct sk_buff *skb)
-{
-       struct net_device *dev = skb->dev;
-
-       if (dev->master) {
-               if (skb_bond_should_drop(skb)) {
-                       kfree_skb(skb);
-                       return NULL;
-               }
-               skb->dev = dev->master;
-       }
-
-       return dev;
-}
-
-static void net_tx_action(struct softirq_action *h)
-{
-       struct softnet_data *sd = &__get_cpu_var(softnet_data);
-
-       if (sd->completion_queue) {
-               struct sk_buff *clist;
-
-               local_irq_disable();
-               clist = sd->completion_queue;
-               sd->completion_queue = NULL;
-               local_irq_enable();
-
-               while (clist) {
-                       struct sk_buff *skb = clist;
-                       clist = clist->next;
-
-                       BUG_TRAP(!atomic_read(&skb->users));
-                       __kfree_skb(skb);
-               }
-       }
-
-       if (sd->output_queue) {
-               struct net_device *head;
-
-               local_irq_disable();
-               head = sd->output_queue;
-               sd->output_queue = NULL;
-               local_irq_enable();
-
-               while (head) {
-                       struct net_device *dev = head;
-                       head = head->next_sched;
-
-                       smp_mb__before_clear_bit();
-                       clear_bit(__LINK_STATE_SCHED, &dev->state);
-
-                       if (spin_trylock(&dev->queue_lock)) {
-                               qdisc_run(dev);
-                               spin_unlock(&dev->queue_lock);
-                       } else {
-                               netif_schedule(dev);
-                       }
-               }
-       }
-}
-
-static __inline__ int deliver_skb(struct sk_buff *skb,
-                                 struct packet_type *pt_prev,
-                                 struct net_device *orig_dev)
-{
-       atomic_inc(&skb->users);
-       return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
-}
-
-#if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE)
-int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff **pskb);
-struct net_bridge;
-struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br,
-                                               unsigned char *addr);
-void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent);
-
-static __inline__ int handle_bridge(struct sk_buff **pskb,
-                                   struct packet_type **pt_prev, int *ret,
-                                   struct net_device *orig_dev)
-{
-       struct net_bridge_port *port;
-
-       if ((*pskb)->pkt_type == PACKET_LOOPBACK ||
-           (port = rcu_dereference((*pskb)->dev->br_port)) == NULL)
-               return 0;
-
-       if (*pt_prev) {
-               *ret = deliver_skb(*pskb, *pt_prev, orig_dev);
-               *pt_prev = NULL;
-       } 
-       
-       return br_handle_frame_hook(port, pskb);
-}
-#else
-#define handle_bridge(skb, pt_prev, ret, orig_dev)     (0)
-#endif
-
-#ifdef CONFIG_NET_CLS_ACT
-/* TODO: Maybe we should just force sch_ingress to be compiled in
- * when CONFIG_NET_CLS_ACT is? otherwise some useless instructions
- * a compare and 2 stores extra right now if we dont have it on
- * but have CONFIG_NET_CLS_ACT
- * NOTE: This doesnt stop any functionality; if you dont have 
- * the ingress scheduler, you just cant add policies on ingress.
- *
- */
-static int ing_filter(struct sk_buff *skb) 
-{
-       struct Qdisc *q;
-       struct net_device *dev = skb->dev;
-       int result = TC_ACT_OK;
-       
-       if (dev->qdisc_ingress) {
-               __u32 ttl = (__u32) G_TC_RTTL(skb->tc_verd);
-               if (MAX_RED_LOOP < ttl++) {
-                       printk(KERN_WARNING "Redir loop detected Dropping packet (%s->%s)\n",
-                               skb->input_dev->name, skb->dev->name);
-                       return TC_ACT_SHOT;
-               }
-
-               skb->tc_verd = SET_TC_RTTL(skb->tc_verd,ttl);
-
-               skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_INGRESS);
-
-               spin_lock(&dev->ingress_lock);
-               if ((q = dev->qdisc_ingress) != NULL)
-                       result = q->enqueue(skb, q);
-               spin_unlock(&dev->ingress_lock);
-
-       }
-
-       return result;
-}
-#endif
-
-int netif_receive_skb(struct sk_buff *skb)
-{
-       struct packet_type *ptype, *pt_prev;
-       struct net_device *orig_dev;
-       int ret = NET_RX_DROP;
-       unsigned short type;
-
-       /* if we've gotten here through NAPI, check netpoll */
-       if (skb->dev->poll && netpoll_rx(skb))
-               return NET_RX_DROP;
-
-       if (!skb->tstamp.off_sec)
-               net_timestamp(skb);
-
-       if (!skb->input_dev)
-               skb->input_dev = skb->dev;
-
-       orig_dev = skb_bond(skb);
-
-       if (!orig_dev)
-               return NET_RX_DROP;
-
-       __get_cpu_var(netdev_rx_stat).total++;
-
-       skb->h.raw = skb->nh.raw = skb->data;
-       skb->mac_len = skb->nh.raw - skb->mac.raw;
-
-       pt_prev = NULL;
-
-       rcu_read_lock();
-
-#ifdef CONFIG_NET_CLS_ACT
-       if (skb->tc_verd & TC_NCLS) {
-               skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
-               goto ncls;
-       }
-#endif
-
-#ifdef CONFIG_XEN
-       switch (skb->ip_summed) {
-       case CHECKSUM_UNNECESSARY:
-               skb->proto_data_valid = 1;
-               break;
-       case CHECKSUM_HW:
-               /* XXX Implement me. */
-       default:
-               skb->proto_data_valid = 0;
-               break;
-       }
-#endif
-
-       list_for_each_entry_rcu(ptype, &ptype_all, list) {
-               if (!ptype->dev || ptype->dev == skb->dev) {
-                       if (pt_prev) 
-                               ret = deliver_skb(skb, pt_prev, orig_dev);
-                       pt_prev = ptype;
-               }
-       }
-
-#ifdef CONFIG_NET_CLS_ACT
-       if (pt_prev) {
-               ret = deliver_skb(skb, pt_prev, orig_dev);
-               pt_prev = NULL; /* noone else should process this after*/
-       } else {
-               skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd);
-       }
-
-       ret = ing_filter(skb);
-
-       if (ret == TC_ACT_SHOT || (ret == TC_ACT_STOLEN)) {
-               kfree_skb(skb);
-               goto out;
-       }
-
-       skb->tc_verd = 0;
-ncls:
-#endif
-
-       handle_diverter(skb);
-
-       if (handle_bridge(&skb, &pt_prev, &ret, orig_dev))
-               goto out;
-
-       type = skb->protocol;
-       list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
-               if (ptype->type == type &&
-                   (!ptype->dev || ptype->dev == skb->dev)) {
-                       if (pt_prev) 
-                               ret = deliver_skb(skb, pt_prev, orig_dev);
-                       pt_prev = ptype;
-               }
-       }
-
-       if (pt_prev) {
-               ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
-       } else {
-               kfree_skb(skb);
-               /* Jamal, now you will not able to escape explaining
-                * me how you were going to use this. :-)
-                */
-               ret = NET_RX_DROP;
-       }
-
-out:
-       rcu_read_unlock();
-       return ret;
-}
-
-static int process_backlog(struct net_device *backlog_dev, int *budget)
-{
-       int work = 0;
-       int quota = min(backlog_dev->quota, *budget);
-       struct softnet_data *queue = &__get_cpu_var(softnet_data);
-       unsigned long start_time = jiffies;
-
-       backlog_dev->weight = weight_p;
-       for (;;) {
-               struct sk_buff *skb;
-               struct net_device *dev;
-
-               local_irq_disable();
-               skb = __skb_dequeue(&queue->input_pkt_queue);
-               if (!skb)
-                       goto job_done;
-               local_irq_enable();
-
-               dev = skb->dev;
-
-               netif_receive_skb(skb);
-
-               dev_put(dev);
-
-               work++;
-
-               if (work >= quota || jiffies - start_time > 1)
-                       break;
-
-       }
-
-       backlog_dev->quota -= work;
-       *budget -= work;
-       return -1;
-
-job_done:
-       backlog_dev->quota -= work;
-       *budget -= work;
-
-       list_del(&backlog_dev->poll_list);
-       smp_mb__before_clear_bit();
-       netif_poll_enable(backlog_dev);
-
-       local_irq_enable();
-       return 0;
-}
-
-static void net_rx_action(struct softirq_action *h)
-{
-       struct softnet_data *queue = &__get_cpu_var(softnet_data);
-       unsigned long start_time = jiffies;
-       int budget = netdev_budget;
-       void *have;
-
-       local_irq_disable();
-
-       while (!list_empty(&queue->poll_list)) {
-               struct net_device *dev;
-
-               if (budget <= 0 || jiffies - start_time > 1)
-                       goto softnet_break;
-
-               local_irq_enable();
-
-               dev = list_entry(queue->poll_list.next,
-                                struct net_device, poll_list);
-               have = netpoll_poll_lock(dev);
-
-               if (dev->quota <= 0 || dev->poll(dev, &budget)) {
-                       netpoll_poll_unlock(have);
-                       local_irq_disable();
-                       list_move_tail(&dev->poll_list, &queue->poll_list);
-                       if (dev->quota < 0)
-                               dev->quota += dev->weight;
-                       else
-                               dev->quota = dev->weight;
-               } else {
-                       netpoll_poll_unlock(have);
-                       dev_put(dev);
-                       local_irq_disable();
-               }
-       }
-out:
-#ifdef CONFIG_NET_DMA
-       /*
-        * There may not be any more sk_buffs coming right now, so push
-        * any pending DMA copies to hardware
-        */
-       if (net_dma_client) {
-               struct dma_chan *chan;
-               rcu_read_lock();
-               list_for_each_entry_rcu(chan, &net_dma_client->channels, client_node)
-                       dma_async_memcpy_issue_pending(chan);
-               rcu_read_unlock();
-       }
-#endif
-       local_irq_enable();
-       return;
-
-softnet_break:
-       __get_cpu_var(netdev_rx_stat).time_squeeze++;
-       __raise_softirq_irqoff(NET_RX_SOFTIRQ);
-       goto out;
-}
-
-static gifconf_func_t * gifconf_list [NPROTO];
-
-/**
- *     register_gifconf        -       register a SIOCGIF handler
- *     @family: Address family
- *     @gifconf: Function handler
- *
- *     Register protocol dependent address dumping routines. The handler
- *     that is passed must not be freed or reused until it has been replaced
- *     by another handler.
- */
-int register_gifconf(unsigned int family, gifconf_func_t * gifconf)
-{
-       if (family >= NPROTO)
-               return -EINVAL;
-       gifconf_list[family] = gifconf;
-       return 0;
-}
-
-
-/*
- *     Map an interface index to its name (SIOCGIFNAME)
- */
-
-/*
- *     We need this ioctl for efficient implementation of the
- *     if_indextoname() function required by the IPv6 API.  Without
- *     it, we would have to search all the interfaces to find a
- *     match.  --pb
- */
-
-static int dev_ifname(struct ifreq __user *arg)
-{
-       struct net_device *dev;
-       struct ifreq ifr;
-
-       /*
-        *      Fetch the caller's info block.
-        */
-
-       if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
-               return -EFAULT;
-
-       read_lock(&dev_base_lock);
-       dev = __dev_get_by_index(ifr.ifr_ifindex);
-       if (!dev) {
-               read_unlock(&dev_base_lock);
-               return -ENODEV;
-       }
-
-       strcpy(ifr.ifr_name, dev->name);
-       read_unlock(&dev_base_lock);
-
-       if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
-               return -EFAULT;
-       return 0;
-}
-
-/*
- *     Perform a SIOCGIFCONF call. This structure will change
- *     size eventually, and there is nothing I can do about it.
- *     Thus we will need a 'compatibility mode'.
- */
-
-static int dev_ifconf(char __user *arg)
-{
-       struct ifconf ifc;
-       struct net_device *dev;
-       char __user *pos;
-       int len;
-       int total;
-       int i;
-
-       /*
-        *      Fetch the caller's info block.
-        */
-
-       if (copy_from_user(&ifc, arg, sizeof(struct ifconf)))
-               return -EFAULT;
-
-       pos = ifc.ifc_buf;
-       len = ifc.ifc_len;
-
-       /*
-        *      Loop over the interfaces, and write an info block for each.
-        */
-
-       total = 0;
-       for (dev = dev_base; dev; dev = dev->next) {
-               for (i = 0; i < NPROTO; i++) {
-                       if (gifconf_list[i]) {
-                               int done;
-                               if (!pos)
-                                       done = gifconf_list[i](dev, NULL, 0);
-                               else
-                                       done = gifconf_list[i](dev, pos + total,
-                                                              len - total);
-                               if (done < 0)
-                                       return -EFAULT;
-                               total += done;
-                       }
-               }
-       }
-
-       /*
-        *      All done.  Write the updated control block back to the caller.
-        */
-       ifc.ifc_len = total;
-
-       /*
-        *      Both BSD and Solaris return 0 here, so we do too.
-        */
-       return copy_to_user(arg, &ifc, sizeof(struct ifconf)) ? -EFAULT : 0;
-}
-
-#ifdef CONFIG_PROC_FS
-/*
- *     This is invoked by the /proc filesystem handler to display a device
- *     in detail.
- */
-static __inline__ struct net_device *dev_get_idx(loff_t pos)
-{
-       struct net_device *dev;
-       loff_t i;
-
-       for (i = 0, dev = dev_base; dev && i < pos; ++i, dev = dev->next);
-
-       return i == pos ? dev : NULL;
-}
-
-void *dev_seq_start(struct seq_file *seq, loff_t *pos)
-{
-       read_lock(&dev_base_lock);
-       return *pos ? dev_get_idx(*pos - 1) : SEQ_START_TOKEN;
-}
-
-void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
-       ++*pos;
-       return v == SEQ_START_TOKEN ? dev_base : ((struct net_device *)v)->next;
-}
-
-void dev_seq_stop(struct seq_file *seq, void *v)
-{
-       read_unlock(&dev_base_lock);
-}
-
-static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
-{
-       if (dev->get_stats) {
-               struct net_device_stats *stats = dev->get_stats(dev);
-
-               seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu "
-                               "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n",
-                          dev->name, stats->rx_bytes, stats->rx_packets,
-                          stats->rx_errors,
-                          stats->rx_dropped + stats->rx_missed_errors,
-                          stats->rx_fifo_errors,
-                          stats->rx_length_errors + stats->rx_over_errors +
-                            stats->rx_crc_errors + stats->rx_frame_errors,
-                          stats->rx_compressed, stats->multicast,
-                          stats->tx_bytes, stats->tx_packets,
-                          stats->tx_errors, stats->tx_dropped,
-                          stats->tx_fifo_errors, stats->collisions,
-                          stats->tx_carrier_errors +
-                            stats->tx_aborted_errors +
-                            stats->tx_window_errors +
-                            stats->tx_heartbeat_errors,
-                          stats->tx_compressed);
-       } else
-               seq_printf(seq, "%6s: No statistics available.\n", dev->name);
-}
-
-/*
- *     Called from the PROCfs module. This now uses the new arbitrary sized
- *     /proc/net interface to create /proc/net/dev
- */
-static int dev_seq_show(struct seq_file *seq, void *v)
-{
-       if (v == SEQ_START_TOKEN)
-               seq_puts(seq, "Inter-|   Receive                            "
-                             "                    |  Transmit\n"
-                             " face |bytes    packets errs drop fifo frame "
-                             "compressed multicast|bytes    packets errs "
-                             "drop fifo colls carrier compressed\n");
-       else
-               dev_seq_printf_stats(seq, v);
-       return 0;
-}
-
-static struct netif_rx_stats *softnet_get_online(loff_t *pos)
-{
-       struct netif_rx_stats *rc = NULL;
-
-       while (*pos < NR_CPUS)
-               if (cpu_online(*pos)) {
-                       rc = &per_cpu(netdev_rx_stat, *pos);
-                       break;
-               } else
-                       ++*pos;
-       return rc;
-}
-
-static void *softnet_seq_start(struct seq_file *seq, loff_t *pos)
-{
-       return softnet_get_online(pos);
-}
-
-static void *softnet_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
-       ++*pos;
-       return softnet_get_online(pos);
-}
-
-static void softnet_seq_stop(struct seq_file *seq, void *v)
-{
-}
-
-static int softnet_seq_show(struct seq_file *seq, void *v)
-{
-       struct netif_rx_stats *s = v;
-
-       seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
-                  s->total, s->dropped, s->time_squeeze, 0,
-                  0, 0, 0, 0, /* was fastroute */
-                  s->cpu_collision );
-       return 0;
-}
-
-static struct seq_operations dev_seq_ops = {
-       .start = dev_seq_start,
-       .next  = dev_seq_next,
-       .stop  = dev_seq_stop,
-       .show  = dev_seq_show,
-};
-
-static int dev_seq_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &dev_seq_ops);
-}
-
-static struct file_operations dev_seq_fops = {
-       .owner   = THIS_MODULE,
-       .open    = dev_seq_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
-};
-
-static struct seq_operations softnet_seq_ops = {
-       .start = softnet_seq_start,
-       .next  = softnet_seq_next,
-       .stop  = softnet_seq_stop,
-       .show  = softnet_seq_show,
-};
-
-static int softnet_seq_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &softnet_seq_ops);
-}
-
-static struct file_operations softnet_seq_fops = {
-       .owner   = THIS_MODULE,
-       .open    = softnet_seq_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
-};
-
-#ifdef CONFIG_WIRELESS_EXT
-extern int wireless_proc_init(void);
-#else
-#define wireless_proc_init() 0
-#endif
-
-static int __init dev_proc_init(void)
-{
-       int rc = -ENOMEM;
-
-       if (!proc_net_fops_create("dev", S_IRUGO, &dev_seq_fops))
-               goto out;
-       if (!proc_net_fops_create("softnet_stat", S_IRUGO, &softnet_seq_fops))
-               goto out_dev;
-       if (wireless_proc_init())
-               goto out_softnet;
-       rc = 0;
-out:
-       return rc;
-out_softnet:
-       proc_net_remove("softnet_stat");
-out_dev:
-       proc_net_remove("dev");
-       goto out;
-}
-#else
-#define dev_proc_init() 0
-#endif /* CONFIG_PROC_FS */
-
-
-/**
- *     netdev_set_master       -       set up master/slave pair
- *     @slave: slave device
- *     @master: new master device
- *
- *     Changes the master device of the slave. Pass %NULL to break the
- *     bonding. The caller must hold the RTNL semaphore. On a failure
- *     a negative errno code is returned. On success the reference counts
- *     are adjusted, %RTM_NEWLINK is sent to the routing socket and the
- *     function returns zero.
- */
-int netdev_set_master(struct net_device *slave, struct net_device *master)
-{
-       struct net_device *old = slave->master;
-
-       ASSERT_RTNL();
-
-       if (master) {
-               if (old)
-                       return -EBUSY;
-               dev_hold(master);
-       }
-
-       slave->master = master;
-       
-       synchronize_net();
-
-       if (old)
-               dev_put(old);
-
-       if (master)
-               slave->flags |= IFF_SLAVE;
-       else
-               slave->flags &= ~IFF_SLAVE;
-
-       rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE);
-       return 0;
-}
-
-/**
- *     dev_set_promiscuity     - update promiscuity count on a device
- *     @dev: device
- *     @inc: modifier
- *
- *     Add or remove promiscuity from a device. While the count in the device
- *     remains above zero the interface remains promiscuous. Once it hits zero
- *     the device reverts back to normal filtering operation. A negative inc
- *     value is used to drop promiscuity on the device.
- */
-void dev_set_promiscuity(struct net_device *dev, int inc)
-{
-       unsigned short old_flags = dev->flags;
-
-       if ((dev->promiscuity += inc) == 0)
-               dev->flags &= ~IFF_PROMISC;
-       else
-               dev->flags |= IFF_PROMISC;
-       if (dev->flags != old_flags) {
-               dev_mc_upload(dev);
-               printk(KERN_INFO "device %s %s promiscuous mode\n",
-                      dev->name, (dev->flags & IFF_PROMISC) ? "entered" :
-                                                              "left");
-               audit_log(current->audit_context, GFP_ATOMIC,
-                       AUDIT_ANOM_PROMISCUOUS,
-                       "dev=%s prom=%d old_prom=%d auid=%u",
-                       dev->name, (dev->flags & IFF_PROMISC),
-                       (old_flags & IFF_PROMISC),
-                       audit_get_loginuid(current->audit_context)); 
-       }
-}
-
-/**
- *     dev_set_allmulti        - update allmulti count on a device
- *     @dev: device
- *     @inc: modifier
- *
- *     Add or remove reception of all multicast frames to a device. While the
- *     count in the device remains above zero the interface remains listening
- *     to all interfaces. Once it hits zero the device reverts back to normal
- *     filtering operation. A negative @inc value is used to drop the counter
- *     when releasing a resource needing all multicasts.
- */
-
-void dev_set_allmulti(struct net_device *dev, int inc)
-{
-       unsigned short old_flags = dev->flags;
-
-       dev->flags |= IFF_ALLMULTI;
-       if ((dev->allmulti += inc) == 0)
-               dev->flags &= ~IFF_ALLMULTI;
-       if (dev->flags ^ old_flags)
-               dev_mc_upload(dev);
-}
-
-unsigned dev_get_flags(const struct net_device *dev)
-{
-       unsigned flags;
-
-       flags = (dev->flags & ~(IFF_PROMISC |
-                               IFF_ALLMULTI |
-                               IFF_RUNNING |
-                               IFF_LOWER_UP |
-                               IFF_DORMANT)) |
-               (dev->gflags & (IFF_PROMISC |
-                               IFF_ALLMULTI));
-
-       if (netif_running(dev)) {
-               if (netif_oper_up(dev))
-                       flags |= IFF_RUNNING;
-               if (netif_carrier_ok(dev))
-                       flags |= IFF_LOWER_UP;
-               if (netif_dormant(dev))
-                       flags |= IFF_DORMANT;
-       }
-
-       return flags;
-}
-
-int dev_change_flags(struct net_device *dev, unsigned flags)
-{
-       int ret;
-       int old_flags = dev->flags;
-
-       /*
-        *      Set the flags on our device.
-        */
-
-       dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP |
-                              IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL |
-                              IFF_AUTOMEDIA)) |
-                    (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC |
-                                   IFF_ALLMULTI));
-
-       /*
-        *      Load in the correct multicast list now the flags have changed.
-        */
-
-       dev_mc_upload(dev);
-
-       /*
-        *      Have we downed the interface. We handle IFF_UP ourselves
-        *      according to user attempts to set it, rather than blindly
-        *      setting it.
-        */
-
-       ret = 0;
-       if ((old_flags ^ flags) & IFF_UP) {     /* Bit is different  ? */
-               ret = ((old_flags & IFF_UP) ? dev_close : dev_open)(dev);
-
-               if (!ret)
-                       dev_mc_upload(dev);
-       }
-
-       if (dev->flags & IFF_UP &&
-           ((old_flags ^ dev->flags) &~ (IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
-                                         IFF_VOLATILE)))
-               raw_notifier_call_chain(&netdev_chain,
-                               NETDEV_CHANGE, dev);
-
-       if ((flags ^ dev->gflags) & IFF_PROMISC) {
-               int inc = (flags & IFF_PROMISC) ? +1 : -1;
-               dev->gflags ^= IFF_PROMISC;
-               dev_set_promiscuity(dev, inc);
-       }
-
-       /* NOTE: order of synchronization of IFF_PROMISC and IFF_ALLMULTI
-          is important. Some (broken) drivers set IFF_PROMISC, when
-          IFF_ALLMULTI is requested not asking us and not reporting.
-        */
-       if ((flags ^ dev->gflags) & IFF_ALLMULTI) {
-               int inc = (flags & IFF_ALLMULTI) ? +1 : -1;
-               dev->gflags ^= IFF_ALLMULTI;
-               dev_set_allmulti(dev, inc);
-       }
-
-       if (old_flags ^ dev->flags)
-               rtmsg_ifinfo(RTM_NEWLINK, dev, old_flags ^ dev->flags);
-
-       return ret;
-}
-
-int dev_set_mtu(struct net_device *dev, int new_mtu)
-{
-       int err;
-
-       if (new_mtu == dev->mtu)
-               return 0;
-
-       /*      MTU must be positive.    */
-       if (new_mtu < 0)
-               return -EINVAL;
-
-       if (!netif_device_present(dev))
-               return -ENODEV;
-
-       err = 0;
-       if (dev->change_mtu)
-               err = dev->change_mtu(dev, new_mtu);
-       else
-               dev->mtu = new_mtu;
-       if (!err && dev->flags & IFF_UP)
-               raw_notifier_call_chain(&netdev_chain,
-                               NETDEV_CHANGEMTU, dev);
-       return err;
-}
-
-int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
-{
-       int err;
-
-       if (!dev->set_mac_address)
-               return -EOPNOTSUPP;
-       if (sa->sa_family != dev->type)
-               return -EINVAL;
-       if (!netif_device_present(dev))
-               return -ENODEV;
-       err = dev->set_mac_address(dev, sa);
-       if (!err)
-               raw_notifier_call_chain(&netdev_chain,
-                               NETDEV_CHANGEADDR, dev);
-       return err;
-}
-
-/*
- *     Perform the SIOCxIFxxx calls.
- */
-static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
-{
-       int err;
-       struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
-
-       if (!dev)
-               return -ENODEV;
-
-       switch (cmd) {
-               case SIOCGIFFLAGS:      /* Get interface flags */
-                       ifr->ifr_flags = dev_get_flags(dev);
-                       return 0;
-
-               case SIOCSIFFLAGS:      /* Set interface flags */
-                       return dev_change_flags(dev, ifr->ifr_flags);
-
-               case SIOCGIFMETRIC:     /* Get the metric on the interface
-                                          (currently unused) */
-                       ifr->ifr_metric = 0;
-                       return 0;
-
-               case SIOCSIFMETRIC:     /* Set the metric on the interface
-                                          (currently unused) */
-                       return -EOPNOTSUPP;
-
-               case SIOCGIFMTU:        /* Get the MTU of a device */
-                       ifr->ifr_mtu = dev->mtu;
-                       return 0;
-
-               case SIOCSIFMTU:        /* Set the MTU of a device */
-                       return dev_set_mtu(dev, ifr->ifr_mtu);
-
-               case SIOCGIFHWADDR:
-                       if (!dev->addr_len)
-                               memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data);
-                       else
-                               memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
-                                      min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
-                       ifr->ifr_hwaddr.sa_family = dev->type;
-                       return 0;
-
-               case SIOCSIFHWADDR:
-                       return dev_set_mac_address(dev, &ifr->ifr_hwaddr);
-
-               case SIOCSIFHWBROADCAST:
-                       if (ifr->ifr_hwaddr.sa_family != dev->type)
-                               return -EINVAL;
-                       memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data,
-                              min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
-                       raw_notifier_call_chain(&netdev_chain,
-                                           NETDEV_CHANGEADDR, dev);
-                       return 0;
-
-               case SIOCGIFMAP:
-                       ifr->ifr_map.mem_start = dev->mem_start;
-                       ifr->ifr_map.mem_end   = dev->mem_end;
-                       ifr->ifr_map.base_addr = dev->base_addr;
-                       ifr->ifr_map.irq       = dev->irq;
-                       ifr->ifr_map.dma       = dev->dma;
-                       ifr->ifr_map.port      = dev->if_port;
-                       return 0;
-
-               case SIOCSIFMAP:
-                       if (dev->set_config) {
-                               if (!netif_device_present(dev))
-                                       return -ENODEV;
-                               return dev->set_config(dev, &ifr->ifr_map);
-                       }
-                       return -EOPNOTSUPP;
-
-               case SIOCADDMULTI:
-                       if (!dev->set_multicast_list ||
-                           ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
-                               return -EINVAL;
-                       if (!netif_device_present(dev))
-                               return -ENODEV;
-                       return dev_mc_add(dev, ifr->ifr_hwaddr.sa_data,
-                                         dev->addr_len, 1);
-
-               case SIOCDELMULTI:
-                       if (!dev->set_multicast_list ||
-                           ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
-                               return -EINVAL;
-                       if (!netif_device_present(dev))
-                               return -ENODEV;
-                       return dev_mc_delete(dev, ifr->ifr_hwaddr.sa_data,
-                                            dev->addr_len, 1);
-
-               case SIOCGIFINDEX:
-                       ifr->ifr_ifindex = dev->ifindex;
-                       return 0;
-
-               case SIOCGIFTXQLEN:
-                       ifr->ifr_qlen = dev->tx_queue_len;
-                       return 0;
-
-               case SIOCSIFTXQLEN:
-                       if (ifr->ifr_qlen < 0)
-                               return -EINVAL;
-                       dev->tx_queue_len = ifr->ifr_qlen;
-                       return 0;
-
-               case SIOCSIFNAME:
-                       ifr->ifr_newname[IFNAMSIZ-1] = '\0';
-                       return dev_change_name(dev, ifr->ifr_newname);
-
-               /*
-                *      Unknown or private ioctl
-                */
-
-               default:
-                       if ((cmd >= SIOCDEVPRIVATE &&
-                           cmd <= SIOCDEVPRIVATE + 15) ||
-                           cmd == SIOCBONDENSLAVE ||
-                           cmd == SIOCBONDRELEASE ||
-                           cmd == SIOCBONDSETHWADDR ||
-                           cmd == SIOCBONDSLAVEINFOQUERY ||
-                           cmd == SIOCBONDINFOQUERY ||
-                           cmd == SIOCBONDCHANGEACTIVE ||
-                           cmd == SIOCGMIIPHY ||
-                           cmd == SIOCGMIIREG ||
-                           cmd == SIOCSMIIREG ||
-                           cmd == SIOCBRADDIF ||
-                           cmd == SIOCBRDELIF ||
-                           cmd == SIOCWANDEV) {
-                               err = -EOPNOTSUPP;
-                               if (dev->do_ioctl) {
-                                       if (netif_device_present(dev))
-                                               err = dev->do_ioctl(dev, ifr,
-                                                                   cmd);
-                                       else
-                                               err = -ENODEV;
-                               }
-                       } else
-                               err = -EINVAL;
-
-       }
-       return err;
-}
-
-/*
- *     This function handles all "interface"-type I/O control requests. The actual
- *     'doing' part of this is dev_ifsioc above.
- */
-
-/**
- *     dev_ioctl       -       network device ioctl
- *     @cmd: command to issue
- *     @arg: pointer to a struct ifreq in user space
- *
- *     Issue ioctl functions to devices. This is normally called by the
- *     user space syscall interfaces but can sometimes be useful for
- *     other purposes. The return value is the return from the syscall if
- *     positive or a negative errno code on error.
- */
-
-int dev_ioctl(unsigned int cmd, void __user *arg)
-{
-       struct ifreq ifr;
-       int ret;
-       char *colon;
-
-       /* One special case: SIOCGIFCONF takes ifconf argument
-          and requires shared lock, because it sleeps writing
-          to user space.
-        */
-
-       if (cmd == SIOCGIFCONF) {
-               rtnl_lock();
-               ret = dev_ifconf((char __user *) arg);
-               rtnl_unlock();
-               return ret;
-       }
-       if (cmd == SIOCGIFNAME)
-               return dev_ifname((struct ifreq __user *)arg);
-
-       if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
-               return -EFAULT;
-
-       ifr.ifr_name[IFNAMSIZ-1] = 0;
-
-       colon = strchr(ifr.ifr_name, ':');
-       if (colon)
-               *colon = 0;
-
-       /*
-        *      See which interface the caller is talking about.
-        */
-
-       switch (cmd) {
-               /*
-                *      These ioctl calls:
-                *      - can be done by all.
-                *      - atomic and do not require locking.
-                *      - return a value
-                */
-               case SIOCGIFFLAGS:
-               case SIOCGIFMETRIC:
-               case SIOCGIFMTU:
-               case SIOCGIFHWADDR:
-               case SIOCGIFSLAVE:
-               case SIOCGIFMAP:
-               case SIOCGIFINDEX:
-               case SIOCGIFTXQLEN:
-                       dev_load(ifr.ifr_name);
-                       read_lock(&dev_base_lock);
-                       ret = dev_ifsioc(&ifr, cmd);
-                       read_unlock(&dev_base_lock);
-                       if (!ret) {
-                               if (colon)
-                                       *colon = ':';
-                               if (copy_to_user(arg, &ifr,
-                                                sizeof(struct ifreq)))
-                                       ret = -EFAULT;
-                       }
-                       return ret;
-
-               case SIOCETHTOOL:
-                       dev_load(ifr.ifr_name);
-                       rtnl_lock();
-                       ret = dev_ethtool(&ifr);
-                       rtnl_unlock();
-                       if (!ret) {
-                               if (colon)
-                                       *colon = ':';
-                               if (copy_to_user(arg, &ifr,
-                                                sizeof(struct ifreq)))
-                                       ret = -EFAULT;
-                       }
-                       return ret;
-
-               /*
-                *      These ioctl calls:
-                *      - require superuser power.
-                *      - require strict serialization.
-                *      - return a value
-                */
-               case SIOCGMIIPHY:
-               case SIOCGMIIREG:
-               case SIOCSIFNAME:
-                       if (!capable(CAP_NET_ADMIN))
-                               return -EPERM;
-                       dev_load(ifr.ifr_name);
-                       rtnl_lock();
-                       ret = dev_ifsioc(&ifr, cmd);
-                       rtnl_unlock();
-                       if (!ret) {
-                               if (colon)
-                                       *colon = ':';
-                               if (copy_to_user(arg, &ifr,
-                                                sizeof(struct ifreq)))
-                                       ret = -EFAULT;
-                       }
-                       return ret;
-
-               /*
-                *      These ioctl calls:
-                *      - require superuser power.
-                *      - require strict serialization.
-                *      - do not return a value
-                */
-               case SIOCSIFFLAGS:
-               case SIOCSIFMETRIC:
-               case SIOCSIFMTU:
-               case SIOCSIFMAP:
-               case SIOCSIFHWADDR:
-               case SIOCSIFSLAVE:
-               case SIOCADDMULTI:
-               case SIOCDELMULTI:
-               case SIOCSIFHWBROADCAST:
-               case SIOCSIFTXQLEN:
-               case SIOCSMIIREG:
-               case SIOCBONDENSLAVE:
-               case SIOCBONDRELEASE:
-               case SIOCBONDSETHWADDR:
-               case SIOCBONDCHANGEACTIVE:
-               case SIOCBRADDIF:
-               case SIOCBRDELIF:
-                       if (!capable(CAP_NET_ADMIN))
-                               return -EPERM;
-                       /* fall through */
-               case SIOCBONDSLAVEINFOQUERY:
-               case SIOCBONDINFOQUERY:
-                       dev_load(ifr.ifr_name);
-                       rtnl_lock();
-                       ret = dev_ifsioc(&ifr, cmd);
-                       rtnl_unlock();
-                       return ret;
-
-               case SIOCGIFMEM:
-                       /* Get the per device memory space. We can add this but
-                        * currently do not support it */
-               case SIOCSIFMEM:
-                       /* Set the per device memory buffer space.
-                        * Not applicable in our case */
-               case SIOCSIFLINK:
-                       return -EINVAL;
-
-               /*
-                *      Unknown or private ioctl.
-                */
-               default:
-                       if (cmd == SIOCWANDEV ||
-                           (cmd >= SIOCDEVPRIVATE &&
-                            cmd <= SIOCDEVPRIVATE + 15)) {
-                               dev_load(ifr.ifr_name);
-                               rtnl_lock();
-                               ret = dev_ifsioc(&ifr, cmd);
-                               rtnl_unlock();
-                               if (!ret && copy_to_user(arg, &ifr,
-                                                        sizeof(struct ifreq)))
-                                       ret = -EFAULT;
-                               return ret;
-                       }
-#ifdef CONFIG_WIRELESS_EXT
-                       /* Take care of Wireless Extensions */
-                       if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
-                               /* If command is `set a parameter', or
-                                * `get the encoding parameters', check if
-                                * the user has the right to do it */
-                               if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE
-                                   || cmd == SIOCGIWENCODEEXT) {
-                                       if (!capable(CAP_NET_ADMIN))
-                                               return -EPERM;
-                               }
-                               dev_load(ifr.ifr_name);
-                               rtnl_lock();
-                               /* Follow me in net/core/wireless.c */
-                               ret = wireless_process_ioctl(&ifr, cmd);
-                               rtnl_unlock();
-                               if (IW_IS_GET(cmd) &&
-                                   copy_to_user(arg, &ifr,
-                                                sizeof(struct ifreq)))
-                                       ret = -EFAULT;
-                               return ret;
-                       }
-#endif /* CONFIG_WIRELESS_EXT */
-                       return -EINVAL;
-       }
-}
-
-
-/**
- *     dev_new_index   -       allocate an ifindex
- *
- *     Returns a suitable unique value for a new device interface
- *     number.  The caller must hold the rtnl semaphore or the
- *     dev_base_lock to be sure it remains unique.
- */
-static int dev_new_index(void)
-{
-       static int ifindex;
-       for (;;) {
-               if (++ifindex <= 0)
-                       ifindex = 1;
-               if (!__dev_get_by_index(ifindex))
-                       return ifindex;
-       }
-}
-
-static int dev_boot_phase = 1;
-
-/* Delayed registration/unregisteration */
-static DEFINE_SPINLOCK(net_todo_list_lock);
-static struct list_head net_todo_list = LIST_HEAD_INIT(net_todo_list);
-
-static inline void net_set_todo(struct net_device *dev)
-{
-       spin_lock(&net_todo_list_lock);
-       list_add_tail(&dev->todo_list, &net_todo_list);
-       spin_unlock(&net_todo_list_lock);
-}
-
-/**
- *     register_netdevice      - register a network device
- *     @dev: device to register
- *
- *     Take a completed network device structure and add it to the kernel
- *     interfaces. A %NETDEV_REGISTER message is sent to the netdev notifier
- *     chain. 0 is returned on success. A negative errno code is returned
- *     on a failure to set up the device, or if the name is a duplicate.
- *
- *     Callers must hold the rtnl semaphore. You may want
- *     register_netdev() instead of this.
- *
- *     BUGS:
- *     The locking appears insufficient to guarantee two parallel registers
- *     will not get the same name.
- */
-
-int register_netdevice(struct net_device *dev)
-{
-       struct hlist_head *head;
-       struct hlist_node *p;
-       int ret;
-
-       BUG_ON(dev_boot_phase);
-       ASSERT_RTNL();
-
-       might_sleep();
-
-       /* When net_device's are persistent, this will be fatal. */
-       BUG_ON(dev->reg_state != NETREG_UNINITIALIZED);
-
-       spin_lock_init(&dev->queue_lock);
-       spin_lock_init(&dev->_xmit_lock);
-       dev->xmit_lock_owner = -1;
-#ifdef CONFIG_NET_CLS_ACT
-       spin_lock_init(&dev->ingress_lock);
-#endif
-
-       ret = alloc_divert_blk(dev);
-       if (ret)
-               goto out;
-
-       dev->iflink = -1;
-
-       /* Init, if this function is available */
-       if (dev->init) {
-               ret = dev->init(dev);
-               if (ret) {
-                       if (ret > 0)
-                               ret = -EIO;
-                       goto out_err;
-               }
-       }
-       if (!dev_valid_name(dev->name)) {
-               ret = -EINVAL;
-               goto out_err;
-       }
-
-       dev->ifindex = dev_new_index();
-       if (dev->iflink == -1)
-               dev->iflink = dev->ifindex;
-
-       /* Check for existence of name */
-       head = dev_name_hash(dev->name);
-       hlist_for_each(p, head) {
-               struct net_device *d
-                       = hlist_entry(p, struct net_device, name_hlist);
-               if (!strncmp(d->name, dev->name, IFNAMSIZ)) {
-                       ret = -EEXIST;
-                       goto out_err;
-               }
-       }
-
-       /* Fix illegal SG+CSUM combinations. */
-       if ((dev->features & NETIF_F_SG) &&
-           !(dev->features & NETIF_F_ALL_CSUM)) {
-               printk(KERN_NOTICE "%s: Dropping NETIF_F_SG since no checksum feature.\n",
-                      dev->name);
-               dev->features &= ~NETIF_F_SG;
-       }
-
-       /* TSO requires that SG is present as well. */
-       if ((dev->features & NETIF_F_TSO) &&
-           !(dev->features & NETIF_F_SG)) {
-               printk(KERN_NOTICE "%s: Dropping NETIF_F_TSO since no SG feature.\n",
-                      dev->name);
-               dev->features &= ~NETIF_F_TSO;
-       }
-       if (dev->features & NETIF_F_UFO) {
-               if (!(dev->features & NETIF_F_HW_CSUM)) {
-                       printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
-                                       "NETIF_F_HW_CSUM feature.\n",
-                                                       dev->name);
-                       dev->features &= ~NETIF_F_UFO;
-               }
-               if (!(dev->features & NETIF_F_SG)) {
-                       printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
-                                       "NETIF_F_SG feature.\n",
-                                       dev->name);
-                       dev->features &= ~NETIF_F_UFO;
-               }
-       }
-
-       /*
-        *      nil rebuild_header routine,
-        *      that should be never called and used as just bug trap.
-        */
-
-       if (!dev->rebuild_header)
-               dev->rebuild_header = default_rebuild_header;
-
-       ret = netdev_register_sysfs(dev);
-       if (ret)
-               goto out_err;
-       dev->reg_state = NETREG_REGISTERED;
-
-       /*
-        *      Default initial state at registry is that the
-        *      device is present.
-        */
-
-       set_bit(__LINK_STATE_PRESENT, &dev->state);
-
-       dev->next = NULL;
-       dev_init_scheduler(dev);
-       write_lock_bh(&dev_base_lock);
-       *dev_tail = dev;
-       dev_tail = &dev->next;
-       hlist_add_head(&dev->name_hlist, head);
-       hlist_add_head(&dev->index_hlist, dev_index_hash(dev->ifindex));
-       dev_hold(dev);
-       write_unlock_bh(&dev_base_lock);
-
-       /* Notify protocols, that a new device appeared. */
-       raw_notifier_call_chain(&netdev_chain, NETDEV_REGISTER, dev);
-
-       ret = 0;
-
-out:
-       return ret;
-out_err:
-       free_divert_blk(dev);
-       goto out;
-}
-
-/**
- *     register_netdev - register a network device
- *     @dev: device to register
- *
- *     Take a completed network device structure and add it to the kernel
- *     interfaces. A %NETDEV_REGISTER message is sent to the netdev notifier
- *     chain. 0 is returned on success. A negative errno code is returned
- *     on a failure to set up the device, or if the name is a duplicate.
- *
- *     This is a wrapper around register_netdev that takes the rtnl semaphore
- *     and expands the device name if you passed a format string to
- *     alloc_netdev.
- */
-int register_netdev(struct net_device *dev)
-{
-       int err;
-
-       rtnl_lock();
-
-       /*
-        * If the name is a format string the caller wants us to do a
-        * name allocation.
-        */
-       if (strchr(dev->name, '%')) {
-               err = dev_alloc_name(dev, dev->name);
-               if (err < 0)
-                       goto out;
-       }
-       
-       /*
-        * Back compatibility hook. Kill this one in 2.5
-        */
-       if (dev->name[0] == 0 || dev->name[0] == ' ') {
-               err = dev_alloc_name(dev, "eth%d");
-               if (err < 0)
-                       goto out;
-       }
-
-       err = register_netdevice(dev);
-out:
-       rtnl_unlock();
-       return err;
-}
-EXPORT_SYMBOL(register_netdev);
-
-/*
- * netdev_wait_allrefs - wait until all references are gone.
- *
- * This is called when unregistering network devices.
- *
- * Any protocol or device that holds a reference should register
- * for netdevice notification, and cleanup and put back the
- * reference if they receive an UNREGISTER event.
- * We can get stuck here if buggy protocols don't correctly
- * call dev_put. 
- */
-static void netdev_wait_allrefs(struct net_device *dev)
-{
-       unsigned long rebroadcast_time, warning_time;
-
-       rebroadcast_time = warning_time = jiffies;
-       while (atomic_read(&dev->refcnt) != 0) {
-               if (time_after(jiffies, rebroadcast_time + 1 * HZ)) {
-                       rtnl_lock();
-
-                       /* Rebroadcast unregister notification */
-                       raw_notifier_call_chain(&netdev_chain,
-                                           NETDEV_UNREGISTER, dev);
-
-                       if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
-                                    &dev->state)) {
-                               /* We must not have linkwatch events
-                                * pending on unregister. If this
-                                * happens, we simply run the queue
-                                * unscheduled, resulting in a noop
-                                * for this device.
-                                */
-                               linkwatch_run_queue();
-                       }
-
-                       __rtnl_unlock();
-
-                       rebroadcast_time = jiffies;
-               }
-
-               msleep(250);
-
-               if (time_after(jiffies, warning_time + 10 * HZ)) {
-                       printk(KERN_EMERG "unregister_netdevice: "
-                              "waiting for %s to become free. Usage "
-                              "count = %d\n",
-                              dev->name, atomic_read(&dev->refcnt));
-                       warning_time = jiffies;
-               }
-       }
-}
-
-/* The sequence is:
- *
- *     rtnl_lock();
- *     ...
- *     register_netdevice(x1);
- *     register_netdevice(x2);
- *     ...
- *     unregister_netdevice(y1);
- *     unregister_netdevice(y2);
- *      ...
- *     rtnl_unlock();
- *     free_netdev(y1);
- *     free_netdev(y2);
- *
- * We are invoked by rtnl_unlock() after it drops the semaphore.
- * This allows us to deal with problems:
- * 1) We can delete sysfs objects which invoke hotplug
- *    without deadlocking with linkwatch via keventd.
- * 2) Since we run with the RTNL semaphore not held, we can sleep
- *    safely in order to wait for the netdev refcnt to drop to zero.
- */
-static DEFINE_MUTEX(net_todo_run_mutex);
-void netdev_run_todo(void)
-{
-       struct list_head list;
-
-       /* Need to guard against multiple cpu's getting out of order. */
-       mutex_lock(&net_todo_run_mutex);
-
-       /* Not safe to do outside the semaphore.  We must not return
-        * until all unregister events invoked by the local processor
-        * have been completed (either by this todo run, or one on
-        * another cpu).
-        */
-       if (list_empty(&net_todo_list))
-               goto out;
-
-       /* Snapshot list, allow later requests */
-       spin_lock(&net_todo_list_lock);
-       list_replace_init(&net_todo_list, &list);
-       spin_unlock(&net_todo_list_lock);
-
-       while (!list_empty(&list)) {
-               struct net_device *dev
-                       = list_entry(list.next, struct net_device, todo_list);
-               list_del(&dev->todo_list);
-
-               if (unlikely(dev->reg_state != NETREG_UNREGISTERING)) {
-                       printk(KERN_ERR "network todo '%s' but state %d\n",
-                              dev->name, dev->reg_state);
-                       dump_stack();
-                       continue;
-               }
-
-               netdev_unregister_sysfs(dev);
-               dev->reg_state = NETREG_UNREGISTERED;
-
-               netdev_wait_allrefs(dev);
-
-               /* paranoia */
-               BUG_ON(atomic_read(&dev->refcnt));
-               BUG_TRAP(!dev->ip_ptr);
-               BUG_TRAP(!dev->ip6_ptr);
-               BUG_TRAP(!dev->dn_ptr);
-
-               /* It must be the very last action,
-                * after this 'dev' may point to freed up memory.
-                */
-               if (dev->destructor)
-                       dev->destructor(dev);
-       }
-
-out:
-       mutex_unlock(&net_todo_run_mutex);
-}
-
-/**
- *     alloc_netdev - allocate network device
- *     @sizeof_priv:   size of private data to allocate space for
- *     @name:          device name format string
- *     @setup:         callback to initialize device
- *
- *     Allocates a struct net_device with private data area for driver use
- *     and performs basic initialization.
- */
-struct net_device *alloc_netdev(int sizeof_priv, const char *name,
-               void (*setup)(struct net_device *))
-{
-       void *p;
-       struct net_device *dev;
-       int alloc_size;
-
-       /* ensure 32-byte alignment of both the device and private area */
-       alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
-       alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
-
-       p = kzalloc(alloc_size, GFP_KERNEL);
-       if (!p) {
-               printk(KERN_ERR "alloc_dev: Unable to allocate device.\n");
-               return NULL;
-       }
-
-       dev = (struct net_device *)
-               (((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
-       dev->padded = (char *)dev - (char *)p;
-
-       if (sizeof_priv)
-               dev->priv = netdev_priv(dev);
-
-       setup(dev);
-       strcpy(dev->name, name);
-       return dev;
-}
-EXPORT_SYMBOL(alloc_netdev);
-
-/**
- *     free_netdev - free network device
- *     @dev: device
- *
- *     This function does the last stage of destroying an allocated device 
- *     interface. The reference to the device object is released.  
- *     If this is the last reference then it will be freed.
- */
-void free_netdev(struct net_device *dev)
-{
-#ifdef CONFIG_SYSFS
-       /*  Compatibility with error handling in drivers */
-       if (dev->reg_state == NETREG_UNINITIALIZED) {
-               kfree((char *)dev - dev->padded);
-               return;
-       }
-
-       BUG_ON(dev->reg_state != NETREG_UNREGISTERED);
-       dev->reg_state = NETREG_RELEASED;
-
-       /* will free via class release */
-       class_device_put(&dev->class_dev);
-#else
-       kfree((char *)dev - dev->padded);
-#endif
-}
-/* Synchronize with packet receive processing. */
-void synchronize_net(void) 
-{
-       might_sleep();
-       synchronize_rcu();
-}
-
-/**
- *     unregister_netdevice - remove device from the kernel
- *     @dev: device
- *
- *     This function shuts down a device interface and removes it
- *     from the kernel tables. On success 0 is returned, on a failure
- *     a negative errno code is returned.
- *
- *     Callers must hold the rtnl semaphore.  You may want
- *     unregister_netdev() instead of this.
- */
-
-int unregister_netdevice(struct net_device *dev)
-{
-       struct net_device *d, **dp;
-
-       BUG_ON(dev_boot_phase);
-       ASSERT_RTNL();
-
-       /* Some devices call without registering for initialization unwind. */
-       if (dev->reg_state == NETREG_UNINITIALIZED) {
-               printk(KERN_DEBUG "unregister_netdevice: device %s/%p never "
-                                 "was registered\n", dev->name, dev);
-               return -ENODEV;
-       }
-
-       BUG_ON(dev->reg_state != NETREG_REGISTERED);
-
-       /* If device is running, close it first. */
-       if (dev->flags & IFF_UP)
-               dev_close(dev);
-
-       /* And unlink it from device chain. */
-       for (dp = &dev_base; (d = *dp) != NULL; dp = &d->next) {
-               if (d == dev) {
-                       write_lock_bh(&dev_base_lock);
-                       hlist_del(&dev->name_hlist);
-                       hlist_del(&dev->index_hlist);
-                       if (dev_tail == &dev->next)
-                               dev_tail = dp;
-                       *dp = d->next;
-                       write_unlock_bh(&dev_base_lock);
-                       break;
-               }
-       }
-       if (!d) {
-               printk(KERN_ERR "unregister net_device: '%s' not found\n",
-                      dev->name);
-               return -ENODEV;
-       }
-
-       dev->reg_state = NETREG_UNREGISTERING;
-
-       synchronize_net();
-
-       /* Shutdown queueing discipline. */
-       dev_shutdown(dev);
-
-       
-       /* Notify protocols, that we are about to destroy
-          this device. They should clean all the things.
-       */
-       raw_notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
-       
-       /*
-        *      Flush the multicast chain
-        */
-       dev_mc_discard(dev);
-
-       if (dev->uninit)
-               dev->uninit(dev);
-
-       /* Notifier chain MUST detach us from master device. */
-       BUG_TRAP(!dev->master);
-
-       free_divert_blk(dev);
-
-       /* Finish processing unregister after unlock */
-       net_set_todo(dev);
-
-       synchronize_net();
-
-       dev_put(dev);
-       return 0;
-}
-
-/**
- *     unregister_netdev - remove device from the kernel
- *     @dev: device
- *
- *     This function shuts down a device interface and removes it
- *     from the kernel tables. On success 0 is returned, on a failure
- *     a negative errno code is returned.
- *
- *     This is just a wrapper for unregister_netdevice that takes
- *     the rtnl semaphore.  In general you want to use this and not
- *     unregister_netdevice.
- */
-void unregister_netdev(struct net_device *dev)
-{
-       rtnl_lock();
-       unregister_netdevice(dev);
-       rtnl_unlock();
-}
-
-EXPORT_SYMBOL(unregister_netdev);
-
-#ifdef CONFIG_HOTPLUG_CPU
-static int dev_cpu_callback(struct notifier_block *nfb,
-                           unsigned long action,
-                           void *ocpu)
-{
-       struct sk_buff **list_skb;
-       struct net_device **list_net;
-       struct sk_buff *skb;
-       unsigned int cpu, oldcpu = (unsigned long)ocpu;
-       struct softnet_data *sd, *oldsd;
-
-       if (action != CPU_DEAD)
-               return NOTIFY_OK;
-
-       local_irq_disable();
-       cpu = smp_processor_id();
-       sd = &per_cpu(softnet_data, cpu);
-       oldsd = &per_cpu(softnet_data, oldcpu);
-
-       /* Find end of our completion_queue. */
-       list_skb = &sd->completion_queue;
-       while (*list_skb)
-               list_skb = &(*list_skb)->next;
-       /* Append completion queue from offline CPU. */
-       *list_skb = oldsd->completion_queue;
-       oldsd->completion_queue = NULL;
-
-       /* Find end of our output_queue. */
-       list_net = &sd->output_queue;
-       while (*list_net)
-               list_net = &(*list_net)->next_sched;
-       /* Append output queue from offline CPU. */
-       *list_net = oldsd->output_queue;
-       oldsd->output_queue = NULL;
-
-       raise_softirq_irqoff(NET_TX_SOFTIRQ);
-       local_irq_enable();
-
-       /* Process offline CPU's input_pkt_queue */
-       while ((skb = __skb_dequeue(&oldsd->input_pkt_queue)))
-               netif_rx(skb);
-
-       return NOTIFY_OK;
-}
-#endif /* CONFIG_HOTPLUG_CPU */
-
-#ifdef CONFIG_NET_DMA
-/**
- * net_dma_rebalance -
- * This is called when the number of channels allocated to the net_dma_client
- * changes.  The net_dma_client tries to have one DMA channel per CPU.
- */
-static void net_dma_rebalance(void)
-{
-       unsigned int cpu, i, n;
-       struct dma_chan *chan;
-
-       if (net_dma_count == 0) {
-               for_each_online_cpu(cpu)
-                       rcu_assign_pointer(per_cpu(softnet_data, cpu).net_dma, NULL);
-               return;
-       }
-
-       i = 0;
-       cpu = first_cpu(cpu_online_map);
-
-       rcu_read_lock();
-       list_for_each_entry(chan, &net_dma_client->channels, client_node) {
-               n = ((num_online_cpus() / net_dma_count)
-                  + (i < (num_online_cpus() % net_dma_count) ? 1 : 0));
-
-               while(n) {
-                       per_cpu(softnet_data, cpu).net_dma = chan;
-                       cpu = next_cpu(cpu, cpu_online_map);
-                       n--;
-               }
-               i++;
-       }
-       rcu_read_unlock();
-}
-
-/**
- * netdev_dma_event - event callback for the net_dma_client
- * @client: should always be net_dma_client
- * @chan: DMA channel for the event
- * @event: event type
- */
-static void netdev_dma_event(struct dma_client *client, struct dma_chan *chan,
-       enum dma_event event)
-{
-       spin_lock(&net_dma_event_lock);
-       switch (event) {
-       case DMA_RESOURCE_ADDED:
-               net_dma_count++;
-               net_dma_rebalance();
-               break;
-       case DMA_RESOURCE_REMOVED:
-               net_dma_count--;
-               net_dma_rebalance();
-               break;
-       default:
-               break;
-       }
-       spin_unlock(&net_dma_event_lock);
-}
-
-/**
- * netdev_dma_regiser - register the networking subsystem as a DMA client
- */
-static int __init netdev_dma_register(void)
-{
-       spin_lock_init(&net_dma_event_lock);
-       net_dma_client = dma_async_client_register(netdev_dma_event);
-       if (net_dma_client == NULL)
-               return -ENOMEM;
-
-       dma_async_client_chan_request(net_dma_client, num_online_cpus());
-       return 0;
-}
-
-#else
-static int __init netdev_dma_register(void) { return -ENODEV; }
-#endif /* CONFIG_NET_DMA */
-
-/*
- *     Initialize the DEV module. At boot time this walks the device list and
- *     unhooks any devices that fail to initialise (normally hardware not
- *     present) and leaves us with a valid list of present and active devices.
- *
- */
-
-/*
- *       This is called single threaded during boot, so no need
- *       to take the rtnl semaphore.
- */
-static int __init net_dev_init(void)
-{
-       int i, rc = -ENOMEM;
-
-       BUG_ON(!dev_boot_phase);
-
-       net_random_init();
-
-       if (dev_proc_init())
-               goto out;
-
-       if (netdev_sysfs_init())
-               goto out;
-
-       INIT_LIST_HEAD(&ptype_all);
-       for (i = 0; i < 16; i++) 
-               INIT_LIST_HEAD(&ptype_base[i]);
-
-       for (i = 0; i < ARRAY_SIZE(dev_name_head); i++)
-               INIT_HLIST_HEAD(&dev_name_head[i]);
-
-       for (i = 0; i < ARRAY_SIZE(dev_index_head); i++)
-               INIT_HLIST_HEAD(&dev_index_head[i]);
-
-       /*
-        *      Initialise the packet receive queues.
-        */
-
-       for_each_possible_cpu(i) {
-               struct softnet_data *queue;
-
-               queue = &per_cpu(softnet_data, i);
-               skb_queue_head_init(&queue->input_pkt_queue);
-               queue->completion_queue = NULL;
-               INIT_LIST_HEAD(&queue->poll_list);
-               set_bit(__LINK_STATE_START, &queue->backlog_dev.state);
-               queue->backlog_dev.weight = weight_p;
-               queue->backlog_dev.poll = process_backlog;
-               atomic_set(&queue->backlog_dev.refcnt, 1);
-       }
-
-       netdev_dma_register();
-
-       dev_boot_phase = 0;
-
-       open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
-       open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
-
-       hotcpu_notifier(dev_cpu_callback, 0);
-       dst_init();
-       dev_mcast_init();
-       rc = 0;
-out:
-       return rc;
-}
-
-subsys_initcall(net_dev_init);
-
-EXPORT_SYMBOL(__dev_get_by_index);
-EXPORT_SYMBOL(__dev_get_by_name);
-EXPORT_SYMBOL(__dev_remove_pack);
-EXPORT_SYMBOL(dev_valid_name);
-EXPORT_SYMBOL(dev_add_pack);
-EXPORT_SYMBOL(dev_alloc_name);
-EXPORT_SYMBOL(dev_close);
-EXPORT_SYMBOL(dev_get_by_flags);
-EXPORT_SYMBOL(dev_get_by_index);
-EXPORT_SYMBOL(dev_get_by_name);
-EXPORT_SYMBOL(dev_open);
-EXPORT_SYMBOL(dev_queue_xmit);
-EXPORT_SYMBOL(dev_remove_pack);
-EXPORT_SYMBOL(dev_set_allmulti);
-EXPORT_SYMBOL(dev_set_promiscuity);
-EXPORT_SYMBOL(dev_change_flags);
-EXPORT_SYMBOL(dev_set_mtu);
-EXPORT_SYMBOL(dev_set_mac_address);
-EXPORT_SYMBOL(free_netdev);
-EXPORT_SYMBOL(netdev_boot_setup_check);
-EXPORT_SYMBOL(netdev_set_master);
-EXPORT_SYMBOL(netdev_state_change);
-EXPORT_SYMBOL(netif_receive_skb);
-EXPORT_SYMBOL(netif_rx);
-EXPORT_SYMBOL(register_gifconf);
-EXPORT_SYMBOL(register_netdevice);
-EXPORT_SYMBOL(register_netdevice_notifier);
-EXPORT_SYMBOL(skb_checksum_help);
-EXPORT_SYMBOL(synchronize_net);
-EXPORT_SYMBOL(unregister_netdevice);
-EXPORT_SYMBOL(unregister_netdevice_notifier);
-EXPORT_SYMBOL(net_enable_timestamp);
-EXPORT_SYMBOL(net_disable_timestamp);
-EXPORT_SYMBOL(dev_get_flags);
-EXPORT_SYMBOL(skb_checksum_setup);
-
-#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
-EXPORT_SYMBOL(br_handle_frame_hook);
-EXPORT_SYMBOL(br_fdb_get_hook);
-EXPORT_SYMBOL(br_fdb_put_hook);
-#endif
-
-#ifdef CONFIG_KMOD
-EXPORT_SYMBOL(dev_load);
-#endif
-
-EXPORT_PER_CPU_SYMBOL(softnet_data);
diff --git a/linux-2.6-xen-sparse/net/core/skbuff.c b/linux-2.6-xen-sparse/net/core/skbuff.c
deleted file mode 100644 (file)
index c8e7259..0000000
+++ /dev/null
@@ -1,2101 +0,0 @@
-/*
- *     Routines having to do with the 'struct sk_buff' memory handlers.
- *
- *     Authors:        Alan Cox <iiitac@pyr.swan.ac.uk>
- *                     Florian La Roche <rzsfl@rz.uni-sb.de>
- *
- *     Version:        $Id: skbuff.c,v 1.90 2001/11/07 05:56:19 davem Exp $
- *
- *     Fixes:
- *             Alan Cox        :       Fixed the worst of the load
- *                                     balancer bugs.
- *             Dave Platt      :       Interrupt stacking fix.
- *     Richard Kooijman        :       Timestamp fixes.
- *             Alan Cox        :       Changed buffer format.
- *             Alan Cox        :       destructor hook for AF_UNIX etc.
- *             Linus Torvalds  :       Better skb_clone.
- *             Alan Cox        :       Added skb_copy.
- *             Alan Cox        :       Added all the changed routines Linus
- *                                     only put in the headers
- *             Ray VanTassle   :       Fixed --skb->lock in free
- *             Alan Cox        :       skb_copy copy arp field
- *             Andi Kleen      :       slabified it.
- *             Robert Olsson   :       Removed skb_head_pool
- *
- *     NOTE:
- *             The __skb_ routines should be called with interrupts
- *     disabled, or you better be *real* sure that the operation is atomic
- *     with respect to whatever list is being frobbed (e.g. via lock_sock()
- *     or via disabling bottom half handlers, etc).
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License
- *     as published by the Free Software Foundation; either version
- *     2 of the License, or (at your option) any later version.
- */
-
-/*
- *     The functions in this file will not compile correctly with gcc 2.4.x
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/slab.h>
-#include <linux/netdevice.h>
-#ifdef CONFIG_NET_CLS_ACT
-#include <net/pkt_sched.h>
-#endif
-#include <linux/string.h>
-#include <linux/skbuff.h>
-#include <linux/cache.h>
-#include <linux/rtnetlink.h>
-#include <linux/init.h>
-#include <linux/highmem.h>
-
-#include <net/protocol.h>
-#include <net/dst.h>
-#include <net/sock.h>
-#include <net/checksum.h>
-#include <net/xfrm.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-
-static kmem_cache_t *skbuff_head_cache __read_mostly;
-static kmem_cache_t *skbuff_fclone_cache __read_mostly;
-
-/*
- *     Keep out-of-line to prevent kernel bloat.
- *     __builtin_return_address is not used because it is not always
- *     reliable.
- */
-
-/**
- *     skb_over_panic  -       private function
- *     @skb: buffer
- *     @sz: size
- *     @here: address
- *
- *     Out of line support code for skb_put(). Not user callable.
- */
-void skb_over_panic(struct sk_buff *skb, int sz, void *here)
-{
-       printk(KERN_EMERG "skb_over_panic: text:%p len:%d put:%d head:%p "
-                         "data:%p tail:%p end:%p dev:%s\n",
-              here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end,
-              skb->dev ? skb->dev->name : "<NULL>");
-       BUG();
-}
-
-/**
- *     skb_under_panic -       private function
- *     @skb: buffer
- *     @sz: size
- *     @here: address
- *
- *     Out of line support code for skb_push(). Not user callable.
- */
-
-void skb_under_panic(struct sk_buff *skb, int sz, void *here)
-{
-       printk(KERN_EMERG "skb_under_panic: text:%p len:%d put:%d head:%p "
-                         "data:%p tail:%p end:%p dev:%s\n",
-              here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end,
-              skb->dev ? skb->dev->name : "<NULL>");
-       BUG();
-}
-
-void skb_truesize_bug(struct sk_buff *skb)
-{
-       printk(KERN_ERR "SKB BUG: Invalid truesize (%u) "
-              "len=%u, sizeof(sk_buff)=%Zd\n",
-              skb->truesize, skb->len, sizeof(struct sk_buff));
-}
-EXPORT_SYMBOL(skb_truesize_bug);
-
-/*     Allocate a new skbuff. We do this ourselves so we can fill in a few
- *     'private' fields and also do memory statistics to find all the
- *     [BEEP] leaks.
- *
- */
-
-/**
- *     __alloc_skb     -       allocate a network buffer
- *     @size: size to allocate
- *     @gfp_mask: allocation mask
- *     @fclone: allocate from fclone cache instead of head cache
- *             and allocate a cloned (child) skb
- *
- *     Allocate a new &sk_buff. The returned buffer has no headroom and a
- *     tail room of size bytes. The object has a reference count of one.
- *     The return is the buffer. On a failure the return is %NULL.
- *
- *     Buffers may only be allocated from interrupts using a @gfp_mask of
- *     %GFP_ATOMIC.
- */
-struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
-                           int fclone)
-{
-       kmem_cache_t *cache;
-       struct skb_shared_info *shinfo;
-       struct sk_buff *skb;
-       u8 *data;
-
-       cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
-
-       /* Get the HEAD */
-       skb = kmem_cache_alloc(cache, gfp_mask & ~__GFP_DMA);
-       if (!skb)
-               goto out;
-
-       /* Get the DATA. Size must match skb_add_mtu(). */
-       size = SKB_DATA_ALIGN(size);
-       data = ____kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
-       if (!data)
-               goto nodata;
-
-       memset(skb, 0, offsetof(struct sk_buff, truesize));
-       skb->truesize = size + sizeof(struct sk_buff);
-       atomic_set(&skb->users, 1);
-       skb->head = data;
-       skb->data = data;
-       skb->tail = data;
-       skb->end  = data + size;
-       /* make sure we initialize shinfo sequentially */
-       shinfo = skb_shinfo(skb);
-       atomic_set(&shinfo->dataref, 1);
-       shinfo->nr_frags  = 0;
-       shinfo->gso_size = 0;
-       shinfo->gso_segs = 0;
-       shinfo->gso_type = 0;
-       shinfo->ip6_frag_id = 0;
-       shinfo->frag_list = NULL;
-
-       if (fclone) {
-               struct sk_buff *child = skb + 1;
-               atomic_t *fclone_ref = (atomic_t *) (child + 1);
-
-               skb->fclone = SKB_FCLONE_ORIG;
-               atomic_set(fclone_ref, 1);
-
-               child->fclone = SKB_FCLONE_UNAVAILABLE;
-       }
-out:
-       return skb;
-nodata:
-       kmem_cache_free(cache, skb);
-       skb = NULL;
-       goto out;
-}
-
-/**
- *     alloc_skb_from_cache    -       allocate a network buffer
- *     @cp: kmem_cache from which to allocate the data area
- *           (object size must be big enough for @size bytes + skb overheads)
- *     @size: size to allocate
- *     @gfp_mask: allocation mask
- *
- *     Allocate a new &sk_buff. The returned buffer has no headroom and
- *     tail room of size bytes. The object has a reference count of one.
- *     The return is the buffer. On a failure the return is %NULL.
- *
- *     Buffers may only be allocated from interrupts using a @gfp_mask of
- *     %GFP_ATOMIC.
- */
-struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
-                                    unsigned int size,
-                                    gfp_t gfp_mask)
-{
-       struct sk_buff *skb;
-       u8 *data;
-
-       /* Get the HEAD */
-       skb = kmem_cache_alloc(skbuff_head_cache,
-                              gfp_mask & ~__GFP_DMA);
-       if (!skb)
-               goto out;
-
-       /* Get the DATA. */
-       size = SKB_DATA_ALIGN(size);
-       data = kmem_cache_alloc(cp, gfp_mask);
-       if (!data)
-               goto nodata;
-
-       memset(skb, 0, offsetof(struct sk_buff, truesize));
-       skb->truesize = size + sizeof(struct sk_buff);
-       atomic_set(&skb->users, 1);
-       skb->head = data;
-       skb->data = data;
-       skb->tail = data;
-       skb->end  = data + size;
-
-       atomic_set(&(skb_shinfo(skb)->dataref), 1);
-       skb_shinfo(skb)->nr_frags  = 0;
-       skb_shinfo(skb)->gso_size = 0;
-       skb_shinfo(skb)->gso_segs = 0;
-       skb_shinfo(skb)->gso_type = 0;
-       skb_shinfo(skb)->ip6_frag_id = 0;
-       skb_shinfo(skb)->frag_list = NULL;
-out:
-       return skb;
-nodata:
-       kmem_cache_free(skbuff_head_cache, skb);
-       skb = NULL;
-       goto out;
-}
-
-/**
- *     __netdev_alloc_skb - allocate an skbuff for rx on a specific device
- *     @dev: network device to receive on
- *     @length: length to allocate
- *     @gfp_mask: get_free_pages mask, passed to alloc_skb
- *
- *     Allocate a new &sk_buff and assign it a usage count of one. The
- *     buffer has unspecified headroom built in. Users should allocate
- *     the headroom they think they need without accounting for the
- *     built in space. The built in space is used for optimisations.
- *
- *     %NULL is returned if there is no free memory.
- */
-struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
-               unsigned int length, gfp_t gfp_mask)
-{
-       struct sk_buff *skb;
-
-       skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
-       if (likely(skb)) {
-               skb_reserve(skb, NET_SKB_PAD);
-               skb->dev = dev;
-       }
-       return skb;
-}
-
-static void skb_drop_list(struct sk_buff **listp)
-{
-       struct sk_buff *list = *listp;
-
-       *listp = NULL;
-
-       do {
-               struct sk_buff *this = list;
-               list = list->next;
-               kfree_skb(this);
-       } while (list);
-}
-
-static inline void skb_drop_fraglist(struct sk_buff *skb)
-{
-       skb_drop_list(&skb_shinfo(skb)->frag_list);
-}
-
-static void skb_clone_fraglist(struct sk_buff *skb)
-{
-       struct sk_buff *list;
-
-       for (list = skb_shinfo(skb)->frag_list; list; list = list->next)
-               skb_get(list);
-}
-
-static void skb_release_data(struct sk_buff *skb)
-{
-       if (!skb->cloned ||
-           !atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1,
-                              &skb_shinfo(skb)->dataref)) {
-               if (skb_shinfo(skb)->nr_frags) {
-                       int i;
-                       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-                               put_page(skb_shinfo(skb)->frags[i].page);
-               }
-
-               if (skb_shinfo(skb)->frag_list)
-                       skb_drop_fraglist(skb);
-
-               kfree(skb->head);
-       }
-}
-
-/*
- *     Free an skbuff by memory without cleaning the state.
- */
-void kfree_skbmem(struct sk_buff *skb)
-{
-       struct sk_buff *other;
-       atomic_t *fclone_ref;
-
-       skb_release_data(skb);
-       switch (skb->fclone) {
-       case SKB_FCLONE_UNAVAILABLE:
-               kmem_cache_free(skbuff_head_cache, skb);
-               break;
-
-       case SKB_FCLONE_ORIG:
-               fclone_ref = (atomic_t *) (skb + 2);
-               if (atomic_dec_and_test(fclone_ref))
-                       kmem_cache_free(skbuff_fclone_cache, skb);
-               break;
-
-       case SKB_FCLONE_CLONE:
-               fclone_ref = (atomic_t *) (skb + 1);
-               other = skb - 1;
-
-               /* The clone portion is available for
-                * fast-cloning again.
-                */
-               skb->fclone = SKB_FCLONE_UNAVAILABLE;
-
-               if (atomic_dec_and_test(fclone_ref))
-                       kmem_cache_free(skbuff_fclone_cache, other);
-               break;
-       };
-}
-
-/**
- *     __kfree_skb - private function
- *     @skb: buffer
- *
- *     Free an sk_buff. Release anything attached to the buffer.
- *     Clean the state. This is an internal helper function. Users should
- *     always call kfree_skb
- */
-
-void __kfree_skb(struct sk_buff *skb)
-{
-       dst_release(skb->dst);
-#ifdef CONFIG_XFRM
-       secpath_put(skb->sp);
-#endif
-       if (skb->destructor) {
-               WARN_ON(in_irq());
-               skb->destructor(skb);
-       }
-#ifdef CONFIG_NETFILTER
-       nf_conntrack_put(skb->nfct);
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-       nf_conntrack_put_reasm(skb->nfct_reasm);
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-       nf_bridge_put(skb->nf_bridge);
-#endif
-#endif
-/* XXX: IS this still necessary? - JHS */
-#ifdef CONFIG_NET_SCHED
-       skb->tc_index = 0;
-#ifdef CONFIG_NET_CLS_ACT
-       skb->tc_verd = 0;
-#endif
-#endif
-
-       kfree_skbmem(skb);
-}
-
-/**
- *     kfree_skb - free an sk_buff
- *     @skb: buffer to free
- *
- *     Drop a reference to the buffer and free it if the usage count has
- *     hit zero.
- */
-void kfree_skb(struct sk_buff *skb)
-{
-       if (unlikely(!skb))
-               return;
-       if (likely(atomic_read(&skb->users) == 1))
-               smp_rmb();
-       else if (likely(!atomic_dec_and_test(&skb->users)))
-               return;
-       __kfree_skb(skb);
-}
-
-/**
- *     skb_clone       -       duplicate an sk_buff
- *     @skb: buffer to clone
- *     @gfp_mask: allocation priority
- *
- *     Duplicate an &sk_buff. The new one is not owned by a socket. Both
- *     copies share the same packet data but not structure. The new
- *     buffer has a reference count of 1. If the allocation fails the
- *     function returns %NULL otherwise the new buffer is returned.
- *
- *     If this function is called from an interrupt gfp_mask() must be
- *     %GFP_ATOMIC.
- */
-
-struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
-{
-       struct sk_buff *n;
-
-       n = skb + 1;
-       if (skb->fclone == SKB_FCLONE_ORIG &&
-           n->fclone == SKB_FCLONE_UNAVAILABLE) {
-               atomic_t *fclone_ref = (atomic_t *) (n + 1);
-               n->fclone = SKB_FCLONE_CLONE;
-               atomic_inc(fclone_ref);
-       } else {
-               n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
-               if (!n)
-                       return NULL;
-               n->fclone = SKB_FCLONE_UNAVAILABLE;
-       }
-
-#define C(x) n->x = skb->x
-
-       n->next = n->prev = NULL;
-       n->sk = NULL;
-       C(tstamp);
-       C(dev);
-       C(h);
-       C(nh);
-       C(mac);
-       C(dst);
-       dst_clone(skb->dst);
-       C(sp);
-#ifdef CONFIG_INET
-       secpath_get(skb->sp);
-#endif
-       memcpy(n->cb, skb->cb, sizeof(skb->cb));
-       C(len);
-       C(data_len);
-       C(csum);
-       C(local_df);
-       n->cloned = 1;
-       n->nohdr = 0;
-#ifdef CONFIG_XEN
-       C(proto_data_valid);
-       C(proto_csum_blank);
-#endif
-       C(pkt_type);
-       C(ip_summed);
-       C(priority);
-#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
-       C(ipvs_property);
-#endif
-       C(protocol);
-       n->destructor = NULL;
-#ifdef CONFIG_NETFILTER
-       C(nfmark);
-       C(nfct);
-       nf_conntrack_get(skb->nfct);
-       C(nfctinfo);
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-       C(nfct_reasm);
-       nf_conntrack_get_reasm(skb->nfct_reasm);
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-       C(nf_bridge);
-       nf_bridge_get(skb->nf_bridge);
-#endif
-#endif /*CONFIG_NETFILTER*/
-#ifdef CONFIG_NET_SCHED
-       C(tc_index);
-#ifdef CONFIG_NET_CLS_ACT
-       n->tc_verd = SET_TC_VERD(skb->tc_verd,0);
-       n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd);
-       n->tc_verd = CLR_TC_MUNGED(n->tc_verd);
-       C(input_dev);
-#endif
-       skb_copy_secmark(n, skb);
-#endif
-       C(truesize);
-       atomic_set(&n->users, 1);
-       C(head);
-       C(data);
-       C(tail);
-       C(end);
-
-       atomic_inc(&(skb_shinfo(skb)->dataref));
-       skb->cloned = 1;
-
-       return n;
-}
-
-static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
-{
-       /*
-        *      Shift between the two data areas in bytes
-        */
-       unsigned long offset = new->data - old->data;
-
-       new->sk         = NULL;
-       new->dev        = old->dev;
-       new->priority   = old->priority;
-       new->protocol   = old->protocol;
-       new->dst        = dst_clone(old->dst);
-#ifdef CONFIG_INET
-       new->sp         = secpath_get(old->sp);
-#endif
-       new->h.raw      = old->h.raw + offset;
-       new->nh.raw     = old->nh.raw + offset;
-       new->mac.raw    = old->mac.raw + offset;
-       memcpy(new->cb, old->cb, sizeof(old->cb));
-       new->local_df   = old->local_df;
-       new->fclone     = SKB_FCLONE_UNAVAILABLE;
-       new->pkt_type   = old->pkt_type;
-       new->tstamp     = old->tstamp;
-       new->destructor = NULL;
-#ifdef CONFIG_NETFILTER
-       new->nfmark     = old->nfmark;
-       new->nfct       = old->nfct;
-       nf_conntrack_get(old->nfct);
-       new->nfctinfo   = old->nfctinfo;
-#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
-       new->nfct_reasm = old->nfct_reasm;
-       nf_conntrack_get_reasm(old->nfct_reasm);
-#endif
-#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
-       new->ipvs_property = old->ipvs_property;
-#endif
-#ifdef CONFIG_BRIDGE_NETFILTER
-       new->nf_bridge  = old->nf_bridge;
-       nf_bridge_get(old->nf_bridge);
-#endif
-#endif
-#ifdef CONFIG_NET_SCHED
-#ifdef CONFIG_NET_CLS_ACT
-       new->tc_verd = old->tc_verd;
-#endif
-       new->tc_index   = old->tc_index;
-#endif
-       skb_copy_secmark(new, old);
-       atomic_set(&new->users, 1);
-       skb_shinfo(new)->gso_size = skb_shinfo(old)->gso_size;
-       skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
-       skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
-}
-
-/**
- *     skb_copy        -       create private copy of an sk_buff
- *     @skb: buffer to copy
- *     @gfp_mask: allocation priority
- *
- *     Make a copy of both an &sk_buff and its data. This is used when the
- *     caller wishes to modify the data and needs a private copy of the
- *     data to alter. Returns %NULL on failure or the pointer to the buffer
- *     on success. The returned buffer has a reference count of 1.
- *
- *     As by-product this function converts non-linear &sk_buff to linear
- *     one, so that &sk_buff becomes completely private and caller is allowed
- *     to modify all the data of returned buffer. This means that this
- *     function is not recommended for use in circumstances when only
- *     header is going to be modified. Use pskb_copy() instead.
- */
-
-struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
-{
-       int headerlen = skb->data - skb->head;
-       /*
-        *      Allocate the copy buffer
-        */
-       struct sk_buff *n = alloc_skb(skb->end - skb->head + skb->data_len,
-                                     gfp_mask);
-       if (!n)
-               return NULL;
-
-       /* Set the data pointer */
-       skb_reserve(n, headerlen);
-       /* Set the tail pointer and length */
-       skb_put(n, skb->len);
-       n->csum      = skb->csum;
-       n->ip_summed = skb->ip_summed;
-
-       if (skb_copy_bits(skb, -headerlen, n->head, headerlen + skb->len))
-               BUG();
-
-       copy_skb_header(n, skb);
-       return n;
-}
-
-
-/**
- *     pskb_copy       -       create copy of an sk_buff with private head.
- *     @skb: buffer to copy
- *     @gfp_mask: allocation priority
- *
- *     Make a copy of both an &sk_buff and part of its data, located
- *     in header. Fragmented data remain shared. This is used when
- *     the caller wishes to modify only header of &sk_buff and needs
- *     private copy of the header to alter. Returns %NULL on failure
- *     or the pointer to the buffer on success.
- *     The returned buffer has a reference count of 1.
- */
-
-struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
-{
-       /*
-        *      Allocate the copy buffer
-        */
-       struct sk_buff *n = alloc_skb(skb->end - skb->head, gfp_mask);
-
-       if (!n)
-               goto out;
-
-       /* Set the data pointer */
-       skb_reserve(n, skb->data - skb->head);
-       /* Set the tail pointer and length */
-       skb_put(n, skb_headlen(skb));
-       /* Copy the bytes */
-       memcpy(n->data, skb->data, n->len);
-       n->csum      = skb->csum;
-       n->ip_summed = skb->ip_summed;
-
-       n->data_len  = skb->data_len;
-       n->len       = skb->len;
-
-       if (skb_shinfo(skb)->nr_frags) {
-               int i;
-
-               for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-                       skb_shinfo(n)->frags[i] = skb_shinfo(skb)->frags[i];
-                       get_page(skb_shinfo(n)->frags[i].page);
-               }
-               skb_shinfo(n)->nr_frags = i;
-       }
-
-       if (skb_shinfo(skb)->frag_list) {
-               skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list;
-               skb_clone_fraglist(n);
-       }
-
-       copy_skb_header(n, skb);
-out:
-       return n;
-}
-
-/**
- *     pskb_expand_head - reallocate header of &sk_buff
- *     @skb: buffer to reallocate
- *     @nhead: room to add at head
- *     @ntail: room to add at tail
- *     @gfp_mask: allocation priority
- *
- *     Expands (or creates identical copy, if &nhead and &ntail are zero)
- *     header of skb. &sk_buff itself is not changed. &sk_buff MUST have
- *     reference count of 1. Returns zero in the case of success or error,
- *     if expansion failed. In the last case, &sk_buff is not changed.
- *
- *     All the pointers pointing into skb header may change and must be
- *     reloaded after call to this function.
- */
-
-int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
-                    gfp_t gfp_mask)
-{
-       int i;
-       u8 *data;
-       int size = nhead + (skb->end - skb->head) + ntail;
-       long off;
-
-       if (skb_shared(skb))
-               BUG();
-
-       size = SKB_DATA_ALIGN(size);
-
-       data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
-       if (!data)
-               goto nodata;
-
-       /* Copy only real data... and, alas, header. This should be
-        * optimized for the cases when header is void. */
-       memcpy(data + nhead, skb->head, skb->tail - skb->head);
-       memcpy(data + size, skb->end, sizeof(struct skb_shared_info));
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-               get_page(skb_shinfo(skb)->frags[i].page);
-
-       if (skb_shinfo(skb)->frag_list)
-               skb_clone_fraglist(skb);
-
-       skb_release_data(skb);
-
-       off = (data + nhead) - skb->head;
-
-       skb->head     = data;
-       skb->end      = data + size;
-       skb->data    += off;
-       skb->tail    += off;
-       skb->mac.raw += off;
-       skb->h.raw   += off;
-       skb->nh.raw  += off;
-       skb->cloned   = 0;
-       skb->nohdr    = 0;
-       atomic_set(&skb_shinfo(skb)->dataref, 1);
-       return 0;
-
-nodata:
-       return -ENOMEM;
-}
-
-/* Make private copy of skb with writable head and some headroom */
-
-struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
-{
-       struct sk_buff *skb2;
-       int delta = headroom - skb_headroom(skb);
-
-       if (delta <= 0)
-               skb2 = pskb_copy(skb, GFP_ATOMIC);
-       else {
-               skb2 = skb_clone(skb, GFP_ATOMIC);
-               if (skb2 && pskb_expand_head(skb2, SKB_DATA_ALIGN(delta), 0,
-                                            GFP_ATOMIC)) {
-                       kfree_skb(skb2);
-                       skb2 = NULL;
-               }
-       }
-       return skb2;
-}
-
-
-/**
- *     skb_copy_expand -       copy and expand sk_buff
- *     @skb: buffer to copy
- *     @newheadroom: new free bytes at head
- *     @newtailroom: new free bytes at tail
- *     @gfp_mask: allocation priority
- *
- *     Make a copy of both an &sk_buff and its data and while doing so
- *     allocate additional space.
- *
- *     This is used when the caller wishes to modify the data and needs a
- *     private copy of the data to alter as well as more space for new fields.
- *     Returns %NULL on failure or the pointer to the buffer
- *     on success. The returned buffer has a reference count of 1.
- *
- *     You must pass %GFP_ATOMIC as the allocation priority if this function
- *     is called from an interrupt.
- *
- *     BUG ALERT: ip_summed is not copied. Why does this work? Is it used
- *     only by netfilter in the cases when checksum is recalculated? --ANK
- */
-struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
-                               int newheadroom, int newtailroom,
-                               gfp_t gfp_mask)
-{
-       /*
-        *      Allocate the copy buffer
-        */
-       struct sk_buff *n = alloc_skb(newheadroom + skb->len + newtailroom,
-                                     gfp_mask);
-       int head_copy_len, head_copy_off;
-
-       if (!n)
-               return NULL;
-
-       skb_reserve(n, newheadroom);
-
-       /* Set the tail pointer and length */
-       skb_put(n, skb->len);
-
-       head_copy_len = skb_headroom(skb);
-       head_copy_off = 0;
-       if (newheadroom <= head_copy_len)
-               head_copy_len = newheadroom;
-       else
-               head_copy_off = newheadroom - head_copy_len;
-
-       /* Copy the linear header and data. */
-       if (skb_copy_bits(skb, -head_copy_len, n->head + head_copy_off,
-                         skb->len + head_copy_len))
-               BUG();
-
-       copy_skb_header(n, skb);
-
-       return n;
-}
-
-/**
- *     skb_pad                 -       zero pad the tail of an skb
- *     @skb: buffer to pad
- *     @pad: space to pad
- *
- *     Ensure that a buffer is followed by a padding area that is zero
- *     filled. Used by network drivers which may DMA or transfer data
- *     beyond the buffer end onto the wire.
- *
- *     May return error in out of memory cases. The skb is freed on error.
- */
-int skb_pad(struct sk_buff *skb, int pad)
-{
-       int err;
-       int ntail;
-       
-       /* If the skbuff is non linear tailroom is always zero.. */
-       if (!skb_cloned(skb) && skb_tailroom(skb) >= pad) {
-               memset(skb->data+skb->len, 0, pad);
-               return 0;
-       }
-
-       ntail = skb->data_len + pad - (skb->end - skb->tail);
-       if (likely(skb_cloned(skb) || ntail > 0)) {
-               err = pskb_expand_head(skb, 0, ntail, GFP_ATOMIC);
-               if (unlikely(err))
-                       goto free_skb;
-       }
-
-       /* FIXME: The use of this function with non-linear skb's really needs
-        * to be audited.
-        */
-       err = skb_linearize(skb);
-       if (unlikely(err))
-               goto free_skb;
-
-       memset(skb->data + skb->len, 0, pad);
-       return 0;
-
-free_skb:
-       kfree_skb(skb);
-       return err;
-}      
-/* Trims skb to length len. It can change skb pointers.
- */
-
-int ___pskb_trim(struct sk_buff *skb, unsigned int len)
-{
-       struct sk_buff **fragp;
-       struct sk_buff *frag;
-       int offset = skb_headlen(skb);
-       int nfrags = skb_shinfo(skb)->nr_frags;
-       int i;
-       int err;
-
-       if (skb_cloned(skb) &&
-           unlikely((err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))))
-               return err;
-
-       i = 0;
-       if (offset >= len)
-               goto drop_pages;
-
-       for (; i < nfrags; i++) {
-               int end = offset + skb_shinfo(skb)->frags[i].size;
-
-               if (end < len) {
-                       offset = end;
-                       continue;
-               }
-
-               skb_shinfo(skb)->frags[i++].size = len - offset;
-
-drop_pages:
-               skb_shinfo(skb)->nr_frags = i;
-
-               for (; i < nfrags; i++)
-                       put_page(skb_shinfo(skb)->frags[i].page);
-
-               if (skb_shinfo(skb)->frag_list)
-                       skb_drop_fraglist(skb);
-               goto done;
-       }
-
-       for (fragp = &skb_shinfo(skb)->frag_list; (frag = *fragp);
-            fragp = &frag->next) {
-               int end = offset + frag->len;
-
-               if (skb_shared(frag)) {
-                       struct sk_buff *nfrag;
-
-                       nfrag = skb_clone(frag, GFP_ATOMIC);
-                       if (unlikely(!nfrag))
-                               return -ENOMEM;
-
-                       nfrag->next = frag->next;
-                       kfree_skb(frag);
-                       frag = nfrag;
-                       *fragp = frag;
-               }
-
-               if (end < len) {
-                       offset = end;
-                       continue;
-               }
-
-               if (end > len &&
-                   unlikely((err = pskb_trim(frag, len - offset))))
-                       return err;
-
-               if (frag->next)
-                       skb_drop_list(&frag->next);
-               break;
-       }
-
-done:
-       if (len > skb_headlen(skb)) {
-               skb->data_len -= skb->len - len;
-               skb->len       = len;
-       } else {
-               skb->len       = len;
-               skb->data_len  = 0;
-               skb->tail      = skb->data + len;
-       }
-
-       return 0;
-}
-
-/**
- *     __pskb_pull_tail - advance tail of skb header
- *     @skb: buffer to reallocate
- *     @delta: number of bytes to advance tail
- *
- *     The function makes a sense only on a fragmented &sk_buff,
- *     it expands header moving its tail forward and copying necessary
- *     data from fragmented part.
- *
- *     &sk_buff MUST have reference count of 1.
- *
- *     Returns %NULL (and &sk_buff does not change) if pull failed
- *     or value of new tail of skb in the case of success.
- *
- *     All the pointers pointing into skb header may change and must be
- *     reloaded after call to this function.
- */
-
-/* Moves tail of skb head forward, copying data from fragmented part,
- * when it is necessary.
- * 1. It may fail due to malloc failure.
- * 2. It may change skb pointers.
- *
- * It is pretty complicated. Luckily, it is called only in exceptional cases.
- */
-unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta)
-{
-       /* If skb has not enough free space at tail, get new one
-        * plus 128 bytes for future expansions. If we have enough
-        * room at tail, reallocate without expansion only if skb is cloned.
-        */
-       int i, k, eat = (skb->tail + delta) - skb->end;
-
-       if (eat > 0 || skb_cloned(skb)) {
-               if (pskb_expand_head(skb, 0, eat > 0 ? eat + 128 : 0,
-                                    GFP_ATOMIC))
-                       return NULL;
-       }
-
-       if (skb_copy_bits(skb, skb_headlen(skb), skb->tail, delta))
-               BUG();
-
-       /* Optimization: no fragments, no reasons to preestimate
-        * size of pulled pages. Superb.
-        */
-       if (!skb_shinfo(skb)->frag_list)
-               goto pull_pages;
-
-       /* Estimate size of pulled pages. */
-       eat = delta;
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               if (skb_shinfo(skb)->frags[i].size >= eat)
-                       goto pull_pages;
-               eat -= skb_shinfo(skb)->frags[i].size;
-       }
-
-       /* If we need update frag list, we are in troubles.
-        * Certainly, it possible to add an offset to skb data,
-        * but taking into account that pulling is expected to
-        * be very rare operation, it is worth to fight against
-        * further bloating skb head and crucify ourselves here instead.
-        * Pure masohism, indeed. 8)8)
-        */
-       if (eat) {
-               struct sk_buff *list = skb_shinfo(skb)->frag_list;
-               struct sk_buff *clone = NULL;
-               struct sk_buff *insp = NULL;
-
-               do {
-                       BUG_ON(!list);
-
-                       if (list->len <= eat) {
-                               /* Eaten as whole. */
-                               eat -= list->len;
-                               list = list->next;
-                               insp = list;
-                       } else {
-                               /* Eaten partially. */
-
-                               if (skb_shared(list)) {
-                                       /* Sucks! We need to fork list. :-( */
-                                       clone = skb_clone(list, GFP_ATOMIC);
-                                       if (!clone)
-                                               return NULL;
-                                       insp = list->next;
-                                       list = clone;
-                               } else {
-                                       /* This may be pulled without
-                                        * problems. */
-                                       insp = list;
-                               }
-                               if (!pskb_pull(list, eat)) {
-                                       if (clone)
-                                               kfree_skb(clone);
-                                       return NULL;
-                               }
-                               break;
-                       }
-               } while (eat);
-
-               /* Free pulled out fragments. */
-               while ((list = skb_shinfo(skb)->frag_list) != insp) {
-                       skb_shinfo(skb)->frag_list = list->next;
-                       kfree_skb(list);
-               }
-               /* And insert new clone at head. */
-               if (clone) {
-                       clone->next = list;
-                       skb_shinfo(skb)->frag_list = clone;
-               }
-       }
-       /* Success! Now we may commit changes to skb data. */
-
-pull_pages:
-       eat = delta;
-       k = 0;
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               if (skb_shinfo(skb)->frags[i].size <= eat) {
-                       put_page(skb_shinfo(skb)->frags[i].page);
-                       eat -= skb_shinfo(skb)->frags[i].size;
-               } else {
-                       skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
-                       if (eat) {
-                               skb_shinfo(skb)->frags[k].page_offset += eat;
-                               skb_shinfo(skb)->frags[k].size -= eat;
-                               eat = 0;
-                       }
-                       k++;
-               }
-       }
-       skb_shinfo(skb)->nr_frags = k;
-
-       skb->tail     += delta;
-       skb->data_len -= delta;
-
-       return skb->tail;
-}
-
-/* Copy some data bits from skb to kernel buffer. */
-
-int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
-{
-       int i, copy;
-       int start = skb_headlen(skb);
-
-       if (offset > (int)skb->len - len)
-               goto fault;
-
-       /* Copy header. */
-       if ((copy = start - offset) > 0) {
-               if (copy > len)
-                       copy = len;
-               memcpy(to, skb->data + offset, copy);
-               if ((len -= copy) == 0)
-                       return 0;
-               offset += copy;
-               to     += copy;
-       }
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               int end;
-
-               BUG_TRAP(start <= offset + len);
-
-               end = start + skb_shinfo(skb)->frags[i].size;
-               if ((copy = end - offset) > 0) {
-                       u8 *vaddr;
-
-                       if (copy > len)
-                               copy = len;
-
-                       vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
-                       memcpy(to,
-                              vaddr + skb_shinfo(skb)->frags[i].page_offset+
-                              offset - start, copy);
-                       kunmap_skb_frag(vaddr);
-
-                       if ((len -= copy) == 0)
-                               return 0;
-                       offset += copy;
-                       to     += copy;
-               }
-               start = end;
-       }
-
-       if (skb_shinfo(skb)->frag_list) {
-               struct sk_buff *list = skb_shinfo(skb)->frag_list;
-
-               for (; list; list = list->next) {
-                       int end;
-
-                       BUG_TRAP(start <= offset + len);
-
-                       end = start + list->len;
-                       if ((copy = end - offset) > 0) {
-                               if (copy > len)
-                                       copy = len;
-                               if (skb_copy_bits(list, offset - start,
-                                                 to, copy))
-                                       goto fault;
-                               if ((len -= copy) == 0)
-                                       return 0;
-                               offset += copy;
-                               to     += copy;
-                       }
-                       start = end;
-               }
-       }
-       if (!len)
-               return 0;
-
-fault:
-       return -EFAULT;
-}
-
-/**
- *     skb_store_bits - store bits from kernel buffer to skb
- *     @skb: destination buffer
- *     @offset: offset in destination
- *     @from: source buffer
- *     @len: number of bytes to copy
- *
- *     Copy the specified number of bytes from the source buffer to the
- *     destination skb.  This function handles all the messy bits of
- *     traversing fragment lists and such.
- */
-
-int skb_store_bits(const struct sk_buff *skb, int offset, void *from, int len)
-{
-       int i, copy;
-       int start = skb_headlen(skb);
-
-       if (offset > (int)skb->len - len)
-               goto fault;
-
-       if ((copy = start - offset) > 0) {
-               if (copy > len)
-                       copy = len;
-               memcpy(skb->data + offset, from, copy);
-               if ((len -= copy) == 0)
-                       return 0;
-               offset += copy;
-               from += copy;
-       }
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-               int end;
-
-               BUG_TRAP(start <= offset + len);
-
-               end = start + frag->size;
-               if ((copy = end - offset) > 0) {
-                       u8 *vaddr;
-
-                       if (copy > len)
-                               copy = len;
-
-                       vaddr = kmap_skb_frag(frag);
-                       memcpy(vaddr + frag->page_offset + offset - start,
-                              from, copy);
-                       kunmap_skb_frag(vaddr);
-
-                       if ((len -= copy) == 0)
-                               return 0;
-                       offset += copy;
-                       from += copy;
-               }
-               start = end;
-       }
-
-       if (skb_shinfo(skb)->frag_list) {
-               struct sk_buff *list = skb_shinfo(skb)->frag_list;
-
-               for (; list; list = list->next) {
-                       int end;
-
-                       BUG_TRAP(start <= offset + len);
-
-                       end = start + list->len;
-                       if ((copy = end - offset) > 0) {
-                               if (copy > len)
-                                       copy = len;
-                               if (skb_store_bits(list, offset - start,
-                                                  from, copy))
-                                       goto fault;
-                               if ((len -= copy) == 0)
-                                       return 0;
-                               offset += copy;
-                               from += copy;
-                       }
-                       start = end;
-               }
-       }
-       if (!len)
-               return 0;
-
-fault:
-       return -EFAULT;
-}
-
-EXPORT_SYMBOL(skb_store_bits);
-
-/* Checksum skb data. */
-
-unsigned int skb_checksum(const struct sk_buff *skb, int offset,
-                         int len, unsigned int csum)
-{
-       int start = skb_headlen(skb);
-       int i, copy = start - offset;
-       int pos = 0;
-
-       /* Checksum header. */
-       if (copy > 0) {
-               if (copy > len)
-                       copy = len;
-               csum = csum_partial(skb->data + offset, copy, csum);
-               if ((len -= copy) == 0)
-                       return csum;
-               offset += copy;
-               pos     = copy;
-       }
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               int end;
-
-               BUG_TRAP(start <= offset + len);
-
-               end = start + skb_shinfo(skb)->frags[i].size;
-               if ((copy = end - offset) > 0) {
-                       unsigned int csum2;
-                       u8 *vaddr;
-                       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
-                       if (copy > len)
-                               copy = len;
-                       vaddr = kmap_skb_frag(frag);
-                       csum2 = csum_partial(vaddr + frag->page_offset +
-                                            offset - start, copy, 0);
-                       kunmap_skb_frag(vaddr);
-                       csum = csum_block_add(csum, csum2, pos);
-                       if (!(len -= copy))
-                               return csum;
-                       offset += copy;
-                       pos    += copy;
-               }
-               start = end;
-       }
-
-       if (skb_shinfo(skb)->frag_list) {
-               struct sk_buff *list = skb_shinfo(skb)->frag_list;
-
-               for (; list; list = list->next) {
-                       int end;
-
-                       BUG_TRAP(start <= offset + len);
-
-                       end = start + list->len;
-                       if ((copy = end - offset) > 0) {
-                               unsigned int csum2;
-                               if (copy > len)
-                                       copy = len;
-                               csum2 = skb_checksum(list, offset - start,
-                                                    copy, 0);
-                               csum = csum_block_add(csum, csum2, pos);
-                               if ((len -= copy) == 0)
-                                       return csum;
-                               offset += copy;
-                               pos    += copy;
-                       }
-                       start = end;
-               }
-       }
-       BUG_ON(len);
-
-       return csum;
-}
-
-/* Both of above in one bottle. */
-
-unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
-                                   u8 *to, int len, unsigned int csum)
-{
-       int start = skb_headlen(skb);
-       int i, copy = start - offset;
-       int pos = 0;
-
-       /* Copy header. */
-       if (copy > 0) {
-               if (copy > len)
-                       copy = len;
-               csum = csum_partial_copy_nocheck(skb->data + offset, to,
-                                                copy, csum);
-               if ((len -= copy) == 0)
-                       return csum;
-               offset += copy;
-               to     += copy;
-               pos     = copy;
-       }
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               int end;
-
-               BUG_TRAP(start <= offset + len);
-
-               end = start + skb_shinfo(skb)->frags[i].size;
-               if ((copy = end - offset) > 0) {
-                       unsigned int csum2;
-                       u8 *vaddr;
-                       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
-                       if (copy > len)
-                               copy = len;
-                       vaddr = kmap_skb_frag(frag);
-                       csum2 = csum_partial_copy_nocheck(vaddr +
-                                                         frag->page_offset +
-                                                         offset - start, to,
-                                                         copy, 0);
-                       kunmap_skb_frag(vaddr);
-                       csum = csum_block_add(csum, csum2, pos);
-                       if (!(len -= copy))
-                               return csum;
-                       offset += copy;
-                       to     += copy;
-                       pos    += copy;
-               }
-               start = end;
-       }
-
-       if (skb_shinfo(skb)->frag_list) {
-               struct sk_buff *list = skb_shinfo(skb)->frag_list;
-
-               for (; list; list = list->next) {
-                       unsigned int csum2;
-                       int end;
-
-                       BUG_TRAP(start <= offset + len);
-
-                       end = start + list->len;
-                       if ((copy = end - offset) > 0) {
-                               if (copy > len)
-                                       copy = len;
-                               csum2 = skb_copy_and_csum_bits(list,
-                                                              offset - start,
-                                                              to, copy, 0);
-                               csum = csum_block_add(csum, csum2, pos);
-                               if ((len -= copy) == 0)
-                                       return csum;
-                               offset += copy;
-                               to     += copy;
-                               pos    += copy;
-                       }
-                       start = end;
-               }
-       }
-       BUG_ON(len);
-       return csum;
-}
-
-void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
-{
-       unsigned int csum;
-       long csstart;
-
-       if (skb->ip_summed == CHECKSUM_HW)
-               csstart = skb->h.raw - skb->data;
-       else
-               csstart = skb_headlen(skb);
-
-       BUG_ON(csstart > skb_headlen(skb));
-
-       memcpy(to, skb->data, csstart);
-
-       csum = 0;
-       if (csstart != skb->len)
-               csum = skb_copy_and_csum_bits(skb, csstart, to + csstart,
-                                             skb->len - csstart, 0);
-
-       if (skb->ip_summed == CHECKSUM_HW) {
-               long csstuff = csstart + skb->csum;
-
-               *((unsigned short *)(to + csstuff)) = csum_fold(csum);
-       }
-}
-
-/**
- *     skb_dequeue - remove from the head of the queue
- *     @list: list to dequeue from
- *
- *     Remove the head of the list. The list lock is taken so the function
- *     may be used safely with other locking list functions. The head item is
- *     returned or %NULL if the list is empty.
- */
-
-struct sk_buff *skb_dequeue(struct sk_buff_head *list)
-{
-       unsigned long flags;
-       struct sk_buff *result;
-
-       spin_lock_irqsave(&list->lock, flags);
-       result = __skb_dequeue(list);
-       spin_unlock_irqrestore(&list->lock, flags);
-       return result;
-}
-
-/**
- *     skb_dequeue_tail - remove from the tail of the queue
- *     @list: list to dequeue from
- *
- *     Remove the tail of the list. The list lock is taken so the function
- *     may be used safely with other locking list functions. The tail item is
- *     returned or %NULL if the list is empty.
- */
-struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list)
-{
-       unsigned long flags;
-       struct sk_buff *result;
-
-       spin_lock_irqsave(&list->lock, flags);
-       result = __skb_dequeue_tail(list);
-       spin_unlock_irqrestore(&list->lock, flags);
-       return result;
-}
-
-/**
- *     skb_queue_purge - empty a list
- *     @list: list to empty
- *
- *     Delete all buffers on an &sk_buff list. Each buffer is removed from
- *     the list and one reference dropped. This function takes the list
- *     lock and is atomic with respect to other list locking functions.
- */
-void skb_queue_purge(struct sk_buff_head *list)
-{
-       struct sk_buff *skb;
-       while ((skb = skb_dequeue(list)) != NULL)
-               kfree_skb(skb);
-}
-
-/**
- *     skb_queue_head - queue a buffer at the list head
- *     @list: list to use
- *     @newsk: buffer to queue
- *
- *     Queue a buffer at the start of the list. This function takes the
- *     list lock and can be used safely with other locking &sk_buff functions
- *     safely.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&list->lock, flags);
-       __skb_queue_head(list, newsk);
-       spin_unlock_irqrestore(&list->lock, flags);
-}
-
-/**
- *     skb_queue_tail - queue a buffer at the list tail
- *     @list: list to use
- *     @newsk: buffer to queue
- *
- *     Queue a buffer at the tail of the list. This function takes the
- *     list lock and can be used safely with other locking &sk_buff functions
- *     safely.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&list->lock, flags);
-       __skb_queue_tail(list, newsk);
-       spin_unlock_irqrestore(&list->lock, flags);
-}
-
-/**
- *     skb_unlink      -       remove a buffer from a list
- *     @skb: buffer to remove
- *     @list: list to use
- *
- *     Remove a packet from a list. The list locks are taken and this
- *     function is atomic with respect to other list locked calls
- *
- *     You must know what list the SKB is on.
- */
-void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&list->lock, flags);
-       __skb_unlink(skb, list);
-       spin_unlock_irqrestore(&list->lock, flags);
-}
-
-/**
- *     skb_append      -       append a buffer
- *     @old: buffer to insert after
- *     @newsk: buffer to insert
- *     @list: list to use
- *
- *     Place a packet after a given packet in a list. The list locks are taken
- *     and this function is atomic with respect to other list locked calls.
- *     A buffer cannot be placed on two lists at the same time.
- */
-void skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&list->lock, flags);
-       __skb_append(old, newsk, list);
-       spin_unlock_irqrestore(&list->lock, flags);
-}
-
-
-/**
- *     skb_insert      -       insert a buffer
- *     @old: buffer to insert before
- *     @newsk: buffer to insert
- *     @list: list to use
- *
- *     Place a packet before a given packet in a list. The list locks are
- *     taken and this function is atomic with respect to other list locked
- *     calls.
- *
- *     A buffer cannot be placed on two lists at the same time.
- */
-void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&list->lock, flags);
-       __skb_insert(newsk, old->prev, old, list);
-       spin_unlock_irqrestore(&list->lock, flags);
-}
-
-#if 0
-/*
- *     Tune the memory allocator for a new MTU size.
- */
-void skb_add_mtu(int mtu)
-{
-       /* Must match allocation in alloc_skb */
-       mtu = SKB_DATA_ALIGN(mtu) + sizeof(struct skb_shared_info);
-
-       kmem_add_cache_size(mtu);
-}
-#endif
-
-static inline void skb_split_inside_header(struct sk_buff *skb,
-                                          struct sk_buff* skb1,
-                                          const u32 len, const int pos)
-{
-       int i;
-
-       memcpy(skb_put(skb1, pos - len), skb->data + len, pos - len);
-
-       /* And move data appendix as is. */
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-               skb_shinfo(skb1)->frags[i] = skb_shinfo(skb)->frags[i];
-
-       skb_shinfo(skb1)->nr_frags = skb_shinfo(skb)->nr_frags;
-       skb_shinfo(skb)->nr_frags  = 0;
-       skb1->data_len             = skb->data_len;
-       skb1->len                  += skb1->data_len;
-       skb->data_len              = 0;
-       skb->len                   = len;
-       skb->tail                  = skb->data + len;
-}
-
-static inline void skb_split_no_header(struct sk_buff *skb,
-                                      struct sk_buff* skb1,
-                                      const u32 len, int pos)
-{
-       int i, k = 0;
-       const int nfrags = skb_shinfo(skb)->nr_frags;
-
-       skb_shinfo(skb)->nr_frags = 0;
-       skb1->len                 = skb1->data_len = skb->len - len;
-       skb->len                  = len;
-       skb->data_len             = len - pos;
-
-       for (i = 0; i < nfrags; i++) {
-               int size = skb_shinfo(skb)->frags[i].size;
-
-               if (pos + size > len) {
-                       skb_shinfo(skb1)->frags[k] = skb_shinfo(skb)->frags[i];
-
-                       if (pos < len) {
-                               /* Split frag.
-                                * We have two variants in this case:
-                                * 1. Move all the frag to the second
-                                *    part, if it is possible. F.e.
-                                *    this approach is mandatory for TUX,
-                                *    where splitting is expensive.
-                                * 2. Split is accurately. We make this.
-                                */
-                               get_page(skb_shinfo(skb)->frags[i].page);
-                               skb_shinfo(skb1)->frags[0].page_offset += len - pos;
-                               skb_shinfo(skb1)->frags[0].size -= len - pos;
-                               skb_shinfo(skb)->frags[i].size  = len - pos;
-                               skb_shinfo(skb)->nr_frags++;
-                       }
-                       k++;
-               } else
-                       skb_shinfo(skb)->nr_frags++;
-               pos += size;
-       }
-       skb_shinfo(skb1)->nr_frags = k;
-}
-
-/**
- * skb_split - Split fragmented skb to two parts at length len.
- * @skb: the buffer to split
- * @skb1: the buffer to receive the second part
- * @len: new length for skb
- */
-void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len)
-{
-       int pos = skb_headlen(skb);
-
-       if (len < pos)  /* Split line is inside header. */
-               skb_split_inside_header(skb, skb1, len, pos);
-       else            /* Second chunk has no header, nothing to copy. */
-               skb_split_no_header(skb, skb1, len, pos);
-}
-
-/**
- * skb_prepare_seq_read - Prepare a sequential read of skb data
- * @skb: the buffer to read
- * @from: lower offset of data to be read
- * @to: upper offset of data to be read
- * @st: state variable
- *
- * Initializes the specified state variable. Must be called before
- * invoking skb_seq_read() for the first time.
- */
-void skb_prepare_seq_read(struct sk_buff *skb, unsigned int from,
-                         unsigned int to, struct skb_seq_state *st)
-{
-       st->lower_offset = from;
-       st->upper_offset = to;
-       st->root_skb = st->cur_skb = skb;
-       st->frag_idx = st->stepped_offset = 0;
-       st->frag_data = NULL;
-}
-
-/**
- * skb_seq_read - Sequentially read skb data
- * @consumed: number of bytes consumed by the caller so far
- * @data: destination pointer for data to be returned
- * @st: state variable
- *
- * Reads a block of skb data at &consumed relative to the
- * lower offset specified to skb_prepare_seq_read(). Assigns
- * the head of the data block to &data and returns the length
- * of the block or 0 if the end of the skb data or the upper
- * offset has been reached.
- *
- * The caller is not required to consume all of the data
- * returned, i.e. &consumed is typically set to the number
- * of bytes already consumed and the next call to
- * skb_seq_read() will return the remaining part of the block.
- *
- * Note: The size of each block of data returned can be arbitary,
- *       this limitation is the cost for zerocopy seqeuental
- *       reads of potentially non linear data.
- *
- * Note: Fragment lists within fragments are not implemented
- *       at the moment, state->root_skb could be replaced with
- *       a stack for this purpose.
- */
-unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
-                         struct skb_seq_state *st)
-{
-       unsigned int block_limit, abs_offset = consumed + st->lower_offset;
-       skb_frag_t *frag;
-
-       if (unlikely(abs_offset >= st->upper_offset))
-               return 0;
-
-next_skb:
-       block_limit = skb_headlen(st->cur_skb);
-
-       if (abs_offset < block_limit) {
-               *data = st->cur_skb->data + abs_offset;
-               return block_limit - abs_offset;
-       }
-
-       if (st->frag_idx == 0 && !st->frag_data)
-               st->stepped_offset += skb_headlen(st->cur_skb);
-
-       while (st->frag_idx < skb_shinfo(st->cur_skb)->nr_frags) {
-               frag = &skb_shinfo(st->cur_skb)->frags[st->frag_idx];
-               block_limit = frag->size + st->stepped_offset;
-
-               if (abs_offset < block_limit) {
-                       if (!st->frag_data)
-                               st->frag_data = kmap_skb_frag(frag);
-
-                       *data = (u8 *) st->frag_data + frag->page_offset +
-                               (abs_offset - st->stepped_offset);
-
-                       return block_limit - abs_offset;
-               }
-
-               if (st->frag_data) {
-                       kunmap_skb_frag(st->frag_data);
-                       st->frag_data = NULL;
-               }
-
-               st->frag_idx++;
-               st->stepped_offset += frag->size;
-       }
-
-       if (st->cur_skb->next) {
-               st->cur_skb = st->cur_skb->next;
-               st->frag_idx = 0;
-               goto next_skb;
-       } else if (st->root_skb == st->cur_skb &&
-                  skb_shinfo(st->root_skb)->frag_list) {
-               st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
-               goto next_skb;
-       }
-
-       return 0;
-}
-
-/**
- * skb_abort_seq_read - Abort a sequential read of skb data
- * @st: state variable
- *
- * Must be called if skb_seq_read() was not called until it
- * returned 0.
- */
-void skb_abort_seq_read(struct skb_seq_state *st)
-{
-       if (st->frag_data)
-               kunmap_skb_frag(st->frag_data);
-}
-
-#define TS_SKB_CB(state)       ((struct skb_seq_state *) &((state)->cb))
-
-static unsigned int skb_ts_get_next_block(unsigned int offset, const u8 **text,
-                                         struct ts_config *conf,
-                                         struct ts_state *state)
-{
-       return skb_seq_read(offset, text, TS_SKB_CB(state));
-}
-
-static void skb_ts_finish(struct ts_config *conf, struct ts_state *state)
-{
-       skb_abort_seq_read(TS_SKB_CB(state));
-}
-
-/**
- * skb_find_text - Find a text pattern in skb data
- * @skb: the buffer to look in
- * @from: search offset
- * @to: search limit
- * @config: textsearch configuration
- * @state: uninitialized textsearch state variable
- *
- * Finds a pattern in the skb data according to the specified
- * textsearch configuration. Use textsearch_next() to retrieve
- * subsequent occurrences of the pattern. Returns the offset
- * to the first occurrence or UINT_MAX if no match was found.
- */
-unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
-                          unsigned int to, struct ts_config *config,
-                          struct ts_state *state)
-{
-       unsigned int ret;
-
-       config->get_next_block = skb_ts_get_next_block;
-       config->finish = skb_ts_finish;
-
-       skb_prepare_seq_read(skb, from, to, TS_SKB_CB(state));
-
-       ret = textsearch_find(config, state);
-       return (ret <= to - from ? ret : UINT_MAX);
-}
-
-/**
- * skb_append_datato_frags: - append the user data to a skb
- * @sk: sock  structure
- * @skb: skb structure to be appened with user data.
- * @getfrag: call back function to be used for getting the user data
- * @from: pointer to user message iov
- * @length: length of the iov message
- *
- * Description: This procedure append the user data in the fragment part
- * of the skb if any page alloc fails user this procedure returns  -ENOMEM
- */
-int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
-                       int (*getfrag)(void *from, char *to, int offset,
-                                       int len, int odd, struct sk_buff *skb),
-                       void *from, int length)
-{
-       int frg_cnt = 0;
-       skb_frag_t *frag = NULL;
-       struct page *page = NULL;
-       int copy, left;
-       int offset = 0;
-       int ret;
-
-       do {
-               /* Return error if we don't have space for new frag */
-               frg_cnt = skb_shinfo(skb)->nr_frags;
-               if (frg_cnt >= MAX_SKB_FRAGS)
-                       return -EFAULT;
-
-               /* allocate a new page for next frag */
-               page = alloc_pages(sk->sk_allocation, 0);
-
-               /* If alloc_page fails just return failure and caller will
-                * free previous allocated pages by doing kfree_skb()
-                */
-               if (page == NULL)
-                       return -ENOMEM;
-
-               /* initialize the next frag */
-               sk->sk_sndmsg_page = page;
-               sk->sk_sndmsg_off = 0;
-               skb_fill_page_desc(skb, frg_cnt, page, 0, 0);
-               skb->truesize += PAGE_SIZE;
-               atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
-
-               /* get the new initialized frag */
-               frg_cnt = skb_shinfo(skb)->nr_frags;
-               frag = &skb_shinfo(skb)->frags[frg_cnt - 1];
-
-               /* copy the user data to page */
-               left = PAGE_SIZE - frag->page_offset;
-               copy = (length > left)? left : length;
-
-               ret = getfrag(from, (page_address(frag->page) +
-                           frag->page_offset + frag->size),
-                           offset, copy, 0, skb);
-               if (ret < 0)
-                       return -EFAULT;
-
-               /* copy was successful so update the size parameters */
-               sk->sk_sndmsg_off += copy;
-               frag->size += copy;
-               skb->len += copy;
-               skb->data_len += copy;
-               offset += copy;
-               length -= copy;
-
-       } while (length > 0);
-
-       return 0;
-}
-
-/**
- *     skb_pull_rcsum - pull skb and update receive checksum
- *     @skb: buffer to update
- *     @start: start of data before pull
- *     @len: length of data pulled
- *
- *     This function performs an skb_pull on the packet and updates
- *     update the CHECKSUM_HW checksum.  It should be used on receive
- *     path processing instead of skb_pull unless you know that the
- *     checksum difference is zero (e.g., a valid IP header) or you
- *     are setting ip_summed to CHECKSUM_NONE.
- */
-unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len)
-{
-       BUG_ON(len > skb->len);
-       skb->len -= len;
-       BUG_ON(skb->len < skb->data_len);
-       skb_postpull_rcsum(skb, skb->data, len);
-       return skb->data += len;
-}
-
-EXPORT_SYMBOL_GPL(skb_pull_rcsum);
-
-/**
- *     skb_segment - Perform protocol segmentation on skb.
- *     @skb: buffer to segment
- *     @features: features for the output path (see dev->features)
- *
- *     This function performs segmentation on the given skb.  It returns
- *     the segment at the given position.  It returns NULL if there are
- *     no more segments to generate, or when an error is encountered.
- */
-struct sk_buff *skb_segment(struct sk_buff *skb, int features)
-{
-       struct sk_buff *segs = NULL;
-       struct sk_buff *tail = NULL;
-       unsigned int mss = skb_shinfo(skb)->gso_size;
-       unsigned int doffset = skb->data - skb->mac.raw;
-       unsigned int offset = doffset;
-       unsigned int headroom;
-       unsigned int len;
-       int sg = features & NETIF_F_SG;
-       int nfrags = skb_shinfo(skb)->nr_frags;
-       int err = -ENOMEM;
-       int i = 0;
-       int pos;
-
-       __skb_push(skb, doffset);
-       headroom = skb_headroom(skb);
-       pos = skb_headlen(skb);
-
-       do {
-               struct sk_buff *nskb;
-               skb_frag_t *frag;
-               int hsize;
-               int k;
-               int size;
-
-               len = skb->len - offset;
-               if (len > mss)
-                       len = mss;
-
-               hsize = skb_headlen(skb) - offset;
-               if (hsize < 0)
-                       hsize = 0;
-               if (hsize > len || !sg)
-                       hsize = len;
-
-               nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC);
-               if (unlikely(!nskb))
-                       goto err;
-
-               if (segs)
-                       tail->next = nskb;
-               else
-                       segs = nskb;
-               tail = nskb;
-
-               nskb->dev = skb->dev;
-               nskb->priority = skb->priority;
-               nskb->protocol = skb->protocol;
-               nskb->dst = dst_clone(skb->dst);
-               memcpy(nskb->cb, skb->cb, sizeof(skb->cb));
-               nskb->pkt_type = skb->pkt_type;
-               nskb->mac_len = skb->mac_len;
-
-               skb_reserve(nskb, headroom);
-               nskb->mac.raw = nskb->data;
-               nskb->nh.raw = nskb->data + skb->mac_len;
-               nskb->h.raw = nskb->nh.raw + (skb->h.raw - skb->nh.raw);
-               memcpy(skb_put(nskb, doffset), skb->data, doffset);
-
-               if (!sg) {
-                       nskb->csum = skb_copy_and_csum_bits(skb, offset,
-                                                           skb_put(nskb, len),
-                                                           len, 0);
-                       continue;
-               }
-
-               frag = skb_shinfo(nskb)->frags;
-               k = 0;
-
-               nskb->ip_summed = CHECKSUM_HW;
-               nskb->csum = skb->csum;
-               memcpy(skb_put(nskb, hsize), skb->data + offset, hsize);
-
-               while (pos < offset + len) {
-                       BUG_ON(i >= nfrags);
-
-                       *frag = skb_shinfo(skb)->frags[i];
-                       get_page(frag->page);
-                       size = frag->size;
-
-                       if (pos < offset) {
-                               frag->page_offset += offset - pos;
-                               frag->size -= offset - pos;
-                       }
-
-                       k++;
-
-                       if (pos + size <= offset + len) {
-                               i++;
-                               pos += size;
-                       } else {
-                               frag->size -= pos + size - (offset + len);
-                               break;
-                       }
-
-                       frag++;
-               }
-
-               skb_shinfo(nskb)->nr_frags = k;
-               nskb->data_len = len - hsize;
-               nskb->len += nskb->data_len;
-               nskb->truesize += nskb->data_len;
-       } while ((offset += len) < skb->len);
-
-       return segs;
-
-err:
-       while ((skb = segs)) {
-               segs = skb->next;
-               kfree(skb);
-       }
-       return ERR_PTR(err);
-}
-
-EXPORT_SYMBOL_GPL(skb_segment);
-
-void __init skb_init(void)
-{
-       skbuff_head_cache = kmem_cache_create("skbuff_head_cache",
-                                             sizeof(struct sk_buff),
-                                             0,
-                                             SLAB_HWCACHE_ALIGN,
-                                             NULL, NULL);
-       if (!skbuff_head_cache)
-               panic("cannot create skbuff cache");
-
-       skbuff_fclone_cache = kmem_cache_create("skbuff_fclone_cache",
-                                               (2*sizeof(struct sk_buff)) +
-                                               sizeof(atomic_t),
-                                               0,
-                                               SLAB_HWCACHE_ALIGN,
-                                               NULL, NULL);
-       if (!skbuff_fclone_cache)
-               panic("cannot create skbuff cache");
-}
-
-EXPORT_SYMBOL(___pskb_trim);
-EXPORT_SYMBOL(__kfree_skb);
-EXPORT_SYMBOL(kfree_skb);
-EXPORT_SYMBOL(__pskb_pull_tail);
-EXPORT_SYMBOL(__alloc_skb);
-EXPORT_SYMBOL(__netdev_alloc_skb);
-EXPORT_SYMBOL(pskb_copy);
-EXPORT_SYMBOL(pskb_expand_head);
-EXPORT_SYMBOL(skb_checksum);
-EXPORT_SYMBOL(skb_clone);
-EXPORT_SYMBOL(skb_clone_fraglist);
-EXPORT_SYMBOL(skb_copy);
-EXPORT_SYMBOL(skb_copy_and_csum_bits);
-EXPORT_SYMBOL(skb_copy_and_csum_dev);
-EXPORT_SYMBOL(skb_copy_bits);
-EXPORT_SYMBOL(skb_copy_expand);
-EXPORT_SYMBOL(skb_over_panic);
-EXPORT_SYMBOL(skb_pad);
-EXPORT_SYMBOL(skb_realloc_headroom);
-EXPORT_SYMBOL(skb_under_panic);
-EXPORT_SYMBOL(skb_dequeue);
-EXPORT_SYMBOL(skb_dequeue_tail);
-EXPORT_SYMBOL(skb_insert);
-EXPORT_SYMBOL(skb_queue_purge);
-EXPORT_SYMBOL(skb_queue_head);
-EXPORT_SYMBOL(skb_queue_tail);
-EXPORT_SYMBOL(skb_unlink);
-EXPORT_SYMBOL(skb_append);
-EXPORT_SYMBOL(skb_split);
-EXPORT_SYMBOL(skb_prepare_seq_read);
-EXPORT_SYMBOL(skb_seq_read);
-EXPORT_SYMBOL(skb_abort_seq_read);
-EXPORT_SYMBOL(skb_find_text);
-EXPORT_SYMBOL(skb_append_datato_frags);
diff --git a/linux-2.6-xen-sparse/scripts/Makefile.xen b/linux-2.6-xen-sparse/scripts/Makefile.xen
deleted file mode 100644 (file)
index 831f68b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# cherrypickxen($1 = allobj)
-cherrypickxen = $(foreach var, $(1), \
-               $(shell o=$(var); \
-                       c=$${o%.o}-xen.c; \
-                       s=$${o%.o}-xen.S; \
-                       oxen=$${o%.o}-xen.o; \
-                       [ -f $(srctree)/$(src)/$${c} ] || \
-                          [ -f $(srctree)/$(src)/$${s} ] \
-                               && echo $$oxen \
-                               || echo $(var) ) \
-         )
-# filterxen($1 = allobj, $2 = noobjs)
-filterxen = $(filter-out $(2), $(1))
diff --git a/patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps-fix.patch b/patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps-fix.patch
deleted file mode 100644 (file)
index 2d60059..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Andrew Morton <akpm@linux-foundation.org>
-
-In file included from arch/i386/kernel/setup.c:46:
-include/linux/crash_dump.h:19:36: warning: extra tokens at end of #ifndef directive
-
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Cc: Andi Kleen <ak@suse.de>
-Cc: Horms <horms@verge.net.au>
-Cc: Ian Campbell <ian.campbell@xensource.com>
-Cc: Magnus Damm <magnus.damm@gmail.com>
-Cc: Vivek Goyal <vgoyal@in.ibm.com>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
----
-
- include/linux/crash_dump.h |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff -puN include/linux/crash_dump.h~allow-i386-crash-kernels-to-handle-x86_64-dumps-fix include/linux/crash_dump.h
---- a/include/linux/crash_dump.h~allow-i386-crash-kernels-to-handle-x86_64-dumps-fix
-+++ a/include/linux/crash_dump.h
-@@ -16,7 +16,7 @@ extern struct proc_dir_entry *proc_vmcor
- /* Architecture code defines this if there are other possible ELF
-  * machine types, e.g. on bi-arch capable hardware. */
--#ifndef vmcore_elf_check_arch_cross(x)
-+#ifndef vmcore_elf_check_arch_cross
- #define vmcore_elf_check_arch_cross(x) 0
- #endif
-_
diff --git a/patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps.patch b/patches/linux-2.6.18/allow-i386-crash-kernels-to-handle-x86_64-dumps.patch
deleted file mode 100644 (file)
index ad9eb93..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Ian Campbell <ian.campbell@xensource.com>
-
-The specific case I am encountering is kdump under Xen with a 64 bit
-hypervisor and 32 bit kernel/userspace.  The dump created is 64 bit due to
-the hypervisor but the dump kernel is 32 bit for maximum compatibility.
-
-It's possibly less likely to be useful in a purely native scenario but I
-see no reason to disallow it.
-
-Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
-Acked-by: Vivek Goyal <vgoyal@in.ibm.com>
-Cc: Horms <horms@verge.net.au>
-Cc: Magnus Damm <magnus.damm@gmail.com>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Cc: Andi Kleen <ak@suse.de>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
----
-
- fs/proc/vmcore.c           |    2 +-
- include/asm-i386/kexec.h   |    3 +++
- include/linux/crash_dump.h |    8 ++++++++
- 3 files changed, 12 insertions(+), 1 deletion(-)
-
-diff -puN fs/proc/vmcore.c~allow-i386-crash-kernels-to-handle-x86_64-dumps fs/proc/vmcore.c
---- a/fs/proc/vmcore.c~allow-i386-crash-kernels-to-handle-x86_64-dumps
-+++ a/fs/proc/vmcore.c
-@@ -514,7 +514,7 @@ static int __init parse_crash_elf64_head
-       /* Do some basic Verification. */
-       if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0 ||
-               (ehdr.e_type != ET_CORE) ||
--              !elf_check_arch(&ehdr) ||
-+              !vmcore_elf_check_arch(&ehdr) ||
-               ehdr.e_ident[EI_CLASS] != ELFCLASS64 ||
-               ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
-               ehdr.e_version != EV_CURRENT ||
-diff -puN include/asm-i386/kexec.h~allow-i386-crash-kernels-to-handle-x86_64-dumps include/asm-i386/kexec.h
---- a/include/asm-i386/kexec.h~allow-i386-crash-kernels-to-handle-x86_64-dumps
-+++ a/include/asm-i386/kexec.h
-@@ -47,6 +47,9 @@
- /* The native architecture */
- #define KEXEC_ARCH KEXEC_ARCH_386
-+/* We can also handle crash dumps from 64 bit kernel. */
-+#define vmcore_elf_check_arch_cross(x) ((x)->e_machine == EM_X86_64)
-+
- #define MAX_NOTE_BYTES 1024
- /* CPU does not save ss and esp on stack if execution is already
-diff -puN include/linux/crash_dump.h~allow-i386-crash-kernels-to-handle-x86_64-dumps include/linux/crash_dump.h
---- a/include/linux/crash_dump.h~allow-i386-crash-kernels-to-handle-x86_64-dumps
-+++ a/include/linux/crash_dump.h
-@@ -14,5 +14,13 @@ extern ssize_t copy_oldmem_page(unsigned
- extern const struct file_operations proc_vmcore_operations;
- extern struct proc_dir_entry *proc_vmcore;
-+/* Architecture code defines this if there are other possible ELF
-+ * machine types, e.g. on bi-arch capable hardware. */
-+#ifndef vmcore_elf_check_arch_cross(x)
-+#define vmcore_elf_check_arch_cross(x) 0
-+#endif
-+
-+#define vmcore_elf_check_arch(x) (elf_check_arch(x) || vmcore_elf_check_arch_cross(x))
-+
- #endif /* CONFIG_CRASH_DUMP */
- #endif /* LINUX_CRASHDUMP_H */
-_
diff --git a/patches/linux-2.6.18/blktap-aio-16_03_06.patch b/patches/linux-2.6.18/blktap-aio-16_03_06.patch
deleted file mode 100644 (file)
index bb2aba6..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/fs/aio.c ./fs/aio.c
---- ../orig-linux-2.6.18/fs/aio.c      2006-09-20 04:42:06.000000000 +0100
-+++ ./fs/aio.c 2007-01-12 16:04:15.000000000 +0000
-@@ -34,6 +34,11 @@
- #include <asm/uaccess.h>
- #include <asm/mmu_context.h>
-+#ifdef CONFIG_EPOLL
-+#include <linux/poll.h>
-+#include <linux/eventpoll.h>
-+#endif
-+
- #if DEBUG > 1
- #define dprintk               printk
- #else
-@@ -1015,6 +1020,10 @@ put_rq:
-       if (waitqueue_active(&ctx->wait))
-               wake_up(&ctx->wait);
-+#ifdef CONFIG_EPOLL
-+      if (ctx->file && waitqueue_active(&ctx->poll_wait))
-+              wake_up(&ctx->poll_wait);
-+#endif
-       if (ret)
-               put_ioctx(ctx);
-@@ -1024,6 +1033,8 @@ put_rq:
- /* aio_read_evt
-  *    Pull an event off of the ioctx's event ring.  Returns the number of 
-  *    events fetched (0 or 1 ;-)
-+ *    If ent parameter is 0, just returns the number of events that would
-+ *    be fetched.
-  *    FIXME: make this use cmpxchg.
-  *    TODO: make the ringbuffer user mmap()able (requires FIXME).
-  */
-@@ -1046,13 +1057,18 @@ static int aio_read_evt(struct kioctx *i
-       head = ring->head % info->nr;
-       if (head != ring->tail) {
--              struct io_event *evp = aio_ring_event(info, head, KM_USER1);
--              *ent = *evp;
--              head = (head + 1) % info->nr;
--              smp_mb(); /* finish reading the event before updatng the head */
--              ring->head = head;
--              ret = 1;
--              put_aio_ring_event(evp, KM_USER1);
-+              if (ent) { /* event requested */
-+                      struct io_event *evp =
-+                              aio_ring_event(info, head, KM_USER1);
-+                      *ent = *evp;
-+                      head = (head + 1) % info->nr;
-+                      /* finish reading the event before updatng the head */
-+                      smp_mb();
-+                      ring->head = head;
-+                      ret = 1;
-+                      put_aio_ring_event(evp, KM_USER1);
-+              } else /* only need to know availability */
-+                      ret = 1;
-       }
-       spin_unlock(&info->ring_lock);
-@@ -1235,9 +1251,78 @@ static void io_destroy(struct kioctx *io
-       aio_cancel_all(ioctx);
-       wait_for_all_aios(ioctx);
-+#ifdef CONFIG_EPOLL
-+      /* forget the poll file, but it's up to the user to close it */
-+      if (ioctx->file) {
-+              ioctx->file->private_data = 0;
-+              ioctx->file = 0;
-+      }
-+#endif
-       put_ioctx(ioctx);       /* once for the lookup */
- }
-+#ifdef CONFIG_EPOLL
-+
-+static int aio_queue_fd_close(struct inode *inode, struct file *file)
-+{
-+      struct kioctx *ioctx = file->private_data;
-+      if (ioctx) {
-+              file->private_data = 0;
-+              spin_lock_irq(&ioctx->ctx_lock);
-+              ioctx->file = 0;
-+              spin_unlock_irq(&ioctx->ctx_lock);
-+      }
-+      return 0;
-+}
-+
-+static unsigned int aio_queue_fd_poll(struct file *file, poll_table *wait)
-+{     unsigned int pollflags = 0;
-+      struct kioctx *ioctx = file->private_data;
-+
-+      if (ioctx) {
-+
-+              spin_lock_irq(&ioctx->ctx_lock);
-+              /* Insert inside our poll wait queue */
-+              poll_wait(file, &ioctx->poll_wait, wait);
-+
-+              /* Check our condition */
-+              if (aio_read_evt(ioctx, 0))
-+                      pollflags = POLLIN | POLLRDNORM;
-+              spin_unlock_irq(&ioctx->ctx_lock);
-+      }
-+
-+      return pollflags;
-+}
-+
-+static const struct file_operations aioq_fops = {
-+      .release        = aio_queue_fd_close,
-+      .poll           = aio_queue_fd_poll
-+};
-+
-+/* make_aio_fd:
-+ *  Create a file descriptor that can be used to poll the event queue.
-+ *  Based and piggybacked on the excellent epoll code.
-+ */
-+
-+static int make_aio_fd(struct kioctx *ioctx)
-+{
-+      int error, fd;
-+      struct inode *inode;
-+      struct file *file;
-+
-+      error = ep_getfd(&fd, &inode, &file, NULL, &aioq_fops);
-+      if (error)
-+              return error;
-+
-+      /* associate the file with the IO context */
-+      file->private_data = ioctx;
-+      ioctx->file = file;
-+      init_waitqueue_head(&ioctx->poll_wait);
-+      return fd;
-+}
-+#endif
-+
-+
- /* sys_io_setup:
-  *    Create an aio_context capable of receiving at least nr_events.
-  *    ctxp must not point to an aio_context that already exists, and
-@@ -1250,18 +1335,30 @@ static void io_destroy(struct kioctx *io
-  *    resources are available.  May fail with -EFAULT if an invalid
-  *    pointer is passed for ctxp.  Will fail with -ENOSYS if not
-  *    implemented.
-+ *
-+ *    To request a selectable fd, the user context has to be initialized
-+ *    to 1, instead of 0, and the return value is the fd.
-+ *    This keeps the system call compatible, since a non-zero value
-+ *    was not allowed so far.
-  */
- asmlinkage long sys_io_setup(unsigned nr_events, aio_context_t __user *ctxp)
- {
-       struct kioctx *ioctx = NULL;
-       unsigned long ctx;
-       long ret;
-+      int make_fd = 0;
-       ret = get_user(ctx, ctxp);
-       if (unlikely(ret))
-               goto out;
-       ret = -EINVAL;
-+#ifdef CONFIG_EPOLL
-+      if (ctx == 1) {
-+              make_fd = 1;
-+              ctx = 0;
-+      }
-+#endif
-       if (unlikely(ctx || nr_events == 0)) {
-               pr_debug("EINVAL: io_setup: ctx %lu nr_events %u\n",
-                        ctx, nr_events);
-@@ -1272,8 +1369,12 @@ asmlinkage long sys_io_setup(unsigned nr
-       ret = PTR_ERR(ioctx);
-       if (!IS_ERR(ioctx)) {
-               ret = put_user(ioctx->user_id, ctxp);
--              if (!ret)
--                      return 0;
-+#ifdef CONFIG_EPOLL
-+              if (make_fd && ret >= 0)
-+                      ret = make_aio_fd(ioctx);
-+#endif
-+              if (ret >= 0)
-+                      return ret;
-               get_ioctx(ioctx); /* io_destroy() expects us to hold a ref */
-               io_destroy(ioctx);
-diff -pruN ../orig-linux-2.6.18/fs/eventpoll.c ./fs/eventpoll.c
---- ../orig-linux-2.6.18/fs/eventpoll.c        2006-09-20 04:42:06.000000000 +0100
-+++ ./fs/eventpoll.c   2007-01-12 16:04:41.000000000 +0000
-@@ -236,8 +236,6 @@ struct ep_pqueue {
- static void ep_poll_safewake_init(struct poll_safewake *psw);
- static void ep_poll_safewake(struct poll_safewake *psw, wait_queue_head_t *wq);
--static int ep_getfd(int *efd, struct inode **einode, struct file **efile,
--                  struct eventpoll *ep);
- static int ep_alloc(struct eventpoll **pep);
- static void ep_free(struct eventpoll *ep);
- static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd);
-@@ -267,7 +265,7 @@ static int ep_events_transfer(struct eve
- static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
-                  int maxevents, long timeout);
- static int eventpollfs_delete_dentry(struct dentry *dentry);
--static struct inode *ep_eventpoll_inode(void);
-+static struct inode *ep_eventpoll_inode(const struct file_operations *fops);
- static int eventpollfs_get_sb(struct file_system_type *fs_type,
-                             int flags, const char *dev_name,
-                             void *data, struct vfsmount *mnt);
-@@ -517,7 +515,7 @@ asmlinkage long sys_epoll_create(int siz
-        * Creates all the items needed to setup an eventpoll file. That is,
-        * a file structure, and inode and a free file descriptor.
-        */
--      error = ep_getfd(&fd, &inode, &file, ep);
-+      error = ep_getfd(&fd, &inode, &file, ep, &eventpoll_fops);
-       if (error)
-               goto eexit_2;
-@@ -702,8 +700,8 @@ eexit_1:
- /*
-  * Creates the file descriptor to be used by the epoll interface.
-  */
--static int ep_getfd(int *efd, struct inode **einode, struct file **efile,
--                  struct eventpoll *ep)
-+int ep_getfd(int *efd, struct inode **einode, struct file **efile,
-+                  struct eventpoll *ep, const struct file_operations *fops)
- {
-       struct qstr this;
-       char name[32];
-@@ -719,7 +717,7 @@ static int ep_getfd(int *efd, struct ino
-               goto eexit_1;
-       /* Allocates an inode from the eventpoll file system */
--      inode = ep_eventpoll_inode();
-+      inode = ep_eventpoll_inode(fops);
-       error = PTR_ERR(inode);
-       if (IS_ERR(inode))
-               goto eexit_2;
-@@ -750,7 +748,7 @@ static int ep_getfd(int *efd, struct ino
-       file->f_pos = 0;
-       file->f_flags = O_RDONLY;
--      file->f_op = &eventpoll_fops;
-+      file->f_op = fops;
-       file->f_mode = FMODE_READ;
-       file->f_version = 0;
-       file->private_data = ep;
-@@ -1569,7 +1567,7 @@ static int eventpollfs_delete_dentry(str
- }
--static struct inode *ep_eventpoll_inode(void)
-+static struct inode *ep_eventpoll_inode(const struct file_operations *fops)
- {
-       int error = -ENOMEM;
-       struct inode *inode = new_inode(eventpoll_mnt->mnt_sb);
-@@ -1577,7 +1575,7 @@ static struct inode *ep_eventpoll_inode(
-       if (!inode)
-               goto eexit_1;
--      inode->i_fop = &eventpoll_fops;
-+      inode->i_fop = fops;
-       /*
-        * Mark the inode dirty from the very beginning,
-diff -pruN ../orig-linux-2.6.18/include/linux/aio.h ./include/linux/aio.h
---- ../orig-linux-2.6.18/include/linux/aio.h   2006-09-20 04:42:06.000000000 +0100
-+++ ./include/linux/aio.h      2007-01-12 16:04:15.000000000 +0000
-@@ -191,6 +191,11 @@ struct kioctx {
-       struct aio_ring_info    ring_info;
-       struct work_struct      wq;
-+#ifdef CONFIG_EPOLL
-+      // poll integration
-+      wait_queue_head_t       poll_wait;
-+      struct file             *file;
-+#endif
- };
- /* prototypes */
-diff -pruN ../orig-linux-2.6.18/include/linux/eventpoll.h ./include/linux/eventpoll.h
---- ../orig-linux-2.6.18/include/linux/eventpoll.h     2006-09-20 04:42:06.000000000 +0100
-+++ ./include/linux/eventpoll.h        2007-01-12 16:04:15.000000000 +0000
-@@ -90,6 +90,12 @@ static inline void eventpoll_release(str
-       eventpoll_release_file(file);
- }
-+/*
-+ * called by aio code to create fd that can poll the  aio event queueQ
-+ */
-+struct eventpoll;
-+int ep_getfd(int *efd, struct inode **einode, struct file **efile,
-+             struct eventpoll *ep, const struct file_operations *fops);
- #else
- static inline void eventpoll_init_file(struct file *file) {}
diff --git a/patches/linux-2.6.18/fix-ide-cd-pio-mode.patch b/patches/linux-2.6.18/fix-ide-cd-pio-mode.patch
deleted file mode 100644 (file)
index 69da5d7..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/drivers/ide/ide-lib.c ./drivers/ide/ide-lib.c
---- ../orig-linux-2.6.18/drivers/ide/ide-lib.c 2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/ide/ide-lib.c    2007-01-12 16:07:37.000000000 +0000
-@@ -408,10 +408,10 @@ void ide_toggle_bounce(ide_drive_t *driv
- {
-       u64 addr = BLK_BOUNCE_HIGH;     /* dma64_addr_t */
--      if (!PCI_DMA_BUS_IS_PHYS) {
--              addr = BLK_BOUNCE_ANY;
--      } else if (on && drive->media == ide_disk) {
--              if (HWIF(drive)->pci_dev)
-+      if (on && drive->media == ide_disk) {
-+              if (!PCI_DMA_BUS_IS_PHYS)
-+                      addr = BLK_BOUNCE_ANY;
-+              else if (HWIF(drive)->pci_dev)
-                       addr = HWIF(drive)->pci_dev->dma_mask;
-       }
diff --git a/patches/linux-2.6.18/fixaddr-top.patch b/patches/linux-2.6.18/fixaddr-top.patch
deleted file mode 100644 (file)
index 19558b9..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/mm/pgtable.c ./arch/i386/mm/pgtable.c
---- ../orig-linux-2.6.18/arch/i386/mm/pgtable.c        2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/mm/pgtable.c   2007-01-17 17:19:36.000000000 +0000
-@@ -12,6 +12,7 @@
- #include <linux/slab.h>
- #include <linux/pagemap.h>
- #include <linux/spinlock.h>
-+#include <linux/module.h>
- #include <asm/system.h>
- #include <asm/pgtable.h>
-@@ -137,6 +138,10 @@ void set_pmd_pfn(unsigned long vaddr, un
-       __flush_tlb_one(vaddr);
- }
-+static int nr_fixmaps = 0;
-+unsigned long __FIXADDR_TOP = 0xfffff000;
-+EXPORT_SYMBOL(__FIXADDR_TOP);
-+
- void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
- {
-       unsigned long address = __fix_to_virt(idx);
-@@ -146,6 +151,13 @@ void __set_fixmap (enum fixed_addresses 
-               return;
-       }
-       set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
-+      nr_fixmaps++;
-+}
-+
-+void set_fixaddr_top(unsigned long top)
-+{
-+      BUG_ON(nr_fixmaps > 0);
-+      __FIXADDR_TOP = top - PAGE_SIZE;
- }
- pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/fixmap.h ./include/asm-i386/fixmap.h
---- ../orig-linux-2.6.18/include/asm-i386/fixmap.h     2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/fixmap.h        2007-01-17 17:19:36.000000000 +0000
-@@ -19,7 +19,7 @@
-  * Leave one empty page between vmalloc'ed areas and
-  * the start of the fixmap.
-  */
--#define __FIXADDR_TOP 0xfffff000
-+extern unsigned long __FIXADDR_TOP;
- #ifndef __ASSEMBLY__
- #include <linux/kernel.h>
-@@ -94,6 +94,8 @@ enum fixed_addresses {
- extern void __set_fixmap (enum fixed_addresses idx,
-                                       unsigned long phys, pgprot_t flags);
-+extern void set_fixaddr_top(unsigned long top);
-+
- #define set_fixmap(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL)
- /*
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/page.h ./include/asm-i386/page.h
---- ../orig-linux-2.6.18/include/asm-i386/page.h       2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/page.h  2007-01-17 17:19:36.000000000 +0000
-@@ -122,7 +122,7 @@ extern int page_is_ram(unsigned long pag
- #define PAGE_OFFSET           ((unsigned long)__PAGE_OFFSET)
- #define VMALLOC_RESERVE               ((unsigned long)__VMALLOC_RESERVE)
--#define MAXMEM                        (-__PAGE_OFFSET-__VMALLOC_RESERVE)
-+#define MAXMEM                        (__FIXADDR_TOP-__PAGE_OFFSET-__VMALLOC_RESERVE)
- #define __pa(x)                       ((unsigned long)(x)-PAGE_OFFSET)
- #define __va(x)                       ((void *)((unsigned long)(x)+PAGE_OFFSET))
- #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
diff --git a/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch b/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
deleted file mode 100644 (file)
index d4b0d38..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c ./arch/i386/kernel/machine_kexec.c
---- ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c      2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/machine_kexec.c 2007-01-12 16:03:23.000000000 +0000
-@@ -20,70 +20,13 @@
- #include <asm/system.h>
- #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
--
--#define L0_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
--#define L1_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
--#define L2_ATTR (_PAGE_PRESENT)
--
--#define LEVEL0_SIZE (1UL << 12UL)
--
--#ifndef CONFIG_X86_PAE
--#define LEVEL1_SIZE (1UL << 22UL)
--static u32 pgtable_level1[1024] PAGE_ALIGNED;
--
--static void identity_map_page(unsigned long address)
--{
--      unsigned long level1_index, level2_index;
--      u32 *pgtable_level2;
--
--      /* Find the current page table */
--      pgtable_level2 = __va(read_cr3());
--
--      /* Find the indexes of the physical address to identity map */
--      level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
--      level2_index = address / LEVEL1_SIZE;
--
--      /* Identity map the page table entry */
--      pgtable_level1[level1_index] = address | L0_ATTR;
--      pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
--
--      /* Flush the tlb so the new mapping takes effect.
--       * Global tlb entries are not flushed but that is not an issue.
--       */
--      load_cr3(pgtable_level2);
--}
--
--#else
--#define LEVEL1_SIZE (1UL << 21UL)
--#define LEVEL2_SIZE (1UL << 30UL)
--static u64 pgtable_level1[512] PAGE_ALIGNED;
--static u64 pgtable_level2[512] PAGE_ALIGNED;
--
--static void identity_map_page(unsigned long address)
--{
--      unsigned long level1_index, level2_index, level3_index;
--      u64 *pgtable_level3;
--
--      /* Find the current page table */
--      pgtable_level3 = __va(read_cr3());
--
--      /* Find the indexes of the physical address to identity map */
--      level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
--      level2_index = (address % LEVEL2_SIZE)/LEVEL1_SIZE;
--      level3_index = address / LEVEL2_SIZE;
--
--      /* Identity map the page table entry */
--      pgtable_level1[level1_index] = address | L0_ATTR;
--      pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
--      set_64bit(&pgtable_level3[level3_index],
--                                             __pa(pgtable_level2) | L2_ATTR);
--
--      /* Flush the tlb so the new mapping takes effect.
--       * Global tlb entries are not flushed but that is not an issue.
--       */
--      load_cr3(pgtable_level3);
--}
-+static u32 kexec_pgd[1024] PAGE_ALIGNED;
-+#ifdef CONFIG_X86_PAE
-+static u32 kexec_pmd0[1024] PAGE_ALIGNED;
-+static u32 kexec_pmd1[1024] PAGE_ALIGNED;
- #endif
-+static u32 kexec_pte0[1024] PAGE_ALIGNED;
-+static u32 kexec_pte1[1024] PAGE_ALIGNED;
- static void set_idt(void *newidt, __u16 limit)
- {
-@@ -127,16 +70,6 @@ static void load_segments(void)
- #undef __STR
- }
--typedef asmlinkage NORET_TYPE void (*relocate_new_kernel_t)(
--                                      unsigned long indirection_page,
--                                      unsigned long reboot_code_buffer,
--                                      unsigned long start_address,
--                                      unsigned int has_pae) ATTRIB_NORET;
--
--extern const unsigned char relocate_new_kernel[];
--extern void relocate_new_kernel_end(void);
--extern const unsigned int relocate_new_kernel_size;
--
- /*
-  * A architecture hook called to validate the
-  * proposed image and prepare the control pages
-@@ -169,25 +102,29 @@ void machine_kexec_cleanup(struct kimage
-  */
- NORET_TYPE void machine_kexec(struct kimage *image)
- {
--      unsigned long page_list;
--      unsigned long reboot_code_buffer;
--
--      relocate_new_kernel_t rnk;
-+      unsigned long page_list[PAGES_NR];
-+      void *control_page;
-       /* Interrupts aren't acceptable while we reboot */
-       local_irq_disable();
--      /* Compute some offsets */
--      reboot_code_buffer = page_to_pfn(image->control_code_page)
--                                                              << PAGE_SHIFT;
--      page_list = image->head;
--
--      /* Set up an identity mapping for the reboot_code_buffer */
--      identity_map_page(reboot_code_buffer);
--
--      /* copy it out */
--      memcpy((void *)reboot_code_buffer, relocate_new_kernel,
--                                              relocate_new_kernel_size);
-+      control_page = page_address(image->control_code_page);
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+      page_list[PA_CONTROL_PAGE] = __pa(control_page);
-+      page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel;
-+      page_list[PA_PGD] = __pa(kexec_pgd);
-+      page_list[VA_PGD] = (unsigned long)kexec_pgd;
-+#ifdef CONFIG_X86_PAE
-+      page_list[PA_PMD_0] = __pa(kexec_pmd0);
-+      page_list[VA_PMD_0] = (unsigned long)kexec_pmd0;
-+      page_list[PA_PMD_1] = __pa(kexec_pmd1);
-+      page_list[VA_PMD_1] = (unsigned long)kexec_pmd1;
-+#endif
-+      page_list[PA_PTE_0] = __pa(kexec_pte0);
-+      page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-+      page_list[PA_PTE_1] = __pa(kexec_pte1);
-+      page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
-       /* The segment registers are funny things, they have both a
-        * visible and an invisible part.  Whenever the visible part is
-@@ -206,6 +143,6 @@ NORET_TYPE void machine_kexec(struct kim
-       set_idt(phys_to_virt(0),0);
-       /* now call it */
--      rnk = (relocate_new_kernel_t) reboot_code_buffer;
--      (*rnk)(page_list, reboot_code_buffer, image->start, cpu_has_pae);
-+      relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-+                      image->start, cpu_has_pae);
- }
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S ./arch/i386/kernel/relocate_kernel.S
---- ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S    2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/relocate_kernel.S       2007-01-12 16:03:23.000000000 +0000
-@@ -7,16 +7,138 @@
-  */
- #include <linux/linkage.h>
-+#include <asm/page.h>
-+#include <asm/kexec.h>
-+
-+/*
-+ * Must be relocatable PIC code callable as a C function
-+ */
-+
-+#define PTR(x) (x << 2)
-+#define PAGE_ALIGNED (1 << PAGE_SHIFT)
-+#define PAGE_ATTR 0x63 /* _PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY */
-+#define PAE_PGD_ATTR 0x01 /* _PAGE_PRESENT */
-+
-+      .text
-+      .align PAGE_ALIGNED
-+      .globl relocate_kernel
-+relocate_kernel:
-+      movl    8(%esp), %ebp /* list of pages */
-+
-+#ifdef CONFIG_X86_PAE
-+      /* map the control page at its virtual address */
-+
-+      movl    PTR(VA_PGD)(%ebp), %edi
-+      movl    PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0xc0000000, %eax
-+      shrl    $27, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PMD_0)(%ebp), %edx
-+      orl     $PAE_PGD_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PMD_0)(%ebp), %edi
-+      movl    PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x3fe00000, %eax
-+      shrl    $18, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PTE_0)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PTE_0)(%ebp), %edi
-+      movl    PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x001ff000, %eax
-+      shrl    $9, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      /* identity map the control page at its physical address */
-+
-+      movl    PTR(VA_PGD)(%ebp), %edi
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0xc0000000, %eax
-+      shrl    $27, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PMD_1)(%ebp), %edx
-+      orl     $PAE_PGD_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PMD_1)(%ebp), %edi
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x3fe00000, %eax
-+      shrl    $18, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PTE_1)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PTE_1)(%ebp), %edi
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x001ff000, %eax
-+      shrl    $9, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+#else
-+      /* map the control page at its virtual address */
-+
-+      movl    PTR(VA_PGD)(%ebp), %edi
-+      movl    PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0xffc00000, %eax
-+      shrl    $20, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PTE_0)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PTE_0)(%ebp), %edi
-+      movl    PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x003ff000, %eax
-+      shrl    $10, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      /* identity map the control page at its physical address */
-+
-+      movl    PTR(VA_PGD)(%ebp), %edi
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0xffc00000, %eax
-+      shrl    $20, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_PTE_1)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+
-+      movl    PTR(VA_PTE_1)(%ebp), %edi
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+      andl    $0x003ff000, %eax
-+      shrl    $10, %eax
-+      addl    %edi, %eax
-+
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+      orl     $PAGE_ATTR, %edx
-+      movl    %edx, (%eax)
-+#endif
--      /*
--       * Must be relocatable PIC code callable as a C function, that once
--       * it starts can not use the previous processes stack.
--       */
--      .globl relocate_new_kernel
- relocate_new_kernel:
-       /* read the arguments and say goodbye to the stack */
-       movl  4(%esp), %ebx /* page_list */
--      movl  8(%esp), %ebp /* reboot_code_buffer */
-+      movl  8(%esp), %ebp /* list of pages */
-       movl  12(%esp), %edx /* start address */
-       movl  16(%esp), %ecx /* cpu_has_pae */
-@@ -24,11 +146,26 @@ relocate_new_kernel:
-       pushl $0
-       popfl
--      /* set a new stack at the bottom of our page... */
--      lea   4096(%ebp), %esp
-+      /* get physical address of control page now */
-+      /* this is impossible after page table switch */
-+      movl    PTR(PA_CONTROL_PAGE)(%ebp), %edi
-+
-+      /* switch to new set of page tables */
-+      movl    PTR(PA_PGD)(%ebp), %eax
-+      movl    %eax, %cr3
-+
-+      /* setup a new stack at the end of the physical control page */
-+      lea     4096(%edi), %esp
--      /* store the parameters back on the stack */
--      pushl   %edx /* store the start address */
-+      /* jump to identity mapped page */
-+      movl    %edi, %eax
-+      addl    $(identity_mapped - relocate_kernel), %eax
-+      pushl   %eax
-+      ret
-+
-+identity_mapped:
-+      /* store the start address on the stack */
-+      pushl   %edx
-       /* Set cr0 to a known state:
-        * 31 0 == Paging disabled
-@@ -113,8 +250,3 @@ relocate_new_kernel:
-       xorl    %edi, %edi
-       xorl    %ebp, %ebp
-       ret
--relocate_new_kernel_end:
--
--      .globl relocate_new_kernel_size
--relocate_new_kernel_size:
--      .long relocate_new_kernel_end - relocate_new_kernel
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/kexec.h ./include/asm-i386/kexec.h
---- ../orig-linux-2.6.18/include/asm-i386/kexec.h      2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/kexec.h 2007-01-12 16:03:23.000000000 +0000
-@@ -1,6 +1,26 @@
- #ifndef _I386_KEXEC_H
- #define _I386_KEXEC_H
-+#define PA_CONTROL_PAGE  0
-+#define VA_CONTROL_PAGE  1
-+#define PA_PGD           2
-+#define VA_PGD           3
-+#define PA_PTE_0         4
-+#define VA_PTE_0         5
-+#define PA_PTE_1         6
-+#define VA_PTE_1         7
-+#ifdef CONFIG_X86_PAE
-+#define PA_PMD_0         8
-+#define VA_PMD_0         9
-+#define PA_PMD_1         10
-+#define VA_PMD_1         11
-+#define PAGES_NR         12
-+#else
-+#define PAGES_NR         8
-+#endif
-+
-+#ifndef __ASSEMBLY__
-+
- #include <asm/fixmap.h>
- #include <asm/ptrace.h>
- #include <asm/string.h>
-@@ -72,5 +92,12 @@ static inline void crash_setup_regs(stru
-                newregs->eip = (unsigned long)current_text_addr();
-        }
- }
-+asmlinkage NORET_TYPE void
-+relocate_kernel(unsigned long indirection_page,
-+              unsigned long control_page,
-+              unsigned long start_address,
-+              unsigned int has_pae) ATTRIB_NORET;
-+
-+#endif /* __ASSEMBLY__ */
- #endif /* _I386_KEXEC_H */
diff --git a/patches/linux-2.6.18/git-4bfaaef01a1badb9e8ffb0c0a37cd2379008d21f.patch b/patches/linux-2.6.18/git-4bfaaef01a1badb9e8ffb0c0a37cd2379008d21f.patch
deleted file mode 100644 (file)
index 21efe3e..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/machine_kexec.c ./arch/x86_64/kernel/machine_kexec.c
---- ../orig-linux-2.6.18/arch/x86_64/kernel/machine_kexec.c    2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/x86_64/kernel/machine_kexec.c       2007-01-12 16:03:49.000000000 +0000
-@@ -15,6 +15,15 @@
- #include <asm/mmu_context.h>
- #include <asm/io.h>
-+#define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
-+static u64 kexec_pgd[512] PAGE_ALIGNED;
-+static u64 kexec_pud0[512] PAGE_ALIGNED;
-+static u64 kexec_pmd0[512] PAGE_ALIGNED;
-+static u64 kexec_pte0[512] PAGE_ALIGNED;
-+static u64 kexec_pud1[512] PAGE_ALIGNED;
-+static u64 kexec_pmd1[512] PAGE_ALIGNED;
-+static u64 kexec_pte1[512] PAGE_ALIGNED;
-+
- static void init_level2_page(pmd_t *level2p, unsigned long addr)
- {
-       unsigned long end_addr;
-@@ -144,32 +153,19 @@ static void load_segments(void)
-               );
- }
--typedef NORET_TYPE void (*relocate_new_kernel_t)(unsigned long indirection_page,
--                                      unsigned long control_code_buffer,
--                                      unsigned long start_address,
--                                      unsigned long pgtable) ATTRIB_NORET;
--
--extern const unsigned char relocate_new_kernel[];
--extern const unsigned long relocate_new_kernel_size;
--
- int machine_kexec_prepare(struct kimage *image)
- {
--      unsigned long start_pgtable, control_code_buffer;
-+      unsigned long start_pgtable;
-       int result;
-       /* Calculate the offsets */
-       start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
--      control_code_buffer = start_pgtable + PAGE_SIZE;
-       /* Setup the identity mapped 64bit page table */
-       result = init_pgtable(image, start_pgtable);
-       if (result)
-               return result;
--      /* Place the code in the reboot code buffer */
--      memcpy(__va(control_code_buffer), relocate_new_kernel,
--                                              relocate_new_kernel_size);
--
-       return 0;
- }
-@@ -184,28 +180,34 @@ void machine_kexec_cleanup(struct kimage
-  */
- NORET_TYPE void machine_kexec(struct kimage *image)
- {
--      unsigned long page_list;
--      unsigned long control_code_buffer;
--      unsigned long start_pgtable;
--      relocate_new_kernel_t rnk;
-+      unsigned long page_list[PAGES_NR];
-+      void *control_page;
-       /* Interrupts aren't acceptable while we reboot */
-       local_irq_disable();
--      /* Calculate the offsets */
--      page_list = image->head;
--      start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
--      control_code_buffer = start_pgtable + PAGE_SIZE;
-+      control_page = page_address(image->control_code_page) + PAGE_SIZE;
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
--      /* Set the low half of the page table to my identity mapped
--       * page table for kexec.  Leave the high half pointing at the
--       * kernel pages.   Don't bother to flush the global pages
--       * as that will happen when I fully switch to my identity mapped
--       * page table anyway.
--       */
--      memcpy(__va(read_cr3()), __va(start_pgtable), PAGE_SIZE/2);
--      __flush_tlb();
-+      page_list[PA_CONTROL_PAGE] = __pa(control_page);
-+      page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel;
-+      page_list[PA_PGD] = __pa(kexec_pgd);
-+      page_list[VA_PGD] = (unsigned long)kexec_pgd;
-+      page_list[PA_PUD_0] = __pa(kexec_pud0);
-+      page_list[VA_PUD_0] = (unsigned long)kexec_pud0;
-+      page_list[PA_PMD_0] = __pa(kexec_pmd0);
-+      page_list[VA_PMD_0] = (unsigned long)kexec_pmd0;
-+      page_list[PA_PTE_0] = __pa(kexec_pte0);
-+      page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-+      page_list[PA_PUD_1] = __pa(kexec_pud1);
-+      page_list[VA_PUD_1] = (unsigned long)kexec_pud1;
-+      page_list[PA_PMD_1] = __pa(kexec_pmd1);
-+      page_list[VA_PMD_1] = (unsigned long)kexec_pmd1;
-+      page_list[PA_PTE_1] = __pa(kexec_pte1);
-+      page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
-+      page_list[PA_TABLE_PAGE] =
-+        (unsigned long)__pa(page_address(image->control_code_page));
-       /* The segment registers are funny things, they have both a
-        * visible and an invisible part.  Whenever the visible part is
-@@ -222,7 +224,8 @@ NORET_TYPE void machine_kexec(struct kim
-        */
-       set_gdt(phys_to_virt(0),0);
-       set_idt(phys_to_virt(0),0);
-+
-       /* now call it */
--      rnk = (relocate_new_kernel_t) control_code_buffer;
--      (*rnk)(page_list, control_code_buffer, image->start, start_pgtable);
-+      relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-+                      image->start);
- }
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/relocate_kernel.S ./arch/x86_64/kernel/relocate_kernel.S
---- ../orig-linux-2.6.18/arch/x86_64/kernel/relocate_kernel.S  2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/x86_64/kernel/relocate_kernel.S     2007-01-12 16:03:49.000000000 +0000
-@@ -7,31 +7,169 @@
-  */
- #include <linux/linkage.h>
-+#include <asm/page.h>
-+#include <asm/kexec.h>
--      /*
--       * Must be relocatable PIC code callable as a C function, that once
--       * it starts can not use the previous processes stack.
--       */
--      .globl relocate_new_kernel
-+/*
-+ * Must be relocatable PIC code callable as a C function
-+ */
-+
-+#define PTR(x) (x << 3)
-+#define PAGE_ALIGNED (1 << PAGE_SHIFT)
-+#define PAGE_ATTR 0x63 /* _PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY */
-+
-+      .text
-+      .align PAGE_ALIGNED
-       .code64
-+      .globl relocate_kernel
-+relocate_kernel:
-+      /* %rdi indirection_page
-+       * %rsi page_list
-+       * %rdx start address
-+       */
-+
-+      /* map the control page at its virtual address */
-+
-+      movq    $0x0000ff8000000000, %r10        /* mask */
-+      mov     $(39 - 3), %cl                   /* bits to shift */
-+      movq    PTR(VA_CONTROL_PAGE)(%rsi), %r11 /* address to map */
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PGD)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PUD_0)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PUD_0)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PMD_0)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PMD_0)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PTE_0)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PTE_0)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_CONTROL_PAGE)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      /* identity map the control page at its physical address */
-+
-+      movq    $0x0000ff8000000000, %r10        /* mask */
-+      mov     $(39 - 3), %cl                   /* bits to shift */
-+      movq    PTR(PA_CONTROL_PAGE)(%rsi), %r11 /* address to map */
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PGD)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PUD_1)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PUD_1)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PMD_1)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PMD_1)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_PTE_1)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
-+      shrq    $9, %r10
-+      sub     $9, %cl
-+
-+      movq    %r11, %r9
-+      andq    %r10, %r9
-+      shrq    %cl, %r9
-+
-+      movq    PTR(VA_PTE_1)(%rsi), %r8
-+      addq    %r8, %r9
-+      movq    PTR(PA_CONTROL_PAGE)(%rsi), %r8
-+      orq     $PAGE_ATTR, %r8
-+      movq    %r8, (%r9)
-+
- relocate_new_kernel:
--      /* %rdi page_list
--       * %rsi reboot_code_buffer
-+      /* %rdi indirection_page
-+       * %rsi page_list
-        * %rdx start address
--       * %rcx page_table
--       * %r8  arg5
--       * %r9  arg6
-        */
-       /* zero out flags, and disable interrupts */
-       pushq $0
-       popfq
--      /* set a new stack at the bottom of our page... */
--      lea   4096(%rsi), %rsp
-+      /* get physical address of control page now */
-+      /* this is impossible after page table switch */
-+      movq    PTR(PA_CONTROL_PAGE)(%rsi), %r8
-+
-+      /* get physical address of page table now too */
-+      movq    PTR(PA_TABLE_PAGE)(%rsi), %rcx
-+
-+      /* switch to new set of page tables */
-+      movq    PTR(PA_PGD)(%rsi), %r9
-+      movq    %r9, %cr3
-+
-+      /* setup a new stack at the end of the physical control page */
-+      lea     4096(%r8), %rsp
-+
-+      /* jump to identity mapped page */
-+      addq    $(identity_mapped - relocate_kernel), %r8
-+      pushq   %r8
-+      ret
--      /* store the parameters back on the stack */
--      pushq   %rdx /* store the start address */
-+identity_mapped:
-+      /* store the start address on the stack */
-+      pushq   %rdx
-       /* Set cr0 to a known state:
-        * 31 1 == Paging enabled
-@@ -136,8 +274,3 @@ relocate_new_kernel:
-       xorq    %r15, %r15
-       ret
--relocate_new_kernel_end:
--
--      .globl relocate_new_kernel_size
--relocate_new_kernel_size:
--      .quad relocate_new_kernel_end - relocate_new_kernel
-diff -pruN ../orig-linux-2.6.18/include/asm-x86_64/kexec.h ./include/asm-x86_64/kexec.h
---- ../orig-linux-2.6.18/include/asm-x86_64/kexec.h    2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-x86_64/kexec.h       2007-01-12 16:03:49.000000000 +0000
-@@ -1,6 +1,27 @@
- #ifndef _X86_64_KEXEC_H
- #define _X86_64_KEXEC_H
-+#define PA_CONTROL_PAGE  0
-+#define VA_CONTROL_PAGE  1
-+#define PA_PGD           2
-+#define VA_PGD           3
-+#define PA_PUD_0         4
-+#define VA_PUD_0         5
-+#define PA_PMD_0         6
-+#define VA_PMD_0         7
-+#define PA_PTE_0         8
-+#define VA_PTE_0         9
-+#define PA_PUD_1         10
-+#define VA_PUD_1         11
-+#define PA_PMD_1         12
-+#define VA_PMD_1         13
-+#define PA_PTE_1         14
-+#define VA_PTE_1         15
-+#define PA_TABLE_PAGE    16
-+#define PAGES_NR         17
-+
-+#ifndef __ASSEMBLY__
-+
- #include <linux/string.h>
- #include <asm/page.h>
-@@ -64,4 +85,12 @@ static inline void crash_setup_regs(stru
-               newregs->rip = (unsigned long)current_text_addr();
-       }
- }
-+
-+NORET_TYPE void
-+relocate_kernel(unsigned long indirection_page,
-+              unsigned long page_list,
-+              unsigned long start_address) ATTRIB_NORET;
-+
-+#endif /* __ASSEMBLY__ */
-+
- #endif /* _X86_64_KEXEC_H */
diff --git a/patches/linux-2.6.18/git-5ee7737379b1d7f0c977c0f1661fbaf01a8d4721.patch b/patches/linux-2.6.18/git-5ee7737379b1d7f0c977c0f1661fbaf01a8d4721.patch
deleted file mode 100644 (file)
index 4d5169a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
---- ./arch/ia64/kernel/smp.c.orig      2007-05-02 19:00:01.000000000 +0900
-+++ ./arch/ia64/kernel/smp.c   2007-05-02 19:04:32.000000000 +0900
-@@ -328,10 +328,14 @@ int
- smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait)
- {
-       struct call_data_struct data;
--      int cpus = num_online_cpus()-1;
-+      int cpus;
--      if (!cpus)
-+      spin_lock(&call_lock);
-+      cpus = num_online_cpus()-1;
-+      if (!cpus) {
-+              spin_unlock(&call_lock);
-               return 0;
-+      }
-       /* Can deadlock when called with interrupts disabled */
-       WARN_ON(irqs_disabled());
-@@ -343,8 +347,6 @@ smp_call_function (void (*func) (void *i
-       if (wait)
-               atomic_set(&data.finished, 0);
--      spin_lock(&call_lock);
--
-       call_data = &data;
-       mb();   /* ensure store to call_data precedes setting of IPI_CALL_FUNC */
-       send_IPI_allbutself(IPI_CALL_FUNC);
diff --git a/patches/linux-2.6.18/git-c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4.patch b/patches/linux-2.6.18/git-c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4.patch
deleted file mode 100644 (file)
index 3634a22..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-commit c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4
-Author: Vivek Goyal <vgoyal@in.ibm.com>
-Date:   Wed Nov 8 17:44:41 2006 -0800
-
-    [PATCH] i386: Force data segment to be 4K aligned
-    
-    o Currently there is no specific alignment restriction in linker script
-      and in some cases it can be placed non 4K aligned addresses. This fails
-      kexec which checks that segment to be loaded is page aligned.
-    
-    o I guess, it does not harm data segment to be 4K aligned.
-    
-    Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
-    Signed-off-by: Andi Kleen <ak@suse.de>
-    Signed-off-by: Andrew Morton <akpm@osdl.org>
-    Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-
-diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S
-index adc1f23..c6f84a0 100644
---- a/arch/i386/kernel/vmlinux.lds.S
-+++ b/arch/i386/kernel/vmlinux.lds.S
-@@ -51,6 +51,7 @@ SECTIONS
-   __tracedata_end = .;
-   /* writeable */
-+  . = ALIGN(4096);
-   .data : AT(ADDR(.data) - LOAD_OFFSET) {     /* Data */
-       *(.data)
-       CONSTRUCTORS
diff --git a/patches/linux-2.6.18/git-dbaab49f92ff6ae6255762a948375e4036cbdbd2.patch b/patches/linux-2.6.18/git-dbaab49f92ff6ae6255762a948375e4036cbdbd2.patch
deleted file mode 100644 (file)
index 294692b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S ./arch/x86_64/kernel/vmlinux.lds.S
---- ../orig-linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S      2007-01-12 18:20:02.000000000 +0000
-+++ ./arch/x86_64/kernel/vmlinux.lds.S 2007-01-12 18:20:20.000000000 +0000
-@@ -17,6 +17,7 @@ PHDRS {
-       text PT_LOAD FLAGS(5);  /* R_E */
-       data PT_LOAD FLAGS(7);  /* RWE */
-       user PT_LOAD FLAGS(7);  /* RWE */
-+      data.init PT_LOAD FLAGS(7);     /* RWE */
-       note PT_NOTE FLAGS(4);  /* R__ */
- }
- SECTIONS
-@@ -131,7 +132,7 @@ SECTIONS
-   . = ALIGN(8192);            /* init_task */
-   .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
-       *(.data.init_task)
--  } :data
-+  }:data.init
-   . = ALIGN(4096);
-   .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
diff --git a/patches/linux-2.6.18/i386-mach-io-check-nmi.patch b/patches/linux-2.6.18/i386-mach-io-check-nmi.patch
deleted file mode 100644 (file)
index 39a5237..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/traps.c ./arch/i386/kernel/traps.c
---- ../orig-linux-2.6.18/arch/i386/kernel/traps.c      2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/traps.c 2007-01-12 16:07:49.000000000 +0000
-@@ -642,18 +642,11 @@ static void mem_parity_error(unsigned ch
- static void io_check_error(unsigned char reason, struct pt_regs * regs)
- {
--      unsigned long i;
--
-       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-       /* Re-enable the IOCK line, wait for a few seconds */
--      reason = (reason & 0xf) | 8;
--      outb(reason, 0x61);
--      i = 2000;
--      while (--i) udelay(1000);
--      reason &= ~8;
--      outb(reason, 0x61);
-+      clear_io_check_error(reason);
- }
- static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/mach-default/mach_traps.h ./include/asm-i386/mach-default/mach_traps.h
---- ../orig-linux-2.6.18/include/asm-i386/mach-default/mach_traps.h    2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/mach-default/mach_traps.h       2007-01-12 16:07:49.000000000 +0000
-@@ -15,6 +15,18 @@ static inline void clear_mem_error(unsig
-       outb(reason, 0x61);
- }
-+static inline void clear_io_check_error(unsigned char reason)
-+{
-+      unsigned long i;
-+
-+      reason = (reason & 0xf) | 8;
-+      outb(reason, 0x61);
-+      i = 2000;
-+      while (--i) udelay(1000);
-+      reason &= ~8;
-+      outb(reason, 0x61);
-+}
-+
- static inline unsigned char get_nmi_reason(void)
- {
-       return inb(0x61);
diff --git a/patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-i386.patch b/patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-i386.patch
deleted file mode 100644 (file)
index ea48da9..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c ./arch/i386/kernel/machine_kexec.c
---- ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c      2007-01-12 16:03:23.000000000 +0000
-+++ ./arch/i386/kernel/machine_kexec.c 2007-01-12 16:03:37.000000000 +0000
-@@ -28,48 +28,6 @@ static u32 kexec_pmd1[1024] PAGE_ALIGNED
- static u32 kexec_pte0[1024] PAGE_ALIGNED;
- static u32 kexec_pte1[1024] PAGE_ALIGNED;
--static void set_idt(void *newidt, __u16 limit)
--{
--      struct Xgt_desc_struct curidt;
--
--      /* ia32 supports unaliged loads & stores */
--      curidt.size    = limit;
--      curidt.address = (unsigned long)newidt;
--
--      load_idt(&curidt);
--};
--
--
--static void set_gdt(void *newgdt, __u16 limit)
--{
--      struct Xgt_desc_struct curgdt;
--
--      /* ia32 supports unaligned loads & stores */
--      curgdt.size    = limit;
--      curgdt.address = (unsigned long)newgdt;
--
--      load_gdt(&curgdt);
--};
--
--static void load_segments(void)
--{
--#define __STR(X) #X
--#define STR(X) __STR(X)
--
--      __asm__ __volatile__ (
--              "\tljmp $"STR(__KERNEL_CS)",$1f\n"
--              "\t1:\n"
--              "\tmovl $"STR(__KERNEL_DS)",%%eax\n"
--              "\tmovl %%eax,%%ds\n"
--              "\tmovl %%eax,%%es\n"
--              "\tmovl %%eax,%%fs\n"
--              "\tmovl %%eax,%%gs\n"
--              "\tmovl %%eax,%%ss\n"
--              ::: "eax", "memory");
--#undef STR
--#undef __STR
--}
--
- /*
-  * A architecture hook called to validate the
-  * proposed image and prepare the control pages
-@@ -126,23 +84,6 @@ NORET_TYPE void machine_kexec(struct kim
-       page_list[PA_PTE_1] = __pa(kexec_pte1);
-       page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
--      /* The segment registers are funny things, they have both a
--       * visible and an invisible part.  Whenever the visible part is
--       * set to a specific selector, the invisible part is loaded
--       * with from a table in memory.  At no other time is the
--       * descriptor table in memory accessed.
--       *
--       * I take advantage of this here by force loading the
--       * segments, before I zap the gdt with an invalid value.
--       */
--      load_segments();
--      /* The gdt & idt are now invalid.
--       * If you want to load them you must set up your own idt & gdt.
--       */
--      set_gdt(phys_to_virt(0),0);
--      set_idt(phys_to_virt(0),0);
--
--      /* now call it */
-       relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-                       image->start, cpu_has_pae);
- }
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S ./arch/i386/kernel/relocate_kernel.S
---- ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S    2007-01-12 16:03:23.000000000 +0000
-+++ ./arch/i386/kernel/relocate_kernel.S       2007-01-12 16:03:37.000000000 +0000
-@@ -154,14 +154,45 @@ relocate_new_kernel:
-       movl    PTR(PA_PGD)(%ebp), %eax
-       movl    %eax, %cr3
-+      /* setup idt */
-+      movl    %edi, %eax
-+      addl    $(idt_48 - relocate_kernel), %eax
-+      lidtl   (%eax)
-+
-+      /* setup gdt */
-+      movl    %edi, %eax
-+      addl    $(gdt - relocate_kernel), %eax
-+      movl    %edi, %esi
-+      addl    $((gdt_48 - relocate_kernel) + 2), %esi
-+      movl    %eax, (%esi)
-+      
-+      movl    %edi, %eax
-+      addl    $(gdt_48 - relocate_kernel), %eax
-+      lgdtl   (%eax)
-+
-+      /* setup data segment registers */
-+      mov     $(gdt_ds - gdt), %eax
-+      mov     %eax, %ds
-+      mov     %eax, %es
-+      mov     %eax, %fs
-+      mov     %eax, %gs
-+      mov     %eax, %ss
-+      
-       /* setup a new stack at the end of the physical control page */
-       lea     4096(%edi), %esp
--      /* jump to identity mapped page */
--      movl    %edi, %eax
--      addl    $(identity_mapped - relocate_kernel), %eax
--      pushl   %eax
--      ret
-+      /* load new code segment and jump to identity mapped page */
-+      movl    %edi, %esi
-+      xorl    %eax, %eax
-+      pushl   %eax
-+      pushl   %esi
-+      pushl   %eax
-+      movl    $(gdt_cs - gdt), %eax
-+      pushl   %eax    
-+      movl    %edi, %eax
-+      addl    $(identity_mapped - relocate_kernel),%eax
-+      pushl   %eax
-+      iretl
- identity_mapped:
-       /* store the start address on the stack */
-@@ -250,3 +281,20 @@ identity_mapped:
-       xorl    %edi, %edi
-       xorl    %ebp, %ebp
-       ret
-+
-+      .align  16
-+gdt:
-+      .quad   0x0000000000000000      /* NULL descriptor */
-+gdt_cs:       
-+      .quad   0x00cf9a000000ffff      /* kernel 4GB code at 0x00000000 */
-+gdt_ds:
-+      .quad   0x00cf92000000ffff      /* kernel 4GB data at 0x00000000 */
-+gdt_end:
-+      
-+gdt_48:
-+      .word   gdt_end - gdt - 1       /* limit */
-+      .long   0                       /* base - filled in by code above */
-+
-+idt_48:
-+      .word   0                       /* limit */
-+      .long   0                       /* base */
diff --git a/patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch b/patches/linux-2.6.18/linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch
deleted file mode 100644 (file)
index 9ecdb3e..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/machine_kexec.c ./arch/x86_64/kernel/machine_kexec.c
---- ../orig-linux-2.6.18/arch/x86_64/kernel/machine_kexec.c    2007-01-12 16:03:49.000000000 +0000
-+++ ./arch/x86_64/kernel/machine_kexec.c       2007-01-12 16:04:02.000000000 +0000
-@@ -112,47 +112,6 @@ static int init_pgtable(struct kimage *i
-       return init_level4_page(image, level4p, 0, end_pfn << PAGE_SHIFT);
- }
--static void set_idt(void *newidt, u16 limit)
--{
--      struct desc_ptr curidt;
--
--      /* x86-64 supports unaliged loads & stores */
--      curidt.size    = limit;
--      curidt.address = (unsigned long)newidt;
--
--      __asm__ __volatile__ (
--              "lidtq %0\n"
--              : : "m" (curidt)
--              );
--};
--
--
--static void set_gdt(void *newgdt, u16 limit)
--{
--      struct desc_ptr curgdt;
--
--      /* x86-64 supports unaligned loads & stores */
--      curgdt.size    = limit;
--      curgdt.address = (unsigned long)newgdt;
--
--      __asm__ __volatile__ (
--              "lgdtq %0\n"
--              : : "m" (curgdt)
--              );
--};
--
--static void load_segments(void)
--{
--      __asm__ __volatile__ (
--              "\tmovl %0,%%ds\n"
--              "\tmovl %0,%%es\n"
--              "\tmovl %0,%%ss\n"
--              "\tmovl %0,%%fs\n"
--              "\tmovl %0,%%gs\n"
--              : : "a" (__KERNEL_DS) : "memory"
--              );
--}
--
- int machine_kexec_prepare(struct kimage *image)
- {
-       unsigned long start_pgtable;
-@@ -209,23 +168,6 @@ NORET_TYPE void machine_kexec(struct kim
-       page_list[PA_TABLE_PAGE] =
-         (unsigned long)__pa(page_address(image->control_code_page));
--      /* The segment registers are funny things, they have both a
--       * visible and an invisible part.  Whenever the visible part is
--       * set to a specific selector, the invisible part is loaded
--       * with from a table in memory.  At no other time is the
--       * descriptor table in memory accessed.
--       *
--       * I take advantage of this here by force loading the
--       * segments, before I zap the gdt with an invalid value.
--       */
--      load_segments();
--      /* The gdt & idt are now invalid.
--       * If you want to load them you must set up your own idt & gdt.
--       */
--      set_gdt(phys_to_virt(0),0);
--      set_idt(phys_to_virt(0),0);
--
--      /* now call it */
-       relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-                       image->start);
- }
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/relocate_kernel.S ./arch/x86_64/kernel/relocate_kernel.S
---- ../orig-linux-2.6.18/arch/x86_64/kernel/relocate_kernel.S  2007-01-12 16:03:49.000000000 +0000
-+++ ./arch/x86_64/kernel/relocate_kernel.S     2007-01-12 16:04:02.000000000 +0000
-@@ -159,13 +159,39 @@ relocate_new_kernel:
-       movq    PTR(PA_PGD)(%rsi), %r9
-       movq    %r9, %cr3
-+      /* setup idt */
-+      movq    %r8, %rax
-+      addq    $(idt_80 - relocate_kernel), %rax
-+      lidtq   (%rax)
-+
-+      /* setup gdt */
-+      movq    %r8, %rax
-+      addq    $(gdt - relocate_kernel), %rax
-+      movq    %r8, %r9
-+      addq    $((gdt_80 - relocate_kernel) + 2), %r9
-+      movq    %rax, (%r9)
-+
-+      movq    %r8, %rax
-+      addq    $(gdt_80 - relocate_kernel), %rax
-+      lgdtq   (%rax)
-+
-+      /* setup data segment registers */
-+      xorl    %eax, %eax
-+      movl    %eax, %ds
-+      movl    %eax, %es
-+      movl    %eax, %fs
-+      movl    %eax, %gs
-+      movl    %eax, %ss
-+      
-       /* setup a new stack at the end of the physical control page */
-       lea     4096(%r8), %rsp
--      /* jump to identity mapped page */
--      addq    $(identity_mapped - relocate_kernel), %r8
--      pushq   %r8
--      ret
-+      /* load new code segment and jump to identity mapped page */
-+      movq    %r8, %rax
-+      addq    $(identity_mapped - relocate_kernel), %rax
-+      pushq   $(gdt_cs - gdt)
-+      pushq   %rax
-+      lretq
- identity_mapped:
-       /* store the start address on the stack */
-@@ -272,5 +298,19 @@ identity_mapped:
-       xorq    %r13, %r13
-       xorq    %r14, %r14
-       xorq    %r15, %r15
--
-       ret
-+
-+      .align  16
-+gdt:
-+      .quad   0x0000000000000000      /* NULL descriptor */
-+gdt_cs:
-+      .quad   0x00af9a000000ffff
-+gdt_end:
-+
-+gdt_80:
-+      .word   gdt_end - gdt - 1       /* limit */
-+      .quad   0                       /* base - filled in by code above */
-+
-+idt_80:
-+      .word   0                       /* limit */
-+      .quad   0                       /* base */
diff --git a/patches/linux-2.6.18/net-csum.patch b/patches/linux-2.6.18/net-csum.patch
deleted file mode 100644 (file)
index fae3ac3..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_tcp.c ./net/ipv4/netfilter/ip_nat_proto_tcp.c
---- ../orig-linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_tcp.c 2006-09-20 04:42:06.000000000 +0100
-+++ ./net/ipv4/netfilter/ip_nat_proto_tcp.c    2007-01-12 16:08:53.000000000 +0000
-@@ -129,7 +129,12 @@ tcp_manip_pkt(struct sk_buff **pskb,
-       if (hdrsize < sizeof(*hdr))
-               return 1;
--      hdr->check = ip_nat_cheat_check(~oldip, newip,
-+#ifdef CONFIG_XEN
-+      if ((*pskb)->proto_csum_blank)
-+              hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
-+      else
-+#endif
-+              hdr->check = ip_nat_cheat_check(~oldip, newip,
-                                       ip_nat_cheat_check(oldport ^ 0xFFFF,
-                                                          newport,
-                                                          hdr->check));
-diff -pruN ../orig-linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_udp.c ./net/ipv4/netfilter/ip_nat_proto_udp.c
---- ../orig-linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_udp.c 2006-09-20 04:42:06.000000000 +0100
-+++ ./net/ipv4/netfilter/ip_nat_proto_udp.c    2007-01-12 16:08:53.000000000 +0000
-@@ -113,11 +113,17 @@ udp_manip_pkt(struct sk_buff **pskb,
-               newport = tuple->dst.u.udp.port;
-               portptr = &hdr->dest;
-       }
--      if (hdr->check) /* 0 is a special case meaning no checksum */
--              hdr->check = ip_nat_cheat_check(~oldip, newip,
-+      if (hdr->check) { /* 0 is a special case meaning no checksum */
-+#ifdef CONFIG_XEN
-+              if ((*pskb)->proto_csum_blank)
-+                      hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
-+              else
-+#endif
-+                      hdr->check = ip_nat_cheat_check(~oldip, newip,
-                                       ip_nat_cheat_check(*portptr ^ 0xFFFF,
-                                                          newport,
-                                                          hdr->check));
-+      }
-       *portptr = newport;
-       return 1;
- }
-diff -pruN ../orig-linux-2.6.18/net/ipv4/xfrm4_output.c ./net/ipv4/xfrm4_output.c
---- ../orig-linux-2.6.18/net/ipv4/xfrm4_output.c       2006-09-20 04:42:06.000000000 +0100
-+++ ./net/ipv4/xfrm4_output.c  2007-01-12 17:38:34.000000000 +0000
-@@ -18,6 +18,8 @@
- #include <net/xfrm.h>
- #include <net/icmp.h>
-+extern int skb_checksum_setup(struct sk_buff *skb);
-+
- static int xfrm4_tunnel_check_size(struct sk_buff *skb)
- {
-       int mtu, ret = 0;
-@@ -48,6 +50,10 @@ static int xfrm4_output_one(struct sk_bu
-       struct xfrm_state *x = dst->xfrm;
-       int err;
-       
-+      err = skb_checksum_setup(skb);
-+      if (err)
-+              goto error_nolock;
-+
-       if (skb->ip_summed == CHECKSUM_HW) {
-               err = skb_checksum_help(skb, 0);
-               if (err)
diff --git a/patches/linux-2.6.18/net-gso-5-rcv-mss.patch b/patches/linux-2.6.18/net-gso-5-rcv-mss.patch
deleted file mode 100644 (file)
index 50102e3..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/net/ipv4/tcp_input.c ./net/ipv4/tcp_input.c
---- ../orig-linux-2.6.18/net/ipv4/tcp_input.c  2006-09-20 04:42:06.000000000 +0100
-+++ ./net/ipv4/tcp_input.c     2007-01-12 18:10:16.000000000 +0000
-@@ -127,7 +127,7 @@ static void tcp_measure_rcv_mss(struct s
-       /* skb->len may jitter because of SACKs, even if peer
-        * sends good full-sized frames.
-        */
--      len = skb->len;
-+      len = skb_shinfo(skb)->gso_size ?: skb->len;
-       if (len >= icsk->icsk_ack.rcv_mss) {
-               icsk->icsk_ack.rcv_mss = len;
-       } else {
diff --git a/patches/linux-2.6.18/net-gso-6-linear-segmentation.patch b/patches/linux-2.6.18/net-gso-6-linear-segmentation.patch
deleted file mode 100644 (file)
index ef30ef4..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/net/core/skbuff.c ./net/core/skbuff.c
---- ../orig-linux-2.6.18/net/core/skbuff.c     2006-09-20 04:42:06.000000000 +0100
-+++ ./net/core/skbuff.c        2007-01-12 18:10:37.000000000 +0000
-@@ -1945,7 +1945,7 @@ struct sk_buff *skb_segment(struct sk_bu
-       do {
-               struct sk_buff *nskb;
-               skb_frag_t *frag;
--              int hsize, nsize;
-+              int hsize;
-               int k;
-               int size;
-@@ -1956,11 +1956,10 @@ struct sk_buff *skb_segment(struct sk_bu
-               hsize = skb_headlen(skb) - offset;
-               if (hsize < 0)
-                       hsize = 0;
--              nsize = hsize + doffset;
--              if (nsize > len + doffset || !sg)
--                      nsize = len + doffset;
-+              if (hsize > len || !sg)
-+                      hsize = len;
--              nskb = alloc_skb(nsize + headroom, GFP_ATOMIC);
-+              nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC);
-               if (unlikely(!nskb))
-                       goto err;
diff --git a/patches/linux-2.6.18/pmd-shared.patch b/patches/linux-2.6.18/pmd-shared.patch
deleted file mode 100644 (file)
index 638a430..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/mm/pageattr.c ./arch/i386/mm/pageattr.c
---- ../orig-linux-2.6.18/arch/i386/mm/pageattr.c       2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/mm/pageattr.c  2007-01-12 18:11:06.000000000 +0000
-@@ -84,7 +84,7 @@ static void set_pmd_pte(pte_t *kpte, uns
-       unsigned long flags;
-       set_pte_atomic(kpte, pte);      /* change init_mm */
--      if (PTRS_PER_PMD > 1)
-+      if (HAVE_SHARED_KERNEL_PMD)
-               return;
-       spin_lock_irqsave(&pgd_lock, flags);
-diff -pruN ../orig-linux-2.6.18/arch/i386/mm/pgtable.c ./arch/i386/mm/pgtable.c
---- ../orig-linux-2.6.18/arch/i386/mm/pgtable.c        2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/mm/pgtable.c   2007-01-12 18:11:06.000000000 +0000
-@@ -214,9 +214,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
-               spin_lock_irqsave(&pgd_lock, flags);
-       }
--      clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
--                      swapper_pg_dir + USER_PTRS_PER_PGD,
--                      KERNEL_PGD_PTRS);
-+      if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD)
-+              clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-+                              swapper_pg_dir + USER_PTRS_PER_PGD,
-+                              KERNEL_PGD_PTRS);
-       if (PTRS_PER_PMD > 1)
-               return;
-@@ -248,6 +249,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
-                       goto out_oom;
-               set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
-       }
-+
-+      if (!HAVE_SHARED_KERNEL_PMD) {
-+              unsigned long flags;
-+
-+              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                      pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+                      if (!pmd)
-+                              goto out_oom;
-+                      set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd)));
-+              }
-+
-+              spin_lock_irqsave(&pgd_lock, flags);
-+              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                      unsigned long v = (unsigned long)i << PGDIR_SHIFT;
-+                      pgd_t *kpgd = pgd_offset_k(v);
-+                      pud_t *kpud = pud_offset(kpgd, v);
-+                      pmd_t *kpmd = pmd_offset(kpud, v);
-+                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                      memcpy(pmd, kpmd, PAGE_SIZE);
-+              }
-+              pgd_list_add(pgd);
-+              spin_unlock_irqrestore(&pgd_lock, flags);
-+      }
-+
-       return pgd;
- out_oom:
-@@ -262,9 +287,23 @@ void pgd_free(pgd_t *pgd)
-       int i;
-       /* in the PAE case user pgd entries are overwritten before usage */
--      if (PTRS_PER_PMD > 1)
--              for (i = 0; i < USER_PTRS_PER_PGD; ++i)
--                      kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
-+      if (PTRS_PER_PMD > 1) {
-+              for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                      kmem_cache_free(pmd_cache, pmd);
-+              }
-+              if (!HAVE_SHARED_KERNEL_PMD) {
-+                      unsigned long flags;
-+                      spin_lock_irqsave(&pgd_lock, flags);
-+                      pgd_list_del(pgd);
-+                      spin_unlock_irqrestore(&pgd_lock, flags);
-+                      for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                              pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                              memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-+                              kmem_cache_free(pmd_cache, pmd);
-+                      }
-+              }
-+      }
-       /* in the non-PAE case, free_pgtables() clears user pgd entries */
-       kmem_cache_free(pgd_cache, pgd);
- }
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/pgtable-2level-defs.h ./include/asm-i386/pgtable-2level-defs.h
---- ../orig-linux-2.6.18/include/asm-i386/pgtable-2level-defs.h        2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/pgtable-2level-defs.h   2007-01-12 18:11:06.000000000 +0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
- #define _I386_PGTABLE_2LEVEL_DEFS_H
-+#define HAVE_SHARED_KERNEL_PMD 0
-+
- /*
-  * traditional i386 two-level paging structure:
-  */
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/pgtable-3level-defs.h ./include/asm-i386/pgtable-3level-defs.h
---- ../orig-linux-2.6.18/include/asm-i386/pgtable-3level-defs.h        2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/pgtable-3level-defs.h   2007-01-12 18:11:06.000000000 +0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
- #define _I386_PGTABLE_3LEVEL_DEFS_H
-+#define HAVE_SHARED_KERNEL_PMD 1
-+
- /*
-  * PGDIR_SHIFT determines what a top-level page table entry can map
-  */
diff --git a/patches/linux-2.6.18/rename-TSS_sysenter_esp0-SYSENTER_stack_esp0.patch b/patches/linux-2.6.18/rename-TSS_sysenter_esp0-SYSENTER_stack_esp0.patch
deleted file mode 100644 (file)
index fcad5ab..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/entry.S ./arch/i386/kernel/entry.S
---- ../orig-linux-2.6.18/arch/i386/kernel/entry.S      2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/entry.S 2007-01-12 18:12:31.000000000 +0000
-@@ -269,7 +269,7 @@ ENTRY(sysenter_entry)
-       CFI_STARTPROC simple
-       CFI_DEF_CFA esp, 0
-       CFI_REGISTER esp, ebp
--      movl TSS_sysenter_esp0(%esp),%esp
-+      movl SYSENTER_stack_esp0(%esp),%esp
- sysenter_past_esp:
-       /*
-        * No need to follow this irqs on/off section: the syscall
-@@ -689,7 +689,7 @@ device_not_available_emulate:
-  * that sets up the real kernel stack. Check here, since we can't
-  * allow the wrong stack to be used.
-  *
-- * "TSS_sysenter_esp0+12" is because the NMI/debug handler will have
-+ * "SYSENTER_stack_esp0+12" is because the NMI/debug handler will have
-  * already pushed 3 words if it hits on the sysenter instruction:
-  * eflags, cs and eip.
-  *
-@@ -701,7 +701,7 @@ device_not_available_emulate:
-       cmpw $__KERNEL_CS,4(%esp);              \
-       jne ok;                                 \
- label:                                                \
--      movl TSS_sysenter_esp0+offset(%esp),%esp;       \
-+      movl SYSENTER_stack_esp0+offset(%esp),%esp;     \
-       pushfl;                                 \
-       pushl $__KERNEL_CS;                     \
-       pushl $sysenter_past_esp
diff --git a/patches/linux-2.6.18/series b/patches/linux-2.6.18/series
deleted file mode 100644 (file)
index 1362cfc..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
-linux-2.6.19-rc1-kexec-move_segment_code-i386.patch
-git-4bfaaef01a1badb9e8ffb0c0a37cd2379008d21f.patch
-linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch
-blktap-aio-16_03_06.patch
-fix-ide-cd-pio-mode.patch
-i386-mach-io-check-nmi.patch
-net-csum.patch
-net-gso-5-rcv-mss.patch
-net-gso-6-linear-segmentation.patch
-pmd-shared.patch
-rename-TSS_sysenter_esp0-SYSENTER_stack_esp0.patch
-xen-hotplug.patch
-xenoprof-generic.patch
-x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
-x86_64-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
-git-dbaab49f92ff6ae6255762a948375e4036cbdbd2.patch
-x86-elfnote-as-preprocessor-macro.patch
-fixaddr-top.patch
-git-c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4.patch
-softlockup-no-idle-hz.patch
-allow-i386-crash-kernels-to-handle-x86_64-dumps.patch
-allow-i386-crash-kernels-to-handle-x86_64-dumps-fix.patch
-git-5ee7737379b1d7f0c977c0f1661fbaf01a8d4721.patch
diff --git a/patches/linux-2.6.18/softlockup-no-idle-hz.patch b/patches/linux-2.6.18/softlockup-no-idle-hz.patch
deleted file mode 100644 (file)
index d98edac..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/include/linux/sched.h ./include/linux/sched.h
---- ../orig-linux-2.6.18/include/linux/sched.h 2006-09-20 04:42:06.000000000 +0100
-+++ ./include/linux/sched.h    2007-02-07 01:10:24.000000000 +0000
-@@ -211,10 +211,15 @@ extern void update_process_times(int use
- extern void scheduler_tick(void);
- #ifdef CONFIG_DETECT_SOFTLOCKUP
-+extern unsigned long softlockup_get_next_event(void);
- extern void softlockup_tick(void);
- extern void spawn_softlockup_task(void);
- extern void touch_softlockup_watchdog(void);
- #else
-+static inline unsigned long softlockup_get_next_event(void)
-+{
-+      return MAX_JIFFY_OFFSET;
-+}
- static inline void softlockup_tick(void)
- {
- }
-diff -pruN ../orig-linux-2.6.18/kernel/softlockup.c ./kernel/softlockup.c
---- ../orig-linux-2.6.18/kernel/softlockup.c   2006-09-20 04:42:06.000000000 +0100
-+++ ./kernel/softlockup.c      2007-02-07 01:53:22.000000000 +0000
-@@ -40,6 +40,19 @@ void touch_softlockup_watchdog(void)
- }
- EXPORT_SYMBOL(touch_softlockup_watchdog);
-+unsigned long softlockup_get_next_event(void)
-+{
-+      int this_cpu = smp_processor_id();
-+      unsigned long touch_timestamp = per_cpu(touch_timestamp, this_cpu);
-+
-+      if (per_cpu(print_timestamp, this_cpu) == touch_timestamp ||
-+              did_panic ||
-+                      !per_cpu(watchdog_task, this_cpu))
-+              return MAX_JIFFY_OFFSET;
-+
-+      return max_t(long, 0, touch_timestamp + HZ - jiffies);
-+}
-+
- /*
-  * This callback runs from the timer interrupt, and checks
-  * whether the watchdog thread has hung or not:
-diff -pruN ../orig-linux-2.6.18/kernel/timer.c ./kernel/timer.c
---- ../orig-linux-2.6.18/kernel/timer.c        2006-09-20 04:42:06.000000000 +0100
-+++ ./kernel/timer.c   2007-02-07 01:29:34.000000000 +0000
-@@ -485,7 +485,9 @@ unsigned long next_timer_interrupt(void)
-               if (hr_expires < 3)
-                       return hr_expires + jiffies;
-       }
--      hr_expires += jiffies;
-+      hr_expires = min_t(unsigned long,
-+                         softlockup_get_next_event(),
-+                         hr_expires) + jiffies;
-       base = __get_cpu_var(tvec_bases);
-       spin_lock(&base->lock);
diff --git a/patches/linux-2.6.18/x86-elfnote-as-preprocessor-macro.patch b/patches/linux-2.6.18/x86-elfnote-as-preprocessor-macro.patch
deleted file mode 100644 (file)
index 9989d78..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/include/linux/elfnote.h ./include/linux/elfnote.h
---- ../orig-linux-2.6.18/include/linux/elfnote.h       2007-01-12 18:19:44.000000000 +0000
-+++ ./include/linux/elfnote.h  2007-01-12 18:21:02.000000000 +0000
-@@ -31,22 +31,38 @@
- /*
-  * Generate a structure with the same shape as Elf{32,64}_Nhdr (which
-  * turn out to be the same size and shape), followed by the name and
-- * desc data with appropriate padding.  The 'desc' argument includes
-- * the assembler pseudo op defining the type of the data: .asciz
-- * "hello, world"
-+ * desc data with appropriate padding.  The 'desctype' argument is the
-+ * assembler pseudo op defining the type of the data e.g. .asciz while
-+ * 'descdata' is the data itself e.g.  "hello, world".
-+ *
-+ * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two")
-+ *      ELFNOTE(XYZCo, 12, .long, 0xdeadbeef)
-  */
--.macro ELFNOTE name type desc:vararg
--.pushsection ".note.\name"
--  .align 4
--  .long 2f - 1f                       /* namesz */
--  .long 4f - 3f                       /* descsz */
--  .long \type
--1:.asciz "\name"
--2:.align 4
--3:\desc
--4:.align 4
-+#ifdef __STDC__
-+#define ELFNOTE(name, type, desctype, descdata...) \
-+.pushsection .note.name                       ;       \
-+  .align 4                            ;       \
-+  .long 2f - 1f               /* namesz */    ;       \
-+  .long 4f - 3f               /* descsz */    ;       \
-+  .long type                          ;       \
-+1:.asciz #name                                ;       \
-+2:.align 4                            ;       \
-+3:desctype descdata                   ;       \
-+4:.align 4                            ;       \
- .popsection
--.endm
-+#else /* !__STDC__, i.e. -traditional */
-+#define ELFNOTE(name, type, desctype, descdata) \
-+.pushsection .note.name                       ;       \
-+  .align 4                            ;       \
-+  .long 2f - 1f               /* namesz */    ;       \
-+  .long 4f - 3f               /* descsz */    ;       \
-+  .long type                          ;       \
-+1:.asciz "name"                               ;       \
-+2:.align 4                            ;       \
-+3:desctype descdata                   ;       \
-+4:.align 4                            ;       \
-+.popsection
-+#endif /* __STDC__ */
- #else /* !__ASSEMBLER__ */
- #include <linux/elf.h>
- /*
diff --git a/patches/linux-2.6.18/x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch b/patches/linux-2.6.18/x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
deleted file mode 100644 (file)
index c59e7ce..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/vmlinux.lds.S ./arch/i386/kernel/vmlinux.lds.S
---- ../orig-linux-2.6.18/arch/i386/kernel/vmlinux.lds.S        2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/vmlinux.lds.S   2007-01-12 18:19:44.000000000 +0000
-@@ -13,6 +13,12 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386"
- OUTPUT_ARCH(i386)
- ENTRY(phys_startup_32)
- jiffies = jiffies_64;
-+
-+PHDRS {
-+      text PT_LOAD FLAGS(5);  /* R_E */
-+      data PT_LOAD FLAGS(7);  /* RWE */
-+      note PT_NOTE FLAGS(4);  /* R__ */
-+}
- SECTIONS
- {
-   . = __KERNEL_START;
-@@ -26,7 +32,7 @@ SECTIONS
-       KPROBES_TEXT
-       *(.fixup)
-       *(.gnu.warning)
--      } = 0x9090
-+      } :text = 0x9090
-   _etext = .;                 /* End of text section */
-@@ -48,7 +54,7 @@ SECTIONS
-   .data : AT(ADDR(.data) - LOAD_OFFSET) {     /* Data */
-       *(.data)
-       CONSTRUCTORS
--      }
-+      } :data
-   . = ALIGN(4096);
-   __nosave_begin = .;
-@@ -184,4 +190,6 @@ SECTIONS
-   STABS_DEBUG
-   DWARF_DEBUG
-+
-+  NOTES
- }
-diff -pruN ../orig-linux-2.6.18/include/asm-generic/vmlinux.lds.h ./include/asm-generic/vmlinux.lds.h
---- ../orig-linux-2.6.18/include/asm-generic/vmlinux.lds.h     2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-generic/vmlinux.lds.h        2007-01-12 18:19:44.000000000 +0000
-@@ -194,3 +194,6 @@
-               .stab.index 0 : { *(.stab.index) }                      \
-               .stab.indexstr 0 : { *(.stab.indexstr) }                \
-               .comment 0 : { *(.comment) }
-+
-+#define NOTES                                                         \
-+              .notes : { *(.note.*) } :note
-diff -pruN ../orig-linux-2.6.18/include/linux/elfnote.h ./include/linux/elfnote.h
---- ../orig-linux-2.6.18/include/linux/elfnote.h       1970-01-01 01:00:00.000000000 +0100
-+++ ./include/linux/elfnote.h  2007-01-12 18:19:44.000000000 +0000
-@@ -0,0 +1,88 @@
-+#ifndef _LINUX_ELFNOTE_H
-+#define _LINUX_ELFNOTE_H
-+/*
-+ * Helper macros to generate ELF Note structures, which are put into a
-+ * PT_NOTE segment of the final vmlinux image.  These are useful for
-+ * including name-value pairs of metadata into the kernel binary (or
-+ * modules?) for use by external programs.
-+ *
-+ * Each note has three parts: a name, a type and a desc.  The name is
-+ * intended to distinguish the note's originator, so it would be a
-+ * company, project, subsystem, etc; it must be in a suitable form for
-+ * use in a section name.  The type is an integer which is used to tag
-+ * the data, and is considered to be within the "name" namespace (so
-+ * "FooCo"'s type 42 is distinct from "BarProj"'s type 42).  The
-+ * "desc" field is the actual data.  There are no constraints on the
-+ * desc field's contents, though typically they're fairly small.
-+ *
-+ * All notes from a given NAME are put into a section named
-+ * .note.NAME.  When the kernel image is finally linked, all the notes
-+ * are packed into a single .notes section, which is mapped into the
-+ * PT_NOTE segment.  Because notes for a given name are grouped into
-+ * the same section, they'll all be adjacent the output file.
-+ *
-+ * This file defines macros for both C and assembler use.  Their
-+ * syntax is slightly different, but they're semantically similar.
-+ *
-+ * See the ELF specification for more detail about ELF notes.
-+ */
-+
-+#ifdef __ASSEMBLER__
-+/*
-+ * Generate a structure with the same shape as Elf{32,64}_Nhdr (which
-+ * turn out to be the same size and shape), followed by the name and
-+ * desc data with appropriate padding.  The 'desc' argument includes
-+ * the assembler pseudo op defining the type of the data: .asciz
-+ * "hello, world"
-+ */
-+.macro ELFNOTE name type desc:vararg
-+.pushsection ".note.\name"
-+  .align 4
-+  .long 2f - 1f                       /* namesz */
-+  .long 4f - 3f                       /* descsz */
-+  .long \type
-+1:.asciz "\name"
-+2:.align 4
-+3:\desc
-+4:.align 4
-+.popsection
-+.endm
-+#else /* !__ASSEMBLER__ */
-+#include <linux/elf.h>
-+/*
-+ * Use an anonymous structure which matches the shape of
-+ * Elf{32,64}_Nhdr, but includes the name and desc data.  The size and
-+ * type of name and desc depend on the macro arguments.  "name" must
-+ * be a literal string, and "desc" must be passed by value.  You may
-+ * only define one note per line, since __LINE__ is used to generate
-+ * unique symbols.
-+ */
-+#define _ELFNOTE_PASTE(a,b)   a##b
-+#define _ELFNOTE(size, name, unique, type, desc)                      \
-+      static const struct {                                           \
-+              struct elf##size##_note _nhdr;                          \
-+              unsigned char _name[sizeof(name)]                       \
-+              __attribute__((aligned(sizeof(Elf##size##_Word))));     \
-+              typeof(desc) _desc                                      \
-+                           __attribute__((aligned(sizeof(Elf##size##_Word)))); \
-+      } _ELFNOTE_PASTE(_note_, unique)                                \
-+              __attribute_used__                                      \
-+              __attribute__((section(".note." name),                  \
-+                             aligned(sizeof(Elf##size##_Word)),       \
-+                             unused)) = {                             \
-+              {                                                       \
-+                      sizeof(name),                                   \
-+                      sizeof(desc),                                   \
-+                      type,                                           \
-+              },                                                      \
-+              name,                                                   \
-+              desc                                                    \
-+      }
-+#define ELFNOTE(size, name, type, desc)               \
-+      _ELFNOTE(size, name, __LINE__, type, desc)
-+
-+#define ELFNOTE32(name, type, desc) ELFNOTE(32, name, type, desc)
-+#define ELFNOTE64(name, type, desc) ELFNOTE(64, name, type, desc)
-+#endif        /* __ASSEMBLER__ */
-+
-+#endif /* _LINUX_ELFNOTE_H */
diff --git a/patches/linux-2.6.18/x86_64-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch b/patches/linux-2.6.18/x86_64-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
deleted file mode 100644 (file)
index 18cbebf..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S ./arch/x86_64/kernel/vmlinux.lds.S
---- ../orig-linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S      2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/x86_64/kernel/vmlinux.lds.S 2007-01-12 18:20:02.000000000 +0000
-@@ -13,6 +13,12 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86
- OUTPUT_ARCH(i386:x86-64)
- ENTRY(phys_startup_64)
- jiffies_64 = jiffies;
-+PHDRS {
-+      text PT_LOAD FLAGS(5);  /* R_E */
-+      data PT_LOAD FLAGS(7);  /* RWE */
-+      user PT_LOAD FLAGS(7);  /* RWE */
-+      note PT_NOTE FLAGS(4);  /* R__ */
-+}
- SECTIONS
- {
-   . = __START_KERNEL;
-@@ -31,7 +37,7 @@ SECTIONS
-       KPROBES_TEXT
-       *(.fixup)
-       *(.gnu.warning)
--      } = 0x9090
-+      } :text = 0x9090
-                               /* out-of-line lock text */
-   .text.lock : AT(ADDR(.text.lock) - LOAD_OFFSET) { *(.text.lock) }
-@@ -57,17 +63,10 @@ SECTIONS
-   .data : AT(ADDR(.data) - LOAD_OFFSET) {
-       *(.data)
-       CONSTRUCTORS
--      }
-+      } :data
-   _edata = .;                 /* End of data section */
--  __bss_start = .;            /* BSS */
--  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
--      *(.bss.page_aligned)    
--      *(.bss)
--      }
--  __bss_stop = .;
--
-   . = ALIGN(PAGE_SIZE);
-   . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
-   .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
-@@ -89,7 +88,7 @@ SECTIONS
- #define VVIRT(x) (ADDR(x) - VVIRT_OFFSET)
-   . = VSYSCALL_ADDR;
--  .vsyscall_0 :        AT(VSYSCALL_PHYS_ADDR) { *(.vsyscall_0) }
-+  .vsyscall_0 :        AT(VSYSCALL_PHYS_ADDR) { *(.vsyscall_0) } :user
-   __vsyscall_0 = VSYSCALL_VIRT_ADDR;
-   . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
-@@ -132,7 +131,7 @@ SECTIONS
-   . = ALIGN(8192);            /* init_task */
-   .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
-       *(.data.init_task)
--  }
-+  } :data
-   . = ALIGN(4096);
-   .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
-@@ -222,6 +221,14 @@ SECTIONS
-   . = ALIGN(4096);
-   __nosave_end = .;
-+  __bss_start = .;            /* BSS */
-+  . = ALIGN(4096);
-+  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
-+      *(.bss.page_aligned)
-+      *(.bss)
-+      }
-+  __bss_stop = .;
-+
-   _end = . ;
-   /* Sections to be discarded */
-@@ -235,4 +242,6 @@ SECTIONS
-   STABS_DEBUG
-   DWARF_DEBUG
-+
-+  NOTES
- }
diff --git a/patches/linux-2.6.18/xen-hotplug.patch b/patches/linux-2.6.18/xen-hotplug.patch
deleted file mode 100644 (file)
index 817e3dd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/fs/proc/proc_misc.c ./fs/proc/proc_misc.c
---- ../orig-linux-2.6.18/fs/proc/proc_misc.c   2006-09-20 04:42:06.000000000 +0100
-+++ ./fs/proc/proc_misc.c      2007-01-12 18:18:36.000000000 +0000
-@@ -471,7 +471,7 @@ static int show_stat(struct seq_file *p,
-               (unsigned long long)cputime64_to_clock_t(irq),
-               (unsigned long long)cputime64_to_clock_t(softirq),
-               (unsigned long long)cputime64_to_clock_t(steal));
--      for_each_online_cpu(i) {
-+      for_each_possible_cpu(i) {
-               /* Copy values here to work around gcc-2.95.3, gcc-2.96 */
-               user = kstat_cpu(i).cpustat.user;
diff --git a/patches/linux-2.6.18/xenoprof-generic.patch b/patches/linux-2.6.18/xenoprof-generic.patch
deleted file mode 100644 (file)
index d2542b2..0000000
+++ /dev/null
@@ -1,662 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/buffer_sync.c ./drivers/oprofile/buffer_sync.c
---- ../orig-linux-2.6.18/drivers/oprofile/buffer_sync.c        2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/buffer_sync.c   2007-01-12 18:19:28.000000000 +0000
-@@ -6,6 +6,10 @@
-  *
-  * @author John Levon <levon@movementarian.org>
-  *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-  * This is the core of the buffer management. Each
-  * CPU buffer is processed and entered into the
-  * global event buffer. Such processing is necessary
-@@ -38,6 +42,7 @@ static cpumask_t marked_cpus = CPU_MASK_
- static DEFINE_SPINLOCK(task_mortuary);
- static void process_task_mortuary(void);
-+static int cpu_current_domain[NR_CPUS];
- /* Take ownership of the task struct and place it on the
-  * list for processing. Only after two full buffer syncs
-@@ -146,6 +151,11 @@ static void end_sync(void)
- int sync_start(void)
- {
-       int err;
-+      int i;
-+
-+      for (i = 0; i < NR_CPUS; i++) {
-+              cpu_current_domain[i] = COORDINATOR_DOMAIN;
-+      }
-       start_cpu_work();
-@@ -275,15 +285,31 @@ static void add_cpu_switch(int i)
-       last_cookie = INVALID_COOKIE;
- }
--static void add_kernel_ctx_switch(unsigned int in_kernel)
-+static void add_cpu_mode_switch(unsigned int cpu_mode)
- {
-       add_event_entry(ESCAPE_CODE);
--      if (in_kernel)
--              add_event_entry(KERNEL_ENTER_SWITCH_CODE); 
--      else
--              add_event_entry(KERNEL_EXIT_SWITCH_CODE); 
-+      switch (cpu_mode) {
-+      case CPU_MODE_USER:
-+              add_event_entry(USER_ENTER_SWITCH_CODE);
-+              break;
-+      case CPU_MODE_KERNEL:
-+              add_event_entry(KERNEL_ENTER_SWITCH_CODE);
-+              break;
-+      case CPU_MODE_XEN:
-+              add_event_entry(XEN_ENTER_SWITCH_CODE);
-+              break;
-+      default:
-+              break;
-+      }
- }
-- 
-+
-+static void add_domain_switch(unsigned long domain_id)
-+{
-+      add_event_entry(ESCAPE_CODE);
-+      add_event_entry(DOMAIN_SWITCH_CODE);
-+      add_event_entry(domain_id);
-+}
-+
- static void
- add_user_ctx_switch(struct task_struct const * task, unsigned long cookie)
- {
-@@ -348,9 +374,9 @@ static int add_us_sample(struct mm_struc
-  * for later lookup from userspace.
-  */
- static int
--add_sample(struct mm_struct * mm, struct op_sample * s, int in_kernel)
-+add_sample(struct mm_struct * mm, struct op_sample * s, int cpu_mode)
- {
--      if (in_kernel) {
-+      if (cpu_mode >= CPU_MODE_KERNEL) {
-               add_sample_entry(s->eip, s->event);
-               return 1;
-       } else if (mm) {
-@@ -496,15 +522,21 @@ void sync_buffer(int cpu)
-       struct mm_struct *mm = NULL;
-       struct task_struct * new;
-       unsigned long cookie = 0;
--      int in_kernel = 1;
-+      int cpu_mode = 1;
-       unsigned int i;
-       sync_buffer_state state = sb_buffer_start;
-       unsigned long available;
-+      int domain_switch = 0;
-       mutex_lock(&buffer_mutex);
-  
-       add_cpu_switch(cpu);
-+      /* We need to assign the first samples in this CPU buffer to the
-+         same domain that we were processing at the last sync_buffer */
-+      if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
-+              add_domain_switch(cpu_current_domain[cpu]);
-+      }
-       /* Remember, only we can modify tail_pos */
-       available = get_slots(cpu_buf);
-@@ -512,16 +544,18 @@ void sync_buffer(int cpu)
-       for (i = 0; i < available; ++i) {
-               struct op_sample * s = &cpu_buf->buffer[cpu_buf->tail_pos];
-  
--              if (is_code(s->eip)) {
--                      if (s->event <= CPU_IS_KERNEL) {
--                              /* kernel/userspace switch */
--                              in_kernel = s->event;
-+              if (is_code(s->eip) && !domain_switch) {
-+                      if (s->event <= CPU_MODE_XEN) {
-+                              /* xen/kernel/userspace switch */
-+                              cpu_mode = s->event;
-                               if (state == sb_buffer_start)
-                                       state = sb_sample_start;
--                              add_kernel_ctx_switch(s->event);
-+                              add_cpu_mode_switch(s->event);
-                       } else if (s->event == CPU_TRACE_BEGIN) {
-                               state = sb_bt_start;
-                               add_trace_begin();
-+                      } else if (s->event == CPU_DOMAIN_SWITCH) {
-+                                      domain_switch = 1;                              
-                       } else {
-                               struct mm_struct * oldmm = mm;
-@@ -535,11 +569,21 @@ void sync_buffer(int cpu)
-                               add_user_ctx_switch(new, cookie);
-                       }
-               } else {
--                      if (state >= sb_bt_start &&
--                          !add_sample(mm, s, in_kernel)) {
--                              if (state == sb_bt_start) {
--                                      state = sb_bt_ignore;
--                                      atomic_inc(&oprofile_stats.bt_lost_no_mapping);
-+                      if (domain_switch) {
-+                              cpu_current_domain[cpu] = s->eip;
-+                              add_domain_switch(s->eip);
-+                              domain_switch = 0;
-+                      } else {
-+                              if (cpu_current_domain[cpu] !=
-+                                  COORDINATOR_DOMAIN) {
-+                                      add_sample_entry(s->eip, s->event);
-+                              }
-+                              else  if (state >= sb_bt_start &&
-+                                  !add_sample(mm, s, cpu_mode)) {
-+                                      if (state == sb_bt_start) {
-+                                              state = sb_bt_ignore;
-+                                              atomic_inc(&oprofile_stats.bt_lost_no_mapping);
-+                                      }
-                               }
-                       }
-               }
-@@ -548,6 +592,11 @@ void sync_buffer(int cpu)
-       }
-       release_mm(mm);
-+      /* We reset domain to COORDINATOR at each CPU switch */
-+      if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
-+              add_domain_switch(COORDINATOR_DOMAIN);
-+      }
-+
-       mark_done(cpu);
-       mutex_unlock(&buffer_mutex);
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/cpu_buffer.c ./drivers/oprofile/cpu_buffer.c
---- ../orig-linux-2.6.18/drivers/oprofile/cpu_buffer.c 2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/cpu_buffer.c    2007-01-12 18:18:50.000000000 +0000
-@@ -6,6 +6,10 @@
-  *
-  * @author John Levon <levon@movementarian.org>
-  *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-  * Each CPU has a local buffer that stores PC value/event
-  * pairs. We also log context switches when we notice them.
-  * Eventually each CPU's buffer is processed into the global
-@@ -34,6 +38,8 @@ static void wq_sync_buffer(void *);
- #define DEFAULT_TIMER_EXPIRE (HZ / 10)
- static int work_enabled;
-+static int32_t current_domain = COORDINATOR_DOMAIN;
-+
- void free_cpu_buffers(void)
- {
-       int i;
-@@ -57,7 +63,7 @@ int alloc_cpu_buffers(void)
-                       goto fail;
-  
-               b->last_task = NULL;
--              b->last_is_kernel = -1;
-+              b->last_cpu_mode = -1;
-               b->tracing = 0;
-               b->buffer_size = buffer_size;
-               b->tail_pos = 0;
-@@ -113,7 +119,7 @@ void cpu_buffer_reset(struct oprofile_cp
-        * collected will populate the buffer with proper
-        * values to initialize the buffer
-        */
--      cpu_buf->last_is_kernel = -1;
-+      cpu_buf->last_cpu_mode = -1;
-       cpu_buf->last_task = NULL;
- }
-@@ -163,13 +169,13 @@ add_code(struct oprofile_cpu_buffer * bu
-  * because of the head/tail separation of the writer and reader
-  * of the CPU buffer.
-  *
-- * is_kernel is needed because on some architectures you cannot
-+ * cpu_mode is needed because on some architectures you cannot
-  * tell if you are in kernel or user space simply by looking at
-- * pc. We tag this in the buffer by generating kernel enter/exit
-- * events whenever is_kernel changes
-+ * pc. We tag this in the buffer by generating kernel/user (and xen)
-+ *  enter events whenever cpu_mode changes
-  */
- static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc,
--                    int is_kernel, unsigned long event)
-+                    int cpu_mode, unsigned long event)
- {
-       struct task_struct * task;
-@@ -180,18 +186,18 @@ static int log_sample(struct oprofile_cp
-               return 0;
-       }
--      is_kernel = !!is_kernel;
--
-       task = current;
-       /* notice a switch from user->kernel or vice versa */
--      if (cpu_buf->last_is_kernel != is_kernel) {
--              cpu_buf->last_is_kernel = is_kernel;
--              add_code(cpu_buf, is_kernel);
-+      if (cpu_buf->last_cpu_mode != cpu_mode) {
-+              cpu_buf->last_cpu_mode = cpu_mode;
-+              add_code(cpu_buf, cpu_mode);
-       }
--
-+      
-       /* notice a task switch */
--      if (cpu_buf->last_task != task) {
-+      /* if not processing other domain samples */
-+      if ((cpu_buf->last_task != task) &&
-+          (current_domain == COORDINATOR_DOMAIN)) {
-               cpu_buf->last_task = task;
-               add_code(cpu_buf, (unsigned long)task);
-       }
-@@ -275,6 +281,25 @@ void oprofile_add_trace(unsigned long pc
-       add_sample(cpu_buf, pc, 0);
- }
-+int oprofile_add_domain_switch(int32_t domain_id)
-+{
-+      struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
-+
-+      /* should have space for switching into and out of domain 
-+         (2 slots each) plus one sample and one cpu mode switch */
-+      if (((nr_available_slots(cpu_buf) < 6) && 
-+           (domain_id != COORDINATOR_DOMAIN)) ||
-+          (nr_available_slots(cpu_buf) < 2))
-+              return 0;
-+
-+      add_code(cpu_buf, CPU_DOMAIN_SWITCH);
-+      add_sample(cpu_buf, domain_id, 0);
-+
-+      current_domain = domain_id;
-+
-+      return 1;
-+}
-+
- /*
-  * This serves to avoid cpu buffer overflow, and makes sure
-  * the task mortuary progresses
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/cpu_buffer.h ./drivers/oprofile/cpu_buffer.h
---- ../orig-linux-2.6.18/drivers/oprofile/cpu_buffer.h 2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/cpu_buffer.h    2007-01-12 18:18:50.000000000 +0000
-@@ -36,7 +36,7 @@ struct oprofile_cpu_buffer {
-       volatile unsigned long tail_pos;
-       unsigned long buffer_size;
-       struct task_struct * last_task;
--      int last_is_kernel;
-+      int last_cpu_mode;
-       int tracing;
-       struct op_sample * buffer;
-       unsigned long sample_received;
-@@ -51,7 +51,10 @@ extern struct oprofile_cpu_buffer cpu_bu
- void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf);
- /* transient events for the CPU buffer -> event buffer */
--#define CPU_IS_KERNEL 1
--#define CPU_TRACE_BEGIN 2
-+#define CPU_MODE_USER           0
-+#define CPU_MODE_KERNEL         1
-+#define CPU_MODE_XEN            2
-+#define CPU_TRACE_BEGIN         3
-+#define CPU_DOMAIN_SWITCH       4
- #endif /* OPROFILE_CPU_BUFFER_H */
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/event_buffer.h ./drivers/oprofile/event_buffer.h
---- ../orig-linux-2.6.18/drivers/oprofile/event_buffer.h       2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/event_buffer.h  2007-01-12 18:18:50.000000000 +0000
-@@ -29,15 +29,20 @@ void wake_up_buffer_waiter(void);
- #define CPU_SWITCH_CODE               2
- #define COOKIE_SWITCH_CODE            3
- #define KERNEL_ENTER_SWITCH_CODE      4
--#define KERNEL_EXIT_SWITCH_CODE               5
-+#define USER_ENTER_SWITCH_CODE                5
- #define MODULE_LOADED_CODE            6
- #define CTX_TGID_CODE                 7
- #define TRACE_BEGIN_CODE              8
- #define TRACE_END_CODE                        9
-+#define XEN_ENTER_SWITCH_CODE         10
-+#define DOMAIN_SWITCH_CODE            11
-  
- #define INVALID_COOKIE ~0UL
- #define NO_COOKIE 0UL
-+/* Constant used to refer to coordinator domain (Xen) */
-+#define COORDINATOR_DOMAIN -1
-+
- /* add data to the event buffer */
- void add_event_entry(unsigned long data);
-  
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/oprof.c ./drivers/oprofile/oprof.c
---- ../orig-linux-2.6.18/drivers/oprofile/oprof.c      2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/oprof.c 2007-01-12 18:18:50.000000000 +0000
-@@ -5,6 +5,10 @@
-  * @remark Read the file COPYING
-  *
-  * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-  */
- #include <linux/kernel.h>
-@@ -19,7 +23,7 @@
- #include "cpu_buffer.h"
- #include "buffer_sync.h"
- #include "oprofile_stats.h"
-- 
-+
- struct oprofile_operations oprofile_ops;
- unsigned long oprofile_started;
-@@ -33,6 +37,32 @@ static DEFINE_MUTEX(start_mutex);
-  */
- static int timer = 0;
-+int oprofile_set_active(int active_domains[], unsigned int adomains)
-+{
-+      int err;
-+
-+      if (!oprofile_ops.set_active)
-+              return -EINVAL;
-+
-+      mutex_lock(&start_mutex);
-+      err = oprofile_ops.set_active(active_domains, adomains);
-+      mutex_unlock(&start_mutex);
-+      return err;
-+}
-+
-+int oprofile_set_passive(int passive_domains[], unsigned int pdomains)
-+{
-+      int err;
-+
-+      if (!oprofile_ops.set_passive)
-+              return -EINVAL;
-+
-+      mutex_lock(&start_mutex);
-+      err = oprofile_ops.set_passive(passive_domains, pdomains);
-+      mutex_unlock(&start_mutex);
-+      return err;
-+}
-+
- int oprofile_setup(void)
- {
-       int err;
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/oprof.h ./drivers/oprofile/oprof.h
---- ../orig-linux-2.6.18/drivers/oprofile/oprof.h      2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/oprof.h 2007-01-12 18:18:50.000000000 +0000
-@@ -35,5 +35,8 @@ void oprofile_create_files(struct super_
- void oprofile_timer_init(struct oprofile_operations * ops);
- int oprofile_set_backtrace(unsigned long depth);
-+
-+int oprofile_set_active(int active_domains[], unsigned int adomains);
-+int oprofile_set_passive(int passive_domains[], unsigned int pdomains);
-  
- #endif /* OPROF_H */
-diff -pruN ../orig-linux-2.6.18/drivers/oprofile/oprofile_files.c ./drivers/oprofile/oprofile_files.c
---- ../orig-linux-2.6.18/drivers/oprofile/oprofile_files.c     2006-09-20 04:42:06.000000000 +0100
-+++ ./drivers/oprofile/oprofile_files.c        2007-01-12 18:18:50.000000000 +0000
-@@ -5,15 +5,21 @@
-  * @remark Read the file COPYING
-  *
-  * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.     
-  */
- #include <linux/fs.h>
- #include <linux/oprofile.h>
-+#include <asm/uaccess.h>
-+#include <linux/ctype.h>
- #include "event_buffer.h"
- #include "oprofile_stats.h"
- #include "oprof.h"
-- 
-+
- unsigned long fs_buffer_size = 131072;
- unsigned long fs_cpu_buffer_size = 8192;
- unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */
-@@ -117,11 +123,202 @@ static ssize_t dump_write(struct file * 
- static struct file_operations dump_fops = {
-       .write          = dump_write,
- };
-- 
-+
-+#define TMPBUFSIZE 512
-+
-+static unsigned int adomains = 0;
-+static int active_domains[MAX_OPROF_DOMAINS + 1];
-+static DEFINE_MUTEX(adom_mutex);
-+
-+static ssize_t adomain_write(struct file * file, char const __user * buf, 
-+                           size_t count, loff_t * offset)
-+{
-+      char *tmpbuf;
-+      char *startp, *endp;
-+      int i;
-+      unsigned long val;
-+      ssize_t retval = count;
-+      
-+      if (*offset)
-+              return -EINVAL; 
-+      if (count > TMPBUFSIZE - 1)
-+              return -EINVAL;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      if (copy_from_user(tmpbuf, buf, count)) {
-+              kfree(tmpbuf);
-+              return -EFAULT;
-+      }
-+      tmpbuf[count] = 0;
-+
-+      mutex_lock(&adom_mutex);
-+
-+      startp = tmpbuf;
-+      /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */
-+      for (i = 0; i <= MAX_OPROF_DOMAINS; i++) {
-+              val = simple_strtoul(startp, &endp, 0);
-+              if (endp == startp)
-+                      break;
-+              while (ispunct(*endp) || isspace(*endp))
-+                      endp++;
-+              active_domains[i] = val;
-+              if (active_domains[i] != val)
-+                      /* Overflow, force error below */
-+                      i = MAX_OPROF_DOMAINS + 1;
-+              startp = endp;
-+      }
-+      /* Force error on trailing junk */
-+      adomains = *startp ? MAX_OPROF_DOMAINS + 1 : i;
-+
-+      kfree(tmpbuf);
-+
-+      if (adomains > MAX_OPROF_DOMAINS
-+          || oprofile_set_active(active_domains, adomains)) {
-+              adomains = 0;
-+              retval = -EINVAL;
-+      }
-+
-+      mutex_unlock(&adom_mutex);
-+      return retval;
-+}
-+
-+static ssize_t adomain_read(struct file * file, char __user * buf, 
-+                          size_t count, loff_t * offset)
-+{
-+      char * tmpbuf;
-+      size_t len;
-+      int i;
-+      ssize_t retval;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      mutex_lock(&adom_mutex);
-+
-+      len = 0;
-+      for (i = 0; i < adomains; i++)
-+              len += snprintf(tmpbuf + len,
-+                              len < TMPBUFSIZE ? TMPBUFSIZE - len : 0,
-+                              "%u ", active_domains[i]);
-+      WARN_ON(len > TMPBUFSIZE);
-+      if (len != 0 && len <= TMPBUFSIZE)
-+              tmpbuf[len-1] = '\n';
-+
-+      mutex_unlock(&adom_mutex);
-+
-+      retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len);
-+
-+      kfree(tmpbuf);
-+      return retval;
-+}
-+
-+
-+static struct file_operations active_domain_ops = {
-+      .read           = adomain_read,
-+      .write          = adomain_write,
-+};
-+
-+static unsigned int pdomains = 0;
-+static int passive_domains[MAX_OPROF_DOMAINS];
-+static DEFINE_MUTEX(pdom_mutex);
-+
-+static ssize_t pdomain_write(struct file * file, char const __user * buf, 
-+                           size_t count, loff_t * offset)
-+{
-+      char *tmpbuf;
-+      char *startp, *endp;
-+      int i;
-+      unsigned long val;
-+      ssize_t retval = count;
-+      
-+      if (*offset)
-+              return -EINVAL; 
-+      if (count > TMPBUFSIZE - 1)
-+              return -EINVAL;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      if (copy_from_user(tmpbuf, buf, count)) {
-+              kfree(tmpbuf);
-+              return -EFAULT;
-+      }
-+      tmpbuf[count] = 0;
-+
-+      mutex_lock(&pdom_mutex);
-+
-+      startp = tmpbuf;
-+      /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */
-+      for (i = 0; i <= MAX_OPROF_DOMAINS; i++) {
-+              val = simple_strtoul(startp, &endp, 0);
-+              if (endp == startp)
-+                      break;
-+              while (ispunct(*endp) || isspace(*endp))
-+                      endp++;
-+              passive_domains[i] = val;
-+              if (passive_domains[i] != val)
-+                      /* Overflow, force error below */
-+                      i = MAX_OPROF_DOMAINS + 1;
-+              startp = endp;
-+      }
-+      /* Force error on trailing junk */
-+      pdomains = *startp ? MAX_OPROF_DOMAINS + 1 : i;
-+
-+      kfree(tmpbuf);
-+
-+      if (pdomains > MAX_OPROF_DOMAINS
-+          || oprofile_set_passive(passive_domains, pdomains)) {
-+              pdomains = 0;
-+              retval = -EINVAL;
-+      }
-+
-+      mutex_unlock(&pdom_mutex);
-+      return retval;
-+}
-+
-+static ssize_t pdomain_read(struct file * file, char __user * buf, 
-+                          size_t count, loff_t * offset)
-+{
-+      char * tmpbuf;
-+      size_t len;
-+      int i;
-+      ssize_t retval;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      mutex_lock(&pdom_mutex);
-+
-+      len = 0;
-+      for (i = 0; i < pdomains; i++)
-+              len += snprintf(tmpbuf + len,
-+                              len < TMPBUFSIZE ? TMPBUFSIZE - len : 0,
-+                              "%u ", passive_domains[i]);
-+      WARN_ON(len > TMPBUFSIZE);
-+      if (len != 0 && len <= TMPBUFSIZE)
-+              tmpbuf[len-1] = '\n';
-+
-+      mutex_unlock(&pdom_mutex);
-+
-+      retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len);
-+
-+      kfree(tmpbuf);
-+      return retval;
-+}
-+
-+static struct file_operations passive_domain_ops = {
-+      .read           = pdomain_read,
-+      .write          = pdomain_write,
-+};
-+
- void oprofile_create_files(struct super_block * sb, struct dentry * root)
- {
-       oprofilefs_create_file(sb, root, "enable", &enable_fops);
-       oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666);
-+      oprofilefs_create_file(sb, root, "active_domains", &active_domain_ops);
-+      oprofilefs_create_file(sb, root, "passive_domains", &passive_domain_ops);
-       oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops);
-       oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size);
-       oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
-diff -pruN ../orig-linux-2.6.18/include/linux/oprofile.h ./include/linux/oprofile.h
---- ../orig-linux-2.6.18/include/linux/oprofile.h      2006-09-20 04:42:06.000000000 +0100
-+++ ./include/linux/oprofile.h 2007-01-12 18:18:50.000000000 +0000
-@@ -16,6 +16,8 @@
- #include <linux/types.h>
- #include <linux/spinlock.h>
- #include <asm/atomic.h>
-+
-+#include <xen/interface/xenoprof.h>
-  
- struct super_block;
- struct dentry;
-@@ -27,6 +29,11 @@ struct oprofile_operations {
-       /* create any necessary configuration files in the oprofile fs.
-        * Optional. */
-       int (*create_files)(struct super_block * sb, struct dentry * root);
-+      /* setup active domains with Xen */
-+      int (*set_active)(int *active_domains, unsigned int adomains);
-+        /* setup passive domains with Xen */
-+        int (*set_passive)(int *passive_domains, unsigned int pdomains);
-+      
-       /* Do any necessary interrupt setup. Optional. */
-       int (*setup)(void);
-       /* Do any necessary interrupt shutdown. Optional. */
-@@ -78,6 +85,8 @@ void oprofile_add_pc(unsigned long pc, i
- /* add a backtrace entry, to be called from the ->backtrace callback */
- void oprofile_add_trace(unsigned long eip);
-+/* add a domain switch entry */
-+int oprofile_add_domain_switch(int32_t domain_id);
- /**
-  * Create a file of the given name as a child of the given root, with